Repository: KreitinnSoftware/MiceWine-RootFS-Generator Branch: main Commit: d5a50fb91bfe Files: 318 Total size: 1.3 MB Directory structure: gitextract_6hm9lafi/ ├── .github/ │ └── workflows/ │ └── build.yml ├── .gitignore ├── build-all.sh ├── build_config/ │ ├── meson-cross-file-aarch64 │ └── meson-cross-file-x86_64 ├── common/ │ ├── Addons/ │ │ ├── DXTest/ │ │ │ ├── DX8DolphinVS/ │ │ │ │ ├── Dolphin1.x │ │ │ │ ├── Dolphin2.x │ │ │ │ ├── Dolphin3.x │ │ │ │ ├── DolphinTween.vsh │ │ │ │ ├── DolphinTween2.vsh │ │ │ │ ├── SeaFloor.vsh │ │ │ │ ├── SeaFloor2.vsh │ │ │ │ ├── caust00.tga │ │ │ │ ├── caust01.tga │ │ │ │ ├── caust02.tga │ │ │ │ ├── caust03.tga │ │ │ │ ├── caust04.tga │ │ │ │ ├── caust05.tga │ │ │ │ ├── caust06.tga │ │ │ │ ├── caust07.tga │ │ │ │ ├── caust08.tga │ │ │ │ ├── caust09.tga │ │ │ │ ├── caust10.tga │ │ │ │ ├── caust11.tga │ │ │ │ ├── caust12.tga │ │ │ │ ├── caust13.tga │ │ │ │ ├── caust14.tga │ │ │ │ ├── caust15.tga │ │ │ │ ├── caust16.tga │ │ │ │ ├── caust17.tga │ │ │ │ ├── caust18.tga │ │ │ │ ├── caust19.tga │ │ │ │ ├── caust20.tga │ │ │ │ ├── caust21.tga │ │ │ │ ├── caust22.tga │ │ │ │ ├── caust23.tga │ │ │ │ ├── caust24.tga │ │ │ │ ├── caust25.tga │ │ │ │ ├── caust26.tga │ │ │ │ ├── caust27.tga │ │ │ │ ├── caust28.tga │ │ │ │ ├── caust29.tga │ │ │ │ ├── caust30.tga │ │ │ │ ├── caust31.tga │ │ │ │ ├── dolphin.x │ │ │ │ ├── dolphin_group.x │ │ │ │ ├── seafloor.x │ │ │ │ └── trace.txt │ │ │ ├── DX9EnvMapping/ │ │ │ │ ├── LobbyCube.dds │ │ │ │ ├── airplane 2.x │ │ │ │ ├── lobby_skybox.x │ │ │ │ └── teapot.x │ │ │ └── DX9StencilMirror/ │ │ │ ├── StencilMirror.dxvk-cache │ │ │ ├── StencilMirror_d3d9.log │ │ │ ├── heli.x │ │ │ └── seafloor.x │ │ ├── DefaultDLLsOverrides.reg │ │ └── Themes/ │ │ └── DarkBlue/ │ │ └── DarkBlue.reg │ └── Start Menu/ │ ├── Applications/ │ │ ├── Notepad.lnk │ │ ├── Registry Editor.lnk │ │ ├── TFM - File Manager.lnk │ │ ├── Task Manager.lnk │ │ └── Wine Configuration.lnk │ ├── DX Test/ │ │ ├── DirectX - 8/ │ │ │ └── DolphinVS.bat │ │ └── DirectX - 9/ │ │ ├── CubeMap.bat │ │ ├── SphereMap.bat │ │ └── StencilMirror.bat │ ├── Regedit Tweak/ │ │ ├── Fake GPU/ │ │ │ ├── 6600GT.reg.bat │ │ │ ├── 9600GT.reg.bat │ │ │ ├── ATIHD5800.reg.bat │ │ │ ├── GMAQ33.reg.bat │ │ │ ├── GTX1050.reg.bat │ │ │ ├── GTX470.reg.bat │ │ │ ├── IntelHD4000.reg.bat │ │ │ ├── RX480.reg.bat │ │ │ ├── VMWareSVGA3D.reg.bat │ │ │ └── VirtIOGPU.reg.bat │ │ ├── Fake VRAM/ │ │ │ ├── 128MB.bat │ │ │ ├── 1GB.bat │ │ │ ├── 256MB.bat │ │ │ ├── 2GB.bat │ │ │ ├── 3GB.bat │ │ │ ├── 4GB.bat │ │ │ ├── 512MB.bat │ │ │ ├── 6GB.bat │ │ │ ├── 768MB.bat │ │ │ └── 8GB.bat │ │ └── Graphics Settings/ │ │ └── CSMT/ │ │ ├── 0.bat │ │ ├── 1.bat │ │ └── 3.bat │ └── Update Prefix.bat ├── create-rootfs-rat.sh ├── packages/ │ ├── FreeGLUT/ │ │ ├── build.sh │ │ ├── fix-cmake-minimum.patch │ │ ├── src-fg_internal.h.patch │ │ └── src-x11-fg_main_x11.c.patch │ ├── GLU/ │ │ └── build.sh │ ├── Vulkan-Headers/ │ │ └── build.sh │ ├── Vulkan-Loader/ │ │ ├── 0001-fix-hardcoded-pathes.patch │ │ ├── 0002-properly-enable-extensions.patch │ │ └── build.sh │ ├── Vulkan-Tools/ │ │ ├── 01-no-android.patch │ │ ├── 02-do-not-search-KHR_display-automatically.patch │ │ └── build.sh │ ├── Vulkan-Volk/ │ │ └── build.sh │ ├── android-shmem/ │ │ ├── build.sh │ │ └── fix-build.patch │ ├── box64-0.3.2/ │ │ ├── build.sh │ │ ├── custom-make-install.sh │ │ └── fix-signal.patch │ ├── box64-0.3.3-8bb53e1/ │ │ ├── build.sh │ │ └── custom-make-install.sh │ ├── box64-0.3.4/ │ │ ├── build.sh │ │ └── custom-make-install.sh │ ├── box64-0.3.6/ │ │ ├── build.sh │ │ └── custom-make-install.sh │ ├── box64-0.3.7-cb2c29c/ │ │ ├── build.sh │ │ └── custom-make-install.sh │ ├── box64-0.3.8/ │ │ ├── build.sh │ │ └── custom-make-install.sh │ ├── box64-0.3.9-056999e/ │ │ ├── build.sh │ │ └── custom-make-install.sh │ ├── brotli/ │ │ └── build.sh │ ├── fakeintl/ │ │ ├── Makefile │ │ ├── build.sh │ │ └── libintl.h │ ├── freetype/ │ │ └── build.sh │ ├── glib/ │ │ ├── build.sh │ │ ├── gio-gdbusprivate.c.patch │ │ ├── gio-gkeyfilesettingsbackend.c.patch │ │ ├── gio-gnetworking.h.in.patch │ │ ├── gio-gunixmounts.c.patch │ │ ├── gio-xdgmime-xdgmime.c.patch │ │ ├── glib-gcharset.c.patch │ │ ├── glib-gspawn.c.patch │ │ ├── glib-gthread-posix.c.patch │ │ ├── glib-gthreadprivate.h.patch │ │ ├── glib-gtimezone.patch │ │ ├── glib-gtypes.h.patch │ │ ├── glib-gutils.c.patch │ │ ├── glib-no-ovverride-host-binary.patch │ │ ├── glib-tests-meson.build.patch │ │ └── meson.build.patch │ ├── gst-plugins-bad/ │ │ ├── build.sh │ │ └── fix-build.patch │ ├── gst-plugins-base/ │ │ └── build.sh │ ├── gst-plugins-good/ │ │ └── build.sh │ ├── gst-plugins-ugly/ │ │ └── build.sh │ ├── gstreamer/ │ │ └── build.sh │ ├── icoutils/ │ │ └── build.sh │ ├── libX11/ │ │ ├── build.sh │ │ ├── fix-pthread.patch │ │ ├── src-CrGlCur.c.patch │ │ └── src-XlibInt.c.patch │ ├── libXau/ │ │ ├── build.sh │ │ └── libXau-1.0.8_AuLock.c.patch │ ├── libXcomposite/ │ │ └── build.sh │ ├── libXcursor/ │ │ ├── build.sh │ │ └── fix-paths.patch │ ├── libXdmcp/ │ │ └── build.sh │ ├── libXext/ │ │ └── build.sh │ ├── libXfixes/ │ │ └── build.sh │ ├── libXi/ │ │ └── build.sh │ ├── libXinerama/ │ │ └── build.sh │ ├── libXrandr/ │ │ └── build.sh │ ├── libXrender/ │ │ └── build.sh │ ├── libXxf86vm/ │ │ └── build.sh │ ├── libadrenotools/ │ │ ├── 01-fix-build.patch │ │ ├── build.sh │ │ └── custom-make-install.sh │ ├── libandroid-wordexp/ │ │ ├── Makefile │ │ ├── build.sh │ │ ├── wordexp.c │ │ └── wordexp.h │ ├── libarchive/ │ │ ├── archive.h.patch │ │ ├── archive_entry.h.patch │ │ ├── archive_string.c.patch │ │ ├── archive_util.c.patch │ │ ├── archive_write_disk_posix.c.patch │ │ ├── archive_write_set_format_zip.c.patch │ │ ├── build.sh │ │ └── fix-cmake-minimum.patch │ ├── libc++/ │ │ ├── Makefile │ │ ├── build.sh │ │ └── custom-make-install.sh │ ├── libdrm/ │ │ └── build.sh │ ├── libevent/ │ │ ├── build.sh │ │ ├── cmake-minimum-fix.patch │ │ └── fix.patch │ ├── libexpat/ │ │ └── build.sh │ ├── libffi/ │ │ └── build.sh │ ├── libghttp/ │ │ └── build.sh │ ├── libglvnd/ │ │ ├── build.sh │ │ └── egl-not-android.diff │ ├── libgmp/ │ │ └── build.sh │ ├── libgnutls/ │ │ ├── build.sh │ │ ├── gl-stdio-impl.h.patch │ │ └── src-gl-stdio-impl.h.patch │ ├── libiconv/ │ │ └── build.sh │ ├── libidn2/ │ │ ├── 0000-disable-versioning-of-symbols.patch │ │ └── build.sh │ ├── libnettle/ │ │ ├── build.sh │ │ └── configure.patch │ ├── libogg/ │ │ └── build.sh │ ├── libpng/ │ │ └── build.sh │ ├── libsndfile/ │ │ ├── build.sh │ │ ├── fix-cmake-minimum.patch │ │ └── fix-tmpdir-and-alsa.patch │ ├── libtool/ │ │ └── build.sh │ ├── libunbound/ │ │ ├── build.sh │ │ ├── libunbound-libunbound.c.patch │ │ └── smallapp-unbound-host.c.patch │ ├── libunistring/ │ │ └── build.sh │ ├── libvorbis/ │ │ └── build.sh │ ├── libxcb/ │ │ ├── build.sh │ │ └── libxcb-1.12_src_xcb_util.c.patch │ ├── libxml2/ │ │ └── build.sh │ ├── libxshmfence/ │ │ └── build.sh │ ├── mangohud/ │ │ ├── 01-fix-build.patch │ │ ├── 02-fix-x11-lib-name.patch │ │ ├── 03-not-search-gpu-on-sys-folder.patch │ │ ├── 04-set-android-os-name.patch │ │ ├── 05-disable-cpu-info.patch │ │ └── build.sh │ ├── mesa-demos/ │ │ ├── 0001-fix-KHR-define.patch │ │ ├── build.sh │ │ └── src-tests-texdown.c.patch │ ├── mesa-vulkan-freedreno-24.0.0/ │ │ ├── build.sh │ │ ├── disable-memfd-create-getrandom.patch │ │ ├── force-linux-like-build.patch │ │ ├── install-drivers-without-hardlinks.patch │ │ ├── tu_kgsl_export_dmabuf.patch │ │ └── wsi-common-no-pthread-cancel.patch │ ├── mesa-vulkan-freedreno-24.3.0/ │ │ ├── build.sh │ │ ├── disable-memfd-create-getrandom.patch │ │ ├── experimental-ad710-support.patch │ │ ├── force-linux-like-build.patch │ │ ├── install-drivers-without-hardlinks.patch │ │ └── wsi-common-no-pthread-cancel.patch │ ├── mesa-vulkan-freedreno-25.0.0/ │ │ ├── build.sh │ │ ├── disable-memfd-create-getrandom.patch │ │ ├── experimental-ad710-support.patch │ │ ├── force-linux-like-build.patch │ │ ├── install-drivers-without-hardlinks.patch │ │ └── wsi-common-no-pthread-cancel.patch │ ├── mesa-vulkan-freedreno-25.0.3/ │ │ ├── build.sh │ │ ├── disable-memfd-create-getrandom.patch │ │ ├── experimental-ad710-support.patch │ │ ├── force-linux-like-build.patch │ │ ├── install-drivers-without-hardlinks.patch │ │ └── wsi-common-no-pthread-cancel.patch │ ├── mesa-vulkan-freedreno-25.1.0/ │ │ ├── build.sh │ │ ├── disable-memfd-create-getrandom.patch │ │ ├── experimental-ad710-support.patch │ │ ├── force-linux-like-build.patch │ │ ├── install-drivers-without-hardlinks.patch │ │ └── wsi-common-no-pthread-cancel.patch │ ├── mesa-vulkan-freedreno-25.1.4/ │ │ ├── build.sh │ │ ├── disable-memfd-create-getrandom.patch │ │ ├── experimental-ad710-support.patch │ │ ├── force-linux-like-build.patch │ │ ├── install-drivers-without-hardlinks.patch │ │ └── wsi-common-no-pthread-cancel.patch │ ├── mesa-vulkan-radeon/ │ │ ├── build.sh │ │ ├── disable-memfd-create-getrandom.patch │ │ ├── force-linux-like-build.patch │ │ ├── install-drivers-without-hardlinks.patch │ │ └── wsi-common-no-pthread-cancel.patch │ ├── mesa-vulkan-wrapper/ │ │ └── build.sh │ ├── mesa-vulkan-wrapper-adrenotools/ │ │ ├── 01-implement-adrenotools.patch │ │ └── build.sh │ ├── mesa-vulkan-wrapper-rev8/ │ │ ├── 01-install-drivers-without-hardlinks.patch │ │ ├── 02-disable-memfd-create-getrandom.patch │ │ ├── 03-wsi-common-no-pthread-cancel.patch │ │ ├── 04-Android-Vulkan-wrapper.patch │ │ ├── 05-vulkan-x11-termux-x11-support.patch │ │ ├── 06-wrapper-map-dmabuf_fd.patch │ │ ├── 07-fix-build.patch │ │ └── build.sh │ ├── mesa-vulkan-wrapper-rev9/ │ │ ├── 01-install-drivers-without-hardlinks.patch │ │ ├── 02-disable-memfd-create-getrandom.patch │ │ ├── 03-Android-Vulkan-wrapper.patch │ │ ├── 03-wsi-common-no-pthread-cancel.patch │ │ ├── 04-vulkan-x11-termux-x11-support.patch │ │ ├── 05-fix-build.patch │ │ └── build.sh │ ├── mesa-zink/ │ │ ├── build.sh │ │ ├── disable-memfd-create-getrandom.patch │ │ ├── force-linux-like-build.patch │ │ ├── install-drivers-without-hardlinks.patch │ │ ├── lld-undefined-version.patch │ │ └── wsi-common-no-pthread-cancel.patch │ ├── openssl/ │ │ ├── Configurations-15-android.conf.patch │ │ ├── build.sh │ │ └── include-crypto-rand.h.patch │ ├── opus/ │ │ └── build.sh │ ├── pcre2/ │ │ └── build.sh │ ├── pulseaudio/ │ │ ├── 01-pulseaudio-android.patch │ │ ├── 02-aaudio-sink.patch │ │ ├── build.sh │ │ └── post-install.sh │ ├── wine/ │ │ ├── build.sh │ │ └── post-install.sh │ ├── xcb-proto/ │ │ └── build.sh │ ├── xkbcommon/ │ │ └── build.sh │ ├── xkeyboard-config/ │ │ └── build.sh │ ├── xorg-utils-macros/ │ │ └── build.sh │ ├── xorgproto/ │ │ ├── build.sh │ │ └── include-x11-Xos_r.h.patch │ ├── xtrans/ │ │ ├── build.sh │ │ ├── xtrans-1.3.5_Xtransutil.c.patch │ │ ├── xtrans-1.4.0_Xtranslcl.c.patch │ │ └── xtrans-1.4.0_Xtranssock.c.patch │ ├── zlib/ │ │ ├── build.sh │ │ └── force-shared-library.patch │ └── zstd/ │ └── build.sh └── tools/ ├── create-rat-pkg.sh └── download-external-dependencies.sh ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/workflows/build.yml ================================================ name: Build and Release MiceWine RootFS on: push: branches: "*" workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - name: "Install ArchLinux" run: | sudo apt update sudo apt install -y arch-install-scripts wget sudo mkdir -p /mnt/ wget https://geo.mirror.pkgbuild.com/iso/latest/archlinux-bootstrap-x86_64.tar.zst sudo tar -xf archlinux-bootstrap-x86_64.tar.zst sudo rm -f archlinux-bootstrap-x86_64.tar.zst sudo mv root.x86_64 /mnt/arch sudo arch-chroot /mnt/arch bash -c "pacman-key --init && pacman-key --populate && sed -i "s/#Server/Server/g" /etc/pacman.d/mirrorlist && sed -i "s/CheckSpace/#CheckSpace/g" /etc/pacman.conf && pacman -Syu --noconfirm base base-devel git cmake meson ninja bison flex python-pip wget python-mako python-pyyaml unzip 7zip glslang glib2-devel python-docutils xmlto fop libxslt python-docutils" - name: "Checkout Repository" uses: actions/checkout@v4 with: fetch-depth: 0 - name: "Copy Repository to Chroot" run: | sudo cp -rf $PWD /mnt/arch/MiceWine-RootFS-Generator - name: "Download Latest Release Rat Packages" run: | curl -LO# https://github.com/KreitinnSoftware/MiceWine-RootFS-Generator/releases/download/$(curl -s https://api.github.com/repos/KreitinnSoftware/MiceWine-RootFS-Generator/releases | grep tag_name -m 1 | cut -d ":" -f 2 | sed "s/\"//g" | sed "s/,//g" | sed "s/ //g")/MiceWine-Packages.zip || true sudo unzip -o MiceWine-Packages.zip -d /mnt/arch/MiceWine-RootFS-Generator/built-pkgs || true rm -f MiceWine-Packages.zip - name: "Setup Basic Android (x86_64) Runtime Environment (Required for Building x86_64 glib)" run: | git clone https://github.com/termux/termux-docker.git sudo cp -rf termux-docker/system/x86 /mnt/arch/system sudo chown -R $(whoami):$(whoami) /mnt/arch/system sudo chmod 755 -R /mnt/arch/system - name: "Start Building (x86_64)" run: | sudo arch-chroot /mnt/arch bash -c "cd /MiceWine-RootFS-Generator && ./build-all.sh x86_64 --ci && cd logs && 7z a /MiceWine-RootFS-$(git rev-parse --short HEAD)-x86_64-Logs.zip" - name: "Create RootFS File (x86_64)" run: | sudo arch-chroot /mnt/arch bash -c "cd /MiceWine-RootFS-Generator && ./create-rootfs-rat.sh x86_64 && mv MiceWine-RootFS-\($(git rev-parse --short HEAD)\)-x86_64.rat /MiceWine-RootFS-$(git rev-parse --short HEAD)-x86_64.rat" - name: "Clean (x86_64) RootFS" run: | sudo rm -rf /mnt/arch/data /mnt/arch/MiceWine-RootFS-Generator/workdir /mnt/arch/MiceWine-RootFS-Generator/rootfs - name: "Start Building (aarch64)" run: | sudo arch-chroot /mnt/arch bash -c "cd /MiceWine-RootFS-Generator && ./build-all.sh aarch64 --ci && cd logs && 7z a /MiceWine-RootFS-$(git rev-parse --short HEAD)-aarch64-Logs.zip" - name: "Create RootFS File (aarch64)" run: | sudo arch-chroot /mnt/arch bash -c "cd /MiceWine-RootFS-Generator && ./create-rootfs-rat.sh aarch64 && mv MiceWine-RootFS-\($(git rev-parse --short HEAD)\)-aarch64.rat /MiceWine-RootFS-$(git rev-parse --short HEAD)-aarch64.rat" - name: "Save Rat Packages" run: | sudo arch-chroot /mnt/arch bash -c "cd /MiceWine-RootFS-Generator/built-pkgs && 7z a /MiceWine-Packages.zip" - name: "Get Short SHA" run: | echo "SHORT_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - name: "Create Release" uses: softprops/action-gh-release@v1 with: name: "MiceWine RootFS (${{ env.SHORT_SHA }})" tag_name: ${{ env.SHORT_SHA }} prerelease: true files: | /mnt/arch/*.rat /mnt/arch/*.zip ================================================ FILE: .gitignore ================================================ workdir logs cache rootfs built-pkgs wine-utils *.rat ================================================ FILE: build-all.sh ================================================ #!/bin/bash setupBuildEnv() { if [ ! -d "$INIT_DIR/cache/android-ndk" ]; then echo "Downloading NDK..." curl --output "cache/$NDK_FILENAME" -#L "$NDK_URL" echo "Checking SHA512..." SHA512=$(sha512sum "cache/$NDK_FILENAME" | cut -d ' ' -f 1) if [ "$SHA512" != "$NDK_SHA512" ]; then echo "Error on Checking SHA512 for NDK... Aborting" rm -f "cache/$NDK_FILENAME" exit 1 fi echo "Unpacking NDK..." unzip "cache/$NDK_FILENAME" -d "cache" &> /dev/null mv "cache/$(unzip -Z1 "cache/$NDK_FILENAME" | cut -d "/" -f 1 | head -n 1)" "cache/android-ndk" chmod -R +x "cache/android-ndk" rm -f "cache/$NDK_FILENAME" echo "" fi if [ ! -d "$INIT_DIR/cache/mingw" ]; then echo "Downloading MinGW..." curl --output "cache/$MINGW_FILENAME" -#L "$MINGW_URL" echo "Checking SHA512..." SHA512=$(sha512sum "cache/$MINGW_FILENAME" | cut -d ' ' -f 1) if [ "$SHA512" != "$MINGW_SHA512" ]; then echo "Error on Checking SHA512 for MinGW... Aborting" rm -f "cache/$MINGW_FILENAME" exit 1 fi echo "Unpacking MinGW..." tar -xf "cache/$MINGW_FILENAME" -C "cache" mv "cache/$(tar -tf "cache/$MINGW_FILENAME" | cut -d "/" -f 1 | head -n 1)/$(tar -tf "cache/$MINGW_FILENAME" | cut -d "/" -f 2 | head -n 1)" "cache/mingw" rm -f "cache/$MINGW_FILENAME" echo "" fi export PATH=$INIT_PATH:$INIT_DIR/cache/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin:$INIT_DIR/cache/mingw/bin export ANDROID_SDK="$1" export CC=$ARCH-linux-android$ANDROID_SDK-clang export CXX=$CC++ export TOOLCHAIN_VERSION="$ARCH-linux-android-4.9" export TOOLCHAIN_TRIPLE="$ARCH-linux-android" export PKG_CONFIG_PATH="$PREFIX/share/pkgconfig:$PREFIX/lib/pkgconfig" export PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" export PKG_CONFIG="/usr/bin/pkg-config" } applyPatches() { for patch in $(find $INIT_DIR/packages/$package -name "*.patch" | sort); do echo " - Applying '$(basename $patch)'..." patch -p1 < "$patch" -ts if [ $? != 0 ]; then echo " -- Error on Applying Patch '$(basename $patch)' on '$package'" exit 1 fi done echo "" $RUN_POST_APPLY_PATCH } downloadPackage() { if [ -e "$INIT_DIR/cache/$package" ]; then echo "-- Package '$package' already downloaded." else echo "-- Downloading '$package'..." curl --output "$INIT_DIR/cache/$package" -# -L $SRC_URL fi local ARCHIVE_MIME_TYPE=$(file -b --mime-type $INIT_DIR/cache/$package) local ARCHIVE_BASE_FOLDER case $ARCHIVE_MIME_TYPE in "application/x-xz"|"application/gzip"|"application/x-bzip2") ARCHIVE_BASE_FOLDER=$(tar -tf "$INIT_DIR/cache/$package" | cut -d "/" -f 1 | head -n 1) if [ ! -f "$ARCHIVE_BASE_FOLDER" ]; then tar -xf "$INIT_DIR/cache/$package" fi ;; *) ARCHIVE_BASE_FOLDER=$(unzip -Z1 "$INIT_DIR/cache/$package" | cut -d "/" -f 1 | head -n 1) if [ ! -f "$ARCHIVE_BASE_FOLDER" ]; then unzip -o "$INIT_DIR/cache/$package" 1> /dev/null fi esac mv $ARCHIVE_BASE_FOLDER $package } gitDownload() { if [ -d "$INIT_DIR/cache/$package" ]; then echo "-- Package '$package' already downloaded." else echo "-- Git Cloning '$package'..." git clone --no-checkout $GIT_URL "$INIT_DIR/cache/$package" &> /dev/zero fi git clone "$INIT_DIR/cache/$package" &> /dev/zero cd $package git reset --hard $GIT_COMMIT &> /dev/zero git checkout $GIT_COMMIT . &> /dev/zero git submodule update --init --recursive &> /dev/zero cd .. } setupPackage() { local package=$1 unset PKG_VER PKG_CATEGORY PKG_PRETTY_NAME PKG_DOWNLOADABLE unset SRC_URL GIT_URL GIT_COMMIT unset HOST_BUILD_FOLDER HOST_BUILD_MAKE HOST_BUILD_CONFIGURE_ARGS HOST_BUILD_CFLAGS HOST_BUILD_CXXFLAGS HOST_BUILD_LDFLAGS unset CONFIGURE_ARGS MESON_ARGS CMAKE_ARGS unset CFLAGS CPPFLAGS LDFLAGS LIBS OVERRIDE_PREFIX OVERRIDE_PKG_CONFIG_PATH unset RUN_POST_APPLY_PATCH RUN_POST_BUILD RUN_POST_CONFIGURE unset BLACKLIST_ARCH BUILD_IN_SRC VK_DRIVER_LIB source "$INIT_DIR/packages/$package/build.sh" if [ -n "$SRC_URL" ] && [ -n "$GIT_URL" ]; then echo "E: Package Source Mismatch, SRC_URL and GIT_URL set, Stopping..." exit 1 fi if [ ! -n "$GIT_URL" ] && [ -n "$GIT_COMMIT" ]; then echo "E: GIT_URL is set but GIT_COMMIT not, Stopping..." exit 1 fi if [ -n "$GIT_COMMIT" ]; then PKG_VER=$(echo $PKG_VER | sed "s/\[gss\]/$(echo $GIT_COMMIT | cut -c1-7)/g") fi if [ -f "$INIT_DIR/built-pkgs/$package-$PKG_VER-$ARCH.rat" ]; then echo "-- Package '$package' already built." return 0 fi if [ -e "$INIT_DIR/workdir/$package/build.sh" ]; then echo "-- Package '$package' already configured." return 0 fi if [ "$BLACKLIST_ARCH" == "$ARCH" ]; then echo "-- Warning: '$package' will not be built." return 0 fi if [ -n "$SRC_URL" ]; then downloadPackage elif [ -n "$GIT_URL" ]; then gitDownload elif [ -n "$BUILD_IN_SRC" ]; then mkdir -p $package cp -rf "$INIT_DIR/packages/$package/"* $package rm $package/build.sh fi cd $package applyPatches export PREFIX_DIR=$PREFIX echo "export CFLAGS=\"$CFLAGS\" LIBS=\"$LIBS\" CPPFLAGS=\"$CPPFLAGS\" LDFLAGS=\"-Wl,-rpath="$PREFIX_DIR/lib" $LDFLAGS\"" > build.sh echo "export DESTDIR=\"$INIT_DIR/workdir/$package/destdir-pkg\"" >> build.sh if [ -n "$OVERRIDE_PREFIX" ]; then PREFIX_DIR=$OVERRIDE_PREFIX fi if [ "$OVERRIDE_PKG_CONFIG_PATH" != "" ]; then echo "export PKG_CONFIG_PATH=$OVERRIDE_PKG_CONFIG_PATH" >> build.sh else echo "export PKG_CONFIG_PATH=$PKG_CONFIG_PATH" >> build.sh fi if [ -f "configure" ] && [ -n "$CONFIGURE_ARGS" ]; then if [ -n "$HOST_BUILD_CONFIGURE_ARGS" ]; then echo "mkdir -p $HOST_BUILD_FOLDER" >> build.sh echo "cd $HOST_BUILD_FOLDER" >> build.sh echo "env -i bash -l -c \"../configure $HOST_BUILD_CONFIGURE_ARGS\"" >> build.sh echo "$HOST_BUILD_MAKE" >> build.sh echo 'cd $OLDPWD' >> build.sh fi echo "../configure --libdir=$PREFIX_DIR/lib --prefix=$PREFIX_DIR $CONFIGURE_ARGS" >> build.sh echo "$RUN_POST_CONFIGURE" >> build.sh if [ -f "$INIT_DIR/packages/$package/post-configure.sh" ]; then echo "$INIT_DIR/packages/$package/post-configure.sh" >> build.sh fi echo "make -j $(nproc)" >> build.sh if [ -f "$INIT_DIR/packages/$package/custom-make-install.sh" ]; then echo "$INIT_DIR/packages/$package/custom-make-install.sh" >> build.sh else echo "make -j $(nproc) install" >> build.sh fi elif [ -f "autogen.sh" ] && [ -n "$CONFIGURE_ARGS" ]; then echo "cd .." >> build.sh echo "./autogen.sh" >> build.sh echo "cd build_dir" >> build.sh echo "../configure --libdir=$PREFIX_DIR/lib --prefix=$PREFIX_DIR $CONFIGURE_ARGS" >> build.sh echo "$RUN_POST_CONFIGURE" >> build.sh if [ -e "$INIT_DIR/packages/$package/post-configure.sh" ]; then echo "$INIT_DIR/packages/$package/post-configure.sh" >> build.sh fi echo "make -j $(nproc)" >> build.sh if [ -e "$INIT_DIR/packages/$package/custom-make-install.sh" ]; then echo "$INIT_DIR/packages/$package/custom-make-install.sh" >> build.sh else echo "make -j $(nproc) install" >> build.sh fi elif [ -e "CMakeLists.txt" ] && [ -n "$CMAKE_ARGS" ]; then echo "cmake -DCMAKE_INSTALL_PREFIX=$PREFIX_DIR -DCMAKE_INSTALL_LIBDIR=$PREFIX_DIR/lib -DCMAKE_BUILD_TYPE=Release $CMAKE_ARGS .." >> build.sh echo "make -j $(nproc)" >> build.sh if [ -e "$INIT_DIR/packages/$package/custom-make-install.sh" ]; then echo "$INIT_DIR/packages/$package/custom-make-install.sh" >> build.sh else echo "make -j $(nproc) install" >> build.sh fi elif [ -e "meson.build" ] && [ -n "$MESON_ARGS" ]; then echo "meson setup --cross-file=$INIT_DIR/build_config/meson-cross-file-$ARCH -Dprefix=$PREFIX_DIR -Dbuildtype=release $MESON_ARGS .." >> build.sh if [ -e "$INIT_DIR/packages/$package/post-configure.sh" ]; then echo "$INIT_DIR/packages/$package/post-configure.sh" >> build.sh fi echo "ninja -j $(nproc)" >> build.sh if [ -e "$INIT_DIR/packages/$package/custom-make-install.sh" ]; then echo "$INIT_DIR/packages/$package/custom-make-install.sh" >> build.sh else echo "ninja -j $(nproc) install" >> build.sh fi elif [ -e "Configure" ] && [ -n "$OPENSSL_FLAGS" ]; then echo "../Configure --prefix=$PREFIX_DIR $OPENSSL_FLAGS" >> build.sh if [ -e "$INIT_DIR/packages/$package/post-configure.sh" ]; then echo "$INIT_DIR/packages/$package/post-configure.sh" >> build.sh fi echo "make -j $(nproc)" >> build.sh echo "make -j $(nproc) DESTDIR=\"\$DESTDIR\" install_sw" >> build.sh elif [ -e "Makefile" ]; then echo "cd .." >> build.sh echo "make -j $(nproc)" >> build.sh if [ -e "$INIT_DIR/packages/$package/custom-make-install.sh" ]; then echo "$INIT_DIR/packages/$package/custom-make-install.sh" >> build.sh else echo "make -j $(nproc) install" >> build.sh fi echo "cd build_dir" >> build.sh else echo "Unsupported build system. Stopping..." exit 1 fi if [ -e "$INIT_DIR/packages/$package/post-install.sh" ]; then echo "$INIT_DIR/packages/$package/post-install.sh" >> build.sh fi echo 'echo $? > exit_code' >> build.sh echo "$PKG_PRETTY_NAME" >> pkg-pretty-name echo "$PKG_VER" >> pkg-ver echo "$PKG_CATEGORY" >> pkg-category echo "$PKG_DOWNLOADABLE" >> pkg-downloadable if [ "$PKG_CATEGORY" == "VulkanDriver" ] || [ "$PKG_CATEGORY" == "AdrenoTools" ]; then echo "$VK_DRIVER_LIB" >> vk-driver-lib fi git -C "$INIT_DIR" log -1 --format="%H" -- "packages/$package" > pkg-commit chmod +x build.sh cd .. if [ -n "$CI" ]; then rm -rf "$INIT_DIR/cache/$package" fi } setupPackages() { cd "$INIT_DIR/workdir" # We need to build package list respecting dependencies order # First add packages that don't need extra dependencies rm -f "$INIT_DIR/workdir/index" export FILTERED_PACKAGES="" export TODO_PACKAGES=$PACKAGES while [ -n "$TODO_PACKAGES" ]; do NEW_TODO="" for package in $TODO_PACKAGES; do unset DEPENDENCIES if [ ! -d "$INIT_DIR/packages/$package" ]; then echo "E: Package '$package' don't exists." exit 1 fi source "$INIT_DIR/packages/$package/build.sh" if [ -z "$DEPENDENCIES" ]; then if ! echo " $FILTERED_PACKAGES " | grep -q " $package "; then FILTERED_PACKAGES+="$package " continue fi fi for dep in $DEPENDENCIES; do if ! echo " $FILTERED_PACKAGES " | grep -q " $dep "; then NEW_TODO+="$package " break fi done if ! echo " $NEW_TODO " | grep -q " $package "; then if ! echo " $FILTERED_PACKAGES " | grep -q " $package "; then FILTERED_PACKAGES+="$package " fi fi done TODO_PACKAGES="$NEW_TODO" done echo $FILTERED_PACKAGES > "$INIT_DIR/workdir/index" for package in $FILTERED_PACKAGES; do packageFullPath=$(ls "$INIT_DIR/built-pkgs/$package-"*"$ARCH.rat" 2> /dev/zero) packageCommitFullPath=$(ls "$INIT_DIR/built-pkgs/$package-"*"$ARCH.commit" 2> /dev/zero) if [ -f "$packageFullPath" ]; then packageCommit=$(cat "$packageCommitFullPath") actualCommit=$(git -C "$INIT_DIR" log -1 --format="%H" -- "packages/$package") if [ "$packageCommit" == "$actualCommit" ]; then installBuiltPackage "$packageFullPath" else echo "W: Package '$package' already built, But it's source is changed. Requires Rebuilding..." rm -f "$packageFullPath" rm -f "$packageCommitFullPath" fi fi if [ "$packageCommit" != "$actualCommit" ]; then for p in $FILTERED_PACKAGES; do unset DEPENDENCIES source "$INIT_DIR/packages/$p/build.sh" if [[ " $DEPENDENCIES " == *" $package "* ]]; then packageFullPath=$(ls "$INIT_DIR/built-pkgs/$p-"*"$ARCH.rat" 2> /dev/zero) packageCommitFullPath=$(ls "$INIT_DIR/built-pkgs/$p-"*"$ARCH.commit" 2> /dev/zero) echo "W: Package '$p' uses '$package' as Dependency, Requires Rebuilding..." rm -f "$packageFullPath" rm -f "$packageCommitFullPath" fi done fi setupPackage $package done } installBuiltPackage() { local package=$1 if [ ! -e "$APP_ROOT_DIR/packages/$(basename $package .rat)" ]; then echo "-- Installing '$(basename $package .rat)'" mkdir -p $APP_ROOT_DIR/packages tar -xf "$package" -C "$APP_ROOT_DIR" touch $APP_ROOT_DIR/makeSymlinks.sh bash $APP_ROOT_DIR/makeSymlinks.sh rm -f $APP_ROOT_DIR/makeSymlinks.sh touch $APP_ROOT_DIR/packages/$(basename $package .rat) fi } compileAll() { echo "" echo "-- Starting Building --" echo "" local packageNum=1 local packageCount=$(( $(ls "$INIT_DIR/workdir" | wc -l) - 1 )) for package in $(cat "$INIT_DIR/workdir/index"); do if [ ! -d "$INIT_DIR/workdir/$package" ]; then continue fi local packageBuildDir="$INIT_DIR/workdir/$package/build_dir" local packageDestDirPkg="$INIT_DIR/workdir/$package/destdir-pkg" mkdir -p "$packageBuildDir" mkdir -p "$packageDestDirPkg" cd "$INIT_DIR/workdir/$package/build_dir" pkgLocalChanged="$(git -C "$INIT_DIR" status --short "packages/$package")" if [ -n "$pkgLocalChanged" ]; then echo "-- W: Source Files for Package '$package' was changed. Reconfiguring..." echo "" cd "$INIT_DIR/workdir" rm -rf "$package" "$INIT_DIR/built-pkgs/$package-"* setupPackage $package mkdir -p "$packageBuildDir" mkdir -p "$packageDestDirPkg" cd "$packageBuildDir" fi touch exit_code pkgVersion=$(cat "../pkg-ver") pkgCategory=$(cat "../pkg-category") pkgCommit=$(cat "../pkg-commit") pkgDownloadable=$(cat "../pkg-downloadable") pkgPrettyName=$(cat "../pkg-pretty-name") vkDriverLib="" if [[ "$pkgCategory" == "VulkanDriver" || "$pkgCategory" == "AdrenoTools" ]]; then vkDriverLib=$(cat "../vk-driver-lib") fi if [ -f "$INIT_DIR/built-pkgs/$package-$pkgVersion-$ARCH.rat" ]; then echo "-- [$packageNum/$packageCount] Package '$package' already built." packageNum=$(( $packageNum + 1 )) continue fi echo "-- [$packageNum/$packageCount] Compiling Package '$package'..." ../build.sh 1> "$INIT_DIR/logs/$package-log.txt" 2> "$INIT_DIR/logs/$package-error_log.txt" if [ "$?" != "0" ]; then echo "- [$packageNum/$packageCount] Package: '"$package"' failed to compile. Check logs" exit 0 fi if [ ! -d "$packageDestDirPkg/data/data/com.micewine.emu" ]; then echo "- [$packageNum/$packageCount] Package: '"$package"' failed to compile. Check logs" exit 0 fi cp -rf "$packageDestDirPkg/data/data/com.micewine.emu/"* "/data/data/com.micewine.emu" find "$packageDestDirPkg" -type f > "$INIT_DIR/logs/$package-package-files.txt" echo $pkgCommit > "$INIT_DIR/built-pkgs/$package-$pkgVersion-$ARCH.commit" if [ -n "$pkgDownloadable" ]; then touch "$INIT_DIR/built-pkgs/$package-$pkgVersion-$ARCH.isDownloadable" fi if [ ! -n "$pkgPrettyName" ]; then pkgPrettyName=$package fi $INIT_DIR/tools/create-rat-pkg.sh "$package" "$pkgPrettyName" "$vkDriverLib" "$ARCH" "$pkgVersion" "$pkgCategory" "$packageDestDirPkg" "$INIT_DIR/built-pkgs" 0 if [ -n "$CI" ]; then rm -rf "$INIT_DIR/workdir/$package" fi packageNum=$(( $packageNum + 1 )) done } showHelp() { echo "Usage: $0 ARCH [OPTIONS]" echo "" echo "Options:" echo " --help: Show this message and exit." echo " --ci: Clean cache and build files after build of each package (for saving space on CI)" echo "" echo "Available Archs:" echo " x86_64" echo " aarch64" } if [ $# -lt 1 ]; then showHelp exit 0 fi case $1 in "aarch64"|"x86_64") export ARCH=$1 ;; "--help") showHelp exit 0 ;; *) printf "E: Unsupported Arch \"$1\" Specified.\n\n" showHelp exit 0 esac export APP_ROOT_DIR=/data/data/com.micewine.emu export PREFIX=$APP_ROOT_DIR/files/usr if [ ! -e "$PREFIX" ]; then sudo mkdir -p "$PREFIX" sudo chown -R $(whoami):$(whoami) "$APP_ROOT_DIR" sudo chmod 755 -R "$APP_ROOT_DIR" fi export NDK_URL="https://dl.google.com/android/repository/android-ndk-r26b-linux.zip" export NDK_FILENAME="${NDK_URL##*/}" export NDK_SHA512="233e0b34c946a1ba60022809536307613ed956a4d596b3f43dc75e752b9d973f7c07f03a404a72a893629b86d8046664b9020920b3a6c64f68e223c5da109ec5" export MINGW_URL="http://techer.pascal.free.fr/Red-Rose_MinGW-w64-Toolchain/Red-Rose-MinGW-w64-Posix-Urct-v12.0.0.r458.g03d8a40f5-Gcc-11.5.0.tar.xz" export MINGW_FILENAME="${MINGW_URL##*/}" export MINGW_SHA512="c92e8d4c5811ad82d457a5618f902c2f7e951aa4e3e1cbd640be243ac4d1810e26ea7a933cb2b4b28cda715c04a7f6453060e1b13dd6bf953b69e6ea5ec75c93" export PACKAGES="$(ls packages)" export INIT_DIR="$PWD" export INIT_PATH="$PATH" case $* in *"--ci"*) export CI=1 esac rm -rf logs mkdir -p {workdir,logs,cache,built-pkgs} setupBuildEnv 29 $ARCH setupPackages compileAll ================================================ FILE: build_config/meson-cross-file-aarch64 ================================================ [binaries] pkg-config = '/usr/bin/pkg-config' cmake = '/usr/bin/cmake' [host_machine] system = 'linux' cpu_family = 'aarch64' cpu = 'aarch64' endian = 'little' [properties] skip_sanity_check = true ================================================ FILE: build_config/meson-cross-file-x86_64 ================================================ [binaries] pkg-config = '/usr/bin/pkg-config' cmake = '/usr/bin/cmake' [host_machine] system = 'linux' cpu_family = 'x86_64' cpu = 'x86_64' endian = 'little' [properties] skip_sanity_check = true ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/Dolphin1.x ================================================ xof 0303txt 0032 template XSkinMeshHeader { <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> WORD nMaxSkinWeightsPerVertex; WORD nMaxSkinWeightsPerFace; WORD nBones; } template VertexDuplicationIndices { DWORD nIndices; DWORD nOriginalVertices; array DWORD indices[nIndices]; } template SkinWeights { <6f0d123b-bad2-4167-a0d0-80224f25fabb> STRING transformNodeName; DWORD nWeights; array DWORD vertexIndices[nWeights]; array FLOAT weights[nWeights]; Matrix4x4 matrixOffset; } Frame SCENE_ROOT { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Frame frm-Dolph01 { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh Dolph01 { 284; -1.947576;64.130737;8.130002;, -7.800217;64.421143;-0.000000;, 31.746841;100.080002;0.000000;, 39.366852;98.809982;6.099998;, 64.766846;116.079941;0.000000;, 68.076843;113.040024;3.559999;, 96.266846;118.369980;0.000000;, 98.046844;114.049973;2.062331;, 114.296844;113.540024;0.000000;, 96.776840;54.869980;6.517096;, 96.266846;72.900009;0.000000;, 106.936844;48.009995;0.000000;, 57.146851;62.739975;11.680001;, 72.136841;84.080002;6.633347;, 82.806854;95.759995;4.012877;, -171.387756;-30.480600;-0.000000;, -176.425171;-38.541008;7.620002;, -181.361847;-42.534954;-0.000000;, -154.447891;-14.097557;-0.000000;, -158.022141;-20.583174;13.970002;, -134.163620;1.137530;5.330001;, -95.865860;31.137846;-0.000000;, -96.765869;24.994415;18.290003;, -133.079376;-0.864030;13.970002;, -51.677738;53.535828;-0.000000;, -52.571472;48.189205;22.350002;, -5.121027;48.889385;24.639997;, 53.596848;48.009995;26.669998;, 110.155029;35.786564;20.319998;, 170.616714;4.479805;11.680001;, 171.602066;8.608099;0.000000;, 208.776871;-26.718767;0.000000;, 202.547195;-36.567245;14.730000;, 227.820557;-49.403225;0.000000;, 219.635742;-63.135403;11.939998;, 242.099518;-74.700821;0.000000;, 234.301636;-87.676208;7.870000;, 251.484833;-95.519829;0.000000;, 246.917847;-103.938271;9.650002;, 250.772247;-115.000572;0.000000;, 246.972794;-113.397652;9.375875;, -135.384537;-7.302986;22.350002;, -119.088821;-7.975105;32.770000;, -89.951057;11.294539;31.705227;, -52.211617;29.392502;31.999998;, -4.920195;31.117809;35.809998;, 45.976837;30.489975;34.040001;, 107.296997;22.034000;28.449999;, 167.911224;-2.593308;18.290003;, -130.285431;-21.345243;36.580002;, -140.494431;-20.199341;31.750000;, -147.848190;-27.584318;27.430000;, -163.472275;-45.189865;20.830002;, -177.160553;-59.922421;10.160001;, -127.643097;-31.164843;35.809998;, -138.714371;-27.248716;30.989998;, -178.659561;-67.602631;13.970002;, -171.449890;-76.994270;14.990002;, -197.253006;-101.077950;7.369999;, -202.413574;-98.976006;7.369999;, -207.100449;-102.960793;4.059999;, -208.425430;-101.488464;-0.000000;, -185.977982;-69.142410;-0.000000;, -183.263901;-66.751122;5.079998;, -148.114319;-41.313347;30.480000;, -141.038208;-33.178036;30.730001;, -146.992157;-44.074024;30.730001;, -160.275284;-49.135139;26.420000;, -156.781799;-54.340389;25.910000;, -167.502533;-80.661797;16.259998;, -190.870132;-101.854103;8.379999;, -149.784882;-65.020676;27.047174;, -141.460510;-49.464539;34.540001;, -118.326942;-56.489838;34.799999;, -147.041763;-70.503639;27.430000;, -136.580017;-43.941616;34.799999;, -134.877014;-34.732857;34.540001;, -120.784431;-44.892262;38.610001;, -165.797058;-85.682549;18.290003;, -186.959900;-104.512314;10.919998;, -142.181732;-91.929665;17.020000;, -106.990486;-81.240273;22.350002;, -159.671616;-93.342796;10.160001;, -165.156662;-89.221420;17.269999;, -79.961212;-58.794125;43.180000;, -78.005432;-68.644684;35.049995;, -116.504807;-43.714310;40.389996;, -77.647179;-28.399250;49.279999;, -112.081055;-25.759773;40.130001;, -111.537277;-12.781038;36.580002;, -81.392578;-4.881754;42.669998;, -49.742218;6.021069;46.230000;, -38.129295;-19.131491;51.049999;, -0.027278;6.284186;48.009998;, 5.076844;-18.789993;51.049999;, 48.006851;5.089982;46.230000;, 50.036850;-18.539993;49.020000;, 103.950737;-1.727674;43.939999;, 101.204376;-28.525307;44.700001;, 159.725540;-22.174656;33.020004;, 150.980530;-44.968723;28.449999;, 192.150482;-48.016220;23.370001;, 179.132843;-68.563484;21.840002;, 210.778015;-71.539383;13.970002;, 200.929749;-82.827507;14.220000;, 223.367020;-89.510345;9.909999;, 212.621933;-96.073799;10.670001;, 239.994675;-107.823067;18.290003;, -42.573589;-51.902767;41.150002;, 6.606843;-52.830002;37.590000;, 47.240704;-51.721313;38.100002;, 94.460991;-54.226379;30.989998;, 143.387604;-64.445183;17.269999;, 173.195267;-79.735161;9.650002;, 194.066788;-90.482391;7.110003;, 213.103455;-109.579109;5.589998;, 223.323807;-117.138016;14.409779;, -53.687107;-68.761032;73.660004;, -54.473625;-70.668358;71.370003;, -32.965847;-60.505638;64.519997;, -12.362958;-70.023148;77.220001;, -25.197519;-72.225266;80.769997;, -43.310638;-71.045502;80.010002;, 3.046844;-66.030014;0.000000;, -40.286179;-67.661491;-0.000000;, 91.451996;-61.840412;0.000000;, 142.235916;-69.045692;0.000000;, 190.629211;-93.123634;0.000000;, 212.794708;-111.462990;0.000000;, -102.330307;-83.610764;-0.000000;, -69.056328;-75.146759;-0.000000;, -134.214218;-94.438782;-0.000000;, -156.798965;-95.268616;-0.000000;, -181.225388;-108.614517;-0.000000;, -184.310028;-107.456978;7.870000;, -199.704224;-117.428978;-0.000000;, -197.509445;-115.066803;4.569998;, 257.696564;-171.556595;86.610001;, 237.179489;-141.742661;73.150002;, 254.689590;-162.297256;63.250000;, 250.899612;-137.325058;9.650002;, 242.654434;-119.142982;20.904961;, 248.963318;-128.733322;0.000000;, 256.736420;-146.928177;5.840001;, 251.849289;-139.245422;0.000000;, 233.837677;-113.330627;24.129999;, -204.366486;-108.193924;3.810001;, -204.885330;-107.962814;-0.000000;, -202.401138;-113.205154;4.830000;, -204.151688;-114.039986;-0.000000;, -25.028708;-73.061371;79.250000;, -42.926811;-72.887756;78.230003;, 105.666840;93.729965;0.000000;, 46.226837;-64.342575;0.000000;, 170.627747;-83.432632;0.000000;, 223.631149;-119.390343;0.000000;, 235.158325;-143.347824;73.150002;, 229.454300;-126.607849;52.320000;, 233.005615;-124.019302;52.320000;, 255.426651;-154.044296;21.590000;, -132.747055;3.981426;-0.000000;, 39.366852;98.809982;-6.099998;, -1.947576;64.130737;-8.130002;, 68.076843;113.040024;-3.560004;, 98.046844;114.049973;-2.062331;, 96.776840;54.869980;-6.517096;, 72.136841;84.080002;-6.633341;, 57.146851;62.739975;-11.680001;, 82.806854;95.759995;-4.012877;, -176.425171;-38.541008;-7.620002;, -158.022141;-20.583174;-13.970002;, -134.163620;1.137530;-5.330001;, -133.079376;-0.864030;-13.970002;, -96.765869;24.994415;-18.289999;, -52.571472;48.189205;-22.349997;, -5.121027;48.889385;-24.639997;, 53.596848;48.009995;-26.670002;, 110.155029;35.786564;-20.320002;, 170.616714;4.479805;-11.680001;, 202.547195;-36.567245;-14.729995;, 219.635742;-63.135403;-11.939998;, 234.301636;-87.676208;-7.870005;, 246.917847;-103.938271;-9.649997;, 246.972794;-113.397652;-9.375875;, -135.384537;-7.302986;-22.349997;, -119.088821;-7.975105;-32.770000;, -89.951057;11.294539;-31.705223;, -52.211617;29.392502;-32.000004;, -4.920195;31.117809;-35.809998;, 45.976837;30.489975;-34.040001;, 107.296997;22.034000;-28.450005;, 167.911224;-2.593308;-18.289999;, -140.494431;-20.199341;-31.750000;, -130.285431;-21.345243;-36.580006;, -147.848190;-27.584318;-27.430006;, -163.472275;-45.189865;-20.830002;, -177.160553;-59.922421;-10.159996;, -138.714371;-27.248716;-30.989998;, -127.643097;-31.164843;-35.809998;, -178.659561;-67.602631;-13.970002;, -202.413574;-98.976006;-7.369999;, -197.253006;-101.077950;-7.369999;, -171.449890;-76.994270;-14.990002;, -183.263901;-66.751122;-5.079998;, -207.100449;-102.960793;-4.059999;, -146.992157;-44.074024;-30.730001;, -141.038208;-33.178036;-30.730001;, -148.114319;-41.313347;-30.480000;, -160.275284;-49.135139;-26.420000;, -156.781799;-54.340389;-25.910000;, -190.870132;-101.854103;-8.380005;, -167.502533;-80.661797;-16.260004;, -149.784882;-65.020676;-27.047174;, -141.460510;-49.464539;-34.539997;, -147.041763;-70.503639;-27.430006;, -118.326942;-56.489838;-34.799995;, -136.580017;-43.941616;-34.799995;, -134.877014;-34.732857;-34.539997;, -120.784431;-44.892262;-38.610001;, -186.959900;-104.512314;-10.919998;, -165.797058;-85.682549;-18.289999;, -130.062363;-62.004459;-31.750000;, -142.181732;-91.929665;-17.019997;, -106.990486;-81.240273;-22.349997;, -165.156662;-89.221420;-17.269999;, -159.671616;-93.342796;-10.159996;, -78.005432;-68.644684;-35.049995;, -79.961212;-58.794125;-43.180000;, -77.647179;-28.399250;-49.279995;, -116.504807;-43.714310;-40.390003;, -112.081055;-25.759773;-40.130005;, -111.537277;-12.781038;-36.580006;, -81.392578;-4.881754;-42.669998;, -38.129295;-19.131491;-51.050003;, -49.742218;6.021069;-46.230003;, 5.076844;-18.789993;-51.050003;, -0.027278;6.284186;-48.009995;, 50.036850;-18.539993;-49.020000;, 48.006851;5.089982;-46.230003;, 101.204376;-28.525307;-44.700005;, 103.950737;-1.727674;-43.940002;, 150.980530;-44.968723;-28.450005;, 159.725540;-22.174656;-33.020004;, 179.132843;-68.563484;-21.839996;, 192.150482;-48.016220;-23.369997;, 200.929749;-82.827507;-14.220005;, 210.778015;-71.539383;-13.970002;, 212.621933;-96.073799;-10.669996;, 223.367020;-89.510345;-9.910004;, 239.994675;-107.823067;-18.289999;, -42.573589;-51.902767;-41.150005;, 6.606843;-52.830002;-37.590000;, 47.240704;-51.721313;-38.100002;, 94.460991;-54.226379;-30.989998;, 143.387604;-64.445183;-17.269999;, 173.195267;-79.735161;-9.649997;, 194.066788;-90.482391;-7.110003;, 213.103455;-109.579109;-5.589998;, 223.323807;-117.138016;-14.409783;, -54.473625;-70.668358;-71.370003;, -53.687107;-68.761032;-73.660011;, -32.965847;-60.505638;-64.520004;, -12.362958;-70.023148;-77.220001;, -43.310638;-71.045502;-80.009995;, -25.197519;-72.225266;-80.769997;, -184.310028;-107.456978;-7.870005;, -197.509445;-115.066803;-4.569998;, 254.689590;-162.297256;-63.250000;, 237.179489;-141.742661;-73.150002;, 257.696564;-171.556595;-86.610001;, 242.654434;-119.142982;-20.904961;, 250.899612;-137.325058;-9.649997;, 256.736420;-146.928177;-5.840001;, 233.837677;-113.330627;-24.129999;, -204.366486;-108.193924;-3.809996;, -202.401138;-113.205154;-4.829995;, -42.926811;-72.887756;-78.230003;, -25.028708;-73.061371;-79.249992;, 233.005615;-124.019302;-52.319996;, 229.454300;-126.607849;-52.319996;, 235.158325;-143.347824;-73.150002;, 255.426651;-154.044296;-21.590004;, 117.346848;105.419968;0.000000;, -130.062363;-62.004459;31.750000;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; MeshNormals { 284; 0.154061;0.776306;-0.611241;, 0.485218;0.874393;0.000000;, 0.501943;0.864901;0.000000;, 0.196937;0.400873;-0.894716;, 0.247004;0.969015;0.000000;, 0.094987;0.474935;-0.874880;, -0.062005;0.998076;0.000000;, -0.097973;0.156957;-0.982734;, -0.439192;0.898393;0.000000;, -0.413192;0.562262;-0.716334;, -0.940811;0.338932;0.000000;, -0.662250;0.749283;0.000000;, -0.120003;0.363010;-0.924025;, -0.166943;0.091969;-0.981668;, -0.125951;0.028989;-0.991613;, 0.648896;0.760877;0.000000;, 0.718366;0.479244;-0.504257;, 0.906668;0.421845;0.000000;, 0.562064;0.827094;0.000000;, 0.584894;0.676877;-0.446919;, 0.504111;0.830183;-0.238052;, 0.463932;0.885871;0.000000;, 0.388073;0.781146;-0.489091;, 0.487116;0.817195;-0.308074;, 0.276965;0.960880;0.000000;, 0.183028;0.740112;-0.647098;, 0.012006;0.607295;-0.794386;, -0.090980;0.587870;-0.803823;, -0.290048;0.665110;-0.688114;, -0.282038;0.781104;-0.557074;, -0.294858;0.955541;0.000000;, -0.343108;0.939296;0.000000;, -0.294119;0.588239;-0.753306;, -0.405953;0.913894;0.000000;, -0.296897;0.389865;-0.871698;, -0.439192;0.898393;0.000000;, -0.122002;0.459008;-0.880015;, -0.461951;0.886906;0.000000;, -0.418980;0.696967;-0.581973;, -0.698049;0.716050;0.000000;, -0.510981;0.773972;-0.373986;, 0.425814;0.721684;-0.545761;, 0.254105;0.553228;-0.793328;, 0.221065;0.500148;-0.837247;, 0.109016;0.493074;-0.863130;, 0.004000;0.473022;-0.881041;, -0.098006;0.416026;-0.904056;, -0.154958;0.491868;-0.856770;, -0.224007;0.558016;-0.799024;, 0.248118;0.211100;-0.945449;, 0.470276;0.287169;-0.834490;, 0.484036;0.255019;-0.837063;, 0.650755;0.387854;-0.652754;, 0.754233;0.329102;-0.568176;, 0.307975;0.029998;-0.950922;, 0.393956;0.076991;-0.915899;, 0.637006;0.314003;-0.704007;, 0.315966;-0.113988;-0.941898;, 0.236981;-0.112991;-0.964921;, 0.440010;0.073002;-0.895021;, 0.819214;0.291076;-0.494129;, 0.998750;-0.049987;0.000000;, 0.839060;0.544039;0.000000;, 0.761763;0.472853;-0.442862;, 0.262104;0.143057;-0.954378;, 0.333060;0.182033;-0.925168;, 0.303127;0.093039;-0.948397;, 0.450081;0.071013;-0.890160;, 0.389056;-0.114016;-0.914131;, 0.402051;0.080010;-0.912115;, 0.314917;0.050986;-0.947749;, 0.460009;-0.058001;-0.886018;, 0.308028;-0.066006;-0.949085;, 0.185032;-0.345060;-0.920161;, 0.207039;-0.351067;-0.913174;, 0.293926;0.184953;-0.937763;, 0.357144;0.200081;-0.912368;, 0.265955;-0.016997;-0.963836;, 0.362108;-0.040012;-0.931277;, 0.213986;-0.200987;-0.955936;, 0.039998;-0.792955;-0.607966;, 0.014005;-0.780304;-0.625244;, -0.060023;-0.860329;-0.506193;, -0.059020;-0.551191;-0.832289;, 0.244024;-0.230023;-0.942094;, 0.154949;-0.900702;-0.405866;, 0.245995;-0.049999;-0.967981;, 0.146029;-0.013003;-0.989195;, 0.223974;0.129985;-0.965888;, 0.170926;0.373839;-0.911608;, 0.198048;0.332081;-0.922225;, 0.083043;0.346180;-0.934486;, 0.008002;-0.058016;-0.998284;, -0.019998;0.292973;-0.955912;, -0.025010;-0.112044;-0.993388;, -0.070977;0.301903;-0.950693;, -0.042022;-0.123063;-0.991509;, -0.139023;0.308051;-0.941157;, -0.150992;-0.243988;-0.957952;, -0.241906;0.203920;-0.948630;, -0.193099;-0.320164;-0.927474;, -0.276012;0.099004;-0.956042;, -0.200959;-0.352928;-0.913814;, -0.255139;0.027015;-0.966527;, -0.188033;-0.324057;-0.927163;, -0.003999;0.128954;-0.991643;, 0.169032;-0.269050;-0.948177;, -0.017001;0.597029;-0.802039;, -0.109988;-0.678926;-0.725921;, -0.012000;-0.715011;-0.699010;, -0.035000;-0.736993;-0.674994;, -0.136038;-0.788221;-0.600168;, -0.127993;-0.788958;-0.600968;, -0.133986;-0.784919;-0.604938;, -0.066975;-0.746723;-0.661755;, 0.041008;-0.875162;-0.482089;, 0.145951;-0.968672;-0.200932;, 0.610009;0.187003;-0.770012;, 0.219989;-0.973951;0.054997;, -0.661088;0.453060;0.598080;, -0.294927;-0.849790;-0.436892;, -0.045004;-0.269023;-0.962082;, 0.240915;0.144949;-0.959661;, 0.024992;-0.999688;0.000000;, -0.112955;-0.993600;0.000000;, -0.050985;-0.998699;0.000000;, -0.087018;-0.996207;0.000000;, -0.089003;-0.996031;0.000000;, -0.042005;-0.999117;0.000000;, -0.159044;-0.987272;0.000000;, -0.141981;-0.989869;0.000000;, -0.006000;-0.999982;0.000000;, -0.221059;-0.975260;0.000000;, -0.341020;-0.940056;0.000000;, -0.259028;-0.808087;-0.529057;, 0.171046;-0.985263;0.000000;, 0.083988;-0.813887;-0.574920;, 0.282084;-0.014004;-0.959287;, 0.522928;0.487933;-0.698904;, -0.987925;0.061995;0.141989;, -0.262064;0.935228;-0.238058;, -0.214934;0.851739;-0.477854;, -0.389085;0.921202;0.000000;, -0.613160;0.678177;0.405106;, -0.576212;-0.817300;0.000000;, 0.599068;0.322036;-0.733083;, 0.795508;-0.223143;-0.563360;, 0.981792;-0.189960;0.000000;, 0.498180;-0.243088;-0.832301;, 0.875052;-0.484029;0.000000;, -0.016996;-0.993789;0.109977;, 0.265977;-0.929920;-0.253978;, -0.911528;-0.411238;0.000000;, -0.040008;-0.999199;0.000000;, -0.086025;-0.996293;0.000000;, -0.147998;-0.988988;0.000000;, 0.363007;-0.817016;-0.448009;, 0.698904;-0.652911;-0.291960;, 0.250048;0.876166;-0.412078;, -0.995170;-0.015003;-0.097017;, 0.520074;0.854121;0.000000;, 0.196937;0.400873;0.894716;, 0.154061;0.776306;0.611241;, 0.094987;0.474935;0.874880;, -0.097973;0.156957;0.982734;, -0.413192;0.562262;0.716334;, -0.166943;0.091969;0.981668;, -0.120003;0.363010;0.924025;, -0.125951;0.028989;0.991613;, 0.718366;0.479244;0.504257;, 0.584894;0.676877;0.446919;, 0.504111;0.830183;0.238052;, 0.487116;0.817195;0.308074;, 0.388073;0.781146;0.489091;, 0.183028;0.740112;0.647098;, 0.012006;0.607295;0.794386;, -0.090980;0.587870;0.803823;, -0.290048;0.665110;0.688114;, -0.282038;0.781104;0.557074;, -0.294119;0.588239;0.753306;, -0.296897;0.389865;0.871698;, -0.122002;0.459008;0.880015;, -0.418980;0.696967;0.581973;, -0.510981;0.773972;0.373986;, 0.425814;0.721684;0.545761;, 0.254105;0.553228;0.793328;, 0.221065;0.500148;0.837247;, 0.109016;0.493074;0.863130;, 0.004000;0.473022;0.881041;, -0.098006;0.416026;0.904056;, -0.154958;0.491868;0.856770;, -0.224007;0.558016;0.799024;, 0.470276;0.287169;0.834490;, 0.248118;0.211100;0.945449;, 0.484036;0.255019;0.837063;, 0.650755;0.387854;0.652754;, 0.754233;0.329102;0.568176;, 0.393956;0.076991;0.915899;, 0.307975;0.029998;0.950922;, 0.637006;0.314003;0.704007;, 0.440010;0.073002;0.895021;, 0.236981;-0.112991;0.964921;, 0.315966;-0.113988;0.941898;, 0.761763;0.472853;0.442862;, 0.819214;0.291076;0.494129;, 0.303127;0.093039;0.948397;, 0.333060;0.182033;0.925168;, 0.262104;0.143057;0.954378;, 0.450081;0.071013;0.890160;, 0.389056;-0.114016;0.914131;, 0.290968;-0.039996;0.955896;, 0.402051;0.080010;0.912115;, 0.460009;-0.058001;0.886018;, 0.308028;-0.066006;0.949085;, 0.234052;-0.276061;0.932207;, 0.185032;-0.345060;0.920161;, 0.293926;0.184953;0.937763;, 0.357144;0.200081;0.912368;, 0.265955;-0.016997;0.963836;, 0.241078;-0.187060;0.952308;, 0.362108;-0.040012;0.931277;, 0.091007;-0.381030;0.920073;, 0.026983;-0.806492;0.590628;, 0.014005;-0.780304;0.625244;, 0.048995;-0.568942;0.820917;, -0.044988;-0.930742;0.362899;, 0.154949;-0.900702;0.405866;, 0.244024;-0.230023;0.942094;, 0.146029;-0.013003;0.989195;, 0.245995;-0.049999;0.967981;, 0.223974;0.129985;0.965888;, 0.170926;0.373839;0.911608;, 0.198048;0.332081;0.922225;, 0.008002;-0.058016;0.998284;, 0.083043;0.346180;0.934486;, -0.025010;-0.112044;0.993388;, -0.019998;0.292973;0.955912;, -0.042022;-0.123063;0.991509;, -0.070977;0.301903;0.950693;, -0.150992;-0.243988;0.957952;, -0.139023;0.308051;0.941157;, -0.193099;-0.320164;0.927474;, -0.241906;0.203920;0.948630;, -0.200959;-0.352928;0.913814;, -0.276012;0.099004;0.956042;, -0.188033;-0.324057;0.927163;, -0.255139;0.027015;0.966527;, 0.169032;-0.269050;0.948177;, -0.003999;0.128954;0.991643;, -0.017001;0.597029;0.802039;, -0.109988;-0.678926;0.725921;, -0.012000;-0.715011;0.699010;, -0.035000;-0.736993;0.674994;, -0.136038;-0.788221;0.600168;, -0.127993;-0.788958;0.600968;, -0.133986;-0.784919;0.604938;, -0.066975;-0.746723;0.661755;, 0.041008;-0.875162;0.482089;, 0.145951;-0.968672;0.200932;, 0.219989;-0.973951;-0.054997;, 0.610009;0.187003;0.770012;, -0.661088;0.453060;-0.598080;, -0.294927;-0.849790;0.436892;, 0.240915;0.144949;0.959661;, -0.045004;-0.269023;0.962082;, -0.259028;-0.808087;0.529057;, 0.154023;-0.708106;0.689103;, -0.987925;0.061995;-0.141989;, 0.522928;0.487933;0.698904;, 0.282084;-0.014004;0.959287;, -0.214934;0.851739;0.477854;, -0.262064;0.935228;0.238058;, -0.613160;0.678177;-0.405106;, 0.599068;0.322036;0.733083;, 0.795508;-0.223143;0.563360;, 0.483976;-0.310984;0.817959;, 0.265977;-0.929920;0.253978;, -0.016996;-0.993789;-0.109977;, 0.250048;0.876166;0.412078;, 0.698904;-0.652911;0.291960;, 0.363007;-0.817016;0.448009;, -0.995170;-0.015003;0.097017;, -0.991904;-0.126988;0.000000;, 0.091007;-0.381030;-0.920073;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; } MeshMaterialList { 1; 564; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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; Material { 0.269804;0.320000;0.630588;0.000000;; 20.000000; 0.500000;0.500000;0.500000;; 0.000000;0.000000;0.000000;; } } VertexDuplicationIndices { 284; 284; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283; } } } } ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/Dolphin2.x ================================================ xof 0303txt 0032 template XSkinMeshHeader { <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> WORD nMaxSkinWeightsPerVertex; WORD nMaxSkinWeightsPerFace; WORD nBones; } template VertexDuplicationIndices { DWORD nIndices; DWORD nOriginalVertices; array DWORD indices[nIndices]; } template SkinWeights { <6f0d123b-bad2-4167-a0d0-80224f25fabb> STRING transformNodeName; DWORD nWeights; array DWORD vertexIndices[nWeights]; array FLOAT weights[nWeights]; Matrix4x4 matrixOffset; } Frame SCENE_ROOT { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Frame frm-Dolph02 { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh Dolph02 { 284; -1.523163;64.520004;8.130000;, -6.853149;65.279984;-0.000000;, 31.746841;100.080002;0.000000;, 39.366852;98.809982;6.100000;, 64.766846;116.079941;0.000000;, 68.076843;113.040024;3.560000;, 96.266846;118.369980;-0.000000;, 98.046844;114.049973;2.062330;, 114.296844;113.540024;-0.000000;, 96.776840;54.869980;6.517095;, 96.266846;72.900009;0.000000;, 106.936844;48.009995;0.000000;, 57.146851;62.739975;11.680000;, 72.136841;84.080002;6.633346;, 82.806854;95.759995;4.012878;, -173.396179;-11.112038;-0.000000;, -179.359558;-18.513649;7.620000;, -184.737610;-21.889885;-0.000000;, -154.622162;3.132233;-0.000000;, -158.944885;-2.880463;13.970000;, -132.664642;15.837616;5.330000;, -91.583008;40.962021;-0.000000;, -93.103821;34.977371;18.290001;, -131.827026;13.720963;13.970000;, -47.355377;57.937881;-0.000000;, -48.554932;52.679184;22.350000;, -4.573151;49.539993;24.639999;, 53.596848;48.009995;26.670000;, 109.726837;36.069992;20.320000;, 164.597672;24.165756;11.680000;, 164.309326;28.406967;0.000000;, 205.337585;15.537689;0.000000;, 204.678864;3.807053;14.730000;, 229.959305;6.926483;0.000000;, 230.871490;-8.854462;11.940000;, 253.443558;-2.321793;0.000000;, 255.279877;-16.970306;7.870000;, 272.058594;-11.217239;0.000000;, 274.108582;-20.241173;9.650000;, 284.510010;-24.596809;0.000000;, 281.051788;-26.843124;9.375875;, -134.884155;7.603134;22.350000;, -118.785126;4.991013;32.770000;, -87.932434;20.529556;31.705227;, -49.602661;33.911453;32.000000;, -4.573151;31.759995;35.810001;, 45.976837;30.489975;34.040001;, 106.426849;22.609970;28.450001;, 164.256134;16.569855;18.290001;, -131.497375;-6.947311;36.580002;, -141.496643;-4.591209;31.750000;, -149.679199;-11.045776;27.430000;, -167.292755;-26.660843;20.830000;, -182.641449;-39.654480;10.160000;, -130.045837;-17.012077;35.810001;, -140.570618;-11.802643;30.990000;, -185.046326;-47.100906;13.970000;, -179.009033;-57.285851;14.990000;, -207.501984;-78.117943;7.370000;, -212.374817;-75.415138;7.370000;, -217.503754;-78.812088;4.060000;, -218.643555;-77.192154;-0.000000;, -192.496216;-47.756264;-0.000000;, -189.516144;-45.705978;5.080000;, -151.581909;-24.644920;30.480000;, -143.585480;-17.412247;30.730000;, -150.797241;-27.519791;30.730000;, -164.589447;-30.959465;26.420000;, -161.742157;-36.544441;25.910000;, -175.527588;-61.398262;16.260000;, -201.257355;-79.650314;8.380000;, -156.069885;-47.983437;27.047173;, -145.948456;-33.531952;34.540001;, -123.818665;-43.267906;34.799999;, -154.000732;-53.754593;27.430000;, -140.443726;-28.630959;34.799999;, -137.653870;-19.691261;34.540001;, -124.874481;-31.459930;38.610001;, -174.433502;-66.586670;18.290001;, -197.692322;-82.756187;10.920000;, -151.732513;-75.607498;17.020000;, -115.517059;-69.194389;22.350000;, -169.266052;-74.923210;10.160000;, -174.220032;-70.176674;17.270000;, -85.397644;-50.283577;43.180000;, -84.454346;-60.306122;35.049999;, -120.484863;-30.801147;40.389999;, -79.864807;-20.409126;49.279999;, -113.949951;-13.502884;40.130001;, -111.861115;-0.681808;36.580002;, -81.197510;3.403015;42.669998;, -49.006622;10.411407;46.230000;, -39.190247;-15.640938;51.049999;, -0.003174;6.529009;48.009998;, 5.076843;-18.789993;51.049999;, 48.006851;5.089981;46.230000;, 50.036850;-18.539993;49.020000;, 103.886841;-1.010025;43.939999;, 103.376846;-27.930008;44.700001;, 162.713242;-4.686424;33.020000;, 161.417679;-29.193550;28.450001;, 201.173447;-11.476181;23.370001;, 199.070190;-36.018791;21.840000;, 228.461502;-21.143990;13.970000;, 226.755234;-36.330627;14.220000;, 248.461105;-25.743721;9.910000;, 244.936478;-38.099564;10.670000;, 272.516663;-27.825661;18.290001;, -46.208221;-47.930710;41.150002;, 6.606842;-52.830002;37.590000;, 47.240704;-51.721313;38.099998;, 98.294579;-53.795647;30.990000;, 159.893112;-50.211456;17.270000;, 198.869385;-48.771626;9.650000;, 225.217270;-46.755871;7.110000;, 255.504883;-47.863602;5.590000;, 269.553040;-46.438980;14.409777;, -59.387085;-63.494911;73.660004;, -60.375549;-65.289017;71.370003;, -36.437195;-57.347382;64.519997;, -14.160309;-68.665680;77.220001;, -28.562531;-69.723923;80.769997;, -48.602417;-66.941849;80.010002;, 3.046844;-66.030014;0.000000;, -44.981171;-63.836952;-0.000000;, 95.548935;-61.466160;0.000000;, 160.262604;-54.943668;0.000000;, 223.603302;-50.946529;0.000000;, 256.815125;-49.490067;0.000000;, -111.173096;-72.104111;-0.000000;, -75.903015;-67.890289;-0.000000;, -144.121399;-79.049561;-0.000000;, -166.643768;-77.178101;-0.000000;, -192.488373;-87.513451;-0.000000;, -195.412811;-85.996056;7.870000;, -211.887085;-94.059570;-0.000000;, -209.426086;-91.976212;4.570000;, 335.214783;-50.588272;86.610001;, 299.024292;-50.850159;73.150002;, 325.862610;-47.883812;63.250000;, 303.063110;-37.013802;9.650000;, 283.385864;-33.640854;20.904961;, 294.864197;-33.797440;0.000000;, 314.287231;-37.568359;5.840000;, 305.185608;-37.304771;0.000000;, 273.239410;-36.253315;24.129999;, -215.413879;-84.334099;3.810000;, -215.901428;-84.042725;-0.000000;, -214.060638;-89.544067;4.830000;, -215.898315;-90.164017;-0.000000;, -28.418518;-70.573166;79.250000;, -48.335999;-68.811401;78.230003;, 105.666840;93.729965;-0.000000;, 46.226837;-64.342575;0.000000;, 198.176895;-53.315128;0.000000;, 271.798553;-47.918884;0.000000;, 299.219421;-53.423798;73.150002;, 282.161438;-48.756035;52.320000;, 282.010498;-44.364044;52.320000;, 319.443726;-42.644302;21.590000;, -130.918793;18.492126;-0.000000;, 39.366852;98.809982;-6.100000;, -1.523163;64.520004;-8.130000;, 68.076843;113.040024;-3.560000;, 98.046844;114.049973;-2.062330;, 96.776840;54.869980;-6.517095;, 72.136841;84.080002;-6.633346;, 57.146851;62.739975;-11.680000;, 82.806854;95.759995;-4.012878;, -179.359558;-18.513649;-7.620000;, -158.944885;-2.880463;-13.970000;, -132.664642;15.837616;-5.330000;, -131.827026;13.720963;-13.970000;, -93.103821;34.977371;-18.290001;, -48.554932;52.679184;-22.350000;, -4.573151;49.539993;-24.639999;, 53.596848;48.009995;-26.670000;, 109.726837;36.069992;-20.320000;, 164.597672;24.165756;-11.680000;, 204.678864;3.807053;-14.730000;, 230.871490;-8.854462;-11.940000;, 255.279877;-16.970306;-7.870000;, 274.108582;-20.241173;-9.650000;, 281.051788;-26.843124;-9.375875;, -134.884155;7.603134;-22.350000;, -118.785126;4.991013;-32.770000;, -87.932434;20.529556;-31.705227;, -49.602661;33.911453;-32.000000;, -4.573151;31.759995;-35.810001;, 45.976837;30.489975;-34.040001;, 106.426849;22.609970;-28.450001;, 164.256134;16.569855;-18.290001;, -141.496643;-4.591209;-31.750000;, -131.497375;-6.947311;-36.580002;, -149.679199;-11.045776;-27.430000;, -167.292755;-26.660843;-20.830000;, -182.641449;-39.654480;-10.160000;, -140.570618;-11.802643;-30.990000;, -130.045837;-17.012077;-35.810001;, -185.046326;-47.100906;-13.970000;, -212.374817;-75.415138;-7.370000;, -207.501984;-78.117943;-7.370000;, -179.009033;-57.285851;-14.990000;, -189.516144;-45.705978;-5.080000;, -217.503754;-78.812088;-4.060000;, -150.797241;-27.519791;-30.730000;, -143.585480;-17.412247;-30.730000;, -151.581909;-24.644920;-30.480000;, -164.589447;-30.959465;-26.420000;, -161.742157;-36.544441;-25.910000;, -201.257355;-79.650314;-8.380000;, -175.527588;-61.398262;-16.260000;, -156.069885;-47.983437;-27.047173;, -145.948456;-33.531952;-34.540001;, -154.000732;-53.754593;-27.430000;, -123.818665;-43.267906;-34.799999;, -140.443726;-28.630959;-34.799999;, -137.653870;-19.691261;-34.540001;, -124.874481;-31.459930;-38.610001;, -197.692322;-82.756187;-10.920000;, -174.433502;-66.586670;-18.290001;, -136.128357;-47.342552;-31.750000;, -151.732513;-75.607498;-17.020000;, -115.517059;-69.194389;-22.350000;, -174.220032;-70.176674;-17.270000;, -169.266052;-74.923210;-10.160000;, -84.454346;-60.306122;-35.049999;, -85.397644;-50.283577;-43.180000;, -79.864807;-20.409126;-49.279999;, -120.484863;-30.801147;-40.389999;, -113.949951;-13.502884;-40.130001;, -111.861115;-0.681808;-36.580002;, -81.197510;3.403015;-42.669998;, -39.190247;-15.640938;-51.049999;, -49.006622;10.411407;-46.230000;, 5.076843;-18.789993;-51.049999;, -0.003174;6.529009;-48.009998;, 50.036850;-18.539993;-49.020000;, 48.006851;5.089981;-46.230000;, 103.376846;-27.930008;-44.700001;, 103.886841;-1.010025;-43.939999;, 161.417679;-29.193550;-28.450001;, 162.713242;-4.686424;-33.020000;, 199.070190;-36.018791;-21.840000;, 201.173447;-11.476181;-23.370001;, 226.755234;-36.330627;-14.220000;, 228.461502;-21.143990;-13.970000;, 244.936478;-38.099564;-10.670000;, 248.461105;-25.743721;-9.910000;, 272.516663;-27.825661;-18.290001;, -46.208221;-47.930710;-41.150002;, 6.606842;-52.830002;-37.590000;, 47.240704;-51.721313;-38.099998;, 98.294579;-53.795647;-30.990000;, 159.893112;-50.211456;-17.270000;, 198.869385;-48.771626;-9.650000;, 225.217270;-46.755871;-7.110000;, 255.504883;-47.863602;-5.590000;, 269.553040;-46.438980;-14.409779;, -60.375549;-65.289017;-71.370003;, -59.387085;-63.494911;-73.660004;, -36.437195;-57.347382;-64.519997;, -14.160309;-68.665680;-77.220001;, -48.602417;-66.941849;-80.010002;, -28.562531;-69.723923;-80.769997;, -195.412811;-85.996056;-7.870000;, -209.426086;-91.976212;-4.570000;, 325.862610;-47.883812;-63.250000;, 299.024292;-50.850159;-73.150002;, 335.214783;-50.588272;-86.610001;, 283.385864;-33.640854;-20.904961;, 303.063110;-37.013802;-9.650000;, 314.287231;-37.568359;-5.840000;, 273.239410;-36.253315;-24.129999;, -215.413879;-84.334099;-3.810000;, -214.060638;-89.544067;-4.830000;, -48.335999;-68.811401;-78.230003;, -28.418518;-70.573166;-79.250000;, 282.010498;-44.364044;-52.320000;, 282.161438;-48.756035;-52.320000;, 299.219421;-53.423798;-73.150002;, 319.443726;-42.644302;-21.590000;, 117.346848;105.419968;0.000000;, -136.128357;-47.342552;31.750000;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; MeshNormals { 284; 0.154061;0.776306;-0.611241;, 0.485218;0.874393;0.000000;, 0.501943;0.864901;0.000000;, 0.196937;0.400873;-0.894716;, 0.247004;0.969015;0.000000;, 0.094987;0.474935;-0.874880;, -0.062005;0.998076;0.000000;, -0.097973;0.156957;-0.982734;, -0.439192;0.898393;0.000000;, -0.413192;0.562262;-0.716334;, -0.940811;0.338932;0.000000;, -0.662250;0.749283;0.000000;, -0.120003;0.363010;-0.924025;, -0.166943;0.091969;-0.981668;, -0.125951;0.028989;-0.991613;, 0.648896;0.760877;0.000000;, 0.718366;0.479244;-0.504257;, 0.906668;0.421845;0.000000;, 0.562064;0.827094;0.000000;, 0.584894;0.676877;-0.446919;, 0.504111;0.830183;-0.238052;, 0.463932;0.885871;0.000000;, 0.388073;0.781146;-0.489091;, 0.487116;0.817195;-0.308074;, 0.276965;0.960880;0.000000;, 0.183028;0.740112;-0.647098;, 0.012006;0.607295;-0.794386;, -0.090980;0.587870;-0.803823;, -0.290048;0.665110;-0.688114;, -0.282038;0.781104;-0.557074;, -0.294858;0.955541;0.000000;, -0.343108;0.939296;0.000000;, -0.294119;0.588239;-0.753306;, -0.405953;0.913894;0.000000;, -0.296897;0.389865;-0.871698;, -0.439192;0.898393;0.000000;, -0.122002;0.459008;-0.880015;, -0.461951;0.886906;0.000000;, -0.418980;0.696967;-0.581973;, -0.698049;0.716050;0.000000;, -0.510981;0.773972;-0.373986;, 0.425814;0.721684;-0.545761;, 0.254105;0.553228;-0.793328;, 0.221065;0.500148;-0.837247;, 0.109016;0.493074;-0.863130;, 0.004000;0.473022;-0.881041;, -0.098006;0.416026;-0.904056;, -0.154958;0.491868;-0.856770;, -0.224007;0.558016;-0.799024;, 0.248118;0.211100;-0.945449;, 0.470276;0.287169;-0.834490;, 0.484036;0.255019;-0.837063;, 0.650755;0.387854;-0.652754;, 0.754233;0.329102;-0.568176;, 0.307975;0.029998;-0.950922;, 0.393956;0.076991;-0.915899;, 0.637006;0.314003;-0.704007;, 0.315966;-0.113988;-0.941898;, 0.236981;-0.112991;-0.964921;, 0.440010;0.073002;-0.895021;, 0.819214;0.291076;-0.494129;, 0.998750;-0.049987;0.000000;, 0.839060;0.544039;0.000000;, 0.761763;0.472853;-0.442862;, 0.262104;0.143057;-0.954378;, 0.333060;0.182033;-0.925168;, 0.303127;0.093039;-0.948397;, 0.450081;0.071013;-0.890160;, 0.389056;-0.114016;-0.914131;, 0.402051;0.080010;-0.912115;, 0.314917;0.050986;-0.947749;, 0.460009;-0.058001;-0.886018;, 0.308028;-0.066006;-0.949085;, 0.185032;-0.345060;-0.920161;, 0.207039;-0.351067;-0.913174;, 0.293926;0.184953;-0.937763;, 0.357144;0.200081;-0.912368;, 0.265955;-0.016997;-0.963836;, 0.362108;-0.040012;-0.931277;, 0.213986;-0.200987;-0.955936;, 0.039998;-0.792955;-0.607966;, 0.014005;-0.780304;-0.625244;, -0.060023;-0.860329;-0.506193;, -0.059020;-0.551191;-0.832289;, 0.244024;-0.230023;-0.942094;, 0.154949;-0.900702;-0.405866;, 0.245995;-0.049999;-0.967981;, 0.146029;-0.013003;-0.989195;, 0.223974;0.129985;-0.965888;, 0.170926;0.373839;-0.911608;, 0.198048;0.332081;-0.922225;, 0.083043;0.346180;-0.934486;, 0.008002;-0.058016;-0.998284;, -0.019998;0.292973;-0.955912;, -0.025010;-0.112044;-0.993388;, -0.070977;0.301903;-0.950693;, -0.042022;-0.123063;-0.991509;, -0.139023;0.308051;-0.941157;, -0.150992;-0.243988;-0.957952;, -0.241906;0.203920;-0.948630;, -0.193099;-0.320164;-0.927474;, -0.276012;0.099004;-0.956042;, -0.200959;-0.352928;-0.913814;, -0.255139;0.027015;-0.966527;, -0.188033;-0.324057;-0.927163;, -0.003999;0.128954;-0.991643;, 0.169032;-0.269050;-0.948177;, -0.017001;0.597029;-0.802039;, -0.109988;-0.678926;-0.725921;, -0.012000;-0.715011;-0.699010;, -0.035000;-0.736993;-0.674994;, -0.136038;-0.788221;-0.600168;, -0.127993;-0.788958;-0.600968;, -0.133986;-0.784919;-0.604938;, -0.066975;-0.746723;-0.661755;, 0.041008;-0.875162;-0.482089;, 0.145951;-0.968672;-0.200932;, 0.610009;0.187003;-0.770012;, 0.219989;-0.973951;0.054997;, -0.661088;0.453060;0.598080;, -0.294927;-0.849790;-0.436892;, -0.045004;-0.269023;-0.962082;, 0.240915;0.144949;-0.959661;, 0.024992;-0.999688;0.000000;, -0.112955;-0.993600;0.000000;, -0.050985;-0.998699;0.000000;, -0.087018;-0.996207;0.000000;, -0.089003;-0.996031;0.000000;, -0.042005;-0.999117;0.000000;, -0.159044;-0.987272;0.000000;, -0.141981;-0.989869;0.000000;, -0.006000;-0.999982;0.000000;, -0.221059;-0.975260;0.000000;, -0.341020;-0.940056;0.000000;, -0.259028;-0.808087;-0.529057;, 0.171046;-0.985263;0.000000;, 0.083988;-0.813887;-0.574920;, 0.282084;-0.014004;-0.959287;, 0.522928;0.487933;-0.698904;, -0.987925;0.061995;0.141989;, -0.262064;0.935228;-0.238058;, -0.214934;0.851739;-0.477854;, -0.389085;0.921202;0.000000;, -0.613160;0.678177;0.405106;, -0.576212;-0.817300;0.000000;, 0.599068;0.322036;-0.733083;, 0.795508;-0.223143;-0.563360;, 0.981792;-0.189960;0.000000;, 0.498180;-0.243088;-0.832301;, 0.875052;-0.484029;0.000000;, -0.016996;-0.993789;0.109977;, 0.265977;-0.929920;-0.253978;, -0.911528;-0.411238;0.000000;, -0.040008;-0.999199;0.000000;, -0.086025;-0.996293;0.000000;, -0.147998;-0.988988;0.000000;, 0.363007;-0.817016;-0.448009;, 0.698904;-0.652911;-0.291960;, 0.250048;0.876166;-0.412078;, -0.995170;-0.015003;-0.097017;, 0.520074;0.854121;0.000000;, 0.196937;0.400873;0.894716;, 0.154061;0.776306;0.611241;, 0.094987;0.474935;0.874880;, -0.097973;0.156957;0.982734;, -0.413192;0.562262;0.716334;, -0.166943;0.091969;0.981668;, -0.120003;0.363010;0.924025;, -0.125951;0.028989;0.991613;, 0.718366;0.479244;0.504257;, 0.584894;0.676877;0.446919;, 0.504111;0.830183;0.238052;, 0.487116;0.817195;0.308074;, 0.388073;0.781146;0.489091;, 0.183028;0.740112;0.647098;, 0.012006;0.607295;0.794386;, -0.090980;0.587870;0.803823;, -0.290048;0.665110;0.688114;, -0.282038;0.781104;0.557074;, -0.294119;0.588239;0.753306;, -0.296897;0.389865;0.871698;, -0.122002;0.459008;0.880015;, -0.418980;0.696967;0.581973;, -0.510981;0.773972;0.373986;, 0.425814;0.721684;0.545761;, 0.254105;0.553228;0.793328;, 0.221065;0.500148;0.837247;, 0.109016;0.493074;0.863130;, 0.004000;0.473022;0.881041;, -0.098006;0.416026;0.904056;, -0.154958;0.491868;0.856770;, -0.224007;0.558016;0.799024;, 0.470276;0.287169;0.834490;, 0.248118;0.211100;0.945449;, 0.484036;0.255019;0.837063;, 0.650755;0.387854;0.652754;, 0.754233;0.329102;0.568176;, 0.393956;0.076991;0.915899;, 0.307975;0.029998;0.950922;, 0.637006;0.314003;0.704007;, 0.440010;0.073002;0.895021;, 0.236981;-0.112991;0.964921;, 0.315966;-0.113988;0.941898;, 0.761763;0.472853;0.442862;, 0.819214;0.291076;0.494129;, 0.303127;0.093039;0.948397;, 0.333060;0.182033;0.925168;, 0.262104;0.143057;0.954378;, 0.450081;0.071013;0.890160;, 0.389056;-0.114016;0.914131;, 0.290968;-0.039996;0.955896;, 0.402051;0.080010;0.912115;, 0.460009;-0.058001;0.886018;, 0.308028;-0.066006;0.949085;, 0.234052;-0.276061;0.932207;, 0.185032;-0.345060;0.920161;, 0.293926;0.184953;0.937763;, 0.357144;0.200081;0.912368;, 0.265955;-0.016997;0.963836;, 0.241078;-0.187060;0.952308;, 0.362108;-0.040012;0.931277;, 0.091007;-0.381030;0.920073;, 0.026983;-0.806492;0.590628;, 0.014005;-0.780304;0.625244;, 0.048995;-0.568942;0.820917;, -0.044988;-0.930742;0.362899;, 0.154949;-0.900702;0.405866;, 0.244024;-0.230023;0.942094;, 0.146029;-0.013003;0.989195;, 0.245995;-0.049999;0.967981;, 0.223974;0.129985;0.965888;, 0.170926;0.373839;0.911608;, 0.198048;0.332081;0.922225;, 0.008002;-0.058016;0.998284;, 0.083043;0.346180;0.934486;, -0.025010;-0.112044;0.993388;, -0.019998;0.292973;0.955912;, -0.042022;-0.123063;0.991509;, -0.070977;0.301903;0.950693;, -0.150992;-0.243988;0.957952;, -0.139023;0.308051;0.941157;, -0.193099;-0.320164;0.927474;, -0.241906;0.203920;0.948630;, -0.200959;-0.352928;0.913814;, -0.276012;0.099004;0.956042;, -0.188033;-0.324057;0.927163;, -0.255139;0.027015;0.966527;, 0.169032;-0.269050;0.948177;, -0.003999;0.128954;0.991643;, -0.017001;0.597029;0.802039;, -0.109988;-0.678926;0.725921;, -0.012000;-0.715011;0.699010;, -0.035000;-0.736993;0.674994;, -0.136038;-0.788221;0.600168;, -0.127993;-0.788958;0.600968;, -0.133986;-0.784919;0.604938;, -0.066975;-0.746723;0.661755;, 0.041008;-0.875162;0.482089;, 0.145951;-0.968672;0.200932;, 0.219989;-0.973951;-0.054997;, 0.610009;0.187003;0.770012;, -0.661088;0.453060;-0.598080;, -0.294927;-0.849790;0.436892;, 0.240915;0.144949;0.959661;, -0.045004;-0.269023;0.962082;, -0.259028;-0.808087;0.529057;, 0.154023;-0.708106;0.689103;, -0.987925;0.061995;-0.141989;, 0.522928;0.487933;0.698904;, 0.282084;-0.014004;0.959287;, -0.214934;0.851739;0.477854;, -0.262064;0.935228;0.238058;, -0.613160;0.678177;-0.405106;, 0.599068;0.322036;0.733083;, 0.795508;-0.223143;0.563360;, 0.483976;-0.310984;0.817959;, 0.265977;-0.929920;0.253978;, -0.016996;-0.993789;-0.109977;, 0.250048;0.876166;0.412078;, 0.698904;-0.652911;0.291960;, 0.363007;-0.817016;0.448009;, -0.995170;-0.015003;0.097017;, -0.991904;-0.126988;0.000000;, 0.091007;-0.381030;-0.920073;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; } MeshMaterialList { 1; 564; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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; Material { 0.269804;0.320000;0.630588;0.000000;; 20.000000; 0.500000;0.500000;0.500000;; 0.000000;0.000000;0.000000;; } } VertexDuplicationIndices { 284; 284; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283; } } } } ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/Dolphin3.x ================================================ xof 0303txt 0032 template XSkinMeshHeader { <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> WORD nMaxSkinWeightsPerVertex; WORD nMaxSkinWeightsPerFace; WORD nBones; } template VertexDuplicationIndices { DWORD nIndices; DWORD nOriginalVertices; array DWORD indices[nIndices]; } template SkinWeights { <6f0d123b-bad2-4167-a0d0-80224f25fabb> STRING transformNodeName; DWORD nWeights; array DWORD vertexIndices[nWeights]; array FLOAT weights[nWeights]; Matrix4x4 matrixOffset; } Frame SCENE_ROOT { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Frame frm-Dolph03 { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh Dolph03 { 284; -1.187194;64.826233;8.130002;, -6.142837;65.927422;-0.000000;, 31.746841;100.080002;0.000000;, 39.366852;98.809982;6.099998;, 64.766846;116.079941;0.000000;, 68.076843;113.040024;3.559999;, 96.266846;118.369980;0.000000;, 98.046844;114.049973;2.062331;, 114.296844;113.540024;0.000000;, 96.776840;54.869980;6.517096;, 96.266846;72.900009;0.000000;, 106.936844;48.009995;0.000000;, 57.146851;62.739975;11.680001;, 72.136841;84.080002;6.633347;, 82.806854;95.759995;4.012877;, -169.419098;16.915739;-0.000000;, -177.035828;11.229694;7.620002;, -183.084564;9.296997;-0.000000;, -148.192398;26.747538;-0.000000;, -153.575363;21.636553;13.970002;, -126.190651;35.514084;5.330001;, -84.050156;54.021847;-0.000000;, -86.416969;48.318592;18.290003;, -125.601196;33.312325;13.970002;, -42.175732;62.659023;-0.000000;, -42.137329;58.528698;22.350002;, -3.544493;50.477592;24.639997;, 53.596848;48.009995;26.669998;, 109.726837;36.069992;20.319998;, 158.141220;32.867401;11.680001;, 157.181122;36.994099;0.000000;, 195.845322;36.444603;0.000000;, 198.421494;24.970091;14.730000;, 217.943008;36.701542;0.000000;, 224.240524;22.792717;11.939998;, 233.396622;40.165440;0.000000;, 242.954117;30.082399;7.870000;, 249.502090;43.866344;0.000000;, 257.511444;39.318447;9.650002;, 267.636658;44.037434;0.000000;, 267.381256;39.921616;9.375875;, -129.344971;27.826403;22.350002;, -115.249748;22.588278;32.770000;, -83.380127;33.276646;31.705227;, -43.810791;41.023785;31.999998;, -3.790570;32.775356;35.809998;, 45.976837;30.489975;34.040001;, 106.426849;22.609970;28.449999;, 159.110229;25.329865;18.290003;, -129.034393;12.997487;36.580002;, -137.842133;17.008808;31.750000;, -146.852936;12.115658;27.430000;, -167.374252;0.337567;20.830002;, -185.472137;-8.430785;10.160001;, -129.556076;2.874023;35.809998;, -138.469482;9.804406;30.989998;, -189.653305;-15.045199;13.970002;, -186.338577;-26.411579;14.990002;, -219.117096;-39.503284;7.369999;, -223.164688;-35.673569;7.369999;, -228.977280;-37.688282;4.059999;, -229.678406;-35.835785;-0.000000;, -197.032120;-13.827255;-0.000000;, -193.635788;-12.582498;5.079998;, -151.718582;-0.788121;30.480000;, -142.486694;4.850280;30.730001;, -151.610046;-3.725685;30.730001;, -165.824905;-4.498291;26.420000;, -164.430069;-10.515144;25.910000;, -183.989227;-31.260592;16.259998;, -213.449738;-42.540489;8.379999;, -161.528366;-22.659479;27.047174;, -148.211853;-10.455325;34.540001;, -128.220383;-24.037979;34.799999;, -160.778366;-28.655569;27.430000;, -141.809769;-6.662666;34.799999;, -137.310959;1.582955;34.540001;, -127.194580;-12.234112;38.610001;, -184.219818;-36.558086;18.290003;, -210.769104;-46.435375;10.919998;, -163.427414;-50.345478;17.020000;, -124.040443;-51.152882;22.350002;, -181.287918;-45.917809;10.160001;, -184.905853;-40.088390;17.269999;, -91.069618;-37.163376;43.180000;, -91.579506;-47.217293;35.049995;, -122.799408;-12.376725;40.389996;, -81.292206;-8.397122;49.279999;, -113.739136;3.524862;40.130001;, -109.828125;15.830540;36.580002;, -79.181816;15.358729;42.669998;, -46.452160;17.672569;46.230000;, -39.970043;-9.546609;51.049999;, 0.110384;6.937223;48.009998;, 5.076844;-18.789993;51.049999;, 48.006851;5.089982;46.230000;, 50.036850;-18.539993;49.020000;, 103.886841;-1.010024;43.939999;, 103.376846;-27.930008;44.700001;, 161.162369;4.123069;33.020004;, 163.766937;-20.261320;28.449999;, 199.195084;9.136382;23.370001;, 203.466644;-15.218976;21.840002;, 227.201157;10.131914;13.970002;, 231.175110;-5.114145;14.220000;, 243.208893;19.011372;9.909999;, 246.819061;6.594709;10.670001;, 262.049408;33.459076;18.290003;, -51.241043;-40.521793;41.150002;, 6.606843;-52.830002;37.590000;, 47.240704;-51.721313;38.100002;, 98.294579;-53.795647;30.989998;, 165.371384;-41.269321;17.269999;, 206.519302;-27.586216;9.650002;, 233.308868;-16.060780;7.110003;, 261.325928;7.033109;5.589998;, 273.138245;19.171013;14.409779;, -67.232765;-53.982800;73.660004;, -68.469292;-55.615852;71.370003;, -41.431782;-51.342903;64.519997;, -16.828482;-66.025253;77.220001;, -33.569759;-64.848167;80.769997;, -56.426437;-58.987450;80.010002;, 3.046844;-66.030014;0.000000;, -51.868515;-56.469826;-0.000000;, 95.548935;-61.466160;0.000000;, 166.511826;-45.863071;0.000000;, 233.058502;-20.942669;0.000000;, 263.500702;6.870311;0.000000;, -119.927795;-54.873909;-0.000000;, -84.209518;-55.953888;-0.000000;, -156.094864;-55.203892;-0.000000;, -179.308792;-48.753994;-0.000000;, -206.911743;-52.337349;-0.000000;, -209.366943;-50.140347;7.870000;, -227.328964;-53.853546;-0.000000;, -224.427170;-52.447666;4.569998;, 318.715668;69.285507;86.610001;, 297.370087;40.059059;73.150002;, 310.972900;63.384106;63.250000;, 288.661469;51.544575;9.650002;, 274.231842;37.747593;20.904961;, 281.194397;46.874439;0.000000;, 295.792297;60.230179;5.840001;, 290.159393;53.076187;0.000000;, 268.865143;28.569664;24.129999;, -228.326324;-43.556538;3.810001;, -228.726089;-43.153072;-0.000000;, -228.311264;-48.939365;4.830000;, -230.245377;-49.082825;-0.000000;, -33.471981;-65.714722;79.250000;, -56.368610;-60.880119;78.230003;, 105.666840;93.729965;0.000000;, 46.226837;-64.342575;0.000000;, 206.947968;-32.213493;0.000000;, 276.245270;19.983170;0.000000;, 299.553619;38.682877;73.150002;, 285.644012;27.761074;52.320000;, 282.026184;30.255810;52.320000;, 302.940948;61.348839;21.590000;, -124.396561;37.824509;-0.000000;, 39.366852;98.809982;-6.099998;, -1.187194;64.826233;-8.130002;, 68.076843;113.040024;-3.560004;, 98.046844;114.049973;-2.062331;, 96.776840;54.869980;-6.517096;, 72.136841;84.080002;-6.633341;, 57.146851;62.739975;-11.680001;, 82.806854;95.759995;-4.012877;, -177.035828;11.229694;-7.620002;, -153.575363;21.636553;-13.970002;, -126.190651;35.514084;-5.330001;, -125.601196;33.312325;-13.970002;, -86.416969;48.318592;-18.289999;, -42.137329;58.528698;-22.349997;, -3.544493;50.477592;-24.639997;, 53.596848;48.009995;-26.670002;, 109.726837;36.069992;-20.320002;, 158.141220;32.867401;-11.680001;, 198.421494;24.970091;-14.729995;, 224.240524;22.792717;-11.939998;, 242.954117;30.082399;-7.870005;, 257.511444;39.318447;-9.649997;, 267.381256;39.921616;-9.375875;, -129.344971;27.826403;-22.349997;, -115.249748;22.588278;-32.770000;, -83.380127;33.276646;-31.705223;, -43.810791;41.023785;-32.000004;, -3.790570;32.775356;-35.809998;, 45.976837;30.489975;-34.040001;, 106.426849;22.609970;-28.450005;, 159.110229;25.329865;-18.289999;, -137.842133;17.008808;-31.750000;, -129.034393;12.997487;-36.580006;, -146.852936;12.115658;-27.430006;, -167.374252;0.337567;-20.830002;, -185.472137;-8.430785;-10.159996;, -138.469482;9.804406;-30.989998;, -129.556076;2.874023;-35.809998;, -189.653305;-15.045199;-13.970002;, -223.164688;-35.673569;-7.369999;, -219.117096;-39.503284;-7.369999;, -186.338577;-26.411579;-14.990002;, -193.635788;-12.582498;-5.079998;, -228.977280;-37.688282;-4.059999;, -151.610046;-3.725685;-30.730001;, -142.486694;4.850280;-30.730001;, -151.718582;-0.788121;-30.480000;, -165.824905;-4.498291;-26.420000;, -164.430069;-10.515144;-25.910000;, -213.449738;-42.540489;-8.380005;, -183.989227;-31.260592;-16.260004;, -161.528366;-22.659479;-27.047174;, -148.211853;-10.455325;-34.539997;, -160.778366;-28.655569;-27.430006;, -128.220383;-24.037979;-34.799995;, -141.809769;-6.662666;-34.799995;, -137.310959;1.582955;-34.539997;, -127.194580;-12.234112;-38.610001;, -210.769104;-46.435375;-10.919998;, -184.219818;-36.558086;-18.289999;, -141.314682;-25.752174;-31.750000;, -163.427414;-50.345478;-17.019997;, -124.040443;-51.152882;-22.349997;, -184.905853;-40.088390;-17.269999;, -181.287918;-45.917809;-10.159996;, -91.579506;-47.217293;-35.049995;, -91.069618;-37.163376;-43.180000;, -81.292206;-8.397122;-49.279995;, -122.799408;-12.376725;-40.390003;, -113.739136;3.524862;-40.130005;, -109.828125;15.830540;-36.580006;, -79.181816;15.358729;-42.669998;, -39.970043;-9.546609;-51.050003;, -46.452160;17.672569;-46.230003;, 5.076844;-18.789993;-51.050003;, 0.110384;6.937223;-48.009995;, 50.036850;-18.539993;-49.020000;, 48.006851;5.089982;-46.230003;, 103.376846;-27.930008;-44.700005;, 103.886841;-1.010024;-43.940002;, 163.766937;-20.261320;-28.450005;, 161.162369;4.123069;-33.020004;, 203.466644;-15.218976;-21.839996;, 199.195084;9.136382;-23.369997;, 231.175110;-5.114145;-14.220005;, 227.201157;10.131914;-13.970002;, 246.819061;6.594709;-10.669996;, 243.208893;19.011372;-9.910004;, 262.049408;33.459076;-18.289999;, -51.241043;-40.521793;-41.150005;, 6.606843;-52.830002;-37.590000;, 47.240704;-51.721313;-38.100002;, 98.294579;-53.795647;-30.989998;, 165.371384;-41.269321;-17.269999;, 206.519302;-27.586216;-9.649997;, 233.308868;-16.060780;-7.110003;, 261.325928;7.033109;-5.589998;, 273.138245;19.171013;-14.409783;, -68.469292;-55.615852;-71.370003;, -67.232765;-53.982800;-73.660011;, -41.431782;-51.342903;-64.520004;, -16.828482;-66.025253;-77.220001;, -56.426437;-58.987450;-80.009995;, -33.569759;-64.848167;-80.769997;, -209.366943;-50.140347;-7.870005;, -224.427170;-52.447666;-4.569998;, 310.972900;63.384106;-63.250000;, 297.370087;40.059059;-73.150002;, 318.715668;69.285507;-86.610001;, 274.231842;37.747593;-20.904961;, 288.661469;51.544575;-9.649997;, 295.792297;60.230179;-5.840001;, 268.865143;28.569664;-24.129999;, -228.326324;-43.556538;-3.809996;, -228.311264;-48.939365;-4.829995;, -56.368610;-60.880119;-78.230003;, -33.471981;-65.714722;-79.249992;, 282.026184;30.255810;-52.319996;, 285.644012;27.761074;-52.319996;, 299.553619;38.682877;-73.150002;, 302.940948;61.348839;-21.590004;, 117.346848;105.419968;0.000000;, -141.314682;-25.752174;31.750000;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; MeshNormals { 284; 0.154061;0.776306;-0.611241;, 0.485218;0.874393;0.000000;, 0.501943;0.864901;0.000000;, 0.196937;0.400873;-0.894716;, 0.247004;0.969015;0.000000;, 0.094987;0.474935;-0.874880;, -0.062005;0.998076;0.000000;, -0.097973;0.156957;-0.982734;, -0.439192;0.898393;0.000000;, -0.413192;0.562262;-0.716334;, -0.940811;0.338932;0.000000;, -0.662250;0.749283;0.000000;, -0.120003;0.363010;-0.924025;, -0.166943;0.091969;-0.981668;, -0.125951;0.028989;-0.991613;, 0.648896;0.760877;0.000000;, 0.718366;0.479244;-0.504257;, 0.906668;0.421845;0.000000;, 0.562064;0.827094;0.000000;, 0.584894;0.676877;-0.446919;, 0.504111;0.830183;-0.238052;, 0.463932;0.885871;0.000000;, 0.388073;0.781146;-0.489091;, 0.487116;0.817195;-0.308074;, 0.276965;0.960880;0.000000;, 0.183028;0.740112;-0.647098;, 0.012006;0.607295;-0.794386;, -0.090980;0.587870;-0.803823;, -0.290048;0.665110;-0.688114;, -0.282038;0.781104;-0.557074;, -0.294858;0.955541;0.000000;, -0.343108;0.939296;0.000000;, -0.294119;0.588239;-0.753306;, -0.405953;0.913894;0.000000;, -0.296897;0.389865;-0.871698;, -0.439192;0.898393;0.000000;, -0.122002;0.459008;-0.880015;, -0.461951;0.886906;0.000000;, -0.418980;0.696967;-0.581973;, -0.698049;0.716050;0.000000;, -0.510981;0.773972;-0.373986;, 0.425814;0.721684;-0.545761;, 0.254105;0.553228;-0.793328;, 0.221065;0.500148;-0.837247;, 0.109016;0.493074;-0.863130;, 0.004000;0.473022;-0.881041;, -0.098006;0.416026;-0.904056;, -0.154958;0.491868;-0.856770;, -0.224007;0.558016;-0.799024;, 0.248118;0.211100;-0.945449;, 0.470276;0.287169;-0.834490;, 0.484036;0.255019;-0.837063;, 0.650755;0.387854;-0.652754;, 0.754233;0.329102;-0.568176;, 0.307975;0.029998;-0.950922;, 0.393956;0.076991;-0.915899;, 0.637006;0.314003;-0.704007;, 0.315966;-0.113988;-0.941898;, 0.236981;-0.112991;-0.964921;, 0.440010;0.073002;-0.895021;, 0.819214;0.291076;-0.494129;, 0.998750;-0.049987;0.000000;, 0.839060;0.544039;0.000000;, 0.761763;0.472853;-0.442862;, 0.262104;0.143057;-0.954378;, 0.333060;0.182033;-0.925168;, 0.303127;0.093039;-0.948397;, 0.450081;0.071013;-0.890160;, 0.389056;-0.114016;-0.914131;, 0.402051;0.080010;-0.912115;, 0.314917;0.050986;-0.947749;, 0.460009;-0.058001;-0.886018;, 0.308028;-0.066006;-0.949085;, 0.185032;-0.345060;-0.920161;, 0.207039;-0.351067;-0.913174;, 0.293926;0.184953;-0.937763;, 0.357144;0.200081;-0.912368;, 0.265955;-0.016997;-0.963836;, 0.362108;-0.040012;-0.931277;, 0.213986;-0.200987;-0.955936;, 0.039998;-0.792955;-0.607966;, 0.014005;-0.780304;-0.625244;, -0.060023;-0.860329;-0.506193;, -0.059020;-0.551191;-0.832289;, 0.244024;-0.230023;-0.942094;, 0.154949;-0.900702;-0.405866;, 0.245995;-0.049999;-0.967981;, 0.146029;-0.013003;-0.989195;, 0.223974;0.129985;-0.965888;, 0.170926;0.373839;-0.911608;, 0.198048;0.332081;-0.922225;, 0.083043;0.346180;-0.934486;, 0.008002;-0.058016;-0.998284;, -0.019998;0.292973;-0.955912;, -0.025010;-0.112044;-0.993388;, -0.070977;0.301903;-0.950693;, -0.042022;-0.123063;-0.991509;, -0.139023;0.308051;-0.941157;, -0.150992;-0.243988;-0.957952;, -0.241906;0.203920;-0.948630;, -0.193099;-0.320164;-0.927474;, -0.276012;0.099004;-0.956042;, -0.200959;-0.352928;-0.913814;, -0.255139;0.027015;-0.966527;, -0.188033;-0.324057;-0.927163;, -0.003999;0.128954;-0.991643;, 0.169032;-0.269050;-0.948177;, -0.017001;0.597029;-0.802039;, -0.109988;-0.678926;-0.725921;, -0.012000;-0.715011;-0.699010;, -0.035000;-0.736993;-0.674994;, -0.136038;-0.788221;-0.600168;, -0.127993;-0.788958;-0.600968;, -0.133986;-0.784919;-0.604938;, -0.066975;-0.746723;-0.661755;, 0.041008;-0.875162;-0.482089;, 0.145951;-0.968672;-0.200932;, 0.610009;0.187003;-0.770012;, 0.219989;-0.973951;0.054997;, -0.661088;0.453060;0.598080;, -0.294927;-0.849790;-0.436892;, -0.045004;-0.269023;-0.962082;, 0.240915;0.144949;-0.959661;, 0.024992;-0.999688;0.000000;, -0.112955;-0.993600;0.000000;, -0.050985;-0.998699;0.000000;, -0.087018;-0.996207;0.000000;, -0.089003;-0.996031;0.000000;, -0.042005;-0.999117;0.000000;, -0.159044;-0.987272;0.000000;, -0.141981;-0.989869;0.000000;, -0.006000;-0.999982;0.000000;, -0.221059;-0.975260;0.000000;, -0.341020;-0.940056;0.000000;, -0.259028;-0.808087;-0.529057;, 0.171046;-0.985263;0.000000;, 0.083988;-0.813887;-0.574920;, 0.282084;-0.014004;-0.959287;, 0.522928;0.487933;-0.698904;, -0.987925;0.061995;0.141989;, -0.262064;0.935228;-0.238058;, -0.214934;0.851739;-0.477854;, -0.389085;0.921202;0.000000;, -0.613160;0.678177;0.405106;, -0.576212;-0.817300;0.000000;, 0.599068;0.322036;-0.733083;, 0.795508;-0.223143;-0.563360;, 0.981792;-0.189960;0.000000;, 0.498180;-0.243088;-0.832301;, 0.875052;-0.484029;0.000000;, -0.016996;-0.993789;0.109977;, 0.265977;-0.929920;-0.253978;, -0.911528;-0.411238;0.000000;, -0.040008;-0.999199;0.000000;, -0.086025;-0.996293;0.000000;, -0.147998;-0.988988;0.000000;, 0.363007;-0.817016;-0.448009;, 0.698904;-0.652911;-0.291960;, 0.250048;0.876166;-0.412078;, -0.995170;-0.015003;-0.097017;, 0.520074;0.854121;0.000000;, 0.196937;0.400873;0.894716;, 0.154061;0.776306;0.611241;, 0.094987;0.474935;0.874880;, -0.097973;0.156957;0.982734;, -0.413192;0.562262;0.716334;, -0.166943;0.091969;0.981668;, -0.120003;0.363010;0.924025;, -0.125951;0.028989;0.991613;, 0.718366;0.479244;0.504257;, 0.584894;0.676877;0.446919;, 0.504111;0.830183;0.238052;, 0.487116;0.817195;0.308074;, 0.388073;0.781146;0.489091;, 0.183028;0.740112;0.647098;, 0.012006;0.607295;0.794386;, -0.090980;0.587870;0.803823;, -0.290048;0.665110;0.688114;, -0.282038;0.781104;0.557074;, -0.294119;0.588239;0.753306;, -0.296897;0.389865;0.871698;, -0.122002;0.459008;0.880015;, -0.418980;0.696967;0.581973;, -0.510981;0.773972;0.373986;, 0.425814;0.721684;0.545761;, 0.254105;0.553228;0.793328;, 0.221065;0.500148;0.837247;, 0.109016;0.493074;0.863130;, 0.004000;0.473022;0.881041;, -0.098006;0.416026;0.904056;, -0.154958;0.491868;0.856770;, -0.224007;0.558016;0.799024;, 0.470276;0.287169;0.834490;, 0.248118;0.211100;0.945449;, 0.484036;0.255019;0.837063;, 0.650755;0.387854;0.652754;, 0.754233;0.329102;0.568176;, 0.393956;0.076991;0.915899;, 0.307975;0.029998;0.950922;, 0.637006;0.314003;0.704007;, 0.440010;0.073002;0.895021;, 0.236981;-0.112991;0.964921;, 0.315966;-0.113988;0.941898;, 0.761763;0.472853;0.442862;, 0.819214;0.291076;0.494129;, 0.303127;0.093039;0.948397;, 0.333060;0.182033;0.925168;, 0.262104;0.143057;0.954378;, 0.450081;0.071013;0.890160;, 0.389056;-0.114016;0.914131;, 0.290968;-0.039996;0.955896;, 0.402051;0.080010;0.912115;, 0.460009;-0.058001;0.886018;, 0.308028;-0.066006;0.949085;, 0.234052;-0.276061;0.932207;, 0.185032;-0.345060;0.920161;, 0.293926;0.184953;0.937763;, 0.357144;0.200081;0.912368;, 0.265955;-0.016997;0.963836;, 0.241078;-0.187060;0.952308;, 0.362108;-0.040012;0.931277;, 0.091007;-0.381030;0.920073;, 0.026983;-0.806492;0.590628;, 0.014005;-0.780304;0.625244;, 0.048995;-0.568942;0.820917;, -0.044988;-0.930742;0.362899;, 0.154949;-0.900702;0.405866;, 0.244024;-0.230023;0.942094;, 0.146029;-0.013003;0.989195;, 0.245995;-0.049999;0.967981;, 0.223974;0.129985;0.965888;, 0.170926;0.373839;0.911608;, 0.198048;0.332081;0.922225;, 0.008002;-0.058016;0.998284;, 0.083043;0.346180;0.934486;, -0.025010;-0.112044;0.993388;, -0.019998;0.292973;0.955912;, -0.042022;-0.123063;0.991509;, -0.070977;0.301903;0.950693;, -0.150992;-0.243988;0.957952;, -0.139023;0.308051;0.941157;, -0.193099;-0.320164;0.927474;, -0.241906;0.203920;0.948630;, -0.200959;-0.352928;0.913814;, -0.276012;0.099004;0.956042;, -0.188033;-0.324057;0.927163;, -0.255139;0.027015;0.966527;, 0.169032;-0.269050;0.948177;, -0.003999;0.128954;0.991643;, -0.017001;0.597029;0.802039;, -0.109988;-0.678926;0.725921;, -0.012000;-0.715011;0.699010;, -0.035000;-0.736993;0.674994;, -0.136038;-0.788221;0.600168;, -0.127993;-0.788958;0.600968;, -0.133986;-0.784919;0.604938;, -0.066975;-0.746723;0.661755;, 0.041008;-0.875162;0.482089;, 0.145951;-0.968672;0.200932;, 0.219989;-0.973951;-0.054997;, 0.610009;0.187003;0.770012;, -0.661088;0.453060;-0.598080;, -0.294927;-0.849790;0.436892;, 0.240915;0.144949;0.959661;, -0.045004;-0.269023;0.962082;, -0.259028;-0.808087;0.529057;, 0.154023;-0.708106;0.689103;, -0.987925;0.061995;-0.141989;, 0.522928;0.487933;0.698904;, 0.282084;-0.014004;0.959287;, -0.214934;0.851739;0.477854;, -0.262064;0.935228;0.238058;, -0.613160;0.678177;-0.405106;, 0.599068;0.322036;0.733083;, 0.795508;-0.223143;0.563360;, 0.483976;-0.310984;0.817959;, 0.265977;-0.929920;0.253978;, -0.016996;-0.993789;-0.109977;, 0.250048;0.876166;0.412078;, 0.698904;-0.652911;0.291960;, 0.363007;-0.817016;0.448009;, -0.995170;-0.015003;0.097017;, -0.991904;-0.126988;0.000000;, 0.091007;-0.381030;-0.920073;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; } MeshMaterialList { 1; 564; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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; Material { 0.269804;0.320000;0.630588;0.000000;; 20.000000; 0.500000;0.500000;0.500000;; 0.000000;0.000000;0.000000;; } } VertexDuplicationIndices { 284; 284; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283; } } } } ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/DolphinTween.vsh ================================================ ;------------------------------------------------------------------------------ ; Constants specified by the app ; c0 = ( 0, 0, 0, 0 ) ; c1 = ( 1, 0.5, 2, 4 ) ; c2 = ( fWeight1, fWeight2, fWeight3, 0 ) ; c4-c7 = matWorldViewProjection ; c8-c11 = matWorldView ; c19 = light direction (in model space) ; c21 = material diffuse color * light diffuse color ; c22 = material ambient color ; ; Vertex components (as specified in the vertex DECL) ; v0 = Position ; v3 = Normal ; v6 = Texcoords ;------------------------------------------------------------------------------ vs.1.1 ;------------------------------------------------------------------------------ ; Vertex transformation ;------------------------------------------------------------------------------ ; Tween the 3 positions (v0,v1,v2) into one position mul r0, v0, c2.x mul r1, v1, c2.y mul r2, v2, c2.z add r3, r0, r1 add r3, r3, r2 ; Transform position to the clipping space m4x4 oPos, r3, c4 ; Transform position to the camera space m4x4 r9, r3, c8 ;------------------------------------------------------------------------------ ; Lighting calculation ;------------------------------------------------------------------------------ ; Tween the 3 normals (v3,v4,v5) into one normal mul r0, v3, c2.x mul r1, v4, c2.y mul r2, v5, c2.z add r3, r0, r1 add r3, r3, r2 ; Do the lighting calculation dp3 r1.x, r3, c19 ; r1 = normal dot light max r1.x, r1.x, c0.x ; if dot < 0 then dot = 0 mul r0, r1.x, c21 ; Multiply with diffuse add r0, r0, c22 ; Add in ambient min oD0, r0, c1.x ; clamp if > 1 ;------------------------------------------------------------------------------ ; Texture coordinates ;------------------------------------------------------------------------------ ; Copy tex coords mov oT0.xy, v6 ;------------------------------------------------------------------------------ ; Fog calculation ;------------------------------------------------------------------------------ ; compute fog factor f = (fog_end - dist)*(1/(fog_end-fog_start)) add r0.x, -r9.z, c23.y mul r0.x, r0.x, c23.z max r0.x, r0.x, c0.x ; clamp fog to > 0.0 min oFog.x, r0.x, c1.x ; clamp fog to < 1.0 ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/DolphinTween2.vsh ================================================ ;------------------------------------------------------------------------------ ; Constants specified by the app ; c0 = ( 0, 0, 0, 0 ) ; c1 = ( 1, 0.5, 2, 4 ) ; c2 = ( fWeight1, fWeight2, fWeight3, 0 ) ; c4-c7 = matWorldViewProjection ; c8-c11 = matWorldView ; c19 = light direction (in model space) ; c21 = material diffuse color * light diffuse color ; c22 = material ambient color ; ; Vertex components (as specified in the vertex DECL) ; v0 = Position ; v3 = Normal ; v6 = Texcoords ;------------------------------------------------------------------------------ vs.1.1 ;------------------------------------------------------------------------------ ; Vertex transformation ;------------------------------------------------------------------------------ ; Tween the 3 positions (v0,v1,v2) into one position mul r0, v0, c2.x mul r1, v1, c2.y mul r2, v2, c2.z add r3, r0, r1 add r3, r3, r2 ; Transform position to the clipping space m4x4 oPos, r3, c4 ; Transform position to the camera space m4x4 r9, r3, c8 ;------------------------------------------------------------------------------ ; Lighting calculation ;------------------------------------------------------------------------------ ; Tween the 3 normals (v3,v4,v5) into one normal mul r0, v3, c2.x mul r1, v4, c2.y mul r2, v5, c2.z add r3, r0, r1 add r3, r3, r2 ; Do the lighting calculation dp3 r1.x, r3, c19 ; r1 = normal dot light max r1.x, r1.x, c0.x ; if dot < 0 then dot = 0 mul r0, r1.x, c21 ; Multiply with diffuse add r0, r0, c22 ; Add in ambient min oD0, r0, c1.x ; clamp if > 1 ;------------------------------------------------------------------------------ ; Texture coordinates ;------------------------------------------------------------------------------ ; Gen tex coords from vertex xz position mul oT0.xy, c1.y, r9.xz ;------------------------------------------------------------------------------ ; Fog calculation ;------------------------------------------------------------------------------ ; compute fog factor f = (fog_end - dist)*(1/(fog_end-fog_start)) add r0.x, -r9.z, c23.y mul r0.x, r0.x, c23.z max r0.x, r0.x, c0.x ; clamp fog to > 0.0 min oFog.x, r0.x, c1.x ; clamp fog to < 1.0 ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/SeaFloor.vsh ================================================ vs.1.1 ;------------------------------------------------------------------------------ ; Constants specified by the app ; c0 = ( 0, 0, 0, 0 ) ; c1 = ( 1, 0.5, 2, 4 ) ; c4-c7 = world-view-projection matrix ; c8-c11 = world-view matrix ; c12-c15 = view matrix ; c20 = light direction ; c21 = material diffuse color * light diffuse color ; c22 = material ambient color ; c28 = projection matrix ; ; Vertex components (as specified in the vertex DECL) ; v0 = Position ; v3 = Normal ; v6 = Texcoords ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; Vertex transformation ;------------------------------------------------------------------------------ ; Transform to view space (world matrix is identity) m4x4 r9, v0, c12 ; Transform to projection space m4x4 r10, r9, c28 ; Store output position mov oPos, r10 ;------------------------------------------------------------------------------ ; Lighting calculation ;------------------------------------------------------------------------------ dp3 r1.x, v3, c20 ; r1 = normal dot light mul r0, r1.x, c21 ; Multiply with diffuse add oD0, r0, c22 ; Add in ambient ;------------------------------------------------------------------------------ ; Texture coordinates ;------------------------------------------------------------------------------ ; Copy tex coords mov oT0.xy, v6 ;------------------------------------------------------------------------------ ; Fog calculation ;------------------------------------------------------------------------------ ; compute fog factor f = (fog_end - dist)*(1/(fog_end-fog_start)) add r0.x, -r9.z, c23.y mul r0.x, r0.x, c23.z max r0.x, r0.x, c0.x ; clamp fog to > 0.0 min oFog.x, r0.x, c1.x ; clamp fog to < 1.0 ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/SeaFloor2.vsh ================================================ vs.1.0 ;------------------------------------------------------------------------------ ; Constants specified by the app ; c0 = ( 0, 0, 0, 0 ) ; c1 = ( 1, 0.5, 2, 4 ) ; c4-c7 = world-view-projection matrix ; c8-c11 = world-view matrix ; c12-c15 = view matrix ; c20 = light direction ; c21 = material diffuse color * light diffuse color ; c22 = material ambient color ; c28 = projection matrix ; ; Vertex components (as specified in the vertex DECL) ; v0 = Position ; v3 = Normal ; v6 = Texcoords ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; Vertex transformation ;------------------------------------------------------------------------------ ; Transform to view space (world matrix is identity) m4x4 r9, v0, c12 ; Transform to projection space m4x4 r10, r9, c28 ; Store output position mov oPos, r10 ;------------------------------------------------------------------------------ ; Lighting calculation ;------------------------------------------------------------------------------ dp3 r1.x, v3, c20 ; r1 = normal dot light max r1, r1.x, c0.x ; if dot < 0 then dot = 0 mul r0, r1.x, c21 ; Multiply with diffuse add r0, r0, c22 ; Add in ambient min oD0, r0, c1.x ; clamp if > 1 ;------------------------------------------------------------------------------ ; Texture coordinates ;------------------------------------------------------------------------------ ; Gen tex coords from vertex xz position mul r0.xy, c24.x, r9.xz add oT0.xy, r0.xy, c24.zw ;------------------------------------------------------------------------------ ; Fog calculation ;------------------------------------------------------------------------------ ; compute fog factor f = (fog_end - dist)*(1/(fog_end-fog_start)) add r0.x, -r9.z, c23.y mul r0.x, r0.x, c23.z max r0.x, r0.x, c0.x ; clamp fog to > 0.0 min oFog.x, r0.x, c1.x ; clamp fog to < 1.0 ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/dolphin.x ================================================ xof 0303txt 0032 template XSkinMeshHeader { <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> WORD nMaxSkinWeightsPerVertex; WORD nMaxSkinWeightsPerFace; WORD nBones; } template VertexDuplicationIndices { DWORD nIndices; DWORD nOriginalVertices; array DWORD indices[nIndices]; } template SkinWeights { <6f0d123b-bad2-4167-a0d0-80224f25fabb> STRING transformNodeName; DWORD nWeights; array DWORD vertexIndices[nWeights]; array FLOAT weights[nWeights]; Matrix4x4 matrixOffset; } Frame SCENE_ROOT { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Frame Dolph02 { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh Dolph02 { 284; -1.523163;64.520004;8.130000;, -6.853149;65.279984;-0.000000;, 31.746841;100.080002;0.000000;, 39.366852;98.809982;6.100000;, 64.766846;116.079941;0.000000;, 68.076843;113.040024;3.560000;, 96.266846;118.369980;-0.000000;, 98.046844;114.049973;2.062330;, 114.296844;113.540024;-0.000000;, 96.776840;54.869980;6.517095;, 96.266846;72.900009;0.000000;, 106.936844;48.009995;0.000000;, 57.146851;62.739975;11.680000;, 72.136841;84.080002;6.633346;, 82.806854;95.759995;4.012878;, -173.396179;-11.112038;-0.000000;, -179.359558;-18.513649;7.620000;, -184.737610;-21.889885;-0.000000;, -154.622162;3.132233;-0.000000;, -158.944885;-2.880463;13.970000;, -132.664642;15.837616;5.330000;, -91.583008;40.962021;-0.000000;, -93.103821;34.977371;18.290001;, -131.827026;13.720963;13.970000;, -47.355377;57.937881;-0.000000;, -48.554932;52.679184;22.350000;, -4.573151;49.539993;24.639999;, 53.596848;48.009995;26.670000;, 109.726837;36.069992;20.320000;, 164.597672;24.165756;11.680000;, 164.309326;28.406967;0.000000;, 205.337585;15.537689;0.000000;, 204.678864;3.807053;14.730000;, 229.959305;6.926483;0.000000;, 230.871490;-8.854462;11.940000;, 253.443558;-2.321793;0.000000;, 255.279877;-16.970306;7.870000;, 272.058594;-11.217239;0.000000;, 274.108582;-20.241173;9.650000;, 284.510010;-24.596809;0.000000;, 281.051788;-26.843124;9.375875;, -134.884155;7.603134;22.350000;, -118.785126;4.991013;32.770000;, -87.932434;20.529556;31.705227;, -49.602661;33.911453;32.000000;, -4.573151;31.759995;35.810001;, 45.976837;30.489975;34.040001;, 106.426849;22.609970;28.450001;, 164.256134;16.569855;18.290001;, -131.497375;-6.947311;36.580002;, -141.496643;-4.591209;31.750000;, -149.679199;-11.045776;27.430000;, -167.292755;-26.660843;20.830000;, -182.641449;-39.654480;10.160000;, -130.045837;-17.012077;35.810001;, -140.570618;-11.802643;30.990000;, -185.046326;-47.100906;13.970000;, -179.009033;-57.285851;14.990000;, -207.501984;-78.117943;7.370000;, -212.374817;-75.415138;7.370000;, -217.503754;-78.812088;4.060000;, -218.643555;-77.192154;-0.000000;, -192.496216;-47.756264;-0.000000;, -189.516144;-45.705978;5.080000;, -151.581909;-24.644920;30.480000;, -143.585480;-17.412247;30.730000;, -150.797241;-27.519791;30.730000;, -164.589447;-30.959465;26.420000;, -161.742157;-36.544441;25.910000;, -175.527588;-61.398262;16.260000;, -201.257355;-79.650314;8.380000;, -156.069885;-47.983437;27.047173;, -145.948456;-33.531952;34.540001;, -123.818665;-43.267906;34.799999;, -154.000732;-53.754593;27.430000;, -140.443726;-28.630959;34.799999;, -137.653870;-19.691261;34.540001;, -124.874481;-31.459930;38.610001;, -174.433502;-66.586670;18.290001;, -197.692322;-82.756187;10.920000;, -151.732513;-75.607498;17.020000;, -115.517059;-69.194389;22.350000;, -169.266052;-74.923210;10.160000;, -174.220032;-70.176674;17.270000;, -85.397644;-50.283577;43.180000;, -84.454346;-60.306122;35.049999;, -120.484863;-30.801147;40.389999;, -79.864807;-20.409126;49.279999;, -113.949951;-13.502884;40.130001;, -111.861115;-0.681808;36.580002;, -81.197510;3.403015;42.669998;, -49.006622;10.411407;46.230000;, -39.190247;-15.640938;51.049999;, -0.003174;6.529009;48.009998;, 5.076843;-18.789993;51.049999;, 48.006851;5.089981;46.230000;, 50.036850;-18.539993;49.020000;, 103.886841;-1.010025;43.939999;, 103.376846;-27.930008;44.700001;, 162.713242;-4.686424;33.020000;, 161.417679;-29.193550;28.450001;, 201.173447;-11.476181;23.370001;, 199.070190;-36.018791;21.840000;, 228.461502;-21.143990;13.970000;, 226.755234;-36.330627;14.220000;, 248.461105;-25.743721;9.910000;, 244.936478;-38.099564;10.670000;, 272.516663;-27.825661;18.290001;, -46.208221;-47.930710;41.150002;, 6.606842;-52.830002;37.590000;, 47.240704;-51.721313;38.099998;, 98.294579;-53.795647;30.990000;, 159.893112;-50.211456;17.270000;, 198.869385;-48.771626;9.650000;, 225.217270;-46.755871;7.110000;, 255.504883;-47.863602;5.590000;, 269.553040;-46.438980;14.409777;, -59.387085;-63.494911;73.660004;, -60.375549;-65.289017;71.370003;, -36.437195;-57.347382;64.519997;, -14.160309;-68.665680;77.220001;, -28.562531;-69.723923;80.769997;, -48.602417;-66.941849;80.010002;, 3.046844;-66.030014;0.000000;, -44.981171;-63.836952;-0.000000;, 95.548935;-61.466160;0.000000;, 160.262604;-54.943668;0.000000;, 223.603302;-50.946529;0.000000;, 256.815125;-49.490067;0.000000;, -111.173096;-72.104111;-0.000000;, -75.903015;-67.890289;-0.000000;, -144.121399;-79.049561;-0.000000;, -166.643768;-77.178101;-0.000000;, -192.488373;-87.513451;-0.000000;, -195.412811;-85.996056;7.870000;, -211.887085;-94.059570;-0.000000;, -209.426086;-91.976212;4.570000;, 335.214783;-50.588272;86.610001;, 299.024292;-50.850159;73.150002;, 325.862610;-47.883812;63.250000;, 303.063110;-37.013802;9.650000;, 283.385864;-33.640854;20.904961;, 294.864197;-33.797440;0.000000;, 314.287231;-37.568359;5.840000;, 305.185608;-37.304771;0.000000;, 273.239410;-36.253315;24.129999;, -215.413879;-84.334099;3.810000;, -215.901428;-84.042725;-0.000000;, -214.060638;-89.544067;4.830000;, -215.898315;-90.164017;-0.000000;, -28.418518;-70.573166;79.250000;, -48.335999;-68.811401;78.230003;, 105.666840;93.729965;-0.000000;, 46.226837;-64.342575;0.000000;, 198.176895;-53.315128;0.000000;, 271.798553;-47.918884;0.000000;, 299.219421;-53.423798;73.150002;, 282.161438;-48.756035;52.320000;, 282.010498;-44.364044;52.320000;, 319.443726;-42.644302;21.590000;, -130.918793;18.492126;-0.000000;, 39.366852;98.809982;-6.100000;, -1.523163;64.520004;-8.130000;, 68.076843;113.040024;-3.560000;, 98.046844;114.049973;-2.062330;, 96.776840;54.869980;-6.517095;, 72.136841;84.080002;-6.633346;, 57.146851;62.739975;-11.680000;, 82.806854;95.759995;-4.012878;, -179.359558;-18.513649;-7.620000;, -158.944885;-2.880463;-13.970000;, -132.664642;15.837616;-5.330000;, -131.827026;13.720963;-13.970000;, -93.103821;34.977371;-18.290001;, -48.554932;52.679184;-22.350000;, -4.573151;49.539993;-24.639999;, 53.596848;48.009995;-26.670000;, 109.726837;36.069992;-20.320000;, 164.597672;24.165756;-11.680000;, 204.678864;3.807053;-14.730000;, 230.871490;-8.854462;-11.940000;, 255.279877;-16.970306;-7.870000;, 274.108582;-20.241173;-9.650000;, 281.051788;-26.843124;-9.375875;, -134.884155;7.603134;-22.350000;, -118.785126;4.991013;-32.770000;, -87.932434;20.529556;-31.705227;, -49.602661;33.911453;-32.000000;, -4.573151;31.759995;-35.810001;, 45.976837;30.489975;-34.040001;, 106.426849;22.609970;-28.450001;, 164.256134;16.569855;-18.290001;, -141.496643;-4.591209;-31.750000;, -131.497375;-6.947311;-36.580002;, -149.679199;-11.045776;-27.430000;, -167.292755;-26.660843;-20.830000;, -182.641449;-39.654480;-10.160000;, -140.570618;-11.802643;-30.990000;, -130.045837;-17.012077;-35.810001;, -185.046326;-47.100906;-13.970000;, -212.374817;-75.415138;-7.370000;, -207.501984;-78.117943;-7.370000;, -179.009033;-57.285851;-14.990000;, -189.516144;-45.705978;-5.080000;, -217.503754;-78.812088;-4.060000;, -150.797241;-27.519791;-30.730000;, -143.585480;-17.412247;-30.730000;, -151.581909;-24.644920;-30.480000;, -164.589447;-30.959465;-26.420000;, -161.742157;-36.544441;-25.910000;, -201.257355;-79.650314;-8.380000;, -175.527588;-61.398262;-16.260000;, -156.069885;-47.983437;-27.047173;, -145.948456;-33.531952;-34.540001;, -154.000732;-53.754593;-27.430000;, -123.818665;-43.267906;-34.799999;, -140.443726;-28.630959;-34.799999;, -137.653870;-19.691261;-34.540001;, -124.874481;-31.459930;-38.610001;, -197.692322;-82.756187;-10.920000;, -174.433502;-66.586670;-18.290001;, -136.128357;-47.342552;-31.750000;, -151.732513;-75.607498;-17.020000;, -115.517059;-69.194389;-22.350000;, -174.220032;-70.176674;-17.270000;, -169.266052;-74.923210;-10.160000;, -84.454346;-60.306122;-35.049999;, -85.397644;-50.283577;-43.180000;, -79.864807;-20.409126;-49.279999;, -120.484863;-30.801147;-40.389999;, -113.949951;-13.502884;-40.130001;, -111.861115;-0.681808;-36.580002;, -81.197510;3.403015;-42.669998;, -39.190247;-15.640938;-51.049999;, -49.006622;10.411407;-46.230000;, 5.076843;-18.789993;-51.049999;, -0.003174;6.529009;-48.009998;, 50.036850;-18.539993;-49.020000;, 48.006851;5.089981;-46.230000;, 103.376846;-27.930008;-44.700001;, 103.886841;-1.010025;-43.939999;, 161.417679;-29.193550;-28.450001;, 162.713242;-4.686424;-33.020000;, 199.070190;-36.018791;-21.840000;, 201.173447;-11.476181;-23.370001;, 226.755234;-36.330627;-14.220000;, 228.461502;-21.143990;-13.970000;, 244.936478;-38.099564;-10.670000;, 248.461105;-25.743721;-9.910000;, 272.516663;-27.825661;-18.290001;, -46.208221;-47.930710;-41.150002;, 6.606842;-52.830002;-37.590000;, 47.240704;-51.721313;-38.099998;, 98.294579;-53.795647;-30.990000;, 159.893112;-50.211456;-17.270000;, 198.869385;-48.771626;-9.650000;, 225.217270;-46.755871;-7.110000;, 255.504883;-47.863602;-5.590000;, 269.553040;-46.438980;-14.409779;, -60.375549;-65.289017;-71.370003;, -59.387085;-63.494911;-73.660004;, -36.437195;-57.347382;-64.519997;, -14.160309;-68.665680;-77.220001;, -48.602417;-66.941849;-80.010002;, -28.562531;-69.723923;-80.769997;, -195.412811;-85.996056;-7.870000;, -209.426086;-91.976212;-4.570000;, 325.862610;-47.883812;-63.250000;, 299.024292;-50.850159;-73.150002;, 335.214783;-50.588272;-86.610001;, 283.385864;-33.640854;-20.904961;, 303.063110;-37.013802;-9.650000;, 314.287231;-37.568359;-5.840000;, 273.239410;-36.253315;-24.129999;, -215.413879;-84.334099;-3.810000;, -214.060638;-89.544067;-4.830000;, -48.335999;-68.811401;-78.230003;, -28.418518;-70.573166;-79.250000;, 282.010498;-44.364044;-52.320000;, 282.161438;-48.756035;-52.320000;, 299.219421;-53.423798;-73.150002;, 319.443726;-42.644302;-21.590000;, 117.346848;105.419968;0.000000;, -136.128357;-47.342552;31.750000;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; MeshNormals { 284; 0.154061;0.776306;-0.611241;, 0.485218;0.874393;0.000000;, 0.501943;0.864901;0.000000;, 0.196937;0.400873;-0.894716;, 0.247004;0.969015;0.000000;, 0.094987;0.474935;-0.874880;, -0.062005;0.998076;0.000000;, -0.097973;0.156957;-0.982734;, -0.439192;0.898393;0.000000;, -0.413192;0.562262;-0.716334;, -0.940811;0.338932;0.000000;, -0.662250;0.749283;0.000000;, -0.120003;0.363010;-0.924025;, -0.166943;0.091969;-0.981668;, -0.125951;0.028989;-0.991613;, 0.648896;0.760877;0.000000;, 0.718366;0.479244;-0.504257;, 0.906668;0.421845;0.000000;, 0.562064;0.827094;0.000000;, 0.584894;0.676877;-0.446919;, 0.504111;0.830183;-0.238052;, 0.463932;0.885871;0.000000;, 0.388073;0.781146;-0.489091;, 0.487116;0.817195;-0.308074;, 0.276965;0.960880;0.000000;, 0.183028;0.740112;-0.647098;, 0.012006;0.607295;-0.794386;, -0.090980;0.587870;-0.803823;, -0.290048;0.665110;-0.688114;, -0.282038;0.781104;-0.557074;, -0.294858;0.955541;0.000000;, -0.343108;0.939296;0.000000;, -0.294119;0.588239;-0.753306;, -0.405953;0.913894;0.000000;, -0.296897;0.389865;-0.871698;, -0.439192;0.898393;0.000000;, -0.122002;0.459008;-0.880015;, -0.461951;0.886906;0.000000;, -0.418980;0.696967;-0.581973;, -0.698049;0.716050;0.000000;, -0.510981;0.773972;-0.373986;, 0.425814;0.721684;-0.545761;, 0.254105;0.553228;-0.793328;, 0.221065;0.500148;-0.837247;, 0.109016;0.493074;-0.863130;, 0.004000;0.473022;-0.881041;, -0.098006;0.416026;-0.904056;, -0.154958;0.491868;-0.856770;, -0.224007;0.558016;-0.799024;, 0.248118;0.211100;-0.945449;, 0.470276;0.287169;-0.834490;, 0.484036;0.255019;-0.837063;, 0.650755;0.387854;-0.652754;, 0.754233;0.329102;-0.568176;, 0.307975;0.029998;-0.950922;, 0.393956;0.076991;-0.915899;, 0.637006;0.314003;-0.704007;, 0.315966;-0.113988;-0.941898;, 0.236981;-0.112991;-0.964921;, 0.440010;0.073002;-0.895021;, 0.819214;0.291076;-0.494129;, 0.998750;-0.049987;0.000000;, 0.839060;0.544039;0.000000;, 0.761763;0.472853;-0.442862;, 0.262104;0.143057;-0.954378;, 0.333060;0.182033;-0.925168;, 0.303127;0.093039;-0.948397;, 0.450081;0.071013;-0.890160;, 0.389056;-0.114016;-0.914131;, 0.402051;0.080010;-0.912115;, 0.314917;0.050986;-0.947749;, 0.460009;-0.058001;-0.886018;, 0.308028;-0.066006;-0.949085;, 0.185032;-0.345060;-0.920161;, 0.207039;-0.351067;-0.913174;, 0.293926;0.184953;-0.937763;, 0.357144;0.200081;-0.912368;, 0.265955;-0.016997;-0.963836;, 0.362108;-0.040012;-0.931277;, 0.213986;-0.200987;-0.955936;, 0.039998;-0.792955;-0.607966;, 0.014005;-0.780304;-0.625244;, -0.060023;-0.860329;-0.506193;, -0.059020;-0.551191;-0.832289;, 0.244024;-0.230023;-0.942094;, 0.154949;-0.900702;-0.405866;, 0.245995;-0.049999;-0.967981;, 0.146029;-0.013003;-0.989195;, 0.223974;0.129985;-0.965888;, 0.170926;0.373839;-0.911608;, 0.198048;0.332081;-0.922225;, 0.083043;0.346180;-0.934486;, 0.008002;-0.058016;-0.998284;, -0.019998;0.292973;-0.955912;, -0.025010;-0.112044;-0.993388;, -0.070977;0.301903;-0.950693;, -0.042022;-0.123063;-0.991509;, -0.139023;0.308051;-0.941157;, -0.150992;-0.243988;-0.957952;, -0.241906;0.203920;-0.948630;, -0.193099;-0.320164;-0.927474;, -0.276012;0.099004;-0.956042;, -0.200959;-0.352928;-0.913814;, -0.255139;0.027015;-0.966527;, -0.188033;-0.324057;-0.927163;, -0.003999;0.128954;-0.991643;, 0.169032;-0.269050;-0.948177;, -0.017001;0.597029;-0.802039;, -0.109988;-0.678926;-0.725921;, -0.012000;-0.715011;-0.699010;, -0.035000;-0.736993;-0.674994;, -0.136038;-0.788221;-0.600168;, -0.127993;-0.788958;-0.600968;, -0.133986;-0.784919;-0.604938;, -0.066975;-0.746723;-0.661755;, 0.041008;-0.875162;-0.482089;, 0.145951;-0.968672;-0.200932;, 0.610009;0.187003;-0.770012;, 0.219989;-0.973951;0.054997;, -0.661088;0.453060;0.598080;, -0.294927;-0.849790;-0.436892;, -0.045004;-0.269023;-0.962082;, 0.240915;0.144949;-0.959661;, 0.024992;-0.999688;0.000000;, -0.112955;-0.993600;0.000000;, -0.050985;-0.998699;0.000000;, -0.087018;-0.996207;0.000000;, -0.089003;-0.996031;0.000000;, -0.042005;-0.999117;0.000000;, -0.159044;-0.987272;0.000000;, -0.141981;-0.989869;0.000000;, -0.006000;-0.999982;0.000000;, -0.221059;-0.975260;0.000000;, -0.341020;-0.940056;0.000000;, -0.259028;-0.808087;-0.529057;, 0.171046;-0.985263;0.000000;, 0.083988;-0.813887;-0.574920;, 0.282084;-0.014004;-0.959287;, 0.522928;0.487933;-0.698904;, -0.987925;0.061995;0.141989;, -0.262064;0.935228;-0.238058;, -0.214934;0.851739;-0.477854;, -0.389085;0.921202;0.000000;, -0.613160;0.678177;0.405106;, -0.576212;-0.817300;0.000000;, 0.599068;0.322036;-0.733083;, 0.795508;-0.223143;-0.563360;, 0.981792;-0.189960;0.000000;, 0.498180;-0.243088;-0.832301;, 0.875052;-0.484029;0.000000;, -0.016996;-0.993789;0.109977;, 0.265977;-0.929920;-0.253978;, -0.911528;-0.411238;0.000000;, -0.040008;-0.999199;0.000000;, -0.086025;-0.996293;0.000000;, -0.147998;-0.988988;0.000000;, 0.363007;-0.817016;-0.448009;, 0.698904;-0.652911;-0.291960;, 0.250048;0.876166;-0.412078;, -0.995170;-0.015003;-0.097017;, 0.520074;0.854121;0.000000;, 0.196937;0.400873;0.894716;, 0.154061;0.776306;0.611241;, 0.094987;0.474935;0.874880;, -0.097973;0.156957;0.982734;, -0.413192;0.562262;0.716334;, -0.166943;0.091969;0.981668;, -0.120003;0.363010;0.924025;, -0.125951;0.028989;0.991613;, 0.718366;0.479244;0.504257;, 0.584894;0.676877;0.446919;, 0.504111;0.830183;0.238052;, 0.487116;0.817195;0.308074;, 0.388073;0.781146;0.489091;, 0.183028;0.740112;0.647098;, 0.012006;0.607295;0.794386;, -0.090980;0.587870;0.803823;, -0.290048;0.665110;0.688114;, -0.282038;0.781104;0.557074;, -0.294119;0.588239;0.753306;, -0.296897;0.389865;0.871698;, -0.122002;0.459008;0.880015;, -0.418980;0.696967;0.581973;, -0.510981;0.773972;0.373986;, 0.425814;0.721684;0.545761;, 0.254105;0.553228;0.793328;, 0.221065;0.500148;0.837247;, 0.109016;0.493074;0.863130;, 0.004000;0.473022;0.881041;, -0.098006;0.416026;0.904056;, -0.154958;0.491868;0.856770;, -0.224007;0.558016;0.799024;, 0.470276;0.287169;0.834490;, 0.248118;0.211100;0.945449;, 0.484036;0.255019;0.837063;, 0.650755;0.387854;0.652754;, 0.754233;0.329102;0.568176;, 0.393956;0.076991;0.915899;, 0.307975;0.029998;0.950922;, 0.637006;0.314003;0.704007;, 0.440010;0.073002;0.895021;, 0.236981;-0.112991;0.964921;, 0.315966;-0.113988;0.941898;, 0.761763;0.472853;0.442862;, 0.819214;0.291076;0.494129;, 0.303127;0.093039;0.948397;, 0.333060;0.182033;0.925168;, 0.262104;0.143057;0.954378;, 0.450081;0.071013;0.890160;, 0.389056;-0.114016;0.914131;, 0.290968;-0.039996;0.955896;, 0.402051;0.080010;0.912115;, 0.460009;-0.058001;0.886018;, 0.308028;-0.066006;0.949085;, 0.234052;-0.276061;0.932207;, 0.185032;-0.345060;0.920161;, 0.293926;0.184953;0.937763;, 0.357144;0.200081;0.912368;, 0.265955;-0.016997;0.963836;, 0.241078;-0.187060;0.952308;, 0.362108;-0.040012;0.931277;, 0.091007;-0.381030;0.920073;, 0.026983;-0.806492;0.590628;, 0.014005;-0.780304;0.625244;, 0.048995;-0.568942;0.820917;, -0.044988;-0.930742;0.362899;, 0.154949;-0.900702;0.405866;, 0.244024;-0.230023;0.942094;, 0.146029;-0.013003;0.989195;, 0.245995;-0.049999;0.967981;, 0.223974;0.129985;0.965888;, 0.170926;0.373839;0.911608;, 0.198048;0.332081;0.922225;, 0.008002;-0.058016;0.998284;, 0.083043;0.346180;0.934486;, -0.025010;-0.112044;0.993388;, -0.019998;0.292973;0.955912;, -0.042022;-0.123063;0.991509;, -0.070977;0.301903;0.950693;, -0.150992;-0.243988;0.957952;, -0.139023;0.308051;0.941157;, -0.193099;-0.320164;0.927474;, -0.241906;0.203920;0.948630;, -0.200959;-0.352928;0.913814;, -0.276012;0.099004;0.956042;, -0.188033;-0.324057;0.927163;, -0.255139;0.027015;0.966527;, 0.169032;-0.269050;0.948177;, -0.003999;0.128954;0.991643;, -0.017001;0.597029;0.802039;, -0.109988;-0.678926;0.725921;, -0.012000;-0.715011;0.699010;, -0.035000;-0.736993;0.674994;, -0.136038;-0.788221;0.600168;, -0.127993;-0.788958;0.600968;, -0.133986;-0.784919;0.604938;, -0.066975;-0.746723;0.661755;, 0.041008;-0.875162;0.482089;, 0.145951;-0.968672;0.200932;, 0.219989;-0.973951;-0.054997;, 0.610009;0.187003;0.770012;, -0.661088;0.453060;-0.598080;, -0.294927;-0.849790;0.436892;, 0.240915;0.144949;0.959661;, -0.045004;-0.269023;0.962082;, -0.259028;-0.808087;0.529057;, 0.154023;-0.708106;0.689103;, -0.987925;0.061995;-0.141989;, 0.522928;0.487933;0.698904;, 0.282084;-0.014004;0.959287;, -0.214934;0.851739;0.477854;, -0.262064;0.935228;0.238058;, -0.613160;0.678177;-0.405106;, 0.599068;0.322036;0.733083;, 0.795508;-0.223143;0.563360;, 0.483976;-0.310984;0.817959;, 0.265977;-0.929920;0.253978;, -0.016996;-0.993789;-0.109977;, 0.250048;0.876166;0.412078;, 0.698904;-0.652911;0.291960;, 0.363007;-0.817016;0.448009;, -0.995170;-0.015003;0.097017;, -0.991904;-0.126988;0.000000;, 0.091007;-0.381030;-0.920073;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; } MeshMaterialList { 1; 564; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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; Material { 1.00000;1.000000;1.00000;1.00000;; 25.400000; 1.000000;1.000000;1.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "dolphin.bmp"; } } } VertexDuplicationIndices { 284; 284; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283; } } } } ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/dolphin_group.x ================================================ xof 0303txt 0032 template XSkinMeshHeader { <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> WORD nMaxSkinWeightsPerVertex; WORD nMaxSkinWeightsPerFace; WORD nBones; } template VertexDuplicationIndices { DWORD nIndices; DWORD nOriginalVertices; array DWORD indices[nIndices]; } template SkinWeights { <6f0d123b-bad2-4167-a0d0-80224f25fabb> STRING transformNodeName; DWORD nWeights; array DWORD vertexIndices[nWeights]; array FLOAT weights[nWeights]; Matrix4x4 matrixOffset; } Frame SCENE_ROOT { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Frame frm-Dolph03 { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh Dolph03 { 284; -1.187194;64.826233;8.130002;, -6.142837;65.927422;-0.000000;, 31.746841;100.080002;0.000000;, 39.366852;98.809982;6.099998;, 64.766846;116.079941;0.000000;, 68.076843;113.040024;3.559999;, 96.266846;118.369980;0.000000;, 98.046844;114.049973;2.062331;, 114.296844;113.540024;0.000000;, 96.776840;54.869980;6.517096;, 96.266846;72.900009;0.000000;, 106.936844;48.009995;0.000000;, 57.146851;62.739975;11.680001;, 72.136841;84.080002;6.633347;, 82.806854;95.759995;4.012877;, -169.419098;16.915739;-0.000000;, -177.035828;11.229694;7.620002;, -183.084564;9.296997;-0.000000;, -148.192398;26.747538;-0.000000;, -153.575363;21.636553;13.970002;, -126.190651;35.514084;5.330001;, -84.050156;54.021847;-0.000000;, -86.416969;48.318592;18.290003;, -125.601196;33.312325;13.970002;, -42.175732;62.659023;-0.000000;, -42.137329;58.528698;22.350002;, -3.544493;50.477592;24.639997;, 53.596848;48.009995;26.669998;, 109.726837;36.069992;20.319998;, 158.141220;32.867401;11.680001;, 157.181122;36.994099;0.000000;, 195.845322;36.444603;0.000000;, 198.421494;24.970091;14.730000;, 217.943008;36.701542;0.000000;, 224.240524;22.792717;11.939998;, 233.396622;40.165440;0.000000;, 242.954117;30.082399;7.870000;, 249.502090;43.866344;0.000000;, 257.511444;39.318447;9.650002;, 267.636658;44.037434;0.000000;, 267.381256;39.921616;9.375875;, -129.344971;27.826403;22.350002;, -115.249748;22.588278;32.770000;, -83.380127;33.276646;31.705227;, -43.810791;41.023785;31.999998;, -3.790570;32.775356;35.809998;, 45.976837;30.489975;34.040001;, 106.426849;22.609970;28.449999;, 159.110229;25.329865;18.290003;, -129.034393;12.997487;36.580002;, -137.842133;17.008808;31.750000;, -146.852936;12.115658;27.430000;, -167.374252;0.337567;20.830002;, -185.472137;-8.430785;10.160001;, -129.556076;2.874023;35.809998;, -138.469482;9.804406;30.989998;, -189.653305;-15.045199;13.970002;, -186.338577;-26.411579;14.990002;, -219.117096;-39.503284;7.369999;, -223.164688;-35.673569;7.369999;, -228.977280;-37.688282;4.059999;, -229.678406;-35.835785;-0.000000;, -197.032120;-13.827255;-0.000000;, -193.635788;-12.582498;5.079998;, -151.718582;-0.788121;30.480000;, -142.486694;4.850280;30.730001;, -151.610046;-3.725685;30.730001;, -165.824905;-4.498291;26.420000;, -164.430069;-10.515144;25.910000;, -183.989227;-31.260592;16.259998;, -213.449738;-42.540489;8.379999;, -161.528366;-22.659479;27.047174;, -148.211853;-10.455325;34.540001;, -128.220383;-24.037979;34.799999;, -160.778366;-28.655569;27.430000;, -141.809769;-6.662666;34.799999;, -137.310959;1.582955;34.540001;, -127.194580;-12.234112;38.610001;, -184.219818;-36.558086;18.290003;, -210.769104;-46.435375;10.919998;, -163.427414;-50.345478;17.020000;, -124.040443;-51.152882;22.350002;, -181.287918;-45.917809;10.160001;, -184.905853;-40.088390;17.269999;, -91.069618;-37.163376;43.180000;, -91.579506;-47.217293;35.049995;, -122.799408;-12.376725;40.389996;, -81.292206;-8.397122;49.279999;, -113.739136;3.524862;40.130001;, -109.828125;15.830540;36.580002;, -79.181816;15.358729;42.669998;, -46.452160;17.672569;46.230000;, -39.970043;-9.546609;51.049999;, 0.110384;6.937223;48.009998;, 5.076844;-18.789993;51.049999;, 48.006851;5.089982;46.230000;, 50.036850;-18.539993;49.020000;, 103.886841;-1.010024;43.939999;, 103.376846;-27.930008;44.700001;, 161.162369;4.123069;33.020004;, 163.766937;-20.261320;28.449999;, 199.195084;9.136382;23.370001;, 203.466644;-15.218976;21.840002;, 227.201157;10.131914;13.970002;, 231.175110;-5.114145;14.220000;, 243.208893;19.011372;9.909999;, 246.819061;6.594709;10.670001;, 262.049408;33.459076;18.290003;, -51.241043;-40.521793;41.150002;, 6.606843;-52.830002;37.590000;, 47.240704;-51.721313;38.100002;, 98.294579;-53.795647;30.989998;, 165.371384;-41.269321;17.269999;, 206.519302;-27.586216;9.650002;, 233.308868;-16.060780;7.110003;, 261.325928;7.033109;5.589998;, 273.138245;19.171013;14.409779;, -67.232765;-53.982800;73.660004;, -68.469292;-55.615852;71.370003;, -41.431782;-51.342903;64.519997;, -16.828482;-66.025253;77.220001;, -33.569759;-64.848167;80.769997;, -56.426437;-58.987450;80.010002;, 3.046844;-66.030014;0.000000;, -51.868515;-56.469826;-0.000000;, 95.548935;-61.466160;0.000000;, 166.511826;-45.863071;0.000000;, 233.058502;-20.942669;0.000000;, 263.500702;6.870311;0.000000;, -119.927795;-54.873909;-0.000000;, -84.209518;-55.953888;-0.000000;, -156.094864;-55.203892;-0.000000;, -179.308792;-48.753994;-0.000000;, -206.911743;-52.337349;-0.000000;, -209.366943;-50.140347;7.870000;, -227.328964;-53.853546;-0.000000;, -224.427170;-52.447666;4.569998;, 318.715668;69.285507;86.610001;, 297.370087;40.059059;73.150002;, 310.972900;63.384106;63.250000;, 288.661469;51.544575;9.650002;, 274.231842;37.747593;20.904961;, 281.194397;46.874439;0.000000;, 295.792297;60.230179;5.840001;, 290.159393;53.076187;0.000000;, 268.865143;28.569664;24.129999;, -228.326324;-43.556538;3.810001;, -228.726089;-43.153072;-0.000000;, -228.311264;-48.939365;4.830000;, -230.245377;-49.082825;-0.000000;, -33.471981;-65.714722;79.250000;, -56.368610;-60.880119;78.230003;, 105.666840;93.729965;0.000000;, 46.226837;-64.342575;0.000000;, 206.947968;-32.213493;0.000000;, 276.245270;19.983170;0.000000;, 299.553619;38.682877;73.150002;, 285.644012;27.761074;52.320000;, 282.026184;30.255810;52.320000;, 302.940948;61.348839;21.590000;, -124.396561;37.824509;-0.000000;, 39.366852;98.809982;-6.099998;, -1.187194;64.826233;-8.130002;, 68.076843;113.040024;-3.560004;, 98.046844;114.049973;-2.062331;, 96.776840;54.869980;-6.517096;, 72.136841;84.080002;-6.633341;, 57.146851;62.739975;-11.680001;, 82.806854;95.759995;-4.012877;, -177.035828;11.229694;-7.620002;, -153.575363;21.636553;-13.970002;, -126.190651;35.514084;-5.330001;, -125.601196;33.312325;-13.970002;, -86.416969;48.318592;-18.289999;, -42.137329;58.528698;-22.349997;, -3.544493;50.477592;-24.639997;, 53.596848;48.009995;-26.670002;, 109.726837;36.069992;-20.320002;, 158.141220;32.867401;-11.680001;, 198.421494;24.970091;-14.729995;, 224.240524;22.792717;-11.939998;, 242.954117;30.082399;-7.870005;, 257.511444;39.318447;-9.649997;, 267.381256;39.921616;-9.375875;, -129.344971;27.826403;-22.349997;, -115.249748;22.588278;-32.770000;, -83.380127;33.276646;-31.705223;, -43.810791;41.023785;-32.000004;, -3.790570;32.775356;-35.809998;, 45.976837;30.489975;-34.040001;, 106.426849;22.609970;-28.450005;, 159.110229;25.329865;-18.289999;, -137.842133;17.008808;-31.750000;, -129.034393;12.997487;-36.580006;, -146.852936;12.115658;-27.430006;, -167.374252;0.337567;-20.830002;, -185.472137;-8.430785;-10.159996;, -138.469482;9.804406;-30.989998;, -129.556076;2.874023;-35.809998;, -189.653305;-15.045199;-13.970002;, -223.164688;-35.673569;-7.369999;, -219.117096;-39.503284;-7.369999;, -186.338577;-26.411579;-14.990002;, -193.635788;-12.582498;-5.079998;, -228.977280;-37.688282;-4.059999;, -151.610046;-3.725685;-30.730001;, -142.486694;4.850280;-30.730001;, -151.718582;-0.788121;-30.480000;, -165.824905;-4.498291;-26.420000;, -164.430069;-10.515144;-25.910000;, -213.449738;-42.540489;-8.380005;, -183.989227;-31.260592;-16.260004;, -161.528366;-22.659479;-27.047174;, -148.211853;-10.455325;-34.539997;, -160.778366;-28.655569;-27.430006;, -128.220383;-24.037979;-34.799995;, -141.809769;-6.662666;-34.799995;, -137.310959;1.582955;-34.539997;, -127.194580;-12.234112;-38.610001;, -210.769104;-46.435375;-10.919998;, -184.219818;-36.558086;-18.289999;, -141.314682;-25.752174;-31.750000;, -163.427414;-50.345478;-17.019997;, -124.040443;-51.152882;-22.349997;, -184.905853;-40.088390;-17.269999;, -181.287918;-45.917809;-10.159996;, -91.579506;-47.217293;-35.049995;, -91.069618;-37.163376;-43.180000;, -81.292206;-8.397122;-49.279995;, -122.799408;-12.376725;-40.390003;, -113.739136;3.524862;-40.130005;, -109.828125;15.830540;-36.580006;, -79.181816;15.358729;-42.669998;, -39.970043;-9.546609;-51.050003;, -46.452160;17.672569;-46.230003;, 5.076844;-18.789993;-51.050003;, 0.110384;6.937223;-48.009995;, 50.036850;-18.539993;-49.020000;, 48.006851;5.089982;-46.230003;, 103.376846;-27.930008;-44.700005;, 103.886841;-1.010024;-43.940002;, 163.766937;-20.261320;-28.450005;, 161.162369;4.123069;-33.020004;, 203.466644;-15.218976;-21.839996;, 199.195084;9.136382;-23.369997;, 231.175110;-5.114145;-14.220005;, 227.201157;10.131914;-13.970002;, 246.819061;6.594709;-10.669996;, 243.208893;19.011372;-9.910004;, 262.049408;33.459076;-18.289999;, -51.241043;-40.521793;-41.150005;, 6.606843;-52.830002;-37.590000;, 47.240704;-51.721313;-38.100002;, 98.294579;-53.795647;-30.989998;, 165.371384;-41.269321;-17.269999;, 206.519302;-27.586216;-9.649997;, 233.308868;-16.060780;-7.110003;, 261.325928;7.033109;-5.589998;, 273.138245;19.171013;-14.409783;, -68.469292;-55.615852;-71.370003;, -67.232765;-53.982800;-73.660011;, -41.431782;-51.342903;-64.520004;, -16.828482;-66.025253;-77.220001;, -56.426437;-58.987450;-80.009995;, -33.569759;-64.848167;-80.769997;, -209.366943;-50.140347;-7.870005;, -224.427170;-52.447666;-4.569998;, 310.972900;63.384106;-63.250000;, 297.370087;40.059059;-73.150002;, 318.715668;69.285507;-86.610001;, 274.231842;37.747593;-20.904961;, 288.661469;51.544575;-9.649997;, 295.792297;60.230179;-5.840001;, 268.865143;28.569664;-24.129999;, -228.326324;-43.556538;-3.809996;, -228.311264;-48.939365;-4.829995;, -56.368610;-60.880119;-78.230003;, -33.471981;-65.714722;-79.249992;, 282.026184;30.255810;-52.319996;, 285.644012;27.761074;-52.319996;, 299.553619;38.682877;-73.150002;, 302.940948;61.348839;-21.590004;, 117.346848;105.419968;0.000000;, -141.314682;-25.752174;31.750000;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; MeshNormals { 284; 0.154061;0.776306;-0.611241;, 0.485218;0.874393;0.000000;, 0.501943;0.864901;0.000000;, 0.196937;0.400873;-0.894716;, 0.247004;0.969015;0.000000;, 0.094987;0.474935;-0.874880;, -0.062005;0.998076;0.000000;, -0.097973;0.156957;-0.982734;, -0.439192;0.898393;0.000000;, -0.413192;0.562262;-0.716334;, -0.940811;0.338932;0.000000;, -0.662250;0.749283;0.000000;, -0.120003;0.363010;-0.924025;, -0.166943;0.091969;-0.981668;, -0.125951;0.028989;-0.991613;, 0.648896;0.760877;0.000000;, 0.718366;0.479244;-0.504257;, 0.906668;0.421845;0.000000;, 0.562064;0.827094;0.000000;, 0.584894;0.676877;-0.446919;, 0.504111;0.830183;-0.238052;, 0.463932;0.885871;0.000000;, 0.388073;0.781146;-0.489091;, 0.487116;0.817195;-0.308074;, 0.276965;0.960880;0.000000;, 0.183028;0.740112;-0.647098;, 0.012006;0.607295;-0.794386;, -0.090980;0.587870;-0.803823;, -0.290048;0.665110;-0.688114;, -0.282038;0.781104;-0.557074;, -0.294858;0.955541;0.000000;, -0.343108;0.939296;0.000000;, -0.294119;0.588239;-0.753306;, -0.405953;0.913894;0.000000;, -0.296897;0.389865;-0.871698;, -0.439192;0.898393;0.000000;, -0.122002;0.459008;-0.880015;, -0.461951;0.886906;0.000000;, -0.418980;0.696967;-0.581973;, -0.698049;0.716050;0.000000;, -0.510981;0.773972;-0.373986;, 0.425814;0.721684;-0.545761;, 0.254105;0.553228;-0.793328;, 0.221065;0.500148;-0.837247;, 0.109016;0.493074;-0.863130;, 0.004000;0.473022;-0.881041;, -0.098006;0.416026;-0.904056;, -0.154958;0.491868;-0.856770;, -0.224007;0.558016;-0.799024;, 0.248118;0.211100;-0.945449;, 0.470276;0.287169;-0.834490;, 0.484036;0.255019;-0.837063;, 0.650755;0.387854;-0.652754;, 0.754233;0.329102;-0.568176;, 0.307975;0.029998;-0.950922;, 0.393956;0.076991;-0.915899;, 0.637006;0.314003;-0.704007;, 0.315966;-0.113988;-0.941898;, 0.236981;-0.112991;-0.964921;, 0.440010;0.073002;-0.895021;, 0.819214;0.291076;-0.494129;, 0.998750;-0.049987;0.000000;, 0.839060;0.544039;0.000000;, 0.761763;0.472853;-0.442862;, 0.262104;0.143057;-0.954378;, 0.333060;0.182033;-0.925168;, 0.303127;0.093039;-0.948397;, 0.450081;0.071013;-0.890160;, 0.389056;-0.114016;-0.914131;, 0.402051;0.080010;-0.912115;, 0.314917;0.050986;-0.947749;, 0.460009;-0.058001;-0.886018;, 0.308028;-0.066006;-0.949085;, 0.185032;-0.345060;-0.920161;, 0.207039;-0.351067;-0.913174;, 0.293926;0.184953;-0.937763;, 0.357144;0.200081;-0.912368;, 0.265955;-0.016997;-0.963836;, 0.362108;-0.040012;-0.931277;, 0.213986;-0.200987;-0.955936;, 0.039998;-0.792955;-0.607966;, 0.014005;-0.780304;-0.625244;, -0.060023;-0.860329;-0.506193;, -0.059020;-0.551191;-0.832289;, 0.244024;-0.230023;-0.942094;, 0.154949;-0.900702;-0.405866;, 0.245995;-0.049999;-0.967981;, 0.146029;-0.013003;-0.989195;, 0.223974;0.129985;-0.965888;, 0.170926;0.373839;-0.911608;, 0.198048;0.332081;-0.922225;, 0.083043;0.346180;-0.934486;, 0.008002;-0.058016;-0.998284;, -0.019998;0.292973;-0.955912;, -0.025010;-0.112044;-0.993388;, -0.070977;0.301903;-0.950693;, -0.042022;-0.123063;-0.991509;, -0.139023;0.308051;-0.941157;, -0.150992;-0.243988;-0.957952;, -0.241906;0.203920;-0.948630;, -0.193099;-0.320164;-0.927474;, -0.276012;0.099004;-0.956042;, -0.200959;-0.352928;-0.913814;, -0.255139;0.027015;-0.966527;, -0.188033;-0.324057;-0.927163;, -0.003999;0.128954;-0.991643;, 0.169032;-0.269050;-0.948177;, -0.017001;0.597029;-0.802039;, -0.109988;-0.678926;-0.725921;, -0.012000;-0.715011;-0.699010;, -0.035000;-0.736993;-0.674994;, -0.136038;-0.788221;-0.600168;, -0.127993;-0.788958;-0.600968;, -0.133986;-0.784919;-0.604938;, -0.066975;-0.746723;-0.661755;, 0.041008;-0.875162;-0.482089;, 0.145951;-0.968672;-0.200932;, 0.610009;0.187003;-0.770012;, 0.219989;-0.973951;0.054997;, -0.661088;0.453060;0.598080;, -0.294927;-0.849790;-0.436892;, -0.045004;-0.269023;-0.962082;, 0.240915;0.144949;-0.959661;, 0.024992;-0.999688;0.000000;, -0.112955;-0.993600;0.000000;, -0.050985;-0.998699;0.000000;, -0.087018;-0.996207;0.000000;, -0.089003;-0.996031;0.000000;, -0.042005;-0.999117;0.000000;, -0.159044;-0.987272;0.000000;, -0.141981;-0.989869;0.000000;, -0.006000;-0.999982;0.000000;, -0.221059;-0.975260;0.000000;, -0.341020;-0.940056;0.000000;, -0.259028;-0.808087;-0.529057;, 0.171046;-0.985263;0.000000;, 0.083988;-0.813887;-0.574920;, 0.282084;-0.014004;-0.959287;, 0.522928;0.487933;-0.698904;, -0.987925;0.061995;0.141989;, -0.262064;0.935228;-0.238058;, -0.214934;0.851739;-0.477854;, -0.389085;0.921202;0.000000;, -0.613160;0.678177;0.405106;, -0.576212;-0.817300;0.000000;, 0.599068;0.322036;-0.733083;, 0.795508;-0.223143;-0.563360;, 0.981792;-0.189960;0.000000;, 0.498180;-0.243088;-0.832301;, 0.875052;-0.484029;0.000000;, -0.016996;-0.993789;0.109977;, 0.265977;-0.929920;-0.253978;, -0.911528;-0.411238;0.000000;, -0.040008;-0.999199;0.000000;, -0.086025;-0.996293;0.000000;, -0.147998;-0.988988;0.000000;, 0.363007;-0.817016;-0.448009;, 0.698904;-0.652911;-0.291960;, 0.250048;0.876166;-0.412078;, -0.995170;-0.015003;-0.097017;, 0.520074;0.854121;0.000000;, 0.196937;0.400873;0.894716;, 0.154061;0.776306;0.611241;, 0.094987;0.474935;0.874880;, -0.097973;0.156957;0.982734;, -0.413192;0.562262;0.716334;, -0.166943;0.091969;0.981668;, -0.120003;0.363010;0.924025;, -0.125951;0.028989;0.991613;, 0.718366;0.479244;0.504257;, 0.584894;0.676877;0.446919;, 0.504111;0.830183;0.238052;, 0.487116;0.817195;0.308074;, 0.388073;0.781146;0.489091;, 0.183028;0.740112;0.647098;, 0.012006;0.607295;0.794386;, -0.090980;0.587870;0.803823;, -0.290048;0.665110;0.688114;, -0.282038;0.781104;0.557074;, -0.294119;0.588239;0.753306;, -0.296897;0.389865;0.871698;, -0.122002;0.459008;0.880015;, -0.418980;0.696967;0.581973;, -0.510981;0.773972;0.373986;, 0.425814;0.721684;0.545761;, 0.254105;0.553228;0.793328;, 0.221065;0.500148;0.837247;, 0.109016;0.493074;0.863130;, 0.004000;0.473022;0.881041;, -0.098006;0.416026;0.904056;, -0.154958;0.491868;0.856770;, -0.224007;0.558016;0.799024;, 0.470276;0.287169;0.834490;, 0.248118;0.211100;0.945449;, 0.484036;0.255019;0.837063;, 0.650755;0.387854;0.652754;, 0.754233;0.329102;0.568176;, 0.393956;0.076991;0.915899;, 0.307975;0.029998;0.950922;, 0.637006;0.314003;0.704007;, 0.440010;0.073002;0.895021;, 0.236981;-0.112991;0.964921;, 0.315966;-0.113988;0.941898;, 0.761763;0.472853;0.442862;, 0.819214;0.291076;0.494129;, 0.303127;0.093039;0.948397;, 0.333060;0.182033;0.925168;, 0.262104;0.143057;0.954378;, 0.450081;0.071013;0.890160;, 0.389056;-0.114016;0.914131;, 0.290968;-0.039996;0.955896;, 0.402051;0.080010;0.912115;, 0.460009;-0.058001;0.886018;, 0.308028;-0.066006;0.949085;, 0.234052;-0.276061;0.932207;, 0.185032;-0.345060;0.920161;, 0.293926;0.184953;0.937763;, 0.357144;0.200081;0.912368;, 0.265955;-0.016997;0.963836;, 0.241078;-0.187060;0.952308;, 0.362108;-0.040012;0.931277;, 0.091007;-0.381030;0.920073;, 0.026983;-0.806492;0.590628;, 0.014005;-0.780304;0.625244;, 0.048995;-0.568942;0.820917;, -0.044988;-0.930742;0.362899;, 0.154949;-0.900702;0.405866;, 0.244024;-0.230023;0.942094;, 0.146029;-0.013003;0.989195;, 0.245995;-0.049999;0.967981;, 0.223974;0.129985;0.965888;, 0.170926;0.373839;0.911608;, 0.198048;0.332081;0.922225;, 0.008002;-0.058016;0.998284;, 0.083043;0.346180;0.934486;, -0.025010;-0.112044;0.993388;, -0.019998;0.292973;0.955912;, -0.042022;-0.123063;0.991509;, -0.070977;0.301903;0.950693;, -0.150992;-0.243988;0.957952;, -0.139023;0.308051;0.941157;, -0.193099;-0.320164;0.927474;, -0.241906;0.203920;0.948630;, -0.200959;-0.352928;0.913814;, -0.276012;0.099004;0.956042;, -0.188033;-0.324057;0.927163;, -0.255139;0.027015;0.966527;, 0.169032;-0.269050;0.948177;, -0.003999;0.128954;0.991643;, -0.017001;0.597029;0.802039;, -0.109988;-0.678926;0.725921;, -0.012000;-0.715011;0.699010;, -0.035000;-0.736993;0.674994;, -0.136038;-0.788221;0.600168;, -0.127993;-0.788958;0.600968;, -0.133986;-0.784919;0.604938;, -0.066975;-0.746723;0.661755;, 0.041008;-0.875162;0.482089;, 0.145951;-0.968672;0.200932;, 0.219989;-0.973951;-0.054997;, 0.610009;0.187003;0.770012;, -0.661088;0.453060;-0.598080;, -0.294927;-0.849790;0.436892;, 0.240915;0.144949;0.959661;, -0.045004;-0.269023;0.962082;, -0.259028;-0.808087;0.529057;, 0.154023;-0.708106;0.689103;, -0.987925;0.061995;-0.141989;, 0.522928;0.487933;0.698904;, 0.282084;-0.014004;0.959287;, -0.214934;0.851739;0.477854;, -0.262064;0.935228;0.238058;, -0.613160;0.678177;-0.405106;, 0.599068;0.322036;0.733083;, 0.795508;-0.223143;0.563360;, 0.483976;-0.310984;0.817959;, 0.265977;-0.929920;0.253978;, -0.016996;-0.993789;-0.109977;, 0.250048;0.876166;0.412078;, 0.698904;-0.652911;0.291960;, 0.363007;-0.817016;0.448009;, -0.995170;-0.015003;0.097017;, -0.991904;-0.126988;0.000000;, 0.091007;-0.381030;-0.920073;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; } MeshMaterialList { 1; 564; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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; Material { 0.269804;0.320000;0.630588;0.000000;; 20.000000; 0.500000;0.500000;0.500000;; 0.000000;0.000000;0.000000;; } } VertexDuplicationIndices { 284; 284; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283; } } } Frame frm-Dolph02 { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh Dolph02 { 284; -1.523163;64.520004;8.130000;, -6.853149;65.279984;-0.000000;, 31.746841;100.080002;0.000000;, 39.366852;98.809982;6.100000;, 64.766846;116.079941;0.000000;, 68.076843;113.040024;3.560000;, 96.266846;118.369980;-0.000000;, 98.046844;114.049973;2.062330;, 114.296844;113.540024;-0.000000;, 96.776840;54.869980;6.517095;, 96.266846;72.900009;0.000000;, 106.936844;48.009995;0.000000;, 57.146851;62.739975;11.680000;, 72.136841;84.080002;6.633346;, 82.806854;95.759995;4.012878;, -173.396179;-11.112038;-0.000000;, -179.359558;-18.513649;7.620000;, -184.737610;-21.889885;-0.000000;, -154.622162;3.132233;-0.000000;, -158.944885;-2.880463;13.970000;, -132.664642;15.837616;5.330000;, -91.583008;40.962021;-0.000000;, -93.103821;34.977371;18.290001;, -131.827026;13.720963;13.970000;, -47.355377;57.937881;-0.000000;, -48.554932;52.679184;22.350000;, -4.573151;49.539993;24.639999;, 53.596848;48.009995;26.670000;, 109.726837;36.069992;20.320000;, 164.597672;24.165756;11.680000;, 164.309326;28.406967;0.000000;, 205.337585;15.537689;0.000000;, 204.678864;3.807053;14.730000;, 229.959305;6.926483;0.000000;, 230.871490;-8.854462;11.940000;, 253.443558;-2.321793;0.000000;, 255.279877;-16.970306;7.870000;, 272.058594;-11.217239;0.000000;, 274.108582;-20.241173;9.650000;, 284.510010;-24.596809;0.000000;, 281.051788;-26.843124;9.375875;, -134.884155;7.603134;22.350000;, -118.785126;4.991013;32.770000;, -87.932434;20.529556;31.705227;, -49.602661;33.911453;32.000000;, -4.573151;31.759995;35.810001;, 45.976837;30.489975;34.040001;, 106.426849;22.609970;28.450001;, 164.256134;16.569855;18.290001;, -131.497375;-6.947311;36.580002;, -141.496643;-4.591209;31.750000;, -149.679199;-11.045776;27.430000;, -167.292755;-26.660843;20.830000;, -182.641449;-39.654480;10.160000;, -130.045837;-17.012077;35.810001;, -140.570618;-11.802643;30.990000;, -185.046326;-47.100906;13.970000;, -179.009033;-57.285851;14.990000;, -207.501984;-78.117943;7.370000;, -212.374817;-75.415138;7.370000;, -217.503754;-78.812088;4.060000;, -218.643555;-77.192154;-0.000000;, -192.496216;-47.756264;-0.000000;, -189.516144;-45.705978;5.080000;, -151.581909;-24.644920;30.480000;, -143.585480;-17.412247;30.730000;, -150.797241;-27.519791;30.730000;, -164.589447;-30.959465;26.420000;, -161.742157;-36.544441;25.910000;, -175.527588;-61.398262;16.260000;, -201.257355;-79.650314;8.380000;, -156.069885;-47.983437;27.047173;, -145.948456;-33.531952;34.540001;, -123.818665;-43.267906;34.799999;, -154.000732;-53.754593;27.430000;, -140.443726;-28.630959;34.799999;, -137.653870;-19.691261;34.540001;, -124.874481;-31.459930;38.610001;, -174.433502;-66.586670;18.290001;, -197.692322;-82.756187;10.920000;, -151.732513;-75.607498;17.020000;, -115.517059;-69.194389;22.350000;, -169.266052;-74.923210;10.160000;, -174.220032;-70.176674;17.270000;, -85.397644;-50.283577;43.180000;, -84.454346;-60.306122;35.049999;, -120.484863;-30.801147;40.389999;, -79.864807;-20.409126;49.279999;, -113.949951;-13.502884;40.130001;, -111.861115;-0.681808;36.580002;, -81.197510;3.403015;42.669998;, -49.006622;10.411407;46.230000;, -39.190247;-15.640938;51.049999;, -0.003174;6.529009;48.009998;, 5.076843;-18.789993;51.049999;, 48.006851;5.089981;46.230000;, 50.036850;-18.539993;49.020000;, 103.886841;-1.010025;43.939999;, 103.376846;-27.930008;44.700001;, 162.713242;-4.686424;33.020000;, 161.417679;-29.193550;28.450001;, 201.173447;-11.476181;23.370001;, 199.070190;-36.018791;21.840000;, 228.461502;-21.143990;13.970000;, 226.755234;-36.330627;14.220000;, 248.461105;-25.743721;9.910000;, 244.936478;-38.099564;10.670000;, 272.516663;-27.825661;18.290001;, -46.208221;-47.930710;41.150002;, 6.606842;-52.830002;37.590000;, 47.240704;-51.721313;38.099998;, 98.294579;-53.795647;30.990000;, 159.893112;-50.211456;17.270000;, 198.869385;-48.771626;9.650000;, 225.217270;-46.755871;7.110000;, 255.504883;-47.863602;5.590000;, 269.553040;-46.438980;14.409777;, -59.387085;-63.494911;73.660004;, -60.375549;-65.289017;71.370003;, -36.437195;-57.347382;64.519997;, -14.160309;-68.665680;77.220001;, -28.562531;-69.723923;80.769997;, -48.602417;-66.941849;80.010002;, 3.046844;-66.030014;0.000000;, -44.981171;-63.836952;-0.000000;, 95.548935;-61.466160;0.000000;, 160.262604;-54.943668;0.000000;, 223.603302;-50.946529;0.000000;, 256.815125;-49.490067;0.000000;, -111.173096;-72.104111;-0.000000;, -75.903015;-67.890289;-0.000000;, -144.121399;-79.049561;-0.000000;, -166.643768;-77.178101;-0.000000;, -192.488373;-87.513451;-0.000000;, -195.412811;-85.996056;7.870000;, -211.887085;-94.059570;-0.000000;, -209.426086;-91.976212;4.570000;, 335.214783;-50.588272;86.610001;, 299.024292;-50.850159;73.150002;, 325.862610;-47.883812;63.250000;, 303.063110;-37.013802;9.650000;, 283.385864;-33.640854;20.904961;, 294.864197;-33.797440;0.000000;, 314.287231;-37.568359;5.840000;, 305.185608;-37.304771;0.000000;, 273.239410;-36.253315;24.129999;, -215.413879;-84.334099;3.810000;, -215.901428;-84.042725;-0.000000;, -214.060638;-89.544067;4.830000;, -215.898315;-90.164017;-0.000000;, -28.418518;-70.573166;79.250000;, -48.335999;-68.811401;78.230003;, 105.666840;93.729965;-0.000000;, 46.226837;-64.342575;0.000000;, 198.176895;-53.315128;0.000000;, 271.798553;-47.918884;0.000000;, 299.219421;-53.423798;73.150002;, 282.161438;-48.756035;52.320000;, 282.010498;-44.364044;52.320000;, 319.443726;-42.644302;21.590000;, -130.918793;18.492126;-0.000000;, 39.366852;98.809982;-6.100000;, -1.523163;64.520004;-8.130000;, 68.076843;113.040024;-3.560000;, 98.046844;114.049973;-2.062330;, 96.776840;54.869980;-6.517095;, 72.136841;84.080002;-6.633346;, 57.146851;62.739975;-11.680000;, 82.806854;95.759995;-4.012878;, -179.359558;-18.513649;-7.620000;, -158.944885;-2.880463;-13.970000;, -132.664642;15.837616;-5.330000;, -131.827026;13.720963;-13.970000;, -93.103821;34.977371;-18.290001;, -48.554932;52.679184;-22.350000;, -4.573151;49.539993;-24.639999;, 53.596848;48.009995;-26.670000;, 109.726837;36.069992;-20.320000;, 164.597672;24.165756;-11.680000;, 204.678864;3.807053;-14.730000;, 230.871490;-8.854462;-11.940000;, 255.279877;-16.970306;-7.870000;, 274.108582;-20.241173;-9.650000;, 281.051788;-26.843124;-9.375875;, -134.884155;7.603134;-22.350000;, -118.785126;4.991013;-32.770000;, -87.932434;20.529556;-31.705227;, -49.602661;33.911453;-32.000000;, -4.573151;31.759995;-35.810001;, 45.976837;30.489975;-34.040001;, 106.426849;22.609970;-28.450001;, 164.256134;16.569855;-18.290001;, -141.496643;-4.591209;-31.750000;, -131.497375;-6.947311;-36.580002;, -149.679199;-11.045776;-27.430000;, -167.292755;-26.660843;-20.830000;, -182.641449;-39.654480;-10.160000;, -140.570618;-11.802643;-30.990000;, -130.045837;-17.012077;-35.810001;, -185.046326;-47.100906;-13.970000;, -212.374817;-75.415138;-7.370000;, -207.501984;-78.117943;-7.370000;, -179.009033;-57.285851;-14.990000;, -189.516144;-45.705978;-5.080000;, -217.503754;-78.812088;-4.060000;, -150.797241;-27.519791;-30.730000;, -143.585480;-17.412247;-30.730000;, -151.581909;-24.644920;-30.480000;, -164.589447;-30.959465;-26.420000;, -161.742157;-36.544441;-25.910000;, -201.257355;-79.650314;-8.380000;, -175.527588;-61.398262;-16.260000;, -156.069885;-47.983437;-27.047173;, -145.948456;-33.531952;-34.540001;, -154.000732;-53.754593;-27.430000;, -123.818665;-43.267906;-34.799999;, -140.443726;-28.630959;-34.799999;, -137.653870;-19.691261;-34.540001;, -124.874481;-31.459930;-38.610001;, -197.692322;-82.756187;-10.920000;, -174.433502;-66.586670;-18.290001;, -136.128357;-47.342552;-31.750000;, -151.732513;-75.607498;-17.020000;, -115.517059;-69.194389;-22.350000;, -174.220032;-70.176674;-17.270000;, -169.266052;-74.923210;-10.160000;, -84.454346;-60.306122;-35.049999;, -85.397644;-50.283577;-43.180000;, -79.864807;-20.409126;-49.279999;, -120.484863;-30.801147;-40.389999;, -113.949951;-13.502884;-40.130001;, -111.861115;-0.681808;-36.580002;, -81.197510;3.403015;-42.669998;, -39.190247;-15.640938;-51.049999;, -49.006622;10.411407;-46.230000;, 5.076843;-18.789993;-51.049999;, -0.003174;6.529009;-48.009998;, 50.036850;-18.539993;-49.020000;, 48.006851;5.089981;-46.230000;, 103.376846;-27.930008;-44.700001;, 103.886841;-1.010025;-43.939999;, 161.417679;-29.193550;-28.450001;, 162.713242;-4.686424;-33.020000;, 199.070190;-36.018791;-21.840000;, 201.173447;-11.476181;-23.370001;, 226.755234;-36.330627;-14.220000;, 228.461502;-21.143990;-13.970000;, 244.936478;-38.099564;-10.670000;, 248.461105;-25.743721;-9.910000;, 272.516663;-27.825661;-18.290001;, -46.208221;-47.930710;-41.150002;, 6.606842;-52.830002;-37.590000;, 47.240704;-51.721313;-38.099998;, 98.294579;-53.795647;-30.990000;, 159.893112;-50.211456;-17.270000;, 198.869385;-48.771626;-9.650000;, 225.217270;-46.755871;-7.110000;, 255.504883;-47.863602;-5.590000;, 269.553040;-46.438980;-14.409779;, -60.375549;-65.289017;-71.370003;, -59.387085;-63.494911;-73.660004;, -36.437195;-57.347382;-64.519997;, -14.160309;-68.665680;-77.220001;, -48.602417;-66.941849;-80.010002;, -28.562531;-69.723923;-80.769997;, -195.412811;-85.996056;-7.870000;, -209.426086;-91.976212;-4.570000;, 325.862610;-47.883812;-63.250000;, 299.024292;-50.850159;-73.150002;, 335.214783;-50.588272;-86.610001;, 283.385864;-33.640854;-20.904961;, 303.063110;-37.013802;-9.650000;, 314.287231;-37.568359;-5.840000;, 273.239410;-36.253315;-24.129999;, -215.413879;-84.334099;-3.810000;, -214.060638;-89.544067;-4.830000;, -48.335999;-68.811401;-78.230003;, -28.418518;-70.573166;-79.250000;, 282.010498;-44.364044;-52.320000;, 282.161438;-48.756035;-52.320000;, 299.219421;-53.423798;-73.150002;, 319.443726;-42.644302;-21.590000;, 117.346848;105.419968;0.000000;, -136.128357;-47.342552;31.750000;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; MeshNormals { 284; 0.154061;0.776306;-0.611241;, 0.485218;0.874393;0.000000;, 0.501943;0.864901;0.000000;, 0.196937;0.400873;-0.894716;, 0.247004;0.969015;0.000000;, 0.094987;0.474935;-0.874880;, -0.062005;0.998076;0.000000;, -0.097973;0.156957;-0.982734;, -0.439192;0.898393;0.000000;, -0.413192;0.562262;-0.716334;, -0.940811;0.338932;0.000000;, -0.662250;0.749283;0.000000;, -0.120003;0.363010;-0.924025;, -0.166943;0.091969;-0.981668;, -0.125951;0.028989;-0.991613;, 0.648896;0.760877;0.000000;, 0.718366;0.479244;-0.504257;, 0.906668;0.421845;0.000000;, 0.562064;0.827094;0.000000;, 0.584894;0.676877;-0.446919;, 0.504111;0.830183;-0.238052;, 0.463932;0.885871;0.000000;, 0.388073;0.781146;-0.489091;, 0.487116;0.817195;-0.308074;, 0.276965;0.960880;0.000000;, 0.183028;0.740112;-0.647098;, 0.012006;0.607295;-0.794386;, -0.090980;0.587870;-0.803823;, -0.290048;0.665110;-0.688114;, -0.282038;0.781104;-0.557074;, -0.294858;0.955541;0.000000;, -0.343108;0.939296;0.000000;, -0.294119;0.588239;-0.753306;, -0.405953;0.913894;0.000000;, -0.296897;0.389865;-0.871698;, -0.439192;0.898393;0.000000;, -0.122002;0.459008;-0.880015;, -0.461951;0.886906;0.000000;, -0.418980;0.696967;-0.581973;, -0.698049;0.716050;0.000000;, -0.510981;0.773972;-0.373986;, 0.425814;0.721684;-0.545761;, 0.254105;0.553228;-0.793328;, 0.221065;0.500148;-0.837247;, 0.109016;0.493074;-0.863130;, 0.004000;0.473022;-0.881041;, -0.098006;0.416026;-0.904056;, -0.154958;0.491868;-0.856770;, -0.224007;0.558016;-0.799024;, 0.248118;0.211100;-0.945449;, 0.470276;0.287169;-0.834490;, 0.484036;0.255019;-0.837063;, 0.650755;0.387854;-0.652754;, 0.754233;0.329102;-0.568176;, 0.307975;0.029998;-0.950922;, 0.393956;0.076991;-0.915899;, 0.637006;0.314003;-0.704007;, 0.315966;-0.113988;-0.941898;, 0.236981;-0.112991;-0.964921;, 0.440010;0.073002;-0.895021;, 0.819214;0.291076;-0.494129;, 0.998750;-0.049987;0.000000;, 0.839060;0.544039;0.000000;, 0.761763;0.472853;-0.442862;, 0.262104;0.143057;-0.954378;, 0.333060;0.182033;-0.925168;, 0.303127;0.093039;-0.948397;, 0.450081;0.071013;-0.890160;, 0.389056;-0.114016;-0.914131;, 0.402051;0.080010;-0.912115;, 0.314917;0.050986;-0.947749;, 0.460009;-0.058001;-0.886018;, 0.308028;-0.066006;-0.949085;, 0.185032;-0.345060;-0.920161;, 0.207039;-0.351067;-0.913174;, 0.293926;0.184953;-0.937763;, 0.357144;0.200081;-0.912368;, 0.265955;-0.016997;-0.963836;, 0.362108;-0.040012;-0.931277;, 0.213986;-0.200987;-0.955936;, 0.039998;-0.792955;-0.607966;, 0.014005;-0.780304;-0.625244;, -0.060023;-0.860329;-0.506193;, -0.059020;-0.551191;-0.832289;, 0.244024;-0.230023;-0.942094;, 0.154949;-0.900702;-0.405866;, 0.245995;-0.049999;-0.967981;, 0.146029;-0.013003;-0.989195;, 0.223974;0.129985;-0.965888;, 0.170926;0.373839;-0.911608;, 0.198048;0.332081;-0.922225;, 0.083043;0.346180;-0.934486;, 0.008002;-0.058016;-0.998284;, -0.019998;0.292973;-0.955912;, -0.025010;-0.112044;-0.993388;, -0.070977;0.301903;-0.950693;, -0.042022;-0.123063;-0.991509;, -0.139023;0.308051;-0.941157;, -0.150992;-0.243988;-0.957952;, -0.241906;0.203920;-0.948630;, -0.193099;-0.320164;-0.927474;, -0.276012;0.099004;-0.956042;, -0.200959;-0.352928;-0.913814;, -0.255139;0.027015;-0.966527;, -0.188033;-0.324057;-0.927163;, -0.003999;0.128954;-0.991643;, 0.169032;-0.269050;-0.948177;, -0.017001;0.597029;-0.802039;, -0.109988;-0.678926;-0.725921;, -0.012000;-0.715011;-0.699010;, -0.035000;-0.736993;-0.674994;, -0.136038;-0.788221;-0.600168;, -0.127993;-0.788958;-0.600968;, -0.133986;-0.784919;-0.604938;, -0.066975;-0.746723;-0.661755;, 0.041008;-0.875162;-0.482089;, 0.145951;-0.968672;-0.200932;, 0.610009;0.187003;-0.770012;, 0.219989;-0.973951;0.054997;, -0.661088;0.453060;0.598080;, -0.294927;-0.849790;-0.436892;, -0.045004;-0.269023;-0.962082;, 0.240915;0.144949;-0.959661;, 0.024992;-0.999688;0.000000;, -0.112955;-0.993600;0.000000;, -0.050985;-0.998699;0.000000;, -0.087018;-0.996207;0.000000;, -0.089003;-0.996031;0.000000;, -0.042005;-0.999117;0.000000;, -0.159044;-0.987272;0.000000;, -0.141981;-0.989869;0.000000;, -0.006000;-0.999982;0.000000;, -0.221059;-0.975260;0.000000;, -0.341020;-0.940056;0.000000;, -0.259028;-0.808087;-0.529057;, 0.171046;-0.985263;0.000000;, 0.083988;-0.813887;-0.574920;, 0.282084;-0.014004;-0.959287;, 0.522928;0.487933;-0.698904;, -0.987925;0.061995;0.141989;, -0.262064;0.935228;-0.238058;, -0.214934;0.851739;-0.477854;, -0.389085;0.921202;0.000000;, -0.613160;0.678177;0.405106;, -0.576212;-0.817300;0.000000;, 0.599068;0.322036;-0.733083;, 0.795508;-0.223143;-0.563360;, 0.981792;-0.189960;0.000000;, 0.498180;-0.243088;-0.832301;, 0.875052;-0.484029;0.000000;, -0.016996;-0.993789;0.109977;, 0.265977;-0.929920;-0.253978;, -0.911528;-0.411238;0.000000;, -0.040008;-0.999199;0.000000;, -0.086025;-0.996293;0.000000;, -0.147998;-0.988988;0.000000;, 0.363007;-0.817016;-0.448009;, 0.698904;-0.652911;-0.291960;, 0.250048;0.876166;-0.412078;, -0.995170;-0.015003;-0.097017;, 0.520074;0.854121;0.000000;, 0.196937;0.400873;0.894716;, 0.154061;0.776306;0.611241;, 0.094987;0.474935;0.874880;, -0.097973;0.156957;0.982734;, -0.413192;0.562262;0.716334;, -0.166943;0.091969;0.981668;, -0.120003;0.363010;0.924025;, -0.125951;0.028989;0.991613;, 0.718366;0.479244;0.504257;, 0.584894;0.676877;0.446919;, 0.504111;0.830183;0.238052;, 0.487116;0.817195;0.308074;, 0.388073;0.781146;0.489091;, 0.183028;0.740112;0.647098;, 0.012006;0.607295;0.794386;, -0.090980;0.587870;0.803823;, -0.290048;0.665110;0.688114;, -0.282038;0.781104;0.557074;, -0.294119;0.588239;0.753306;, -0.296897;0.389865;0.871698;, -0.122002;0.459008;0.880015;, -0.418980;0.696967;0.581973;, -0.510981;0.773972;0.373986;, 0.425814;0.721684;0.545761;, 0.254105;0.553228;0.793328;, 0.221065;0.500148;0.837247;, 0.109016;0.493074;0.863130;, 0.004000;0.473022;0.881041;, -0.098006;0.416026;0.904056;, -0.154958;0.491868;0.856770;, -0.224007;0.558016;0.799024;, 0.470276;0.287169;0.834490;, 0.248118;0.211100;0.945449;, 0.484036;0.255019;0.837063;, 0.650755;0.387854;0.652754;, 0.754233;0.329102;0.568176;, 0.393956;0.076991;0.915899;, 0.307975;0.029998;0.950922;, 0.637006;0.314003;0.704007;, 0.440010;0.073002;0.895021;, 0.236981;-0.112991;0.964921;, 0.315966;-0.113988;0.941898;, 0.761763;0.472853;0.442862;, 0.819214;0.291076;0.494129;, 0.303127;0.093039;0.948397;, 0.333060;0.182033;0.925168;, 0.262104;0.143057;0.954378;, 0.450081;0.071013;0.890160;, 0.389056;-0.114016;0.914131;, 0.290968;-0.039996;0.955896;, 0.402051;0.080010;0.912115;, 0.460009;-0.058001;0.886018;, 0.308028;-0.066006;0.949085;, 0.234052;-0.276061;0.932207;, 0.185032;-0.345060;0.920161;, 0.293926;0.184953;0.937763;, 0.357144;0.200081;0.912368;, 0.265955;-0.016997;0.963836;, 0.241078;-0.187060;0.952308;, 0.362108;-0.040012;0.931277;, 0.091007;-0.381030;0.920073;, 0.026983;-0.806492;0.590628;, 0.014005;-0.780304;0.625244;, 0.048995;-0.568942;0.820917;, -0.044988;-0.930742;0.362899;, 0.154949;-0.900702;0.405866;, 0.244024;-0.230023;0.942094;, 0.146029;-0.013003;0.989195;, 0.245995;-0.049999;0.967981;, 0.223974;0.129985;0.965888;, 0.170926;0.373839;0.911608;, 0.198048;0.332081;0.922225;, 0.008002;-0.058016;0.998284;, 0.083043;0.346180;0.934486;, -0.025010;-0.112044;0.993388;, -0.019998;0.292973;0.955912;, -0.042022;-0.123063;0.991509;, -0.070977;0.301903;0.950693;, -0.150992;-0.243988;0.957952;, -0.139023;0.308051;0.941157;, -0.193099;-0.320164;0.927474;, -0.241906;0.203920;0.948630;, -0.200959;-0.352928;0.913814;, -0.276012;0.099004;0.956042;, -0.188033;-0.324057;0.927163;, -0.255139;0.027015;0.966527;, 0.169032;-0.269050;0.948177;, -0.003999;0.128954;0.991643;, -0.017001;0.597029;0.802039;, -0.109988;-0.678926;0.725921;, -0.012000;-0.715011;0.699010;, -0.035000;-0.736993;0.674994;, -0.136038;-0.788221;0.600168;, -0.127993;-0.788958;0.600968;, -0.133986;-0.784919;0.604938;, -0.066975;-0.746723;0.661755;, 0.041008;-0.875162;0.482089;, 0.145951;-0.968672;0.200932;, 0.219989;-0.973951;-0.054997;, 0.610009;0.187003;0.770012;, -0.661088;0.453060;-0.598080;, -0.294927;-0.849790;0.436892;, 0.240915;0.144949;0.959661;, -0.045004;-0.269023;0.962082;, -0.259028;-0.808087;0.529057;, 0.154023;-0.708106;0.689103;, -0.987925;0.061995;-0.141989;, 0.522928;0.487933;0.698904;, 0.282084;-0.014004;0.959287;, -0.214934;0.851739;0.477854;, -0.262064;0.935228;0.238058;, -0.613160;0.678177;-0.405106;, 0.599068;0.322036;0.733083;, 0.795508;-0.223143;0.563360;, 0.483976;-0.310984;0.817959;, 0.265977;-0.929920;0.253978;, -0.016996;-0.993789;-0.109977;, 0.250048;0.876166;0.412078;, 0.698904;-0.652911;0.291960;, 0.363007;-0.817016;0.448009;, -0.995170;-0.015003;0.097017;, -0.991904;-0.126988;0.000000;, 0.091007;-0.381030;-0.920073;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; } MeshMaterialList { 1; 564; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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; Material { 0.269804;0.320000;0.630588;0.000000;; 20.000000; 0.500000;0.500000;0.500000;; 0.000000;0.000000;0.000000;; } } VertexDuplicationIndices { 284; 284; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283; } } } Frame frm-Dolph01 { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh Dolph01 { 284; -1.947576;64.130737;8.130002;, -7.800217;64.421143;-0.000000;, 31.746841;100.080002;0.000000;, 39.366852;98.809982;6.099998;, 64.766846;116.079941;0.000000;, 68.076843;113.040024;3.559999;, 96.266846;118.369980;0.000000;, 98.046844;114.049973;2.062331;, 114.296844;113.540024;0.000000;, 96.776840;54.869980;6.517096;, 96.266846;72.900009;0.000000;, 106.936844;48.009995;0.000000;, 57.146851;62.739975;11.680001;, 72.136841;84.080002;6.633347;, 82.806854;95.759995;4.012877;, -171.387756;-30.480600;-0.000000;, -176.425171;-38.541008;7.620002;, -181.361847;-42.534954;-0.000000;, -154.447891;-14.097557;-0.000000;, -158.022141;-20.583174;13.970002;, -134.163620;1.137530;5.330001;, -95.865860;31.137846;-0.000000;, -96.765869;24.994415;18.290003;, -133.079376;-0.864030;13.970002;, -51.677738;53.535828;-0.000000;, -52.571472;48.189205;22.350002;, -5.121027;48.889385;24.639997;, 53.596848;48.009995;26.669998;, 110.155029;35.786564;20.319998;, 170.616714;4.479805;11.680001;, 171.602066;8.608099;0.000000;, 208.776871;-26.718767;0.000000;, 202.547195;-36.567245;14.730000;, 227.820557;-49.403225;0.000000;, 219.635742;-63.135403;11.939998;, 242.099518;-74.700821;0.000000;, 234.301636;-87.676208;7.870000;, 251.484833;-95.519829;0.000000;, 246.917847;-103.938271;9.650002;, 250.772247;-115.000572;0.000000;, 246.972794;-113.397652;9.375875;, -135.384537;-7.302986;22.350002;, -119.088821;-7.975105;32.770000;, -89.951057;11.294539;31.705227;, -52.211617;29.392502;31.999998;, -4.920195;31.117809;35.809998;, 45.976837;30.489975;34.040001;, 107.296997;22.034000;28.449999;, 167.911224;-2.593308;18.290003;, -130.285431;-21.345243;36.580002;, -140.494431;-20.199341;31.750000;, -147.848190;-27.584318;27.430000;, -163.472275;-45.189865;20.830002;, -177.160553;-59.922421;10.160001;, -127.643097;-31.164843;35.809998;, -138.714371;-27.248716;30.989998;, -178.659561;-67.602631;13.970002;, -171.449890;-76.994270;14.990002;, -197.253006;-101.077950;7.369999;, -202.413574;-98.976006;7.369999;, -207.100449;-102.960793;4.059999;, -208.425430;-101.488464;-0.000000;, -185.977982;-69.142410;-0.000000;, -183.263901;-66.751122;5.079998;, -148.114319;-41.313347;30.480000;, -141.038208;-33.178036;30.730001;, -146.992157;-44.074024;30.730001;, -160.275284;-49.135139;26.420000;, -156.781799;-54.340389;25.910000;, -167.502533;-80.661797;16.259998;, -190.870132;-101.854103;8.379999;, -149.784882;-65.020676;27.047174;, -141.460510;-49.464539;34.540001;, -118.326942;-56.489838;34.799999;, -147.041763;-70.503639;27.430000;, -136.580017;-43.941616;34.799999;, -134.877014;-34.732857;34.540001;, -120.784431;-44.892262;38.610001;, -165.797058;-85.682549;18.290003;, -186.959900;-104.512314;10.919998;, -142.181732;-91.929665;17.020000;, -106.990486;-81.240273;22.350002;, -159.671616;-93.342796;10.160001;, -165.156662;-89.221420;17.269999;, -79.961212;-58.794125;43.180000;, -78.005432;-68.644684;35.049995;, -116.504807;-43.714310;40.389996;, -77.647179;-28.399250;49.279999;, -112.081055;-25.759773;40.130001;, -111.537277;-12.781038;36.580002;, -81.392578;-4.881754;42.669998;, -49.742218;6.021069;46.230000;, -38.129295;-19.131491;51.049999;, -0.027278;6.284186;48.009998;, 5.076844;-18.789993;51.049999;, 48.006851;5.089982;46.230000;, 50.036850;-18.539993;49.020000;, 103.950737;-1.727674;43.939999;, 101.204376;-28.525307;44.700001;, 159.725540;-22.174656;33.020004;, 150.980530;-44.968723;28.449999;, 192.150482;-48.016220;23.370001;, 179.132843;-68.563484;21.840002;, 210.778015;-71.539383;13.970002;, 200.929749;-82.827507;14.220000;, 223.367020;-89.510345;9.909999;, 212.621933;-96.073799;10.670001;, 239.994675;-107.823067;18.290003;, -42.573589;-51.902767;41.150002;, 6.606843;-52.830002;37.590000;, 47.240704;-51.721313;38.100002;, 94.460991;-54.226379;30.989998;, 143.387604;-64.445183;17.269999;, 173.195267;-79.735161;9.650002;, 194.066788;-90.482391;7.110003;, 213.103455;-109.579109;5.589998;, 223.323807;-117.138016;14.409779;, -53.687107;-68.761032;73.660004;, -54.473625;-70.668358;71.370003;, -32.965847;-60.505638;64.519997;, -12.362958;-70.023148;77.220001;, -25.197519;-72.225266;80.769997;, -43.310638;-71.045502;80.010002;, 3.046844;-66.030014;0.000000;, -40.286179;-67.661491;-0.000000;, 91.451996;-61.840412;0.000000;, 142.235916;-69.045692;0.000000;, 190.629211;-93.123634;0.000000;, 212.794708;-111.462990;0.000000;, -102.330307;-83.610764;-0.000000;, -69.056328;-75.146759;-0.000000;, -134.214218;-94.438782;-0.000000;, -156.798965;-95.268616;-0.000000;, -181.225388;-108.614517;-0.000000;, -184.310028;-107.456978;7.870000;, -199.704224;-117.428978;-0.000000;, -197.509445;-115.066803;4.569998;, 257.696564;-171.556595;86.610001;, 237.179489;-141.742661;73.150002;, 254.689590;-162.297256;63.250000;, 250.899612;-137.325058;9.650002;, 242.654434;-119.142982;20.904961;, 248.963318;-128.733322;0.000000;, 256.736420;-146.928177;5.840001;, 251.849289;-139.245422;0.000000;, 233.837677;-113.330627;24.129999;, -204.366486;-108.193924;3.810001;, -204.885330;-107.962814;-0.000000;, -202.401138;-113.205154;4.830000;, -204.151688;-114.039986;-0.000000;, -25.028708;-73.061371;79.250000;, -42.926811;-72.887756;78.230003;, 105.666840;93.729965;0.000000;, 46.226837;-64.342575;0.000000;, 170.627747;-83.432632;0.000000;, 223.631149;-119.390343;0.000000;, 235.158325;-143.347824;73.150002;, 229.454300;-126.607849;52.320000;, 233.005615;-124.019302;52.320000;, 255.426651;-154.044296;21.590000;, -132.747055;3.981426;-0.000000;, 39.366852;98.809982;-6.099998;, -1.947576;64.130737;-8.130002;, 68.076843;113.040024;-3.560004;, 98.046844;114.049973;-2.062331;, 96.776840;54.869980;-6.517096;, 72.136841;84.080002;-6.633341;, 57.146851;62.739975;-11.680001;, 82.806854;95.759995;-4.012877;, -176.425171;-38.541008;-7.620002;, -158.022141;-20.583174;-13.970002;, -134.163620;1.137530;-5.330001;, -133.079376;-0.864030;-13.970002;, -96.765869;24.994415;-18.289999;, -52.571472;48.189205;-22.349997;, -5.121027;48.889385;-24.639997;, 53.596848;48.009995;-26.670002;, 110.155029;35.786564;-20.320002;, 170.616714;4.479805;-11.680001;, 202.547195;-36.567245;-14.729995;, 219.635742;-63.135403;-11.939998;, 234.301636;-87.676208;-7.870005;, 246.917847;-103.938271;-9.649997;, 246.972794;-113.397652;-9.375875;, -135.384537;-7.302986;-22.349997;, -119.088821;-7.975105;-32.770000;, -89.951057;11.294539;-31.705223;, -52.211617;29.392502;-32.000004;, -4.920195;31.117809;-35.809998;, 45.976837;30.489975;-34.040001;, 107.296997;22.034000;-28.450005;, 167.911224;-2.593308;-18.289999;, -140.494431;-20.199341;-31.750000;, -130.285431;-21.345243;-36.580006;, -147.848190;-27.584318;-27.430006;, -163.472275;-45.189865;-20.830002;, -177.160553;-59.922421;-10.159996;, -138.714371;-27.248716;-30.989998;, -127.643097;-31.164843;-35.809998;, -178.659561;-67.602631;-13.970002;, -202.413574;-98.976006;-7.369999;, -197.253006;-101.077950;-7.369999;, -171.449890;-76.994270;-14.990002;, -183.263901;-66.751122;-5.079998;, -207.100449;-102.960793;-4.059999;, -146.992157;-44.074024;-30.730001;, -141.038208;-33.178036;-30.730001;, -148.114319;-41.313347;-30.480000;, -160.275284;-49.135139;-26.420000;, -156.781799;-54.340389;-25.910000;, -190.870132;-101.854103;-8.380005;, -167.502533;-80.661797;-16.260004;, -149.784882;-65.020676;-27.047174;, -141.460510;-49.464539;-34.539997;, -147.041763;-70.503639;-27.430006;, -118.326942;-56.489838;-34.799995;, -136.580017;-43.941616;-34.799995;, -134.877014;-34.732857;-34.539997;, -120.784431;-44.892262;-38.610001;, -186.959900;-104.512314;-10.919998;, -165.797058;-85.682549;-18.289999;, -130.062363;-62.004459;-31.750000;, -142.181732;-91.929665;-17.019997;, -106.990486;-81.240273;-22.349997;, -165.156662;-89.221420;-17.269999;, -159.671616;-93.342796;-10.159996;, -78.005432;-68.644684;-35.049995;, -79.961212;-58.794125;-43.180000;, -77.647179;-28.399250;-49.279995;, -116.504807;-43.714310;-40.390003;, -112.081055;-25.759773;-40.130005;, -111.537277;-12.781038;-36.580006;, -81.392578;-4.881754;-42.669998;, -38.129295;-19.131491;-51.050003;, -49.742218;6.021069;-46.230003;, 5.076844;-18.789993;-51.050003;, -0.027278;6.284186;-48.009995;, 50.036850;-18.539993;-49.020000;, 48.006851;5.089982;-46.230003;, 101.204376;-28.525307;-44.700005;, 103.950737;-1.727674;-43.940002;, 150.980530;-44.968723;-28.450005;, 159.725540;-22.174656;-33.020004;, 179.132843;-68.563484;-21.839996;, 192.150482;-48.016220;-23.369997;, 200.929749;-82.827507;-14.220005;, 210.778015;-71.539383;-13.970002;, 212.621933;-96.073799;-10.669996;, 223.367020;-89.510345;-9.910004;, 239.994675;-107.823067;-18.289999;, -42.573589;-51.902767;-41.150005;, 6.606843;-52.830002;-37.590000;, 47.240704;-51.721313;-38.100002;, 94.460991;-54.226379;-30.989998;, 143.387604;-64.445183;-17.269999;, 173.195267;-79.735161;-9.649997;, 194.066788;-90.482391;-7.110003;, 213.103455;-109.579109;-5.589998;, 223.323807;-117.138016;-14.409783;, -54.473625;-70.668358;-71.370003;, -53.687107;-68.761032;-73.660011;, -32.965847;-60.505638;-64.520004;, -12.362958;-70.023148;-77.220001;, -43.310638;-71.045502;-80.009995;, -25.197519;-72.225266;-80.769997;, -184.310028;-107.456978;-7.870005;, -197.509445;-115.066803;-4.569998;, 254.689590;-162.297256;-63.250000;, 237.179489;-141.742661;-73.150002;, 257.696564;-171.556595;-86.610001;, 242.654434;-119.142982;-20.904961;, 250.899612;-137.325058;-9.649997;, 256.736420;-146.928177;-5.840001;, 233.837677;-113.330627;-24.129999;, -204.366486;-108.193924;-3.809996;, -202.401138;-113.205154;-4.829995;, -42.926811;-72.887756;-78.230003;, -25.028708;-73.061371;-79.249992;, 233.005615;-124.019302;-52.319996;, 229.454300;-126.607849;-52.319996;, 235.158325;-143.347824;-73.150002;, 255.426651;-154.044296;-21.590004;, 117.346848;105.419968;0.000000;, -130.062363;-62.004459;31.750000;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; MeshNormals { 284; 0.154061;0.776306;-0.611241;, 0.485218;0.874393;0.000000;, 0.501943;0.864901;0.000000;, 0.196937;0.400873;-0.894716;, 0.247004;0.969015;0.000000;, 0.094987;0.474935;-0.874880;, -0.062005;0.998076;0.000000;, -0.097973;0.156957;-0.982734;, -0.439192;0.898393;0.000000;, -0.413192;0.562262;-0.716334;, -0.940811;0.338932;0.000000;, -0.662250;0.749283;0.000000;, -0.120003;0.363010;-0.924025;, -0.166943;0.091969;-0.981668;, -0.125951;0.028989;-0.991613;, 0.648896;0.760877;0.000000;, 0.718366;0.479244;-0.504257;, 0.906668;0.421845;0.000000;, 0.562064;0.827094;0.000000;, 0.584894;0.676877;-0.446919;, 0.504111;0.830183;-0.238052;, 0.463932;0.885871;0.000000;, 0.388073;0.781146;-0.489091;, 0.487116;0.817195;-0.308074;, 0.276965;0.960880;0.000000;, 0.183028;0.740112;-0.647098;, 0.012006;0.607295;-0.794386;, -0.090980;0.587870;-0.803823;, -0.290048;0.665110;-0.688114;, -0.282038;0.781104;-0.557074;, -0.294858;0.955541;0.000000;, -0.343108;0.939296;0.000000;, -0.294119;0.588239;-0.753306;, -0.405953;0.913894;0.000000;, -0.296897;0.389865;-0.871698;, -0.439192;0.898393;0.000000;, -0.122002;0.459008;-0.880015;, -0.461951;0.886906;0.000000;, -0.418980;0.696967;-0.581973;, -0.698049;0.716050;0.000000;, -0.510981;0.773972;-0.373986;, 0.425814;0.721684;-0.545761;, 0.254105;0.553228;-0.793328;, 0.221065;0.500148;-0.837247;, 0.109016;0.493074;-0.863130;, 0.004000;0.473022;-0.881041;, -0.098006;0.416026;-0.904056;, -0.154958;0.491868;-0.856770;, -0.224007;0.558016;-0.799024;, 0.248118;0.211100;-0.945449;, 0.470276;0.287169;-0.834490;, 0.484036;0.255019;-0.837063;, 0.650755;0.387854;-0.652754;, 0.754233;0.329102;-0.568176;, 0.307975;0.029998;-0.950922;, 0.393956;0.076991;-0.915899;, 0.637006;0.314003;-0.704007;, 0.315966;-0.113988;-0.941898;, 0.236981;-0.112991;-0.964921;, 0.440010;0.073002;-0.895021;, 0.819214;0.291076;-0.494129;, 0.998750;-0.049987;0.000000;, 0.839060;0.544039;0.000000;, 0.761763;0.472853;-0.442862;, 0.262104;0.143057;-0.954378;, 0.333060;0.182033;-0.925168;, 0.303127;0.093039;-0.948397;, 0.450081;0.071013;-0.890160;, 0.389056;-0.114016;-0.914131;, 0.402051;0.080010;-0.912115;, 0.314917;0.050986;-0.947749;, 0.460009;-0.058001;-0.886018;, 0.308028;-0.066006;-0.949085;, 0.185032;-0.345060;-0.920161;, 0.207039;-0.351067;-0.913174;, 0.293926;0.184953;-0.937763;, 0.357144;0.200081;-0.912368;, 0.265955;-0.016997;-0.963836;, 0.362108;-0.040012;-0.931277;, 0.213986;-0.200987;-0.955936;, 0.039998;-0.792955;-0.607966;, 0.014005;-0.780304;-0.625244;, -0.060023;-0.860329;-0.506193;, -0.059020;-0.551191;-0.832289;, 0.244024;-0.230023;-0.942094;, 0.154949;-0.900702;-0.405866;, 0.245995;-0.049999;-0.967981;, 0.146029;-0.013003;-0.989195;, 0.223974;0.129985;-0.965888;, 0.170926;0.373839;-0.911608;, 0.198048;0.332081;-0.922225;, 0.083043;0.346180;-0.934486;, 0.008002;-0.058016;-0.998284;, -0.019998;0.292973;-0.955912;, -0.025010;-0.112044;-0.993388;, -0.070977;0.301903;-0.950693;, -0.042022;-0.123063;-0.991509;, -0.139023;0.308051;-0.941157;, -0.150992;-0.243988;-0.957952;, -0.241906;0.203920;-0.948630;, -0.193099;-0.320164;-0.927474;, -0.276012;0.099004;-0.956042;, -0.200959;-0.352928;-0.913814;, -0.255139;0.027015;-0.966527;, -0.188033;-0.324057;-0.927163;, -0.003999;0.128954;-0.991643;, 0.169032;-0.269050;-0.948177;, -0.017001;0.597029;-0.802039;, -0.109988;-0.678926;-0.725921;, -0.012000;-0.715011;-0.699010;, -0.035000;-0.736993;-0.674994;, -0.136038;-0.788221;-0.600168;, -0.127993;-0.788958;-0.600968;, -0.133986;-0.784919;-0.604938;, -0.066975;-0.746723;-0.661755;, 0.041008;-0.875162;-0.482089;, 0.145951;-0.968672;-0.200932;, 0.610009;0.187003;-0.770012;, 0.219989;-0.973951;0.054997;, -0.661088;0.453060;0.598080;, -0.294927;-0.849790;-0.436892;, -0.045004;-0.269023;-0.962082;, 0.240915;0.144949;-0.959661;, 0.024992;-0.999688;0.000000;, -0.112955;-0.993600;0.000000;, -0.050985;-0.998699;0.000000;, -0.087018;-0.996207;0.000000;, -0.089003;-0.996031;0.000000;, -0.042005;-0.999117;0.000000;, -0.159044;-0.987272;0.000000;, -0.141981;-0.989869;0.000000;, -0.006000;-0.999982;0.000000;, -0.221059;-0.975260;0.000000;, -0.341020;-0.940056;0.000000;, -0.259028;-0.808087;-0.529057;, 0.171046;-0.985263;0.000000;, 0.083988;-0.813887;-0.574920;, 0.282084;-0.014004;-0.959287;, 0.522928;0.487933;-0.698904;, -0.987925;0.061995;0.141989;, -0.262064;0.935228;-0.238058;, -0.214934;0.851739;-0.477854;, -0.389085;0.921202;0.000000;, -0.613160;0.678177;0.405106;, -0.576212;-0.817300;0.000000;, 0.599068;0.322036;-0.733083;, 0.795508;-0.223143;-0.563360;, 0.981792;-0.189960;0.000000;, 0.498180;-0.243088;-0.832301;, 0.875052;-0.484029;0.000000;, -0.016996;-0.993789;0.109977;, 0.265977;-0.929920;-0.253978;, -0.911528;-0.411238;0.000000;, -0.040008;-0.999199;0.000000;, -0.086025;-0.996293;0.000000;, -0.147998;-0.988988;0.000000;, 0.363007;-0.817016;-0.448009;, 0.698904;-0.652911;-0.291960;, 0.250048;0.876166;-0.412078;, -0.995170;-0.015003;-0.097017;, 0.520074;0.854121;0.000000;, 0.196937;0.400873;0.894716;, 0.154061;0.776306;0.611241;, 0.094987;0.474935;0.874880;, -0.097973;0.156957;0.982734;, -0.413192;0.562262;0.716334;, -0.166943;0.091969;0.981668;, -0.120003;0.363010;0.924025;, -0.125951;0.028989;0.991613;, 0.718366;0.479244;0.504257;, 0.584894;0.676877;0.446919;, 0.504111;0.830183;0.238052;, 0.487116;0.817195;0.308074;, 0.388073;0.781146;0.489091;, 0.183028;0.740112;0.647098;, 0.012006;0.607295;0.794386;, -0.090980;0.587870;0.803823;, -0.290048;0.665110;0.688114;, -0.282038;0.781104;0.557074;, -0.294119;0.588239;0.753306;, -0.296897;0.389865;0.871698;, -0.122002;0.459008;0.880015;, -0.418980;0.696967;0.581973;, -0.510981;0.773972;0.373986;, 0.425814;0.721684;0.545761;, 0.254105;0.553228;0.793328;, 0.221065;0.500148;0.837247;, 0.109016;0.493074;0.863130;, 0.004000;0.473022;0.881041;, -0.098006;0.416026;0.904056;, -0.154958;0.491868;0.856770;, -0.224007;0.558016;0.799024;, 0.470276;0.287169;0.834490;, 0.248118;0.211100;0.945449;, 0.484036;0.255019;0.837063;, 0.650755;0.387854;0.652754;, 0.754233;0.329102;0.568176;, 0.393956;0.076991;0.915899;, 0.307975;0.029998;0.950922;, 0.637006;0.314003;0.704007;, 0.440010;0.073002;0.895021;, 0.236981;-0.112991;0.964921;, 0.315966;-0.113988;0.941898;, 0.761763;0.472853;0.442862;, 0.819214;0.291076;0.494129;, 0.303127;0.093039;0.948397;, 0.333060;0.182033;0.925168;, 0.262104;0.143057;0.954378;, 0.450081;0.071013;0.890160;, 0.389056;-0.114016;0.914131;, 0.290968;-0.039996;0.955896;, 0.402051;0.080010;0.912115;, 0.460009;-0.058001;0.886018;, 0.308028;-0.066006;0.949085;, 0.234052;-0.276061;0.932207;, 0.185032;-0.345060;0.920161;, 0.293926;0.184953;0.937763;, 0.357144;0.200081;0.912368;, 0.265955;-0.016997;0.963836;, 0.241078;-0.187060;0.952308;, 0.362108;-0.040012;0.931277;, 0.091007;-0.381030;0.920073;, 0.026983;-0.806492;0.590628;, 0.014005;-0.780304;0.625244;, 0.048995;-0.568942;0.820917;, -0.044988;-0.930742;0.362899;, 0.154949;-0.900702;0.405866;, 0.244024;-0.230023;0.942094;, 0.146029;-0.013003;0.989195;, 0.245995;-0.049999;0.967981;, 0.223974;0.129985;0.965888;, 0.170926;0.373839;0.911608;, 0.198048;0.332081;0.922225;, 0.008002;-0.058016;0.998284;, 0.083043;0.346180;0.934486;, -0.025010;-0.112044;0.993388;, -0.019998;0.292973;0.955912;, -0.042022;-0.123063;0.991509;, -0.070977;0.301903;0.950693;, -0.150992;-0.243988;0.957952;, -0.139023;0.308051;0.941157;, -0.193099;-0.320164;0.927474;, -0.241906;0.203920;0.948630;, -0.200959;-0.352928;0.913814;, -0.276012;0.099004;0.956042;, -0.188033;-0.324057;0.927163;, -0.255139;0.027015;0.966527;, 0.169032;-0.269050;0.948177;, -0.003999;0.128954;0.991643;, -0.017001;0.597029;0.802039;, -0.109988;-0.678926;0.725921;, -0.012000;-0.715011;0.699010;, -0.035000;-0.736993;0.674994;, -0.136038;-0.788221;0.600168;, -0.127993;-0.788958;0.600968;, -0.133986;-0.784919;0.604938;, -0.066975;-0.746723;0.661755;, 0.041008;-0.875162;0.482089;, 0.145951;-0.968672;0.200932;, 0.219989;-0.973951;-0.054997;, 0.610009;0.187003;0.770012;, -0.661088;0.453060;-0.598080;, -0.294927;-0.849790;0.436892;, 0.240915;0.144949;0.959661;, -0.045004;-0.269023;0.962082;, -0.259028;-0.808087;0.529057;, 0.154023;-0.708106;0.689103;, -0.987925;0.061995;-0.141989;, 0.522928;0.487933;0.698904;, 0.282084;-0.014004;0.959287;, -0.214934;0.851739;0.477854;, -0.262064;0.935228;0.238058;, -0.613160;0.678177;-0.405106;, 0.599068;0.322036;0.733083;, 0.795508;-0.223143;0.563360;, 0.483976;-0.310984;0.817959;, 0.265977;-0.929920;0.253978;, -0.016996;-0.993789;-0.109977;, 0.250048;0.876166;0.412078;, 0.698904;-0.652911;0.291960;, 0.363007;-0.817016;0.448009;, -0.995170;-0.015003;0.097017;, -0.991904;-0.126988;0.000000;, 0.091007;-0.381030;-0.920073;; 564; 3;3,2,1;, 3;1,0,3;, 3;5,4,2;, 3;2,3,5;, 3;6,4,5;, 3;5,7,6;, 3;8,6,7;, 3;11,10,9;, 3;12,13,3;, 3;3,0,12;, 3;14,5,3;, 3;3,13,14;, 3;7,5,14;, 3;17,16,15;, 3;19,18,15;, 3;15,16,19;, 3;21,160,20;, 3;21,23,22;, 3;23,21,20;, 3;24,21,22;, 3;22,25,24;, 3;0,1,24;, 3;24,25,0;, 3;26,0,25;, 3;27,12,0;, 3;0,26,27;, 3;27,28,9;, 3;9,12,27;, 3;11,9,28;, 3;30,11,28;, 3;28,29,30;, 3;31,30,29;, 3;29,32,31;, 3;33,31,32;, 3;32,34,33;, 3;35,33,34;, 3;34,36,35;, 3;37,35,36;, 3;36,38,37;, 3;39,37,38;, 3;38,40,39;, 3;23,19,41;, 3;22,23,41;, 3;42,22,41;, 3;42,43,22;, 3;25,22,43;, 3;43,44,25;, 3;26,25,44;, 3;44,45,26;, 3;27,26,45;, 3;45,46,27;, 3;28,27,46;, 3;46,47,28;, 3;48,29,28;, 3;28,47,48;, 3;32,29,48;, 3;50,49,42;, 3;42,41,50;, 3;19,51,50;, 3;50,41,19;, 3;52,51,19;, 3;19,16,52;, 3;53,52,16;, 3;50,55,54;, 3;54,49,50;, 3;51,55,50;, 3;53,56,52;, 3;59,58,57;, 3;57,56,59;, 3;62,61,60;, 3;60,63,62;, 3;17,63,53;, 3;53,16,17;, 3;62,63,17;, 3;65,51,64;, 3;64,66,65;, 3;51,52,67;, 3;67,64,51;, 3;66,64,67;, 3;67,68,66;, 3;57,68,67;, 3;67,56,57;, 3;69,57,58;, 3;58,70,69;, 3;71,68,57;, 3;57,69,71;, 3;72,66,68;, 3;283,73,72;, 3;72,71,74;, 3;56,53,63;, 3;65,66,75;, 3;76,65,75;, 3;54,76,75;, 3;77,54,75;, 3;72,77,75;, 3;66,72,75;, 3;69,70,79;, 3;79,78,69;, 3;71,69,78;, 3;78,74,71;, 3;283,74,80;, 3;283,81,73;, 3;81,283,80;, 3;82,80,74;, 3;74,83,82;, 3;84,73,81;, 3;81,85,84;, 3;87,86,73;, 3;73,84,87;, 3;86,77,73;, 3;88,54,77;, 3;77,86,88;, 3;89,42,49;, 3;89,49,88;, 3;88,49,54;, 3;90,88,86;, 3;86,87,90;, 3;91,90,87;, 3;87,92,91;, 3;93,91,92;, 3;92,94,93;, 3;95,93,94;, 3;94,96,95;, 3;97,95,96;, 3;96,98,97;, 3;99,97,98;, 3;98,100,99;, 3;101,99,100;, 3;100,102,101;, 3;103,101,102;, 3;102,104,103;, 3;105,103,104;, 3;104,106,105;, 3;89,88,90;, 3;43,89,90;, 3;42,89,43;, 3;44,43,90;, 3;90,91,44;, 3;45,44,91;, 3;91,93,45;, 3;46,45,93;, 3;93,95,46;, 3;47,46,95;, 3;95,97,47;, 3;48,47,97;, 3;97,99,48;, 3;32,48,99;, 3;99,101,32;, 3;34,32,101;, 3;101,103,34;, 3;36,34,103;, 3;103,105,36;, 3;107,38,36;, 3;36,105,107;, 3;40,38,107;, 3;92,87,84;, 3;84,108,92;, 3;94,92,108;, 3;108,109,94;, 3;96,94,109;, 3;109,110,96;, 3;98,96,110;, 3;110,111,98;, 3;100,98,111;, 3;111,112,100;, 3;102,100,112;, 3;112,113,102;, 3;104,102,113;, 3;113,114,104;, 3;106,104,114;, 3;114,115,106;, 3;116,106,115;, 3;117,84,85;, 3;85,118,117;, 3;108,84,117;, 3;117,119,108;, 3;121,120,119;, 3;121,119,122;, 3;122,119,117;, 3;123,109,108;, 3;108,124,123;, 3;126,112,111;, 3;111,125,126;, 3;128,115,114;, 3;114,127,128;, 3;130,85,81;, 3;81,129,130;, 3;124,108,85;, 3;85,130,124;, 3;129,81,80;, 3;80,131,129;, 3;131,80,82;, 3;82,132,131;, 3;132,82,134;, 3;134,133,132;, 3;82,83,134;, 3;136,135,133;, 3;133,134,136;, 3;139,138,137;, 3;40,141,140;, 3;140,142,40;, 3;142,140,143;, 3;143,144,142;, 3;106,145,107;, 3;107,105,106;, 3;116,145,106;, 3;59,56,63;, 3;63,60,59;, 3;61,147,146;, 3;146,60,61;, 3;59,60,146;, 3;146,58,59;, 3;74,78,83;, 3;79,134,83;, 3;83,78,79;, 3;134,79,136;, 3;148,136,79;, 3;79,70,148;, 3;58,146,148;, 3;148,70,58;, 3;149,135,136;, 3;136,148,149;, 3;146,147,149;, 3;149,148,146;, 3;55,51,65;, 3;76,54,55;, 3;73,77,72;, 3;56,67,52;, 3;65,76,55;, 3;151,150,121;, 3;121,122,151;, 3;151,122,117;, 3;117,118,151;, 3;120,121,150;, 3;108,119,118;, 3;118,85,108;, 3;119,120,150;, 3;119,151,118;, 3;150,151,119;, 3;10,13,12;, 3;12,9,10;, 3;10,152,14;, 3;14,13,10;, 3;7,152,282;, 3;125,111,110;, 3;110,153,125;, 3;153,110,109;, 3;109,123,153;, 3;127,114,113;, 3;113,154,127;, 3;112,126,154;, 3;154,113,112;, 3;115,128,155;, 3;155,116,115;, 3;157,156,138;, 3;138,158,157;, 3;157,158,145;, 3;145,116,157;, 3;137,138,156;, 3;40,142,39;, 3;116,155,144;, 3;116,144,143;, 3;143,159,116;, 3;116,159,157;, 3;157,159,139;, 3;139,156,157;, 3;156,139,137;, 3;158,138,139;, 3;139,159,158;, 3;159,143,140;, 3;140,158,159;, 3;158,140,141;, 3;158,141,145;, 3;141,40,107;, 3;107,145,141;, 3;18,19,20;, 3;20,160,18;, 3;19,23,20;, 3;1,2,161;, 3;161,162,1;, 3;2,4,163;, 3;163,161,2;, 3;163,4,6;, 3;6,164,163;, 3;164,6,8;, 3;165,10,11;, 3;167,162,161;, 3;161,166,167;, 3;161,163,168;, 3;168,166,161;, 3;168,163,164;, 3;15,169,17;, 3;15,18,170;, 3;170,169,15;, 3;171,160,21;, 3;21,172,171;, 3;172,21,173;, 3;173,21,24;, 3;24,174,173;, 3;24,1,162;, 3;162,174,24;, 3;174,162,175;, 3;162,167,176;, 3;176,175,162;, 3;176,167,165;, 3;165,177,176;, 3;177,165,11;, 3;177,11,30;, 3;30,178,177;, 3;178,30,31;, 3;31,179,178;, 3;179,31,33;, 3;33,180,179;, 3;180,33,35;, 3;35,181,180;, 3;181,35,37;, 3;37,182,181;, 3;182,37,39;, 3;39,183,182;, 3;184,170,172;, 3;173,185,184;, 3;173,184,172;, 3;173,186,185;, 3;186,173,174;, 3;174,187,186;, 3;187,174,175;, 3;175,188,187;, 3;188,175,176;, 3;176,189,188;, 3;189,176,177;, 3;177,190,189;, 3;177,178,191;, 3;191,190,177;, 3;191,178,179;, 3;185,193,192;, 3;192,184,185;, 3;192,194,170;, 3;170,184,192;, 3;170,194,195;, 3;195,169,170;, 3;169,195,196;, 3;198,197,192;, 3;192,193,198;, 3;192,197,194;, 3;195,199,196;, 3;202,201,200;, 3;200,199,202;, 3;204,61,62;, 3;62,203,204;, 3;196,203,17;, 3;17,169,196;, 3;17,203,62;, 3;207,194,206;, 3;206,205,207;, 3;208,195,194;, 3;194,207,208;, 3;208,207,205;, 3;205,209,208;, 3;208,209,202;, 3;202,199,208;, 3;201,202,211;, 3;211,210,201;, 3;202,209,212;, 3;212,211,202;, 3;209,205,213;, 3;213,221,214;, 3;214,212,213;, 3;203,196,199;, 3;216,205,206;, 3;216,206,217;, 3;216,217,198;, 3;216,198,218;, 3;216,218,213;, 3;216,213,205;, 3;219,210,211;, 3;211,220,219;, 3;220,211,212;, 3;212,214,220;, 3;222,214,221;, 3;221,223,222;, 3;223,221,215;, 3;222,225,224;, 3;224,214,222;, 3;223,215,227;, 3;227,226,223;, 3;215,229,228;, 3;228,227,215;, 3;215,218,229;, 3;218,198,230;, 3;230,229,218;, 3;193,230,198;, 3;230,193,231;, 3;185,231,193;, 3;229,230,232;, 3;232,228,229;, 3;228,232,234;, 3;234,233,228;, 3;233,234,236;, 3;236,235,233;, 3;235,236,238;, 3;238,237,235;, 3;237,238,240;, 3;240,239,237;, 3;239,240,242;, 3;242,241,239;, 3;241,242,244;, 3;244,243,241;, 3;243,244,246;, 3;246,245,243;, 3;245,246,248;, 3;248,247,245;, 3;232,230,231;, 3;232,231,186;, 3;186,231,185;, 3;232,186,187;, 3;187,234,232;, 3;234,187,188;, 3;188,236,234;, 3;236,188,189;, 3;189,238,236;, 3;238,189,190;, 3;190,240,238;, 3;240,190,191;, 3;191,242,240;, 3;242,191,179;, 3;179,244,242;, 3;244,179,180;, 3;180,246,244;, 3;246,180,181;, 3;181,248,246;, 3;249,248,181;, 3;181,182,249;, 3;249,182,183;, 3;227,228,233;, 3;233,250,227;, 3;250,233,235;, 3;235,251,250;, 3;251,235,237;, 3;237,252,251;, 3;252,237,239;, 3;239,253,252;, 3;253,239,241;, 3;241,254,253;, 3;254,241,243;, 3;243,255,254;, 3;255,243,245;, 3;245,256,255;, 3;256,245,247;, 3;247,257,256;, 3;257,247,258;, 3;226,227,260;, 3;260,259,226;, 3;260,227,250;, 3;250,261,260;, 3;263,260,261;, 3;263,261,264;, 3;264,261,262;, 3;250,251,123;, 3;123,124,250;, 3;253,254,126;, 3;126,125,253;, 3;256,257,128;, 3;128,127,256;, 3;223,226,130;, 3;130,129,223;, 3;226,250,124;, 3;124,130,226;, 3;222,223,129;, 3;129,131,222;, 3;225,222,131;, 3;131,132,225;, 3;265,225,132;, 3;132,133,265;, 3;265,224,225;, 3;133,135,266;, 3;266,265,133;, 3;269,268,267;, 3;271,270,183;, 3;183,142,271;, 3;272,271,142;, 3;142,144,272;, 3;249,273,247;, 3;247,248,249;, 3;247,273,258;, 3;203,199,200;, 3;200,204,203;, 3;274,147,61;, 3;61,204,274;, 3;274,204,200;, 3;200,201,274;, 3;224,220,214;, 3;224,265,219;, 3;219,220,224;, 3;266,219,265;, 3;266,275,210;, 3;210,219,266;, 3;275,274,201;, 3;201,210,275;, 3;266,135,149;, 3;149,275,266;, 3;149,147,274;, 3;274,275,149;, 3;206,194,197;, 3;197,198,217;, 3;213,218,215;, 3;195,208,199;, 3;197,217,206;, 3;264,277,276;, 3;276,263,264;, 3;260,263,276;, 3;276,259,260;, 3;277,264,262;, 3;259,261,250;, 3;250,226,259;, 3;261,276,277;, 3;276,261,259;, 3;262,261,277;, 3;167,166,10;, 3;10,165,167;, 3;168,152,10;, 3;10,166,168;, 3;152,164,282;, 3;164,152,168;, 3;252,253,125;, 3;125,153,252;, 3;251,252,153;, 3;153,123,251;, 3;255,256,127;, 3;127,154,255;, 3;154,126,254;, 3;254,255,154;, 3;155,128,257;, 3;257,258,155;, 3;268,280,279;, 3;279,278,268;, 3;273,278,279;, 3;279,258,273;, 3;280,268,269;, 3;39,142,183;, 3;144,155,258;, 3;258,281,272;, 3;281,258,279;, 3;144,258,272;, 3;267,281,279;, 3;279,280,267;, 3;269,267,280;, 3;267,268,278;, 3;278,281,267;, 3;271,272,281;, 3;281,278,271;, 3;270,271,278;, 3;273,270,278;, 3;249,183,270;, 3;270,273,249;, 3;171,170,18;, 3;18,160,171;, 3;171,172,170;, 3;213,212,209;, 3;68,71,72;, 3;152,7,14;, 3;7,282,8;, 3;282,164,8;, 3;221,213,215;, 3;283,72,74;; } MeshMaterialList { 1; 564; 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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; Material { 0.269804;0.320000;0.630588;0.000000;; 20.000000; 0.500000;0.500000;0.500000;; 0.000000;0.000000;0.000000;; } } VertexDuplicationIndices { 284; 284; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283; } } } } ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/seafloor.x ================================================ xof 0302txt 0064 Header { 1; 0; 1; } Frame x3ds_SeaFloor { FrameTransformMatrix { 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000,-10.000000, 0.000000, 1.000000;; } Mesh SeaFloor { 1490; -14.285719;-0.135096;-100.000000;, 14.285709;-1.018934;-100.000000;, -71.428574;-0.307925;-71.428574;, -42.857147;-0.273623;-71.428574;, -14.285719;-0.105719;-71.428574;, 14.285709;-0.833857;-71.428574;, 42.857140;-0.314925;-71.428574;, 71.428566;-0.882375;-71.428574;, -71.428574;0.237553;-42.857147;, -42.857147;0.431774;-42.857147;, -14.285719;0.101133;-42.857147;, 14.285709;-0.082143;-42.857147;, 42.857140;0.526248;-42.857147;, 71.428566;0.188181;-42.857147;, -100.000000;0.713668;-14.285719;, -71.428574;0.809312;-14.285719;, -42.857147;0.912310;-14.285719;, -14.285719;0.613536;-14.285719;, 14.285709;0.520900;-14.285719;, 42.857140;0.942775;-14.285719;, 71.428566;0.305558;-14.285719;, 99.999992;0.135099;-14.285719;, -100.000000;0.004447;14.285709;, -71.428574;0.556757;14.285709;, -42.857147;0.392118;14.285709;, -14.285719;0.736304;14.285709;, 14.285709;-0.197491;14.285709;, 42.857140;-0.282111;14.285709;, 71.428566;-0.590892;14.285709;, 99.999992;-0.408245;14.285709;, -71.428574;-0.323118;42.857140;, -42.857147;-0.008600;42.857140;, -14.285719;0.211306;42.857140;, 14.285709;0.301397;42.857140;, 42.857140;-0.261847;42.857140;, 71.428566;-0.276548;42.857140;, -71.428574;-0.643011;71.428566;, -42.857147;-0.224026;71.428566;, -14.285719;-0.347621;71.428566;, 14.285709;-0.445051;71.428566;, 42.857140;-0.962680;71.428566;, 71.428566;-0.550829;71.428566;, -14.285719;0.097598;99.999992;, 14.285709;-0.334380;99.999992;, -76.190468;-0.350025;-71.428574;, -42.857143;-0.441021;-90.476181;, -42.857147;-0.907937;-85.714287;, -42.857147;-1.142959;-80.952377;, -42.857147;-1.552437;-76.190475;, -47.619049;-0.468403;-71.428574;, -52.380955;-0.233633;-71.428558;, -57.142860;0.234804;-71.428574;, -61.904766;0.256296;-71.428574;, -66.666672;-0.268906;-71.428574;, -23.809528;0.089565;-100.000000;, -19.047623;0.099161;-100.000000;, -14.285719;0.203792;-95.238091;, -14.285717;0.338728;-90.476181;, -14.285719;0.057991;-85.714287;, -14.285719;-0.359968;-80.952377;, -14.285719;0.016018;-76.190475;, -19.047621;-0.192406;-71.428574;, -23.809525;0.134232;-71.428558;, -28.571434;-0.406027;-71.428574;, -33.333336;-0.182656;-71.428574;, -38.095242;-0.113404;-71.428574;, -9.523813;0.412146;-99.999992;, -4.761909;0.014920;-99.999985;, -0.000005;-0.100070;-100.000000;, 4.761901;0.085441;-100.000000;, 9.523804;-0.537958;-100.000000;, 14.285707;-1.093982;-95.238091;, 14.285707;-0.775956;-90.476181;, 14.285709;-0.471833;-85.714287;, 14.285707;0.375411;-80.952377;, 14.285709;-0.608159;-76.190475;, 9.523804;-0.531067;-71.428574;, 4.761899;-0.149243;-71.428558;, -0.000005;0.311526;-71.428574;, -4.761910;0.094294;-71.428574;, -9.523813;0.247405;-71.428574;, 19.047613;-0.288111;-99.999992;, 23.809519;-0.432924;-99.999985;, 42.857136;-0.456084;-90.476181;, 42.857140;0.010033;-85.714287;, 42.857140;-0.404199;-80.952377;, 42.857140;-0.552525;-76.190475;, 38.095234;0.155982;-71.428574;, 33.333328;0.912775;-71.428558;, 28.571423;0.696381;-71.428574;, 23.809519;0.386063;-71.428574;, 19.047615;0.369331;-71.428574;, 71.428566;-0.588181;-76.190475;, 66.666656;-1.049700;-71.428574;, 61.904755;-0.913305;-71.428558;, 57.142853;0.193122;-71.428574;, 52.380947;-0.192729;-71.428574;, 47.619045;0.338611;-71.428574;, -71.428574;-0.241318;-66.666664;, -71.428558;-0.603029;-61.904758;, -71.428574;-0.217375;-57.142864;, -71.428574;0.028318;-52.380951;, -71.428574;0.587854;-47.619053;, -76.190468;0.561106;-42.857147;, -80.952370;0.501583;-42.857143;, -85.714279;0.946841;-42.857147;, -90.476189;-0.158061;-42.857147;, -42.857147;0.228752;-66.666664;, -42.857143;-0.562465;-61.904758;, -42.857147;-0.859382;-57.142864;, -42.857147;-0.007008;-52.380951;, -42.857147;0.154437;-47.619053;, -47.619049;0.141752;-42.857147;, -52.380955;0.157896;-42.857143;, -57.142860;0.078797;-42.857147;, -61.904766;0.214786;-42.857147;, -66.666672;0.865034;-42.857147;, -14.285719;0.811342;-66.666664;, -14.285717;-0.196288;-61.904758;, -14.285719;0.023182;-57.142864;, -14.285719;0.091712;-52.380951;, -14.285719;0.171870;-47.619053;, -19.047621;0.282091;-42.857147;, -23.809525;0.509501;-42.857143;, -28.571434;-0.060183;-42.857147;, -33.333336;0.406079;-42.857147;, -38.095242;-0.392864;-42.857147;, 14.285707;0.130527;-66.666664;, 14.285707;-0.698166;-61.904758;, 14.285709;-0.182321;-57.142864;, 14.285707;-0.197670;-52.380951;, 14.285709;-0.200434;-47.619053;, 9.523804;0.031800;-42.857147;, 4.761899;0.280455;-42.857143;, -0.000005;0.140762;-42.857147;, -4.761910;0.591689;-42.857147;, -9.523813;-0.218071;-42.857147;, 42.857140;-0.226362;-66.666664;, 42.857136;0.738809;-61.904758;, 42.857140;0.179423;-57.142864;, 42.857140;0.378334;-52.380951;, 42.857140;0.820125;-47.619053;, 38.095234;0.853592;-42.857147;, 33.333328;-0.018476;-42.857143;, 28.571423;1.015341;-42.857147;, 23.809519;0.538136;-42.857147;, 19.047615;-0.198490;-42.857147;, 71.428558;-0.679641;-66.666664;, 71.428558;-0.461165;-61.904758;, 71.428566;0.446923;-57.142864;, 71.428566;-0.014271;-52.380951;, 71.428566;0.207117;-47.619053;, 66.666656;0.327562;-42.857147;, 61.904755;0.103409;-42.857143;, 57.142853;-0.221917;-42.857147;, 52.380947;0.665427;-42.857147;, 47.619045;1.094022;-42.857147;, 95.238075;0.454392;-42.857147;, 90.476173;0.364723;-42.857143;, 85.714279;0.485237;-42.857147;, 80.952377;0.118603;-42.857147;, 76.190475;-0.336103;-42.857147;, -71.428574;0.467962;-38.095242;, -71.428558;0.764602;-33.333336;, -71.428574;0.977364;-28.571432;, -71.428574;1.280020;-23.809528;, -71.428574;1.180180;-19.047623;, -76.190468;0.880916;-14.285718;, -80.952370;0.382879;-14.285717;, -85.714279;0.352142;-14.285719;, -90.476189;0.207240;-14.285719;, -95.238098;-0.018347;-14.285719;, -99.999992;0.251241;-19.047621;, -99.999985;0.167263;-23.809525;, -100.000000;0.050628;-28.571434;, -42.857147;-0.612424;-38.095242;, -42.857143;-0.013090;-33.333336;, -42.857147;0.794656;-28.571432;, -42.857147;0.799792;-23.809528;, -42.857147;1.508822;-19.047623;, -47.619049;0.850131;-14.285718;, -52.380955;1.256059;-14.285717;, -57.142860;1.383449;-14.285719;, -61.904766;0.533856;-14.285719;, -66.666672;1.164416;-14.285719;, -14.285719;0.036708;-38.095242;, -14.285717;0.592788;-33.333336;, -14.285719;-0.055841;-28.571432;, -14.285719;0.533173;-23.809528;, -14.285719;0.474651;-19.047623;, -19.047621;0.135255;-14.285718;, -23.809525;0.747218;-14.285717;, -28.571434;0.255237;-14.285719;, -33.333336;0.906706;-14.285719;, -38.095242;0.899367;-14.285719;, 14.285707;-0.142404;-38.095242;, 14.285707;0.716628;-33.333336;, 14.285709;0.651095;-28.571432;, 14.285707;1.172098;-23.809528;, 14.285709;0.759930;-19.047623;, 9.523804;0.735744;-14.285718;, 4.761899;0.725145;-14.285717;, -0.000005;0.411798;-14.285719;, -4.761910;0.761873;-14.285719;, -9.523813;0.430274;-14.285719;, 42.857140;0.426968;-38.095242;, 42.857136;0.449123;-33.333336;, 42.857140;1.083668;-28.571432;, 42.857140;1.438282;-23.809528;, 42.857140;1.176020;-19.047623;, 38.095234;-0.011468;-14.285718;, 33.333328;0.612236;-14.285717;, 28.571423;1.162916;-14.285719;, 23.809519;0.809581;-14.285719;, 19.047615;0.797696;-14.285719;, 71.428558;0.957744;-38.095242;, 71.428558;0.863921;-33.333336;, 71.428566;0.919251;-28.571432;, 71.428566;0.468944;-23.809528;, 71.428566;-0.199780;-19.047623;, 66.666656;0.422344;-14.285718;, 61.904755;0.898708;-14.285717;, 57.142853;0.673347;-14.285719;, 52.380947;0.642073;-14.285719;, 47.619045;1.169447;-14.285719;, 99.999985;0.229194;-23.809528;, 99.999992;0.329644;-19.047623;, 95.238075;0.326864;-14.285718;, 90.476173;-0.572017;-14.285717;, 85.714279;-0.058216;-14.285719;, 80.952377;0.529773;-14.285719;, 76.190475;0.501918;-14.285719;, -71.428574;0.704634;-9.523813;, -71.428558;0.782750;-4.761908;, -71.428574;0.557799;-0.000005;, -71.428574;0.375774;4.761900;, -71.428574;0.528790;9.523805;, -76.190468;0.623954;14.285707;, -80.952370;0.408449;14.285707;, -85.714279;0.557152;14.285709;, -90.476189;-0.328164;14.285708;, -95.238098;0.071238;14.285710;, -99.999992;0.206027;9.523804;, -99.999985;-0.113214;4.761899;, -100.000000;0.182745;-0.000005;, -100.000000;0.192273;-4.761910;, -100.000000;0.021115;-9.523813;, -42.857147;0.755936;-9.523813;, -42.857143;0.162534;-4.761908;, -42.857147;0.257527;-0.000005;, -42.857147;0.903496;4.761900;, -42.857147;0.489498;9.523805;, -47.619049;0.151162;14.285707;, -52.380955;-0.193396;14.285707;, -57.142860;1.133530;14.285709;, -61.904766;0.626719;14.285708;, -66.666672;0.678700;14.285710;, -14.285719;0.429847;-9.523813;, -14.285717;0.631708;-4.761908;, -14.285719;1.100993;-0.000005;, -14.285719;0.530112;4.761900;, -14.285719;0.092696;9.523805;, -19.047621;0.117114;14.285707;, -23.809525;-0.007938;14.285707;, -28.571434;-0.031347;14.285709;, -33.333336;-0.141815;14.285708;, -38.095242;0.261257;14.285710;, 14.285707;0.208703;-9.523813;, 14.285707;0.211788;-4.761908;, 14.285709;0.475223;-0.000005;, 14.285707;0.964629;4.761900;, 14.285709;1.008226;9.523805;, 9.523804;0.989429;14.285707;, 4.761899;0.945728;14.285707;, -0.000005;0.221178;14.285709;, -4.761910;0.686866;14.285708;, -9.523813;0.626730;14.285710;, 42.857140;1.010462;-9.523813;, 42.857136;0.352587;-4.761908;, 42.857140;-0.224639;-0.000005;, 42.857140;-0.260482;4.761900;, 42.857140;0.138258;9.523805;, 38.095234;0.165571;14.285707;, 33.333328;-0.010969;14.285707;, 28.571423;-0.125291;14.285709;, 23.809519;0.187099;14.285708;, 19.047615;0.869021;14.285710;, 71.428558;0.508842;-9.523813;, 71.428558;0.840931;-4.761908;, 71.428566;0.284687;-0.000005;, 71.428566;-0.243677;4.761900;, 71.428566;-0.171505;9.523805;, 66.666656;-0.213838;14.285707;, 61.904755;0.078522;14.285707;, 57.142853;0.070022;14.285709;, 52.380947;0.182034;14.285708;, 47.619045;0.667903;14.285710;, 99.999992;0.094004;-9.523813;, 99.999985;0.379086;-4.761909;, 99.999992;0.098439;-0.000005;, 99.999985;0.297234;4.761901;, 99.999992;-0.136030;9.523805;, 95.238075;-0.306846;14.285707;, 90.476173;-0.311506;14.285707;, 85.714279;-0.168183;14.285709;, 80.952377;-0.256323;14.285708;, 76.190475;0.321061;14.285710;, -71.428574;0.327637;19.047613;, -71.428558;0.617808;23.809519;, -71.428574;0.457445;28.571423;, -71.428574;0.144485;33.333328;, -71.428574;-0.015872;38.095234;, -76.190468;-0.202490;42.857140;, -80.952370;0.073814;42.857136;, -85.714279;0.682053;42.857140;, -90.476189;0.292514;42.857140;, -95.238098;-0.619205;42.857140;, -100.000000;0.331048;28.571423;, -100.000000;-0.086507;23.809519;, -100.000000;-0.222385;19.047615;, -42.857147;0.343030;19.047613;, -42.857143;0.665933;23.809519;, -42.857147;0.723581;28.571423;, -42.857147;0.173923;33.333328;, -42.857147;-0.111467;38.095234;, -47.619049;-0.099223;42.857140;, -52.380955;0.268527;42.857136;, -57.142860;0.327154;42.857140;, -61.904766;0.255922;42.857140;, -66.666672;0.127546;42.857140;, -14.285719;0.941067;19.047613;, -14.285717;0.404930;23.809519;, -14.285719;0.591995;28.571423;, -14.285719;0.895216;33.333328;, -14.285719;0.559608;38.095234;, -19.047621;0.156090;42.857140;, -23.809525;0.375621;42.857136;, -28.571434;0.320363;42.857140;, -33.333336;-0.061159;42.857140;, -38.095242;-0.087877;42.857140;, 14.285707;0.367362;19.047613;, 14.285707;0.127668;23.809519;, 14.285709;0.470778;28.571423;, 14.285707;0.580796;33.333328;, 14.285709;0.198341;38.095234;, 9.523804;-0.512508;42.857140;, 4.761899;0.445894;42.857136;, -0.000005;1.368379;42.857140;, -4.761910;1.112172;42.857140;, -9.523813;0.619264;42.857140;, 42.857140;-0.214846;19.047613;, 42.857136;-0.014231;23.809519;, 42.857140;0.684959;28.571423;, 42.857140;-0.573070;33.333328;, 42.857140;-0.226664;38.095234;, 38.095234;0.478938;42.857140;, 33.333328;0.659463;42.857136;, 28.571423;0.218665;42.857140;, 23.809519;0.908736;42.857140;, 19.047615;0.434395;42.857140;, 71.428558;0.109958;19.047613;, 71.428558;-0.379407;23.809519;, 71.428566;-0.991344;28.571423;, 71.428566;-0.379050;33.333328;, 71.428566;-0.167809;38.095234;, 66.666656;-0.321815;42.857140;, 61.904755;-0.448380;42.857136;, 57.142853;-0.777358;42.857140;, 52.380947;-0.764991;42.857140;, 47.619045;-0.099739;42.857140;, 99.999992;-0.144340;19.047613;, 99.999985;-0.541099;23.809519;, 90.476173;-0.659219;42.857136;, 85.714279;-0.455414;42.857140;, 80.952377;-0.204183;42.857140;, 76.190475;0.194762;42.857140;, -71.428574;0.281622;47.619041;, -71.428558;-0.044956;52.380943;, -71.428574;-0.720373;57.142849;, -71.428574;-0.063963;61.904755;, -71.428574;0.233860;66.666656;, -76.190468;-0.093972;71.428558;, -42.857147;-0.316298;47.619041;, -42.857143;-0.253962;52.380943;, -42.857147;-0.545225;57.142849;, -42.857147;-0.607017;61.904755;, -42.857147;-1.006271;66.666656;, -47.619049;-0.292324;71.428558;, -52.380955;-0.839913;71.428558;, -57.142860;-0.282055;71.428566;, -61.904766;-0.288374;71.428566;, -66.666672;-0.813121;71.428566;, -14.285719;1.076631;47.619041;, -14.285717;0.051704;52.380943;, -14.285719;0.258576;57.142849;, -14.285719;-0.205593;61.904755;, -14.285719;0.006442;66.666656;, -19.047621;0.447580;71.428558;, -23.809525;-0.650777;71.428558;, -28.571434;-0.030014;71.428566;, -33.333336;-0.474398;71.428566;, -38.095242;-0.982600;71.428566;, 14.285707;-0.220121;47.619041;, 14.285707;-1.204683;52.380943;, 14.285709;-0.473230;57.142849;, 14.285707;-0.330069;61.904755;, 14.285709;-0.960922;66.666656;, 9.523804;-1.140873;71.428558;, 4.761899;-0.792691;71.428558;, -0.000005;-0.404453;71.428566;, -4.761910;0.013935;71.428566;, -9.523813;0.088346;71.428566;, 42.857140;-0.202450;47.619041;, 42.857136;0.309247;52.380943;, 42.857140;0.242164;57.142849;, 42.857140;0.608813;61.904755;, 42.857140;0.156971;66.666656;, 38.095234;-0.075689;71.428558;, 33.333328;-0.110703;71.428558;, 28.571423;0.163211;71.428566;, 23.809519;-0.448917;71.428566;, 19.047615;-0.805722;71.428566;, 71.428558;-0.825014;47.619041;, 71.428558;-0.469043;52.380943;, 71.428566;0.034489;57.142849;, 71.428566;-0.200289;61.904755;, 71.428566;0.045184;66.666656;, 66.666656;-0.407994;71.428558;, 61.904755;-0.229676;71.428558;, 57.142853;0.593403;71.428566;, 52.380947;-0.092017;71.428566;, 47.619045;-0.035994;71.428566;, -42.857147;-0.427180;76.190468;, -42.857143;0.314200;80.952370;, -42.857147;-0.057606;85.714279;, -42.857147;0.372523;90.476181;, -14.285719;0.019902;76.190468;, -14.285717;-0.469934;80.952370;, -14.285719;-0.360965;85.714279;, -14.285719;-0.127913;90.476181;, -14.285719;-0.098582;95.238083;, -19.047621;-0.021066;99.999992;, -23.809525;0.079518;99.999985;, -28.571434;0.911401;99.999992;, 14.285707;-0.502925;76.190468;, 14.285707;-0.298658;80.952370;, 14.285709;-0.081354;85.714279;, 14.285707;-0.389222;90.476181;, 14.285709;0.108639;95.238083;, 9.523804;-0.039113;99.999992;, 4.761899;-0.055326;99.999985;, -0.000005;0.095156;99.999992;, -4.761910;0.063914;99.999985;, -9.523813;-0.125103;99.999992;, 42.857140;-1.034266;76.190468;, 42.857136;-1.173705;80.952370;, 42.857140;-0.110575;85.714279;, 42.857140;0.089482;90.476181;, 23.809519;-0.215739;99.999985;, 19.047615;0.263260;99.999992;, -47.619053;-0.896381;-90.476189;, -57.142868;-0.328173;-85.714279;, -52.380959;-0.656298;-85.714287;, -47.619053;-0.432877;-85.714287;, -61.904762;-0.513313;-80.952385;, -57.142857;-0.960566;-80.952377;, -52.380955;-0.566089;-80.952385;, -47.619049;-1.267757;-80.952377;, -66.666672;-0.336182;-76.190483;, -61.904762;-0.397067;-76.190475;, -57.142857;-0.479988;-76.190475;, -52.380959;-0.531276;-76.190483;, -47.619049;-0.742459;-76.190475;, -38.095245;0.045469;-95.238098;, -33.333336;0.102977;-95.238091;, -28.571430;0.130415;-95.238091;, -23.809528;-0.216483;-95.238106;, -19.047625;-0.169905;-95.238091;, -38.095245;-0.444137;-90.476181;, -33.333332;-0.695001;-90.476196;, -28.571432;0.611303;-90.476204;, -23.809528;-0.606146;-90.476189;, -19.047625;0.362023;-90.476189;, -38.095245;-1.056779;-85.714272;, -33.333340;-0.718648;-85.714279;, -28.571434;0.199615;-85.714279;, -23.809530;-0.253343;-85.714287;, -19.047623;-0.399376;-85.714287;, -38.095245;-0.913340;-80.952385;, -33.333336;-0.903951;-80.952385;, -28.571436;-0.603099;-80.952377;, -23.809532;-0.025633;-80.952385;, -19.047625;0.198069;-80.952377;, -38.095242;-0.220551;-76.190483;, -33.333340;-0.775552;-76.190475;, -28.571432;-0.088182;-76.190475;, -23.809528;-0.321007;-76.190483;, -19.047623;0.017947;-76.190475;, -9.523815;-0.077893;-95.238098;, -4.761909;0.308261;-95.238091;, -0.000005;-0.490944;-95.238091;, 4.761901;-0.627974;-95.238106;, 9.523804;-0.424610;-95.238091;, -9.523813;-0.044581;-90.476181;, -4.761909;0.159439;-90.476196;, -0.000005;-0.443794;-90.476204;, 4.761900;-0.127339;-90.476189;, 9.523804;-0.250573;-90.476189;, -9.523813;-0.061567;-85.714272;, -4.761909;0.264794;-85.714279;, -0.000004;0.601675;-85.714279;, 4.761900;-0.576284;-85.714287;, 9.523804;-0.400029;-85.714287;, -9.523813;0.294668;-80.952385;, -4.761909;-0.135345;-80.952385;, -0.000005;0.062585;-80.952377;, 4.761900;-0.023677;-80.952385;, 9.523804;-0.732768;-80.952377;, -9.523815;0.351763;-76.190483;, -4.761909;0.180779;-76.190475;, -0.000005;0.126858;-76.190475;, 4.761901;0.035790;-76.190483;, 9.523804;-0.244378;-76.190475;, 19.047617;-0.575421;-95.238098;, 23.809519;0.061376;-95.238091;, 28.571426;-0.336216;-95.238091;, 33.333332;0.180103;-95.238106;, 38.095234;-0.950449;-95.238091;, 19.047615;-0.320800;-90.476181;, 23.809519;-0.205761;-90.476196;, 28.571424;-0.332053;-90.476204;, 33.333328;0.028708;-90.476189;, 38.095230;-0.358080;-90.476189;, 19.047617;-0.081426;-85.714272;, 23.809517;-0.106021;-85.714279;, 28.571426;-0.354572;-85.714279;, 33.333332;-0.169037;-85.714287;, 38.095234;-0.146862;-85.714287;, 19.047615;0.048051;-80.952385;, 23.809521;-0.574941;-80.952385;, 28.571423;0.019022;-80.952377;, 33.333328;-0.485126;-80.952385;, 38.095234;0.118830;-80.952377;, 19.047617;-0.137680;-76.190483;, 23.809519;-0.555381;-76.190475;, 28.571423;0.379704;-76.190475;, 33.333328;0.264785;-76.190483;, 38.095230;-0.129358;-76.190475;, 47.619045;0.240993;-90.476181;, 47.619045;0.370391;-85.714272;, 52.380959;-0.804926;-85.714279;, 57.142849;-0.681500;-85.714279;, 47.619049;-0.513063;-80.952385;, 52.380947;0.252851;-80.952385;, 57.142857;0.166456;-80.952377;, 61.904758;-0.092455;-80.952385;, 47.619041;0.081938;-76.190483;, 52.380955;-0.371723;-76.190475;, 57.142857;0.392582;-76.190475;, 61.904751;-0.302392;-76.190483;, 66.666656;-0.426238;-76.190475;, -76.190475;-0.348970;-66.666672;, -80.952385;-0.405730;-61.904762;, -76.190475;-0.803196;-61.904766;, -85.714279;-0.199913;-57.142860;, -80.952385;-0.717034;-57.142860;, -76.190475;-0.750128;-57.142857;, -85.714287;-0.086299;-52.380962;, -80.952385;-0.218255;-52.380955;, -76.190475;-0.017879;-52.380959;, -90.476189;0.289871;-47.619053;, -85.714287;0.408372;-47.619049;, -80.952377;0.272326;-47.619057;, -76.190475;0.132861;-47.619049;, -66.666672;0.266427;-66.666664;, -61.904770;-0.072512;-66.666664;, -57.142864;-0.150835;-66.666664;, -52.380962;-0.021293;-66.666672;, -47.619057;-0.474822;-66.666672;, -66.666672;0.487985;-61.904766;, -61.904758;-0.309201;-61.904766;, -57.142860;0.319654;-61.904766;, -52.380955;1.311962;-61.904762;, -47.619053;-0.171303;-61.904766;, -66.666672;-0.229193;-57.142864;, -61.904766;0.417655;-57.142853;, -57.142868;0.166550;-57.142860;, -52.380959;0.317161;-57.142860;, -47.619053;0.296120;-57.142857;, -66.666672;0.130392;-52.380959;, -61.904762;-0.005004;-52.380955;, -57.142857;-0.630300;-52.380962;, -52.380955;0.486425;-52.380955;, -47.619049;-0.289771;-52.380959;, -66.666672;0.395921;-47.619045;, -61.904762;0.500003;-47.619053;, -57.142857;0.402763;-47.619049;, -52.380959;0.551308;-47.619057;, -47.619049;-0.121532;-47.619049;, -38.095245;-0.010068;-66.666664;, -33.333336;-0.289168;-66.666664;, -28.571430;-0.496295;-66.666664;, -23.809528;-0.467309;-66.666672;, -19.047625;0.277623;-66.666672;, -38.095245;-0.132215;-61.904766;, -33.333332;-1.095695;-61.904766;, -28.571432;-0.030175;-61.904766;, -23.809528;-0.633231;-61.904762;, -19.047625;0.155150;-61.904766;, -38.095245;-0.245004;-57.142864;, -33.333340;-0.246470;-57.142853;, -28.571434;-0.801827;-57.142860;, -23.809530;-0.406785;-57.142860;, -19.047623;-0.079546;-57.142857;, -38.095245;-0.125901;-52.380959;, -33.333336;-0.249462;-52.380955;, -28.571436;-0.489908;-52.380962;, -23.809532;-0.264658;-52.380955;, -19.047625;-0.025563;-52.380959;, -38.095242;0.434170;-47.619045;, -33.333340;0.213746;-47.619053;, -28.571432;0.227585;-47.619049;, -23.809528;0.409066;-47.619057;, -19.047623;0.586967;-47.619049;, -9.523815;0.243269;-66.666664;, -4.761909;0.305613;-66.666664;, -0.000005;0.749702;-66.666664;, 4.761901;-0.041101;-66.666672;, 9.523804;-0.224528;-66.666672;, -9.523813;-0.138317;-61.904766;, -4.761909;0.969622;-61.904766;, -0.000005;0.390296;-61.904766;, 4.761900;0.515348;-61.904762;, 9.523804;0.101632;-61.904766;, -9.523813;0.508570;-57.142864;, -4.761909;0.220557;-57.142853;, -0.000004;0.053783;-57.142860;, 4.761900;0.033699;-57.142860;, 9.523804;0.194044;-57.142857;, -9.523813;-0.169694;-52.380959;, -4.761909;0.481576;-52.380955;, -0.000005;0.347434;-52.380962;, 4.761900;0.266849;-52.380955;, 9.523804;-0.116532;-52.380959;, -9.523815;-0.231660;-47.619045;, -4.761909;-0.377175;-47.619053;, -0.000005;0.112933;-47.619049;, 4.761901;0.317320;-47.619057;, 9.523804;-0.017629;-47.619049;, 19.047617;0.135771;-66.666664;, 23.809519;0.019960;-66.666664;, 28.571426;-0.267989;-66.666664;, 33.333332;0.653463;-66.666672;, 38.095234;1.169628;-66.666672;, 19.047615;-0.067673;-61.904766;, 23.809519;0.597693;-61.904766;, 28.571424;0.044806;-61.904766;, 33.333328;-0.036723;-61.904762;, 38.095230;0.271063;-61.904766;, 19.047617;-0.361246;-57.142864;, 23.809517;-0.058579;-57.142853;, 28.571426;0.609813;-57.142860;, 33.333332;0.330539;-57.142860;, 38.095234;-0.057024;-57.142857;, 19.047615;-0.436143;-52.380959;, 23.809521;0.470412;-52.380955;, 28.571423;0.448475;-52.380962;, 33.333328;0.713128;-52.380955;, 38.095234;0.489472;-52.380959;, 19.047617;-0.600673;-47.619045;, 23.809519;-0.377628;-47.619053;, 28.571423;0.918299;-47.619049;, 33.333328;1.202303;-47.619057;, 38.095230;0.447862;-47.619049;, 47.619041;0.033839;-66.666664;, 52.380955;-0.946366;-66.666664;, 57.142857;-0.235814;-66.666664;, 61.904755;-0.488056;-66.666672;, 66.666656;0.116058;-66.666672;, 47.619045;-0.261705;-61.904766;, 52.380947;-0.553567;-61.904766;, 57.142849;-0.841473;-61.904766;, 61.904758;-0.209702;-61.904762;, 66.666656;-0.157042;-61.904766;, 47.619045;0.525451;-57.142864;, 52.380959;-0.712736;-57.142853;, 57.142849;-0.364831;-57.142860;, 61.904758;-0.605710;-57.142860;, 66.666664;-0.069805;-57.142857;, 47.619049;0.038909;-52.380959;, 52.380947;-0.769230;-52.380955;, 57.142857;-0.503422;-52.380962;, 61.904758;0.345566;-52.380955;, 66.666656;-0.560847;-52.380959;, 47.619041;0.506564;-47.619045;, 52.380955;-0.508165;-47.619053;, 57.142857;0.135078;-47.619049;, 61.904751;-1.073132;-47.619057;, 66.666656;-0.165831;-47.619049;, 76.190483;-0.072807;-66.666664;, 76.190475;-0.486434;-61.904766;, 80.952377;0.095965;-61.904766;, 76.190468;0.392118;-57.142864;, 80.952362;-0.160010;-57.142857;, 85.714279;0.029156;-57.142864;, 76.190475;0.389107;-52.380959;, 80.952385;-0.270554;-52.380955;, 85.714279;0.304861;-52.380959;, 90.476181;0.029144;-52.380955;, 76.190475;-0.280273;-47.619045;, 80.952377;0.047318;-47.619053;, 85.714279;0.077279;-47.619049;, 90.476181;0.522156;-47.619057;, -95.238091;0.146004;-38.095249;, -90.476189;-0.135323;-38.095245;, -85.714302;-0.094774;-38.095245;, -80.952385;-0.012592;-38.095238;, -76.190475;0.214362;-38.095242;, -95.238091;-0.663445;-33.333336;, -90.476196;-0.571629;-33.333336;, -85.714287;0.142352;-33.333340;, -80.952385;-0.006924;-33.333336;, -76.190475;0.942335;-33.333336;, -95.238091;0.105121;-28.571430;, -90.476196;0.379096;-28.571432;, -85.714279;0.025746;-28.571434;, -80.952385;0.014520;-28.571434;, -76.190475;0.436127;-28.571432;, -95.238098;0.037560;-23.809530;, -90.476196;0.267005;-23.809528;, -85.714287;0.863584;-23.809528;, -80.952385;-0.166361;-23.809530;, -76.190475;0.196967;-23.809528;, -95.238098;-0.104465;-19.047628;, -90.476189;0.122242;-19.047621;, -85.714287;0.447682;-19.047623;, -80.952377;0.063871;-19.047625;, -76.190475;0.343448;-19.047625;, -66.666672;0.590940;-38.095249;, -61.904770;0.608232;-38.095245;, -57.142864;0.552512;-38.095245;, -52.380962;0.320589;-38.095238;, -47.619057;0.278432;-38.095242;, -66.666672;1.271968;-33.333336;, -61.904758;0.403147;-33.333336;, -57.142860;0.108861;-33.333340;, -52.380955;-0.191607;-33.333336;, -47.619053;0.253385;-33.333336;, -66.666672;1.065984;-28.571430;, -61.904766;0.646968;-28.571432;, -57.142868;0.768861;-28.571434;, -52.380959;0.366157;-28.571434;, -47.619053;0.675626;-28.571432;, -66.666672;1.103412;-23.809530;, -61.904762;1.158456;-23.809528;, -57.142857;0.210519;-23.809528;, -52.380955;0.972075;-23.809530;, -47.619049;0.647467;-23.809528;, -66.666672;1.283420;-19.047628;, -61.904762;1.341369;-19.047621;, -57.142857;1.247629;-19.047623;, -52.380959;0.956362;-19.047625;, -47.619049;1.172287;-19.047625;, -38.095245;-0.214886;-38.095249;, -33.333336;0.484496;-38.095245;, -28.571430;-0.136695;-38.095245;, -23.809528;0.848725;-38.095238;, -19.047625;0.345354;-38.095242;, -38.095245;-0.436160;-33.333336;, -33.333332;0.551390;-33.333336;, -28.571432;0.495749;-33.333340;, -23.809528;0.666285;-33.333336;, -19.047625;0.129059;-33.333336;, -38.095245;0.679556;-28.571430;, -33.333340;0.879020;-28.571432;, -28.571434;0.751337;-28.571434;, -23.809530;0.503239;-28.571434;, -19.047623;0.511175;-28.571432;, -38.095245;0.953050;-23.809530;, -33.333336;0.333945;-23.809528;, -28.571436;0.857836;-23.809528;, -23.809532;-0.429330;-23.809530;, -19.047625;-0.056639;-23.809528;, -38.095242;1.071013;-19.047628;, -33.333340;0.435640;-19.047621;, -28.571432;0.770570;-19.047623;, -23.809528;0.340346;-19.047625;, -19.047623;0.447750;-19.047625;, -9.523815;-0.086783;-38.095249;, -4.761909;0.113547;-38.095245;, -0.000005;-0.197065;-38.095245;, 4.761901;-0.054983;-38.095238;, 9.523804;0.692805;-38.095242;, -9.523813;0.274385;-33.333336;, -4.761909;-0.232459;-33.333336;, -0.000005;-0.380196;-33.333340;, 4.761900;0.399482;-33.333336;, 9.523804;0.062564;-33.333336;, -9.523813;0.297241;-28.571430;, -4.761909;0.415487;-28.571432;, -0.000004;0.800085;-28.571434;, 4.761900;0.788055;-28.571434;, 9.523804;0.737738;-28.571432;, -9.523813;0.525031;-23.809530;, -4.761909;0.399502;-23.809528;, -0.000005;0.520640;-23.809528;, 4.761900;0.163826;-23.809530;, 9.523804;1.190181;-23.809528;, -9.523815;0.465551;-19.047628;, -4.761909;0.210487;-19.047621;, -0.000005;0.555673;-19.047623;, 4.761901;0.842914;-19.047625;, 9.523804;0.660211;-19.047625;, 19.047617;0.451290;-38.095249;, 23.809519;0.286698;-38.095245;, 28.571426;0.805214;-38.095245;, 33.333332;0.989717;-38.095238;, 38.095234;0.593022;-38.095242;, 19.047615;1.319814;-33.333336;, 23.809519;1.135292;-33.333336;, 28.571424;1.117218;-33.333340;, 33.333328;1.023826;-33.333336;, 38.095230;0.911118;-33.333336;, 19.047617;0.540009;-28.571430;, 23.809517;0.881057;-28.571432;, 28.571426;0.618853;-28.571434;, 33.333332;0.981026;-28.571434;, 38.095234;0.603346;-28.571432;, 19.047615;0.622427;-23.809530;, 23.809521;0.594324;-23.809528;, 28.571423;0.218313;-23.809528;, 33.333328;1.047722;-23.809530;, 38.095234;1.451933;-23.809528;, 19.047617;0.620442;-19.047628;, 23.809519;0.343850;-19.047621;, 28.571423;0.528112;-19.047623;, 33.333328;0.528256;-19.047625;, 38.095230;0.711731;-19.047625;, 47.619041;1.491915;-38.095249;, 52.380955;0.149788;-38.095245;, 57.142857;-0.120143;-38.095245;, 61.904755;-0.000747;-38.095238;, 66.666656;1.339226;-38.095242;, 47.619045;0.151090;-33.333336;, 52.380947;0.313079;-33.333336;, 57.142849;0.156893;-33.333340;, 61.904758;0.354590;-33.333336;, 66.666656;0.247437;-33.333336;, 47.619045;1.023633;-28.571430;, 52.380959;-0.145311;-28.571432;, 57.142849;0.631876;-28.571434;, 61.904758;0.844891;-28.571434;, 66.666664;1.026587;-28.571432;, 47.619049;0.998444;-23.809530;, 52.380947;0.614895;-23.809528;, 57.142857;-0.185409;-23.809528;, 61.904758;0.752258;-23.809530;, 66.666656;0.566804;-23.809528;, 47.619041;1.884505;-19.047628;, 52.380955;0.703374;-19.047621;, 57.142857;0.932738;-19.047623;, 61.904751;-0.012433;-19.047625;, 66.666656;0.598260;-19.047625;, 76.190483;0.585609;-38.095249;, 80.952385;0.112419;-38.095245;, 85.714272;0.569965;-38.095245;, 90.476196;0.070365;-38.095238;, 95.238098;0.810845;-38.095242;, 76.190475;0.958473;-33.333336;, 80.952377;0.519011;-33.333336;, 85.714279;1.036680;-33.333340;, 90.476189;0.312387;-33.333336;, 95.238091;0.684369;-33.333336;, 76.190468;0.903687;-28.571430;, 80.952362;0.370712;-28.571432;, 85.714279;0.401624;-28.571434;, 90.476189;0.465031;-28.571434;, 95.238083;0.871782;-28.571432;, 76.190475;0.067014;-23.809530;, 80.952385;-0.059502;-23.809528;, 85.714279;-0.401895;-23.809528;, 90.476181;0.112269;-23.809530;, 95.238083;0.295354;-23.809528;, 76.190475;0.241683;-19.047628;, 80.952377;0.139077;-19.047621;, 85.714279;0.032044;-19.047623;, 90.476181;0.370127;-19.047625;, 95.238083;0.035993;-19.047625;, -95.238091;-0.635028;-9.523814;, -90.476189;0.081866;-9.523813;, -85.714302;0.542680;-9.523813;, -80.952385;0.072004;-9.523814;, -76.190475;0.769015;-9.523814;, -95.238091;0.370450;-4.761909;, -90.476196;0.126042;-4.761909;, -85.714287;-0.035015;-4.761909;, -80.952385;0.433681;-4.761909;, -76.190475;0.785710;-4.761909;, -95.238091;0.243324;-0.000005;, -90.476196;0.458492;-0.000005;, -85.714279;0.686098;-0.000005;, -80.952385;0.255165;-0.000005;, -76.190475;0.671934;-0.000005;, -95.238098;0.680216;4.761900;, -90.476196;0.493188;4.761901;, -85.714287;0.510967;4.761900;, -80.952385;-0.085318;4.761900;, -76.190475;0.153707;4.761900;, -95.238098;-0.113884;9.523805;, -90.476189;-0.062231;9.523803;, -85.714287;0.013318;9.523803;, -80.952377;0.501502;9.523804;, -76.190475;0.116553;9.523804;, -66.666672;0.648186;-9.523814;, -61.904770;1.037785;-9.523813;, -57.142864;1.118643;-9.523813;, -52.380962;0.152270;-9.523814;, -47.619057;0.382152;-9.523814;, -66.666672;-0.263512;-4.761909;, -61.904758;1.228136;-4.761909;, -57.142860;1.333070;-4.761909;, -52.380955;0.844646;-4.761909;, -47.619053;0.275482;-4.761909;, -66.666672;-0.122993;-0.000005;, -61.904766;-0.001749;-0.000005;, -57.142868;0.388759;-0.000005;, -52.380959;0.776936;-0.000005;, -47.619053;0.057072;-0.000005;, -66.666672;-0.154972;4.761900;, -61.904762;-0.245416;4.761901;, -57.142857;0.150180;4.761900;, -52.380955;0.469004;4.761900;, -47.619049;0.523502;4.761900;, -66.666672;0.668283;9.523805;, -61.904762;0.014012;9.523803;, -57.142857;1.073029;9.523803;, -52.380959;0.621311;9.523804;, -47.619049;0.676246;9.523804;, -38.095245;0.257905;-9.523814;, -33.333336;0.409918;-9.523813;, -28.571430;0.237781;-9.523813;, -23.809528;1.043879;-9.523814;, -19.047625;0.787480;-9.523814;, -38.095245;0.408669;-4.761909;, -33.333332;-0.055927;-4.761909;, -28.571432;0.258839;-4.761909;, -23.809528;0.549747;-4.761909;, -19.047625;0.945331;-4.761909;, -38.095245;0.346291;-0.000005;, -33.333340;0.166681;-0.000005;, -28.571434;0.184476;-0.000005;, -23.809530;0.419668;-0.000005;, -19.047623;0.156914;-0.000005;, -38.095245;0.484803;4.761900;, -33.333336;0.414197;4.761901;, -28.571436;0.395152;4.761900;, -23.809532;0.548786;4.761900;, -19.047625;-0.148510;4.761900;, -38.095242;0.264819;9.523805;, -33.333340;0.227147;9.523803;, -28.571432;0.518521;9.523803;, -23.809528;-0.044758;9.523804;, -19.047623;0.149496;9.523804;, -9.523815;0.995608;-9.523814;, -4.761909;1.512732;-9.523813;, -0.000005;0.859293;-9.523813;, 4.761901;0.560019;-9.523814;, 9.523804;0.686237;-9.523814;, -9.523813;1.376515;-4.761909;, -4.761909;0.789060;-4.761909;, -0.000005;0.791284;-4.761909;, 4.761900;0.844546;-4.761909;, 9.523804;0.953963;-4.761909;, -9.523813;0.748610;-0.000005;, -4.761909;-0.118583;-0.000005;, -0.000004;0.563196;-0.000005;, 4.761900;0.647850;-0.000005;, 9.523804;0.984808;-0.000005;, -9.523813;0.464913;4.761900;, -4.761909;0.729785;4.761901;, -0.000005;0.889329;4.761900;, 4.761900;0.917057;4.761900;, 9.523804;1.329822;4.761900;, -9.523815;-0.044570;9.523805;, -4.761909;0.210753;9.523803;, -0.000005;0.873260;9.523803;, 4.761901;0.876039;9.523804;, 9.523804;1.378626;9.523804;, 19.047617;0.670248;-9.523814;, 23.809519;0.631106;-9.523813;, 28.571426;0.236182;-9.523813;, 33.333332;0.132501;-9.523814;, 38.095234;0.736855;-9.523814;, 19.047615;0.106248;-4.761909;, 23.809519;-0.385313;-4.761909;, 28.571424;0.358606;-4.761909;, 33.333328;0.369490;-4.761909;, 38.095230;-0.458202;-4.761909;, 19.047617;0.438385;-0.000005;, 23.809517;0.103508;-0.000005;, 28.571426;0.654476;-0.000005;, 33.333332;0.197987;-0.000005;, 38.095234;-0.468729;-0.000005;, 19.047615;0.402630;4.761900;, 23.809521;0.413054;4.761901;, 28.571423;0.697183;4.761900;, 33.333328;-0.211688;4.761900;, 38.095234;-0.481783;4.761900;, 19.047617;1.188652;9.523805;, 23.809519;0.765385;9.523803;, 28.571423;0.633057;9.523803;, 33.333328;-0.037992;9.523804;, 38.095230;-0.279323;9.523804;, 47.619041;1.065258;-9.523814;, 52.380955;0.678198;-9.523813;, 57.142857;0.212120;-9.523813;, 61.904755;1.334492;-9.523814;, 66.666656;0.436235;-9.523814;, 47.619045;0.288181;-4.761909;, 52.380947;1.176908;-4.761909;, 57.142849;0.975162;-4.761909;, 61.904758;0.550585;-4.761909;, 66.666656;0.058083;-4.761909;, 47.619045;-0.404481;-0.000005;, 52.380959;0.548954;-0.000005;, 57.142849;0.225667;-0.000005;, 61.904758;0.339342;-0.000005;, 66.666664;0.584654;-0.000005;, 47.619049;0.216021;4.761900;, 52.380947;0.048065;4.761901;, 57.142857;0.231755;4.761900;, 61.904758;-0.012498;4.761900;, 66.666656;0.332744;4.761900;, 47.619041;-0.071246;9.523805;, 52.380955;-0.208520;9.523803;, 57.142857;0.279395;9.523803;, 61.904751;0.154010;9.523804;, 66.666656;-0.188532;9.523804;, 76.190483;-0.088690;-9.523814;, 80.952385;0.390631;-9.523813;, 85.714272;-0.161228;-9.523813;, 90.476196;-0.238980;-9.523814;, 95.238098;0.173079;-9.523814;, 76.190475;-0.134629;-4.761909;, 80.952377;-0.278623;-4.761909;, 85.714279;0.152124;-4.761909;, 90.476189;-0.788111;-4.761909;, 95.238091;0.056065;-4.761909;, 76.190468;0.151857;-0.000005;, 80.952362;0.013362;-0.000005;, 85.714279;0.238772;-0.000004;, 90.476189;-0.584571;-0.000005;, 95.238083;-0.271175;-0.000005;, 76.190475;0.288078;4.761900;, 80.952385;-0.006765;4.761901;, 85.714279;-0.320527;4.761900;, 90.476181;-0.171760;4.761901;, 95.238083;-0.106328;4.761900;, 76.190475;-0.488811;9.523805;, 80.952377;0.259892;9.523803;, 85.714279;-0.964793;9.523803;, 90.476181;-0.619212;9.523804;, 95.238083;0.091132;9.523804;, -95.238091;-0.201637;19.047617;, -90.476189;-0.149839;19.047615;, -85.714302;0.006371;19.047617;, -80.952385;-0.033042;19.047615;, -76.190475;-0.317115;19.047615;, -95.238091;0.209303;23.809517;, -90.476196;0.460540;23.809519;, -85.714287;0.020164;23.809519;, -80.952385;-0.128085;23.809521;, -76.190475;0.149817;23.809519;, -95.238091;0.420094;28.571424;, -90.476196;0.492581;28.571423;, -85.714279;0.095347;28.571424;, -80.952385;0.419620;28.571423;, -76.190475;0.362057;28.571423;, -95.238098;-0.150883;33.333332;, -90.476196;-0.282124;33.333332;, -85.714287;-0.187727;33.333332;, -80.952385;0.259263;33.333332;, -76.190475;0.594422;33.333328;, -95.238098;-0.571404;38.095238;, -90.476189;-0.486190;38.095230;, -85.714287;0.357521;38.095226;, -80.952377;0.504628;38.095230;, -76.190475;0.373769;38.095230;, -66.666672;0.502245;19.047617;, -61.904770;0.511736;19.047615;, -57.142864;0.360597;19.047617;, -52.380962;0.735265;19.047615;, -47.619057;0.127262;19.047615;, -66.666672;0.514087;23.809517;, -61.904758;0.519105;23.809519;, -57.142860;0.519451;23.809519;, -52.380955;0.782563;23.809521;, -47.619053;0.444003;23.809519;, -66.666672;-0.234723;28.571424;, -61.904766;0.326034;28.571423;, -57.142868;0.051950;28.571424;, -52.380959;-0.173723;28.571423;, -47.619053;-0.238126;28.571423;, -66.666672;0.537940;33.333332;, -61.904762;-0.058904;33.333332;, -57.142857;0.204335;33.333332;, -52.380955;-0.088778;33.333332;, -47.619049;0.203796;33.333328;, -66.666672;0.652848;38.095238;, -61.904762;0.415248;38.095230;, -57.142857;0.087422;38.095226;, -52.380959;-0.090355;38.095230;, -47.619049;-0.059427;38.095230;, -38.095245;0.161836;19.047617;, -33.333336;-0.440482;19.047615;, -28.571430;-0.285349;19.047617;, -23.809528;0.407627;19.047615;, -19.047625;0.433981;19.047615;, -38.095245;0.020594;23.809517;, -33.333332;-0.073424;23.809519;, -28.571432;0.625639;23.809519;, -23.809528;0.315404;23.809521;, -19.047625;0.293077;23.809519;, -38.095245;0.766912;28.571424;, -33.333340;0.504977;28.571423;, -28.571434;0.369143;28.571424;, -23.809530;0.445399;28.571423;, -19.047623;0.100101;28.571423;, -38.095245;0.201413;33.333332;, -33.333336;1.294783;33.333332;, -28.571436;0.968459;33.333332;, -23.809532;0.558453;33.333332;, -19.047625;0.277103;33.333328;, -38.095242;0.575762;38.095238;, -33.333340;0.453316;38.095230;, -28.571432;1.285199;38.095226;, -23.809528;0.488240;38.095230;, -19.047623;0.187016;38.095230;, -9.523815;0.996402;19.047617;, -4.761909;0.775935;19.047615;, -0.000005;0.880439;19.047617;, 4.761901;0.612420;19.047615;, 9.523804;0.571617;19.047615;, -9.523813;1.616749;23.809517;, -4.761909;0.377220;23.809519;, -0.000005;0.720718;23.809519;, 4.761900;0.472201;23.809521;, 9.523804;0.317466;23.809519;, -9.523813;0.431987;28.571424;, -4.761909;0.345291;28.571423;, -0.000004;-0.074424;28.571424;, 4.761900;-0.542948;28.571423;, 9.523804;0.259391;28.571423;, -9.523813;0.669768;33.333332;, -4.761909;0.340621;33.333332;, -0.000005;-0.096041;33.333332;, 4.761900;-0.622098;33.333332;, 9.523804;0.051470;33.333328;, -9.523815;0.390742;38.095238;, -4.761909;0.199370;38.095230;, -0.000005;0.857651;38.095226;, 4.761901;0.552805;38.095230;, 9.523804;-0.119714;38.095230;, 19.047617;0.459538;19.047617;, 23.809519;0.618532;19.047615;, 28.571426;0.356688;19.047617;, 33.333332;0.198981;19.047615;, 38.095234;0.222746;19.047615;, 19.047615;0.095561;23.809517;, 23.809519;0.536586;23.809519;, 28.571424;0.152821;23.809519;, 33.333328;-0.680507;23.809521;, 38.095230;0.177823;23.809519;, 19.047617;0.005467;28.571424;, 23.809517;-0.100124;28.571423;, 28.571426;-0.181885;28.571424;, 33.333332;-0.433794;28.571423;, 38.095234;-0.490281;28.571423;, 19.047615;0.185628;33.333332;, 23.809521;-0.394754;33.333332;, 28.571423;-0.515903;33.333332;, 33.333328;-0.266749;33.333332;, 38.095234;-0.440623;33.333328;, 19.047617;-0.215529;38.095238;, 23.809519;-0.145184;38.095230;, 28.571423;-0.328802;38.095226;, 33.333328;-0.118301;38.095230;, 38.095230;-0.068659;38.095230;, 47.619041;0.250273;19.047617;, 52.380955;-0.139636;19.047615;, 57.142857;0.045368;19.047617;, 61.904755;0.484037;19.047615;, 66.666656;-0.962253;19.047615;, 47.619045;-0.242349;23.809517;, 52.380947;0.047723;23.809519;, 57.142849;-0.259574;23.809519;, 61.904758;0.171286;23.809521;, 66.666656;0.119474;23.809519;, 47.619045;0.854265;28.571424;, 52.380959;0.709659;28.571423;, 57.142849;0.114179;28.571424;, 61.904758;-0.737622;28.571423;, 66.666664;-0.540622;28.571423;, 47.619049;0.196880;33.333332;, 52.380947;0.418325;33.333332;, 57.142857;-0.165413;33.333332;, 61.904758;-0.018578;33.333332;, 66.666656;-0.542027;33.333328;, 47.619041;0.040305;38.095238;, 52.380955;-0.305511;38.095230;, 57.142857;-0.801721;38.095226;, 61.904751;-0.693914;38.095230;, 66.666656;-0.260167;38.095230;, 76.190483;-0.350931;19.047617;, 80.952385;-0.270984;19.047615;, 85.714272;-0.653663;19.047617;, 90.476196;-0.588821;19.047615;, 95.238098;-0.166806;19.047615;, 76.190475;-0.982747;23.809517;, 80.952377;-0.280588;23.809519;, 85.714279;-0.809163;23.809519;, 90.476189;-0.707869;23.809521;, 95.238091;-0.191508;23.809521;, 76.190468;-1.361749;28.571424;, 80.952362;-1.537214;28.571423;, 85.714279;-0.557252;28.571424;, 90.476189;-0.858880;28.571423;, 95.238083;-0.540427;28.571423;, 76.190475;-0.991974;33.333332;, 80.952385;-0.341072;33.333332;, 85.714279;-0.480612;33.333332;, 90.476181;-0.357981;33.333332;, 95.238083;-0.068596;33.333332;, 76.190475;-0.649106;38.095238;, 80.952377;-0.559025;38.095230;, 85.714279;-0.386252;38.095226;, 90.476181;0.099080;38.095230;, -90.476189;-0.876558;47.619049;, -85.714302;-0.346224;47.619041;, -80.952385;-0.279265;47.619049;, -76.190475;-0.593621;47.619045;, -90.476196;-0.496902;52.380939;, -85.714287;-0.441395;52.380951;, -80.952385;-0.030910;52.380947;, -76.190475;0.249934;52.380951;, -85.714279;-0.433317;57.142853;, -80.952385;-0.000843;57.142857;, -76.190475;-0.835901;57.142849;, -85.714287;0.363133;61.904758;, -80.952385;-0.122559;61.904758;, -76.190475;-0.282176;61.904758;, -80.952377;0.289427;66.666664;, -76.190475;0.455423;66.666664;, -66.666672;0.605411;47.619045;, -61.904770;-0.101593;47.619049;, -57.142864;0.010784;47.619041;, -52.380962;-0.305407;47.619049;, -47.619057;-0.352808;47.619045;, -66.666672;-0.066875;52.380955;, -61.904758;-0.453473;52.380939;, -57.142860;0.087123;52.380951;, -52.380955;-0.189693;52.380947;, -47.619053;0.324851;52.380951;, -66.666672;-0.553944;57.142853;, -61.904766;-0.676060;57.142849;, -57.142868;-0.862220;57.142853;, -52.380959;-0.121714;57.142857;, -47.619053;-0.157393;57.142849;, -66.666672;-0.748001;61.904766;, -61.904762;-0.196270;61.904755;, -57.142857;-0.844559;61.904758;, -52.380955;-0.766034;61.904758;, -47.619049;-0.394087;61.904758;, -66.666672;-0.406123;66.666649;, -61.904762;-0.455862;66.666656;, -57.142857;-0.281796;66.666664;, -52.380959;-0.495838;66.666664;, -47.619049;-1.226247;66.666664;, -38.095245;0.092546;47.619045;, -33.333336;0.097091;47.619049;, -28.571430;0.451482;47.619041;, -23.809528;0.626763;47.619049;, -19.047625;-0.020122;47.619045;, -38.095245;-0.419869;52.380955;, -33.333332;-0.212224;52.380939;, -28.571432;-0.223933;52.380951;, -23.809528;0.030272;52.380947;, -19.047625;0.380474;52.380951;, -38.095245;-0.268773;57.142853;, -33.333340;0.039447;57.142849;, -28.571434;-0.597401;57.142853;, -23.809530;-0.248587;57.142857;, -19.047623;0.346370;57.142849;, -38.095245;-0.955208;61.904766;, -33.333336;-0.925934;61.904755;, -28.571436;-0.662956;61.904758;, -23.809532;-0.401054;61.904758;, -19.047625;0.134505;61.904758;, -38.095242;-0.814418;66.666649;, -33.333340;-1.112140;66.666656;, -28.571432;-0.516252;66.666664;, -23.809528;-0.760757;66.666664;, -19.047623;-0.348394;66.666664;, -9.523815;-0.110413;47.619045;, -4.761909;0.305821;47.619049;, -0.000005;0.281593;47.619041;, 4.761901;0.292163;47.619049;, 9.523804;-0.293571;47.619045;, -9.523813;0.220246;52.380955;, -4.761909;-0.295488;52.380939;, -0.000005;-0.155451;52.380951;, 4.761900;0.391777;52.380947;, 9.523804;-0.325865;52.380951;, -9.523813;0.437661;57.142853;, -4.761909;-0.513525;57.142849;, -0.000004;-0.649736;57.142853;, 4.761900;-0.020130;57.142857;, 9.523804;-0.557592;57.142849;, -9.523813;-0.414858;61.904766;, -4.761909;-0.065868;61.904755;, -0.000005;-0.010068;61.904758;, 4.761900;-0.069373;61.904758;, 9.523804;-0.799663;61.904758;, -9.523815;-0.369522;66.666649;, -4.761909;-0.696942;66.666656;, -0.000005;0.025907;66.666664;, 4.761901;-1.007324;66.666664;, 9.523804;-0.574893;66.666664;, 19.047617;0.325343;47.619045;, 23.809519;0.473680;47.619049;, 28.571426;0.275061;47.619041;, 33.333332;-0.256181;47.619049;, 38.095234;0.483084;47.619045;, 19.047615;-0.350834;52.380955;, 23.809519;-0.013383;52.380939;, 28.571424;-0.273459;52.380951;, 33.333328;0.254800;52.380947;, 38.095230;0.599137;52.380951;, 19.047617;-0.194767;57.142853;, 23.809517;-0.314225;57.142849;, 28.571426;-0.353765;57.142853;, 33.333332;0.507339;57.142857;, 38.095234;0.010199;57.142849;, 19.047615;-0.016212;61.904766;, 23.809521;0.033933;61.904755;, 28.571423;-0.351155;61.904758;, 33.333328;-0.111704;61.904758;, 38.095234;-0.173389;61.904758;, 19.047617;0.042704;66.666649;, 23.809519;-0.981737;66.666656;, 28.571423;-0.207663;66.666664;, 33.333328;-0.098233;66.666664;, 38.095230;0.349205;66.666664;, 47.619041;-0.111488;47.619045;, 52.380955;-0.173820;47.619049;, 57.142857;-0.055898;47.619041;, 61.904755;-0.458990;47.619049;, 66.666656;0.068232;47.619045;, 47.619045;-0.448598;52.380955;, 52.380947;-0.643468;52.380939;, 57.142849;-0.963284;52.380951;, 61.904758;-0.282064;52.380947;, 66.666656;-0.610852;52.380951;, 47.619045;0.255676;57.142853;, 52.380959;0.043661;57.142849;, 57.142849;-0.450146;57.142853;, 61.904758;-0.734543;57.142857;, 66.666664;-0.595717;57.142849;, 47.619049;0.295272;61.904766;, 52.380947;0.224996;61.904755;, 57.142857;0.410076;61.904758;, 61.904758;-0.102180;61.904758;, 66.666656;-0.641119;61.904758;, 47.619041;-0.063889;66.666649;, 52.380955;-0.052278;66.666656;, 57.142857;-0.260962;66.666664;, 61.904751;0.211714;66.666664;, 66.666656;-0.891935;66.666664;, 76.190483;0.384868;47.619045;, 80.952385;-0.498316;47.619049;, 85.714272;-0.452842;47.619045;, 90.476196;-0.679208;47.619049;, 76.190475;0.383476;52.380955;, 80.952377;0.228437;52.380943;, 85.714279;-0.298431;52.380951;, 76.190468;0.030241;57.142853;, 80.952362;-0.057542;57.142849;, 76.190475;-0.149108;61.904766;, 80.952385;0.231597;61.904755;, 76.190475;0.684127;66.666649;, -66.666672;-0.805704;76.190475;, -61.904770;-0.639796;76.190468;, -57.142864;-0.707538;76.190475;, -52.380962;-1.071568;76.190475;, -47.619057;-0.374410;76.190468;, -66.666672;-0.417351;80.952377;, -61.904758;-0.230551;80.952385;, -57.142860;-0.240226;80.952370;, -52.380955;0.515422;80.952385;, -47.619053;-0.344058;80.952370;, -52.380959;-0.267540;85.714279;, -47.619053;-0.400396;85.714272;, -52.380955;0.632710;90.476189;, -47.619049;0.289989;90.476181;, -38.095245;-0.131742;76.190475;, -33.333336;-0.165298;76.190468;, -28.571430;0.479944;76.190475;, -23.809528;-0.376538;76.190475;, -19.047625;-0.480150;76.190468;, -38.095245;-0.001046;80.952377;, -33.333332;-0.343873;80.952385;, -28.571432;0.302766;80.952370;, -23.809528;0.061208;80.952385;, -19.047625;-0.168522;80.952370;, -38.095245;0.534184;85.714272;, -33.333340;0.319921;85.714272;, -28.571434;0.235242;85.714279;, -23.809530;0.387477;85.714279;, -19.047623;0.091821;85.714272;, -38.095245;-0.278674;90.476181;, -33.333336;-0.722953;90.476196;, -28.571436;-0.670441;90.476181;, -23.809532;-0.490729;90.476189;, -19.047625;-0.106003;90.476181;, -33.333340;-0.228621;95.238091;, -28.571432;0.184142;95.238091;, -23.809528;-0.230569;95.238091;, -19.047623;-0.329850;95.238083;, -9.523815;-0.422359;76.190475;, -4.761909;-0.279259;76.190468;, -0.000005;-0.393888;76.190475;, 4.761901;-0.153724;76.190475;, 9.523804;-0.603998;76.190468;, -9.523813;-0.517870;80.952377;, -4.761909;-0.318783;80.952385;, -0.000005;-0.221239;80.952370;, 4.761900;-0.203658;80.952385;, 9.523804;-0.281561;80.952370;, -9.523813;-0.602386;85.714272;, -4.761909;-0.275787;85.714272;, -0.000004;-0.346190;85.714279;, 4.761900;-0.680653;85.714279;, 9.523804;-0.553402;85.714272;, -9.523813;-0.672190;90.476181;, -4.761909;-0.708849;90.476196;, -0.000005;-0.185962;90.476181;, 4.761900;-0.110973;90.476189;, 9.523804;-0.155267;90.476181;, -9.523815;0.470404;95.238083;, -4.761909;0.108812;95.238091;, -0.000005;-0.220810;95.238091;, 4.761901;-0.266211;95.238091;, 9.523804;0.384882;95.238083;, 19.047617;-0.379222;76.190475;, 23.809519;-0.648977;76.190468;, 28.571426;-0.178253;76.190475;, 33.333332;-0.078896;76.190475;, 38.095234;-0.675569;76.190468;, 19.047615;-0.109131;80.952377;, 23.809519;0.306690;80.952385;, 28.571424;-0.406478;80.952370;, 33.333328;-0.045989;80.952385;, 38.095230;-0.416376;80.952370;, 19.047617;-0.794436;85.714272;, 23.809517;-0.613818;85.714272;, 28.571426;-0.121993;85.714279;, 33.333332;0.033380;85.714279;, 38.095234;-0.071678;85.714272;, 19.047615;-0.322759;90.476181;, 23.809521;0.144414;90.476196;, 28.571423;0.629921;90.476181;, 33.333328;-0.051256;90.476189;, 38.095234;0.560947;90.476181;, 19.047617;0.169525;95.238083;, 23.809519;-0.366049;95.238091;, 28.571423;-0.622185;95.238091;, 33.333328;-0.079609;95.238091;, 47.619041;-0.304020;76.190475;, 52.380955;-0.227923;76.190468;, 57.142857;-0.457192;76.190475;, 61.904755;-0.708188;76.190475;, 66.666656;-0.840111;76.190468;, 47.619045;-1.493818;80.952377;, 52.380947;-0.057613;80.952385;, 57.142849;-0.457289;80.952370;, 61.904758;-0.765565;80.952385;, 47.619045;-0.240735;85.714272;, 52.380959;-0.726876;85.714272;, 57.142849;-0.889818;85.714279;, 47.619049;-0.358727;90.476181;; 2830; 3;461,466,462;, 3;466,461,465;, 3;462,467,463;, 3;467,462,466;, 3;464,470,465;, 3;470,464,469;, 3;465,471,466;, 3;471,465,470;, 3;466,472,467;, 3;472,466,471;, 3;3,472,49;, 3;472,3,48;, 3;49,471,50;, 3;471,49,472;, 3;46,460,463;, 3;460,46,45;, 3;50,470,51;, 3;470,50,471;, 3;47,463,467;, 3;463,47,46;, 3;51,469,52;, 3;469,51,470;, 3;48,467,472;, 3;467,48,47;, 3;52,468,53;, 3;468,52,469;, 3;473,479,474;, 3;479,473,478;, 3;474,480,475;, 3;480,474,479;, 3;475,481,476;, 3;481,475,480;, 3;476,482,477;, 3;482,476,481;, 3;478,484,479;, 3;484,478,483;, 3;479,485,480;, 3;485,479,484;, 3;480,486,481;, 3;486,480,485;, 3;481,487,482;, 3;487,481,486;, 3;483,489,484;, 3;489,483,488;, 3;484,490,485;, 3;490,484,489;, 3;485,491,486;, 3;491,485,490;, 3;486,492,487;, 3;492,486,491;, 3;488,494,489;, 3;494,488,493;, 3;489,495,490;, 3;495,489,494;, 3;490,496,491;, 3;496,490,495;, 3;491,497,492;, 3;497,491,496;, 3;56,55,477;, 3;55,56,0;, 3;4,497,61;, 3;497,4,60;, 3;48,65,493;, 3;65,48,3;, 3;57,477,482;, 3;477,57,56;, 3;61,496,62;, 3;496,61,497;, 3;47,493,488;, 3;493,47,48;, 3;58,482,487;, 3;482,58,57;, 3;62,495,63;, 3;495,62,496;, 3;46,488,483;, 3;488,46,47;, 3;59,487,492;, 3;487,59,58;, 3;63,494,64;, 3;494,63,495;, 3;45,483,478;, 3;483,45,46;, 3;54,477,55;, 3;477,54,476;, 3;60,492,497;, 3;492,60,59;, 3;64,493,65;, 3;493,64,494;, 3;498,504,499;, 3;504,498,503;, 3;499,505,500;, 3;505,499,504;, 3;500,506,501;, 3;506,500,505;, 3;501,507,502;, 3;507,501,506;, 3;503,509,504;, 3;509,503,508;, 3;504,510,505;, 3;510,504,509;, 3;505,511,506;, 3;511,505,510;, 3;506,512,507;, 3;512,506,511;, 3;508,514,509;, 3;514,508,513;, 3;509,515,510;, 3;515,509,514;, 3;510,516,511;, 3;516,510,515;, 3;511,517,512;, 3;517,511,516;, 3;513,519,514;, 3;519,513,518;, 3;514,520,515;, 3;520,514,519;, 3;515,521,516;, 3;521,515,520;, 3;516,522,517;, 3;522,516,521;, 3;0,498,66;, 3;498,0,56;, 3;71,70,502;, 3;70,71,1;, 3;5,522,76;, 3;522,5,75;, 3;60,80,518;, 3;80,60,4;, 3;66,499,67;, 3;499,66,498;, 3;72,502,507;, 3;502,72,71;, 3;76,521,77;, 3;521,76,522;, 3;59,518,513;, 3;518,59,60;, 3;67,500,68;, 3;500,67,499;, 3;73,507,512;, 3;507,73,72;, 3;77,520,78;, 3;520,77,521;, 3;58,513,508;, 3;513,58,59;, 3;68,501,69;, 3;501,68,500;, 3;74,512,517;, 3;512,74,73;, 3;78,519,79;, 3;519,78,520;, 3;57,508,503;, 3;508,57,58;, 3;69,502,70;, 3;502,69,501;, 3;75,517,522;, 3;517,75,74;, 3;79,518,80;, 3;518,79,519;, 3;56,503,498;, 3;503,56,57;, 3;523,529,524;, 3;529,523,528;, 3;524,530,525;, 3;530,524,529;, 3;525,531,526;, 3;531,525,530;, 3;526,532,527;, 3;532,526,531;, 3;528,534,529;, 3;534,528,533;, 3;529,535,530;, 3;535,529,534;, 3;530,536,531;, 3;536,530,535;, 3;531,537,532;, 3;537,531,536;, 3;533,539,534;, 3;539,533,538;, 3;534,540,535;, 3;540,534,539;, 3;535,541,536;, 3;541,535,540;, 3;536,542,537;, 3;542,536,541;, 3;538,544,539;, 3;544,538,543;, 3;539,545,540;, 3;545,539,544;, 3;540,546,541;, 3;546,540,545;, 3;541,547,542;, 3;547,541,546;, 3;1,523,81;, 3;523,1,71;, 3;6,547,87;, 3;547,6,86;, 3;75,91,543;, 3;91,75,5;, 3;81,524,82;, 3;524,81,523;, 3;83,527,532;, 3;87,546,88;, 3;546,87,547;, 3;74,543,538;, 3;543,74,75;, 3;525,82,524;, 3;84,532,537;, 3;532,84,83;, 3;88,545,89;, 3;545,88,546;, 3;73,538,533;, 3;538,73,74;, 3;85,537,542;, 3;537,85,84;, 3;89,544,90;, 3;544,89,545;, 3;72,533,528;, 3;533,72,73;, 3;86,542,547;, 3;542,86,85;, 3;90,543,91;, 3;543,90,544;, 3;71,528,523;, 3;528,71,72;, 3;550,548,549;, 3;549,553,550;, 3;553,549,552;, 3;550,554,551;, 3;554,550,553;, 3;555,551,554;, 3;552,557,553;, 3;557,552,556;, 3;553,558,554;, 3;558,553,557;, 3;554,559,555;, 3;559,554,558;, 3;560,555,559;, 3;7,560,93;, 3;560,7,92;, 3;86,97,556;, 3;97,86,6;, 3;93,559,94;, 3;559,93,560;, 3;85,556,552;, 3;556,85,86;, 3;94,558,95;, 3;558,94,559;, 3;84,552,549;, 3;552,84,85;, 3;95,557,96;, 3;557,95,558;, 3;83,549,548;, 3;549,83,84;, 3;96,556,97;, 3;556,96,557;, 3;562,566,563;, 3;566,562,565;, 3;564,568,565;, 3;568,564,567;, 3;565,569,566;, 3;569,565,568;, 3;567,572,568;, 3;572,567,571;, 3;568,573,569;, 3;573,568,572;, 3;98,44,561;, 3;44,98,2;, 3;8,573,103;, 3;573,8,102;, 3;99,561,563;, 3;561,99,98;, 3;103,572,104;, 3;572,103,573;, 3;100,563,566;, 3;563,100,99;, 3;104,571,105;, 3;571,104,572;, 3;101,566,569;, 3;566,101,100;, 3;105,570,106;, 3;570,105,571;, 3;102,569,573;, 3;569,102,101;, 3;574,580,575;, 3;580,574,579;, 3;575,581,576;, 3;581,575,580;, 3;576,582,577;, 3;582,576,581;, 3;577,583,578;, 3;583,577,582;, 3;579,585,580;, 3;585,579,584;, 3;580,586,581;, 3;586,580,585;, 3;581,587,582;, 3;587,581,586;, 3;582,588,583;, 3;588,582,587;, 3;584,590,585;, 3;590,584,589;, 3;585,591,586;, 3;591,585,590;, 3;586,592,587;, 3;592,586,591;, 3;587,593,588;, 3;593,587,592;, 3;589,595,590;, 3;595,589,594;, 3;590,596,591;, 3;596,590,595;, 3;591,597,592;, 3;597,591,596;, 3;592,598,593;, 3;598,592,597;, 3;2,574,53;, 3;574,2,98;, 3;107,49,578;, 3;49,107,3;, 3;9,598,112;, 3;598,9,111;, 3;102,116,594;, 3;116,102,8;, 3;53,575,52;, 3;575,53,574;, 3;108,578,583;, 3;578,108,107;, 3;112,597,113;, 3;597,112,598;, 3;101,594,589;, 3;594,101,102;, 3;52,576,51;, 3;576,52,575;, 3;109,583,588;, 3;583,109,108;, 3;113,596,114;, 3;596,113,597;, 3;100,589,584;, 3;589,100,101;, 3;51,577,50;, 3;577,51,576;, 3;110,588,593;, 3;588,110,109;, 3;114,595,115;, 3;595,114,596;, 3;99,584,579;, 3;584,99,100;, 3;50,578,49;, 3;578,50,577;, 3;111,593,598;, 3;593,111,110;, 3;115,594,116;, 3;594,115,595;, 3;98,579,574;, 3;579,98,99;, 3;599,605,600;, 3;605,599,604;, 3;600,606,601;, 3;606,600,605;, 3;601,607,602;, 3;607,601,606;, 3;602,608,603;, 3;608,602,607;, 3;604,610,605;, 3;610,604,609;, 3;605,611,606;, 3;611,605,610;, 3;606,612,607;, 3;612,606,611;, 3;607,613,608;, 3;613,607,612;, 3;609,615,610;, 3;615,609,614;, 3;610,616,611;, 3;616,610,615;, 3;611,617,612;, 3;617,611,616;, 3;612,618,613;, 3;618,612,617;, 3;614,620,615;, 3;620,614,619;, 3;615,621,616;, 3;621,615,620;, 3;616,622,617;, 3;622,616,621;, 3;617,623,618;, 3;623,617,622;, 3;3,599,65;, 3;599,3,107;, 3;117,61,603;, 3;61,117,4;, 3;10,623,122;, 3;623,10,121;, 3;111,126,619;, 3;126,111,9;, 3;65,600,64;, 3;600,65,599;, 3;118,603,608;, 3;603,118,117;, 3;122,622,123;, 3;622,122,623;, 3;110,619,614;, 3;619,110,111;, 3;64,601,63;, 3;601,64,600;, 3;119,608,613;, 3;608,119,118;, 3;123,621,124;, 3;621,123,622;, 3;109,614,609;, 3;614,109,110;, 3;63,602,62;, 3;602,63,601;, 3;120,613,618;, 3;613,120,119;, 3;124,620,125;, 3;620,124,621;, 3;108,609,604;, 3;609,108,109;, 3;62,603,61;, 3;603,62,602;, 3;121,618,623;, 3;618,121,120;, 3;125,619,126;, 3;619,125,620;, 3;107,604,599;, 3;604,107,108;, 3;624,630,625;, 3;630,624,629;, 3;625,631,626;, 3;631,625,630;, 3;626,632,627;, 3;632,626,631;, 3;627,633,628;, 3;633,627,632;, 3;629,635,630;, 3;635,629,634;, 3;630,636,631;, 3;636,630,635;, 3;631,637,632;, 3;637,631,636;, 3;632,638,633;, 3;638,632,637;, 3;634,640,635;, 3;640,634,639;, 3;635,641,636;, 3;641,635,640;, 3;636,642,637;, 3;642,636,641;, 3;637,643,638;, 3;643,637,642;, 3;639,645,640;, 3;645,639,644;, 3;640,646,641;, 3;646,640,645;, 3;641,647,642;, 3;647,641,646;, 3;642,648,643;, 3;648,642,647;, 3;4,624,80;, 3;624,4,117;, 3;127,76,628;, 3;76,127,5;, 3;11,648,132;, 3;648,11,131;, 3;121,136,644;, 3;136,121,10;, 3;80,625,79;, 3;625,80,624;, 3;128,628,633;, 3;628,128,127;, 3;132,647,133;, 3;647,132,648;, 3;120,644,639;, 3;644,120,121;, 3;79,626,78;, 3;626,79,625;, 3;129,633,638;, 3;633,129,128;, 3;133,646,134;, 3;646,133,647;, 3;119,639,634;, 3;639,119,120;, 3;78,627,77;, 3;627,78,626;, 3;130,638,643;, 3;638,130,129;, 3;134,645,135;, 3;645,134,646;, 3;118,634,629;, 3;634,118,119;, 3;77,628,76;, 3;628,77,627;, 3;131,643,648;, 3;643,131,130;, 3;135,644,136;, 3;644,135,645;, 3;117,629,624;, 3;629,117,118;, 3;649,655,650;, 3;655,649,654;, 3;650,656,651;, 3;656,650,655;, 3;651,657,652;, 3;657,651,656;, 3;652,658,653;, 3;658,652,657;, 3;654,660,655;, 3;660,654,659;, 3;655,661,656;, 3;661,655,660;, 3;656,662,657;, 3;662,656,661;, 3;657,663,658;, 3;663,657,662;, 3;659,665,660;, 3;665,659,664;, 3;660,666,661;, 3;666,660,665;, 3;661,667,662;, 3;667,661,666;, 3;662,668,663;, 3;668,662,667;, 3;664,670,665;, 3;670,664,669;, 3;665,671,666;, 3;671,665,670;, 3;666,672,667;, 3;672,666,671;, 3;667,673,668;, 3;673,667,672;, 3;5,649,91;, 3;649,5,127;, 3;137,87,653;, 3;87,137,6;, 3;12,673,142;, 3;673,12,141;, 3;131,146,669;, 3;146,131,11;, 3;91,650,90;, 3;650,91,649;, 3;138,653,658;, 3;653,138,137;, 3;142,672,143;, 3;672,142,673;, 3;130,669,664;, 3;669,130,131;, 3;90,651,89;, 3;651,90,650;, 3;139,658,663;, 3;658,139,138;, 3;143,671,144;, 3;671,143,672;, 3;129,664,659;, 3;664,129,130;, 3;89,652,88;, 3;652,89,651;, 3;140,663,668;, 3;663,140,139;, 3;144,670,145;, 3;670,144,671;, 3;128,659,654;, 3;659,128,129;, 3;88,653,87;, 3;653,88,652;, 3;141,668,673;, 3;668,141,140;, 3;145,669,146;, 3;669,145,670;, 3;127,654,649;, 3;654,127,128;, 3;674,680,675;, 3;680,674,679;, 3;675,681,676;, 3;681,675,680;, 3;676,682,677;, 3;682,676,681;, 3;677,683,678;, 3;683,677,682;, 3;679,685,680;, 3;685,679,684;, 3;680,686,681;, 3;686,680,685;, 3;681,687,682;, 3;687,681,686;, 3;682,688,683;, 3;688,682,687;, 3;684,690,685;, 3;690,684,689;, 3;685,691,686;, 3;691,685,690;, 3;686,692,687;, 3;692,686,691;, 3;687,693,688;, 3;693,687,692;, 3;689,695,690;, 3;695,689,694;, 3;690,696,691;, 3;696,690,695;, 3;691,697,692;, 3;697,691,696;, 3;692,698,693;, 3;698,692,697;, 3;6,674,97;, 3;674,6,137;, 3;147,93,678;, 3;93,147,7;, 3;13,698,152;, 3;698,13,151;, 3;141,156,694;, 3;156,141,12;, 3;97,675,96;, 3;675,97,674;, 3;148,678,683;, 3;678,148,147;, 3;152,697,153;, 3;697,152,698;, 3;140,694,689;, 3;694,140,141;, 3;96,676,95;, 3;676,96,675;, 3;149,683,688;, 3;683,149,148;, 3;153,696,154;, 3;696,153,697;, 3;139,689,684;, 3;689,139,140;, 3;95,677,94;, 3;677,95,676;, 3;150,688,693;, 3;688,150,149;, 3;154,695,155;, 3;695,154,696;, 3;138,684,679;, 3;684,138,139;, 3;94,678,93;, 3;678,94,677;, 3;151,693,698;, 3;693,151,150;, 3;155,694,156;, 3;694,155,695;, 3;137,679,674;, 3;679,137,138;, 3;701,699,700;, 3;700,703,701;, 3;703,700,702;, 3;704,701,703;, 3;702,706,703;, 3;706,702,705;, 3;703,707,704;, 3;707,703,706;, 3;708,704,707;, 3;705,710,706;, 3;710,705,709;, 3;706,711,707;, 3;711,706,710;, 3;707,712,708;, 3;712,707,711;, 3;699,7,147;, 3;151,161,709;, 3;161,151,13;, 3;157,712,158;, 3;150,709,705;, 3;709,150,151;, 3;158,711,159;, 3;711,158,712;, 3;149,705,702;, 3;705,149,150;, 3;159,710,160;, 3;710,159,711;, 3;148,702,700;, 3;702,148,149;, 3;160,709,161;, 3;709,160,710;, 3;147,700,699;, 3;700,147,148;, 3;713,719,714;, 3;719,713,718;, 3;714,720,715;, 3;720,714,719;, 3;715,721,716;, 3;721,715,720;, 3;716,722,717;, 3;722,716,721;, 3;718,724,719;, 3;724,718,723;, 3;719,725,720;, 3;725,719,724;, 3;720,726,721;, 3;726,720,725;, 3;721,727,722;, 3;727,721,726;, 3;723,729,724;, 3;729,723,728;, 3;724,730,725;, 3;730,724,729;, 3;725,731,726;, 3;731,725,730;, 3;726,732,727;, 3;732,726,731;, 3;728,734,729;, 3;734,728,733;, 3;729,735,730;, 3;735,729,734;, 3;730,736,731;, 3;736,730,735;, 3;731,737,732;, 3;737,731,736;, 3;162,103,717;, 3;103,162,8;, 3;15,737,167;, 3;737,15,166;, 3;172,171,733;, 3;171,172,14;, 3;163,717,722;, 3;717,163,162;, 3;167,736,168;, 3;736,167,737;, 3;173,733,728;, 3;733,173,172;, 3;106,715,105;, 3;715,106,714;, 3;164,722,727;, 3;722,164,163;, 3;168,735,169;, 3;735,168,736;, 3;174,728,723;, 3;728,174,173;, 3;105,716,104;, 3;716,105,715;, 3;165,727,732;, 3;727,165,164;, 3;169,734,170;, 3;734,169,735;, 3;104,717,103;, 3;717,104,716;, 3;166,732,737;, 3;732,166,165;, 3;170,733,171;, 3;733,170,734;, 3;738,744,739;, 3;744,738,743;, 3;739,745,740;, 3;745,739,744;, 3;740,746,741;, 3;746,740,745;, 3;741,747,742;, 3;747,741,746;, 3;743,749,744;, 3;749,743,748;, 3;744,750,745;, 3;750,744,749;, 3;745,751,746;, 3;751,745,750;, 3;746,752,747;, 3;752,746,751;, 3;748,754,749;, 3;754,748,753;, 3;749,755,750;, 3;755,749,754;, 3;750,756,751;, 3;756,750,755;, 3;751,757,752;, 3;757,751,756;, 3;753,759,754;, 3;759,753,758;, 3;754,760,755;, 3;760,754,759;, 3;755,761,756;, 3;761,755,760;, 3;756,762,757;, 3;762,756,761;, 3;8,738,116;, 3;738,8,162;, 3;175,112,742;, 3;112,175,9;, 3;16,762,180;, 3;762,16,179;, 3;166,184,758;, 3;184,166,15;, 3;116,739,115;, 3;739,116,738;, 3;176,742,747;, 3;742,176,175;, 3;180,761,181;, 3;761,180,762;, 3;165,758,753;, 3;758,165,166;, 3;115,740,114;, 3;740,115,739;, 3;177,747,752;, 3;747,177,176;, 3;181,760,182;, 3;760,181,761;, 3;164,753,748;, 3;753,164,165;, 3;114,741,113;, 3;741,114,740;, 3;178,752,757;, 3;752,178,177;, 3;182,759,183;, 3;759,182,760;, 3;163,748,743;, 3;748,163,164;, 3;113,742,112;, 3;742,113,741;, 3;179,757,762;, 3;757,179,178;, 3;183,758,184;, 3;758,183,759;, 3;162,743,738;, 3;743,162,163;, 3;763,769,764;, 3;769,763,768;, 3;764,770,765;, 3;770,764,769;, 3;765,771,766;, 3;771,765,770;, 3;766,772,767;, 3;772,766,771;, 3;768,774,769;, 3;774,768,773;, 3;769,775,770;, 3;775,769,774;, 3;770,776,771;, 3;776,770,775;, 3;771,777,772;, 3;777,771,776;, 3;773,779,774;, 3;779,773,778;, 3;774,780,775;, 3;780,774,779;, 3;775,781,776;, 3;781,775,780;, 3;776,782,777;, 3;782,776,781;, 3;778,784,779;, 3;784,778,783;, 3;779,785,780;, 3;785,779,784;, 3;780,786,781;, 3;786,780,785;, 3;781,787,782;, 3;787,781,786;, 3;9,763,126;, 3;763,9,175;, 3;185,122,767;, 3;122,185,10;, 3;17,787,190;, 3;787,17,189;, 3;179,194,783;, 3;194,179,16;, 3;126,764,125;, 3;764,126,763;, 3;186,767,772;, 3;767,186,185;, 3;190,786,191;, 3;786,190,787;, 3;178,783,778;, 3;783,178,179;, 3;125,765,124;, 3;765,125,764;, 3;187,772,777;, 3;772,187,186;, 3;191,785,192;, 3;785,191,786;, 3;177,778,773;, 3;778,177,178;, 3;124,766,123;, 3;766,124,765;, 3;188,777,782;, 3;777,188,187;, 3;192,784,193;, 3;784,192,785;, 3;176,773,768;, 3;773,176,177;, 3;123,767,122;, 3;767,123,766;, 3;189,782,787;, 3;782,189,188;, 3;193,783,194;, 3;783,193,784;, 3;175,768,763;, 3;768,175,176;, 3;788,794,789;, 3;794,788,793;, 3;789,795,790;, 3;795,789,794;, 3;790,796,791;, 3;796,790,795;, 3;791,797,792;, 3;797,791,796;, 3;793,799,794;, 3;799,793,798;, 3;794,800,795;, 3;800,794,799;, 3;795,801,796;, 3;801,795,800;, 3;796,802,797;, 3;802,796,801;, 3;798,804,799;, 3;804,798,803;, 3;799,805,800;, 3;805,799,804;, 3;800,806,801;, 3;806,800,805;, 3;801,807,802;, 3;807,801,806;, 3;803,809,804;, 3;809,803,808;, 3;804,810,805;, 3;810,804,809;, 3;805,811,806;, 3;811,805,810;, 3;806,812,807;, 3;812,806,811;, 3;10,788,136;, 3;788,10,185;, 3;195,132,792;, 3;132,195,11;, 3;18,812,200;, 3;812,18,199;, 3;189,204,808;, 3;204,189,17;, 3;136,789,135;, 3;789,136,788;, 3;196,792,797;, 3;792,196,195;, 3;200,811,201;, 3;811,200,812;, 3;188,808,803;, 3;808,188,189;, 3;135,790,134;, 3;790,135,789;, 3;197,797,802;, 3;797,197,196;, 3;201,810,202;, 3;810,201,811;, 3;187,803,798;, 3;803,187,188;, 3;134,791,133;, 3;791,134,790;, 3;198,802,807;, 3;802,198,197;, 3;202,809,203;, 3;809,202,810;, 3;186,798,793;, 3;798,186,187;, 3;133,792,132;, 3;792,133,791;, 3;199,807,812;, 3;807,199,198;, 3;203,808,204;, 3;808,203,809;, 3;185,793,788;, 3;793,185,186;, 3;813,819,814;, 3;819,813,818;, 3;814,820,815;, 3;820,814,819;, 3;815,821,816;, 3;821,815,820;, 3;816,822,817;, 3;822,816,821;, 3;818,824,819;, 3;824,818,823;, 3;819,825,820;, 3;825,819,824;, 3;820,826,821;, 3;826,820,825;, 3;821,827,822;, 3;827,821,826;, 3;823,829,824;, 3;829,823,828;, 3;824,830,825;, 3;830,824,829;, 3;825,831,826;, 3;831,825,830;, 3;826,832,827;, 3;832,826,831;, 3;828,834,829;, 3;834,828,833;, 3;829,835,830;, 3;835,829,834;, 3;830,836,831;, 3;836,830,835;, 3;831,837,832;, 3;837,831,836;, 3;11,813,146;, 3;813,11,195;, 3;205,142,817;, 3;142,205,12;, 3;19,837,210;, 3;837,19,209;, 3;199,214,833;, 3;214,199,18;, 3;146,814,145;, 3;814,146,813;, 3;206,817,822;, 3;817,206,205;, 3;210,836,211;, 3;836,210,837;, 3;198,833,828;, 3;833,198,199;, 3;145,815,144;, 3;815,145,814;, 3;207,822,827;, 3;822,207,206;, 3;211,835,212;, 3;835,211,836;, 3;197,828,823;, 3;828,197,198;, 3;144,816,143;, 3;816,144,815;, 3;208,827,832;, 3;827,208,207;, 3;212,834,213;, 3;834,212,835;, 3;196,823,818;, 3;823,196,197;, 3;143,817,142;, 3;817,143,816;, 3;209,832,837;, 3;832,209,208;, 3;213,833,214;, 3;833,213,834;, 3;195,818,813;, 3;818,195,196;, 3;838,844,839;, 3;844,838,843;, 3;839,845,840;, 3;845,839,844;, 3;840,846,841;, 3;846,840,845;, 3;841,847,842;, 3;847,841,846;, 3;843,849,844;, 3;849,843,848;, 3;844,850,845;, 3;850,844,849;, 3;845,851,846;, 3;851,845,850;, 3;846,852,847;, 3;852,846,851;, 3;848,854,849;, 3;854,848,853;, 3;849,855,850;, 3;855,849,854;, 3;850,856,851;, 3;856,850,855;, 3;851,857,852;, 3;857,851,856;, 3;853,859,854;, 3;859,853,858;, 3;854,860,855;, 3;860,854,859;, 3;855,861,856;, 3;861,855,860;, 3;856,862,857;, 3;862,856,861;, 3;12,838,156;, 3;838,12,205;, 3;215,152,842;, 3;152,215,13;, 3;20,862,220;, 3;862,20,219;, 3;209,224,858;, 3;224,209,19;, 3;156,839,155;, 3;839,156,838;, 3;216,842,847;, 3;842,216,215;, 3;220,861,221;, 3;861,220,862;, 3;208,858,853;, 3;858,208,209;, 3;155,840,154;, 3;840,155,839;, 3;217,847,852;, 3;847,217,216;, 3;221,860,222;, 3;860,221,861;, 3;207,853,848;, 3;853,207,208;, 3;154,841,153;, 3;841,154,840;, 3;218,852,857;, 3;852,218,217;, 3;222,859,223;, 3;859,222,860;, 3;206,848,843;, 3;848,206,207;, 3;153,842,152;, 3;842,153,841;, 3;219,857,862;, 3;857,219,218;, 3;223,858,224;, 3;858,223,859;, 3;205,843,838;, 3;843,205,206;, 3;863,869,864;, 3;869,863,868;, 3;864,870,865;, 3;870,864,869;, 3;865,871,866;, 3;871,865,870;, 3;866,872,867;, 3;872,866,871;, 3;868,874,869;, 3;874,868,873;, 3;869,875,870;, 3;875,869,874;, 3;870,876,871;, 3;876,870,875;, 3;871,877,872;, 3;877,871,876;, 3;873,879,874;, 3;879,873,878;, 3;874,880,875;, 3;880,874,879;, 3;875,881,876;, 3;881,875,880;, 3;876,882,877;, 3;882,876,881;, 3;878,884,879;, 3;884,878,883;, 3;879,885,880;, 3;885,879,884;, 3;880,886,881;, 3;886,880,885;, 3;881,887,882;, 3;887,881,886;, 3;13,863,161;, 3;863,13,215;, 3;21,887,227;, 3;887,21,226;, 3;219,231,883;, 3;231,219,20;, 3;161,864,160;, 3;864,161,863;, 3;227,886,228;, 3;886,227,887;, 3;218,883,878;, 3;883,218,219;, 3;160,865,159;, 3;865,160,864;, 3;228,885,229;, 3;885,228,886;, 3;217,878,873;, 3;878,217,218;, 3;159,866,158;, 3;866,159,865;, 3;225,877,882;, 3;229,884,230;, 3;884,229,885;, 3;216,873,868;, 3;873,216,217;, 3;158,867,157;, 3;867,158,866;, 3;226,882,887;, 3;882,226,225;, 3;230,883,231;, 3;883,230,884;, 3;215,868,863;, 3;868,215,216;, 3;888,894,889;, 3;894,888,893;, 3;889,895,890;, 3;895,889,894;, 3;890,896,891;, 3;896,890,895;, 3;891,897,892;, 3;897,891,896;, 3;893,899,894;, 3;899,893,898;, 3;894,900,895;, 3;900,894,899;, 3;895,901,896;, 3;901,895,900;, 3;896,902,897;, 3;902,896,901;, 3;898,904,899;, 3;904,898,903;, 3;899,905,900;, 3;905,899,904;, 3;900,906,901;, 3;906,900,905;, 3;901,907,902;, 3;907,901,906;, 3;903,909,904;, 3;909,903,908;, 3;904,910,905;, 3;910,904,909;, 3;905,911,906;, 3;911,905,910;, 3;906,912,907;, 3;912,906,911;, 3;14,888,171;, 3;888,14,246;, 3;232,167,892;, 3;167,232,15;, 3;23,912,237;, 3;912,23,236;, 3;242,241,908;, 3;241,242,22;, 3;171,889,170;, 3;889,171,888;, 3;233,892,897;, 3;892,233,232;, 3;237,911,238;, 3;911,237,912;, 3;243,908,903;, 3;908,243,242;, 3;170,890,169;, 3;890,170,889;, 3;234,897,902;, 3;897,234,233;, 3;238,910,239;, 3;910,238,911;, 3;244,903,898;, 3;903,244,243;, 3;169,891,168;, 3;891,169,890;, 3;235,902,907;, 3;902,235,234;, 3;239,909,240;, 3;909,239,910;, 3;245,898,893;, 3;898,245,244;, 3;168,892,167;, 3;892,168,891;, 3;236,907,912;, 3;907,236,235;, 3;240,908,241;, 3;908,240,909;, 3;246,893,888;, 3;893,246,245;, 3;913,919,914;, 3;919,913,918;, 3;914,920,915;, 3;920,914,919;, 3;915,921,916;, 3;921,915,920;, 3;916,922,917;, 3;922,916,921;, 3;918,924,919;, 3;924,918,923;, 3;919,925,920;, 3;925,919,924;, 3;920,926,921;, 3;926,920,925;, 3;921,927,922;, 3;927,921,926;, 3;923,929,924;, 3;929,923,928;, 3;924,930,925;, 3;930,924,929;, 3;925,931,926;, 3;931,925,930;, 3;926,932,927;, 3;932,926,931;, 3;928,934,929;, 3;934,928,933;, 3;929,935,930;, 3;935,929,934;, 3;930,936,931;, 3;936,930,935;, 3;931,937,932;, 3;937,931,936;, 3;15,913,184;, 3;913,15,232;, 3;247,180,917;, 3;180,247,16;, 3;24,937,252;, 3;937,24,251;, 3;236,256,933;, 3;256,236,23;, 3;184,914,183;, 3;914,184,913;, 3;248,917,922;, 3;917,248,247;, 3;252,936,253;, 3;936,252,937;, 3;235,933,928;, 3;933,235,236;, 3;183,915,182;, 3;915,183,914;, 3;249,922,927;, 3;922,249,248;, 3;253,935,254;, 3;935,253,936;, 3;234,928,923;, 3;928,234,235;, 3;182,916,181;, 3;916,182,915;, 3;250,927,932;, 3;927,250,249;, 3;254,934,255;, 3;934,254,935;, 3;233,923,918;, 3;923,233,234;, 3;181,917,180;, 3;917,181,916;, 3;251,932,937;, 3;932,251,250;, 3;255,933,256;, 3;933,255,934;, 3;232,918,913;, 3;918,232,233;, 3;938,944,939;, 3;944,938,943;, 3;939,945,940;, 3;945,939,944;, 3;940,946,941;, 3;946,940,945;, 3;941,947,942;, 3;947,941,946;, 3;943,949,944;, 3;949,943,948;, 3;944,950,945;, 3;950,944,949;, 3;945,951,946;, 3;951,945,950;, 3;946,952,947;, 3;952,946,951;, 3;948,954,949;, 3;954,948,953;, 3;949,955,950;, 3;955,949,954;, 3;950,956,951;, 3;956,950,955;, 3;951,957,952;, 3;957,951,956;, 3;953,959,954;, 3;959,953,958;, 3;954,960,955;, 3;960,954,959;, 3;955,961,956;, 3;961,955,960;, 3;956,962,957;, 3;962,956,961;, 3;16,938,194;, 3;938,16,247;, 3;257,190,942;, 3;190,257,17;, 3;25,962,262;, 3;962,25,261;, 3;251,266,958;, 3;266,251,24;, 3;194,939,193;, 3;939,194,938;, 3;258,942,947;, 3;942,258,257;, 3;262,961,263;, 3;961,262,962;, 3;250,958,953;, 3;958,250,251;, 3;193,940,192;, 3;940,193,939;, 3;259,947,952;, 3;947,259,258;, 3;263,960,264;, 3;960,263,961;, 3;249,953,948;, 3;953,249,250;, 3;192,941,191;, 3;941,192,940;, 3;260,952,957;, 3;952,260,259;, 3;264,959,265;, 3;959,264,960;, 3;248,948,943;, 3;948,248,249;, 3;191,942,190;, 3;942,191,941;, 3;261,957,962;, 3;957,261,260;, 3;265,958,266;, 3;958,265,959;, 3;247,943,938;, 3;943,247,248;, 3;963,969,964;, 3;969,963,968;, 3;964,970,965;, 3;970,964,969;, 3;965,971,966;, 3;971,965,970;, 3;966,972,967;, 3;972,966,971;, 3;968,974,969;, 3;974,968,973;, 3;969,975,970;, 3;975,969,974;, 3;970,976,971;, 3;976,970,975;, 3;971,977,972;, 3;977,971,976;, 3;973,979,974;, 3;979,973,978;, 3;974,980,975;, 3;980,974,979;, 3;975,981,976;, 3;981,975,980;, 3;976,982,977;, 3;982,976,981;, 3;978,984,979;, 3;984,978,983;, 3;979,985,980;, 3;985,979,984;, 3;980,986,981;, 3;986,980,985;, 3;981,987,982;, 3;987,981,986;, 3;17,963,204;, 3;963,17,257;, 3;267,200,967;, 3;200,267,18;, 3;26,987,272;, 3;987,26,271;, 3;261,276,983;, 3;276,261,25;, 3;204,964,203;, 3;964,204,963;, 3;268,967,972;, 3;967,268,267;, 3;272,986,273;, 3;986,272,987;, 3;260,983,978;, 3;983,260,261;, 3;203,965,202;, 3;965,203,964;, 3;269,972,977;, 3;972,269,268;, 3;273,985,274;, 3;985,273,986;, 3;259,978,973;, 3;978,259,260;, 3;202,966,201;, 3;966,202,965;, 3;270,977,982;, 3;977,270,269;, 3;274,984,275;, 3;984,274,985;, 3;258,973,968;, 3;973,258,259;, 3;201,967,200;, 3;967,201,966;, 3;271,982,987;, 3;982,271,270;, 3;275,983,276;, 3;983,275,984;, 3;257,968,963;, 3;968,257,258;, 3;988,994,989;, 3;994,988,993;, 3;989,995,990;, 3;995,989,994;, 3;990,996,991;, 3;996,990,995;, 3;991,997,992;, 3;997,991,996;, 3;993,999,994;, 3;999,993,998;, 3;994,1000,995;, 3;1000,994,999;, 3;995,1001,996;, 3;1001,995,1000;, 3;996,1002,997;, 3;1002,996,1001;, 3;998,1004,999;, 3;1004,998,1003;, 3;999,1005,1000;, 3;1005,999,1004;, 3;1000,1006,1001;, 3;1006,1000,1005;, 3;1001,1007,1002;, 3;1007,1001,1006;, 3;1003,1009,1004;, 3;1009,1003,1008;, 3;1004,1010,1005;, 3;1010,1004,1009;, 3;1005,1011,1006;, 3;1011,1005,1010;, 3;1006,1012,1007;, 3;1012,1006,1011;, 3;18,988,214;, 3;988,18,267;, 3;277,210,992;, 3;210,277,19;, 3;27,1012,282;, 3;1012,27,281;, 3;271,286,1008;, 3;286,271,26;, 3;214,989,213;, 3;989,214,988;, 3;278,992,997;, 3;992,278,277;, 3;282,1011,283;, 3;1011,282,1012;, 3;270,1008,1003;, 3;1008,270,271;, 3;213,990,212;, 3;990,213,989;, 3;279,997,1002;, 3;997,279,278;, 3;283,1010,284;, 3;1010,283,1011;, 3;269,1003,998;, 3;1003,269,270;, 3;212,991,211;, 3;991,212,990;, 3;280,1002,1007;, 3;1002,280,279;, 3;284,1009,285;, 3;1009,284,1010;, 3;268,998,993;, 3;998,268,269;, 3;211,992,210;, 3;992,211,991;, 3;281,1007,1012;, 3;1007,281,280;, 3;285,1008,286;, 3;1008,285,1009;, 3;267,993,988;, 3;993,267,268;, 3;1013,1019,1014;, 3;1019,1013,1018;, 3;1014,1020,1015;, 3;1020,1014,1019;, 3;1015,1021,1016;, 3;1021,1015,1020;, 3;1016,1022,1017;, 3;1022,1016,1021;, 3;1018,1024,1019;, 3;1024,1018,1023;, 3;1019,1025,1020;, 3;1025,1019,1024;, 3;1020,1026,1021;, 3;1026,1020,1025;, 3;1021,1027,1022;, 3;1027,1021,1026;, 3;1023,1029,1024;, 3;1029,1023,1028;, 3;1024,1030,1025;, 3;1030,1024,1029;, 3;1025,1031,1026;, 3;1031,1025,1030;, 3;1026,1032,1027;, 3;1032,1026,1031;, 3;1028,1034,1029;, 3;1034,1028,1033;, 3;1029,1035,1030;, 3;1035,1029,1034;, 3;1030,1036,1031;, 3;1036,1030,1035;, 3;1031,1037,1032;, 3;1037,1031,1036;, 3;19,1013,224;, 3;1013,19,277;, 3;287,220,1017;, 3;220,287,20;, 3;28,1037,292;, 3;1037,28,291;, 3;281,296,1033;, 3;296,281,27;, 3;224,1014,223;, 3;1014,224,1013;, 3;288,1017,1022;, 3;1017,288,287;, 3;292,1036,293;, 3;1036,292,1037;, 3;280,1033,1028;, 3;1033,280,281;, 3;223,1015,222;, 3;1015,223,1014;, 3;289,1022,1027;, 3;1022,289,288;, 3;293,1035,294;, 3;1035,293,1036;, 3;279,1028,1023;, 3;1028,279,280;, 3;222,1016,221;, 3;1016,222,1015;, 3;290,1027,1032;, 3;1027,290,289;, 3;294,1034,295;, 3;1034,294,1035;, 3;278,1023,1018;, 3;1023,278,279;, 3;221,1017,220;, 3;1017,221,1016;, 3;291,1032,1037;, 3;1032,291,290;, 3;295,1033,296;, 3;1033,295,1034;, 3;277,1018,1013;, 3;1018,277,278;, 3;1038,1044,1039;, 3;1044,1038,1043;, 3;1039,1045,1040;, 3;1045,1039,1044;, 3;1040,1046,1041;, 3;1046,1040,1045;, 3;1041,1047,1042;, 3;1047,1041,1046;, 3;1043,1049,1044;, 3;1049,1043,1048;, 3;1044,1050,1045;, 3;1050,1044,1049;, 3;1045,1051,1046;, 3;1051,1045,1050;, 3;1046,1052,1047;, 3;1052,1046,1051;, 3;1048,1054,1049;, 3;1054,1048,1053;, 3;1049,1055,1050;, 3;1055,1049,1054;, 3;1050,1056,1051;, 3;1056,1050,1055;, 3;1051,1057,1052;, 3;1057,1051,1056;, 3;1053,1059,1054;, 3;1059,1053,1058;, 3;1054,1060,1055;, 3;1060,1054,1059;, 3;1055,1061,1056;, 3;1061,1055,1060;, 3;1056,1062,1057;, 3;1062,1056,1061;, 3;20,1038,231;, 3;1038,20,287;, 3;297,227,1042;, 3;227,297,21;, 3;29,1062,302;, 3;1062,29,301;, 3;291,306,1058;, 3;306,291,28;, 3;231,1039,230;, 3;1039,231,1038;, 3;298,1042,1047;, 3;1042,298,297;, 3;302,1061,303;, 3;1061,302,1062;, 3;290,1058,1053;, 3;1058,290,291;, 3;230,1040,229;, 3;1040,230,1039;, 3;299,1047,1052;, 3;1047,299,298;, 3;303,1060,304;, 3;1060,303,1061;, 3;289,1053,1048;, 3;1053,289,290;, 3;229,1041,228;, 3;1041,229,1040;, 3;300,1052,1057;, 3;1052,300,299;, 3;304,1059,305;, 3;1059,304,1060;, 3;288,1048,1043;, 3;1048,288,289;, 3;228,1042,227;, 3;1042,228,1041;, 3;301,1057,1062;, 3;1057,301,300;, 3;305,1058,306;, 3;1058,305,1059;, 3;287,1043,1038;, 3;1043,287,288;, 3;1063,1069,1064;, 3;1069,1063,1068;, 3;1064,1070,1065;, 3;1070,1064,1069;, 3;1065,1071,1066;, 3;1071,1065,1070;, 3;1066,1072,1067;, 3;1072,1066,1071;, 3;1068,1074,1069;, 3;1074,1068,1073;, 3;1069,1075,1070;, 3;1075,1069,1074;, 3;1070,1076,1071;, 3;1076,1070,1075;, 3;1071,1077,1072;, 3;1077,1071,1076;, 3;1073,1079,1074;, 3;1079,1073,1078;, 3;1074,1080,1075;, 3;1080,1074,1079;, 3;1075,1081,1076;, 3;1081,1075,1080;, 3;1076,1082,1077;, 3;1082,1076,1081;, 3;1078,1084,1079;, 3;1084,1078,1083;, 3;1079,1085,1080;, 3;1085,1079,1084;, 3;1080,1086,1081;, 3;1086,1080,1085;, 3;1081,1087,1082;, 3;1087,1081,1086;, 3;22,1063,241;, 3;1063,22,319;, 3;307,237,1067;, 3;237,307,23;, 3;30,1087,312;, 3;1087,30,311;, 3;241,1064,240;, 3;1064,241,1063;, 3;308,1067,1072;, 3;1067,308,307;, 3;312,1086,313;, 3;1086,312,1087;, 3;240,1065,239;, 3;1065,240,1064;, 3;309,1072,1077;, 3;1072,309,308;, 3;313,1085,314;, 3;1085,313,1086;, 3;317,1078,1073;, 3;239,1066,238;, 3;1066,239,1065;, 3;310,1077,1082;, 3;1077,310,309;, 3;314,1084,315;, 3;1084,314,1085;, 3;318,1073,1068;, 3;1073,318,317;, 3;238,1067,237;, 3;1067,238,1066;, 3;311,1082,1087;, 3;1082,311,310;, 3;315,1083,316;, 3;1083,315,1084;, 3;319,1068,1063;, 3;1068,319,318;, 3;1088,1094,1089;, 3;1094,1088,1093;, 3;1089,1095,1090;, 3;1095,1089,1094;, 3;1090,1096,1091;, 3;1096,1090,1095;, 3;1091,1097,1092;, 3;1097,1091,1096;, 3;1093,1099,1094;, 3;1099,1093,1098;, 3;1094,1100,1095;, 3;1100,1094,1099;, 3;1095,1101,1096;, 3;1101,1095,1100;, 3;1096,1102,1097;, 3;1102,1096,1101;, 3;1098,1104,1099;, 3;1104,1098,1103;, 3;1099,1105,1100;, 3;1105,1099,1104;, 3;1100,1106,1101;, 3;1106,1100,1105;, 3;1101,1107,1102;, 3;1107,1101,1106;, 3;1103,1109,1104;, 3;1109,1103,1108;, 3;1104,1110,1105;, 3;1110,1104,1109;, 3;1105,1111,1106;, 3;1111,1105,1110;, 3;1106,1112,1107;, 3;1112,1106,1111;, 3;23,1088,256;, 3;1088,23,307;, 3;320,252,1092;, 3;252,320,24;, 3;31,1112,325;, 3;1112,31,324;, 3;311,329,1108;, 3;329,311,30;, 3;256,1089,255;, 3;1089,256,1088;, 3;321,1092,1097;, 3;1092,321,320;, 3;325,1111,326;, 3;1111,325,1112;, 3;310,1108,1103;, 3;1108,310,311;, 3;255,1090,254;, 3;1090,255,1089;, 3;322,1097,1102;, 3;1097,322,321;, 3;326,1110,327;, 3;1110,326,1111;, 3;309,1103,1098;, 3;1103,309,310;, 3;254,1091,253;, 3;1091,254,1090;, 3;323,1102,1107;, 3;1102,323,322;, 3;327,1109,328;, 3;1109,327,1110;, 3;308,1098,1093;, 3;1098,308,309;, 3;253,1092,252;, 3;1092,253,1091;, 3;324,1107,1112;, 3;1107,324,323;, 3;328,1108,329;, 3;1108,328,1109;, 3;307,1093,1088;, 3;1093,307,308;, 3;1113,1119,1114;, 3;1119,1113,1118;, 3;1114,1120,1115;, 3;1120,1114,1119;, 3;1115,1121,1116;, 3;1121,1115,1120;, 3;1116,1122,1117;, 3;1122,1116,1121;, 3;1118,1124,1119;, 3;1124,1118,1123;, 3;1119,1125,1120;, 3;1125,1119,1124;, 3;1120,1126,1121;, 3;1126,1120,1125;, 3;1121,1127,1122;, 3;1127,1121,1126;, 3;1123,1129,1124;, 3;1129,1123,1128;, 3;1124,1130,1125;, 3;1130,1124,1129;, 3;1125,1131,1126;, 3;1131,1125,1130;, 3;1126,1132,1127;, 3;1132,1126,1131;, 3;1128,1134,1129;, 3;1134,1128,1133;, 3;1129,1135,1130;, 3;1135,1129,1134;, 3;1130,1136,1131;, 3;1136,1130,1135;, 3;1131,1137,1132;, 3;1137,1131,1136;, 3;24,1113,266;, 3;1113,24,320;, 3;330,262,1117;, 3;262,330,25;, 3;32,1137,335;, 3;1137,32,334;, 3;324,339,1133;, 3;339,324,31;, 3;266,1114,265;, 3;1114,266,1113;, 3;331,1117,1122;, 3;1117,331,330;, 3;335,1136,336;, 3;1136,335,1137;, 3;323,1133,1128;, 3;1133,323,324;, 3;265,1115,264;, 3;1115,265,1114;, 3;332,1122,1127;, 3;1122,332,331;, 3;336,1135,337;, 3;1135,336,1136;, 3;322,1128,1123;, 3;1128,322,323;, 3;264,1116,263;, 3;1116,264,1115;, 3;333,1127,1132;, 3;1127,333,332;, 3;337,1134,338;, 3;1134,337,1135;, 3;321,1123,1118;, 3;1123,321,322;, 3;263,1117,262;, 3;1117,263,1116;, 3;334,1132,1137;, 3;1132,334,333;, 3;338,1133,339;, 3;1133,338,1134;, 3;320,1118,1113;, 3;1118,320,321;, 3;1138,1144,1139;, 3;1144,1138,1143;, 3;1139,1145,1140;, 3;1145,1139,1144;, 3;1140,1146,1141;, 3;1146,1140,1145;, 3;1141,1147,1142;, 3;1147,1141,1146;, 3;1143,1149,1144;, 3;1149,1143,1148;, 3;1144,1150,1145;, 3;1150,1144,1149;, 3;1145,1151,1146;, 3;1151,1145,1150;, 3;1146,1152,1147;, 3;1152,1146,1151;, 3;1148,1154,1149;, 3;1154,1148,1153;, 3;1149,1155,1150;, 3;1155,1149,1154;, 3;1150,1156,1151;, 3;1156,1150,1155;, 3;1151,1157,1152;, 3;1157,1151,1156;, 3;1153,1159,1154;, 3;1159,1153,1158;, 3;1154,1160,1155;, 3;1160,1154,1159;, 3;1155,1161,1156;, 3;1161,1155,1160;, 3;1156,1162,1157;, 3;1162,1156,1161;, 3;25,1138,276;, 3;1138,25,330;, 3;340,272,1142;, 3;272,340,26;, 3;33,1162,345;, 3;1162,33,344;, 3;334,349,1158;, 3;349,334,32;, 3;276,1139,275;, 3;1139,276,1138;, 3;341,1142,1147;, 3;1142,341,340;, 3;345,1161,346;, 3;1161,345,1162;, 3;333,1158,1153;, 3;1158,333,334;, 3;275,1140,274;, 3;1140,275,1139;, 3;342,1147,1152;, 3;1147,342,341;, 3;346,1160,347;, 3;1160,346,1161;, 3;332,1153,1148;, 3;1153,332,333;, 3;274,1141,273;, 3;1141,274,1140;, 3;343,1152,1157;, 3;1152,343,342;, 3;347,1159,348;, 3;1159,347,1160;, 3;331,1148,1143;, 3;1148,331,332;, 3;273,1142,272;, 3;1142,273,1141;, 3;344,1157,1162;, 3;1157,344,343;, 3;348,1158,349;, 3;1158,348,1159;, 3;330,1143,1138;, 3;1143,330,331;, 3;1163,1169,1164;, 3;1169,1163,1168;, 3;1164,1170,1165;, 3;1170,1164,1169;, 3;1165,1171,1166;, 3;1171,1165,1170;, 3;1166,1172,1167;, 3;1172,1166,1171;, 3;1168,1174,1169;, 3;1174,1168,1173;, 3;1169,1175,1170;, 3;1175,1169,1174;, 3;1170,1176,1171;, 3;1176,1170,1175;, 3;1171,1177,1172;, 3;1177,1171,1176;, 3;1173,1179,1174;, 3;1179,1173,1178;, 3;1174,1180,1175;, 3;1180,1174,1179;, 3;1175,1181,1176;, 3;1181,1175,1180;, 3;1176,1182,1177;, 3;1182,1176,1181;, 3;1178,1184,1179;, 3;1184,1178,1183;, 3;1179,1185,1180;, 3;1185,1179,1184;, 3;1180,1186,1181;, 3;1186,1180,1185;, 3;1181,1187,1182;, 3;1187,1181,1186;, 3;26,1163,286;, 3;1163,26,340;, 3;350,282,1167;, 3;282,350,27;, 3;34,1187,355;, 3;1187,34,354;, 3;344,359,1183;, 3;359,344,33;, 3;286,1164,285;, 3;1164,286,1163;, 3;351,1167,1172;, 3;1167,351,350;, 3;355,1186,356;, 3;1186,355,1187;, 3;343,1183,1178;, 3;1183,343,344;, 3;285,1165,284;, 3;1165,285,1164;, 3;352,1172,1177;, 3;1172,352,351;, 3;356,1185,357;, 3;1185,356,1186;, 3;342,1178,1173;, 3;1178,342,343;, 3;284,1166,283;, 3;1166,284,1165;, 3;353,1177,1182;, 3;1177,353,352;, 3;357,1184,358;, 3;1184,357,1185;, 3;341,1173,1168;, 3;1173,341,342;, 3;283,1167,282;, 3;1167,283,1166;, 3;354,1182,1187;, 3;1182,354,353;, 3;358,1183,359;, 3;1183,358,1184;, 3;340,1168,1163;, 3;1168,340,341;, 3;1188,1194,1189;, 3;1194,1188,1193;, 3;1189,1195,1190;, 3;1195,1189,1194;, 3;1190,1196,1191;, 3;1196,1190,1195;, 3;1191,1197,1192;, 3;1197,1191,1196;, 3;1193,1199,1194;, 3;1199,1193,1198;, 3;1194,1200,1195;, 3;1200,1194,1199;, 3;1195,1201,1196;, 3;1201,1195,1200;, 3;1196,1202,1197;, 3;1202,1196,1201;, 3;1198,1204,1199;, 3;1204,1198,1203;, 3;1199,1205,1200;, 3;1205,1199,1204;, 3;1200,1206,1201;, 3;1206,1200,1205;, 3;1201,1207,1202;, 3;1207,1201,1206;, 3;1203,1209,1204;, 3;1209,1203,1208;, 3;1204,1210,1205;, 3;1210,1204,1209;, 3;1205,1211,1206;, 3;1211,1205,1210;, 3;1206,1212,1207;, 3;1212,1206,1211;, 3;27,1188,296;, 3;1188,27,350;, 3;360,292,1192;, 3;292,360,28;, 3;35,1212,365;, 3;1212,35,364;, 3;354,369,1208;, 3;369,354,34;, 3;296,1189,295;, 3;1189,296,1188;, 3;361,1192,1197;, 3;1192,361,360;, 3;365,1211,366;, 3;1211,365,1212;, 3;353,1208,1203;, 3;1208,353,354;, 3;295,1190,294;, 3;1190,295,1189;, 3;362,1197,1202;, 3;1197,362,361;, 3;366,1210,367;, 3;1210,366,1211;, 3;352,1203,1198;, 3;1203,352,353;, 3;294,1191,293;, 3;1191,294,1190;, 3;363,1202,1207;, 3;1202,363,362;, 3;367,1209,368;, 3;1209,367,1210;, 3;351,1198,1193;, 3;1198,351,352;, 3;293,1192,292;, 3;1192,293,1191;, 3;364,1207,1212;, 3;1207,364,363;, 3;368,1208,369;, 3;1208,368,1209;, 3;350,1193,1188;, 3;1193,350,351;, 3;1213,1219,1214;, 3;1219,1213,1218;, 3;1214,1220,1215;, 3;1220,1214,1219;, 3;1215,1221,1216;, 3;1221,1215,1220;, 3;1216,1222,1217;, 3;1222,1216,1221;, 3;1218,1224,1219;, 3;1224,1218,1223;, 3;1219,1225,1220;, 3;1225,1219,1224;, 3;1220,1226,1221;, 3;1226,1220,1225;, 3;1221,1227,1222;, 3;1227,1221,1226;, 3;1223,1229,1224;, 3;1229,1223,1228;, 3;1224,1230,1225;, 3;1230,1224,1229;, 3;1225,1231,1226;, 3;1231,1225,1230;, 3;1226,1232,1227;, 3;1232,1226,1231;, 3;1228,1234,1229;, 3;1234,1228,1233;, 3;1229,1235,1230;, 3;1235,1229,1234;, 3;1230,1236,1231;, 3;1236,1230,1235;, 3;28,1213,306;, 3;1213,28,360;, 3;370,302,1217;, 3;302,370,29;, 3;364,375,1233;, 3;375,364,35;, 3;306,1214,305;, 3;1214,306,1213;, 3;371,1217,1222;, 3;1217,371,370;, 3;363,1233,1228;, 3;1233,363,364;, 3;305,1215,304;, 3;1215,305,1214;, 3;372,1235,373;, 3;1235,372,1236;, 3;362,1228,1223;, 3;1228,362,363;, 3;304,1216,303;, 3;1216,304,1215;, 3;373,1234,374;, 3;1234,373,1235;, 3;361,1223,1218;, 3;1223,361,362;, 3;303,1217,302;, 3;1217,303,1216;, 3;374,1233,375;, 3;1233,374,1234;, 3;360,1218,1213;, 3;1218,360,361;, 3;1237,1242,1238;, 3;1242,1237,1241;, 3;1238,1243,1239;, 3;1243,1238,1242;, 3;1239,1244,1240;, 3;1244,1239,1243;, 3;1241,1245,1242;, 3;1242,1246,1243;, 3;1246,1242,1245;, 3;1243,1247,1244;, 3;1247,1243,1246;, 3;1245,1249,1246;, 3;1249,1245,1248;, 3;1246,1250,1247;, 3;1250,1246,1249;, 3;1248,1251,1249;, 3;1249,1252,1250;, 3;1252,1249,1251;, 3;376,312,1240;, 3;312,376,30;, 3;36,1252,381;, 3;1252,36,380;, 3;316,1237,315;, 3;377,1240,1244;, 3;1240,377,376;, 3;1251,381,1252;, 3;315,1238,314;, 3;1238,315,1237;, 3;378,1244,1247;, 3;1244,378,377;, 3;314,1239,313;, 3;1239,314,1238;, 3;379,1247,1250;, 3;1247,379,378;, 3;313,1240,312;, 3;1240,313,1239;, 3;380,1250,1252;, 3;1250,380,379;, 3;1253,1259,1254;, 3;1259,1253,1258;, 3;1254,1260,1255;, 3;1260,1254,1259;, 3;1255,1261,1256;, 3;1261,1255,1260;, 3;1256,1262,1257;, 3;1262,1256,1261;, 3;1258,1264,1259;, 3;1264,1258,1263;, 3;1259,1265,1260;, 3;1265,1259,1264;, 3;1260,1266,1261;, 3;1266,1260,1265;, 3;1261,1267,1262;, 3;1267,1261,1266;, 3;1263,1269,1264;, 3;1269,1263,1268;, 3;1264,1270,1265;, 3;1270,1264,1269;, 3;1265,1271,1266;, 3;1271,1265,1270;, 3;1266,1272,1267;, 3;1272,1266,1271;, 3;1268,1274,1269;, 3;1274,1268,1273;, 3;1269,1275,1270;, 3;1275,1269,1274;, 3;1270,1276,1271;, 3;1276,1270,1275;, 3;1271,1277,1272;, 3;1277,1271,1276;, 3;30,1253,329;, 3;1253,30,376;, 3;382,325,1257;, 3;325,382,31;, 3;37,1277,387;, 3;1277,37,386;, 3;380,391,1273;, 3;391,380,36;, 3;329,1254,328;, 3;1254,329,1253;, 3;383,1257,1262;, 3;1257,383,382;, 3;387,1276,388;, 3;1276,387,1277;, 3;379,1273,1268;, 3;1273,379,380;, 3;328,1255,327;, 3;1255,328,1254;, 3;384,1262,1267;, 3;1262,384,383;, 3;388,1275,389;, 3;1275,388,1276;, 3;378,1268,1263;, 3;1268,378,379;, 3;327,1256,326;, 3;1256,327,1255;, 3;385,1267,1272;, 3;1267,385,384;, 3;389,1274,390;, 3;1274,389,1275;, 3;377,1263,1258;, 3;1263,377,378;, 3;326,1257,325;, 3;1257,326,1256;, 3;386,1272,1277;, 3;1272,386,385;, 3;390,1273,391;, 3;1273,390,1274;, 3;376,1258,1253;, 3;1258,376,377;, 3;1278,1284,1279;, 3;1284,1278,1283;, 3;1279,1285,1280;, 3;1285,1279,1284;, 3;1280,1286,1281;, 3;1286,1280,1285;, 3;1281,1287,1282;, 3;1287,1281,1286;, 3;1283,1289,1284;, 3;1289,1283,1288;, 3;1284,1290,1285;, 3;1290,1284,1289;, 3;1285,1291,1286;, 3;1291,1285,1290;, 3;1286,1292,1287;, 3;1292,1286,1291;, 3;1288,1294,1289;, 3;1294,1288,1293;, 3;1289,1295,1290;, 3;1295,1289,1294;, 3;1290,1296,1291;, 3;1296,1290,1295;, 3;1291,1297,1292;, 3;1297,1291,1296;, 3;1293,1299,1294;, 3;1299,1293,1298;, 3;1294,1300,1295;, 3;1300,1294,1299;, 3;1295,1301,1296;, 3;1301,1295,1300;, 3;1296,1302,1297;, 3;1302,1296,1301;, 3;31,1278,339;, 3;1278,31,382;, 3;392,335,1282;, 3;335,392,32;, 3;38,1302,397;, 3;1302,38,396;, 3;386,401,1298;, 3;401,386,37;, 3;339,1279,338;, 3;1279,339,1278;, 3;393,1282,1287;, 3;1282,393,392;, 3;397,1301,398;, 3;1301,397,1302;, 3;385,1298,1293;, 3;1298,385,386;, 3;338,1280,337;, 3;1280,338,1279;, 3;394,1287,1292;, 3;1287,394,393;, 3;398,1300,399;, 3;1300,398,1301;, 3;384,1293,1288;, 3;1293,384,385;, 3;337,1281,336;, 3;1281,337,1280;, 3;395,1292,1297;, 3;1292,395,394;, 3;399,1299,400;, 3;1299,399,1300;, 3;383,1288,1283;, 3;1288,383,384;, 3;336,1282,335;, 3;1282,336,1281;, 3;396,1297,1302;, 3;1297,396,395;, 3;400,1298,401;, 3;1298,400,1299;, 3;382,1283,1278;, 3;1283,382,383;, 3;1303,1309,1304;, 3;1309,1303,1308;, 3;1304,1310,1305;, 3;1310,1304,1309;, 3;1305,1311,1306;, 3;1311,1305,1310;, 3;1306,1312,1307;, 3;1312,1306,1311;, 3;1308,1314,1309;, 3;1314,1308,1313;, 3;1309,1315,1310;, 3;1315,1309,1314;, 3;1310,1316,1311;, 3;1316,1310,1315;, 3;1311,1317,1312;, 3;1317,1311,1316;, 3;1313,1319,1314;, 3;1319,1313,1318;, 3;1314,1320,1315;, 3;1320,1314,1319;, 3;1315,1321,1316;, 3;1321,1315,1320;, 3;1316,1322,1317;, 3;1322,1316,1321;, 3;1318,1324,1319;, 3;1324,1318,1323;, 3;1319,1325,1320;, 3;1325,1319,1324;, 3;1320,1326,1321;, 3;1326,1320,1325;, 3;1321,1327,1322;, 3;1327,1321,1326;, 3;32,1303,349;, 3;1303,32,392;, 3;402,345,1307;, 3;345,402,33;, 3;39,1327,407;, 3;1327,39,406;, 3;396,411,1323;, 3;411,396,38;, 3;349,1304,348;, 3;1304,349,1303;, 3;403,1307,1312;, 3;1307,403,402;, 3;407,1326,408;, 3;1326,407,1327;, 3;395,1323,1318;, 3;1323,395,396;, 3;348,1305,347;, 3;1305,348,1304;, 3;404,1312,1317;, 3;1312,404,403;, 3;408,1325,409;, 3;1325,408,1326;, 3;394,1318,1313;, 3;1318,394,395;, 3;347,1306,346;, 3;1306,347,1305;, 3;405,1317,1322;, 3;1317,405,404;, 3;409,1324,410;, 3;1324,409,1325;, 3;393,1313,1308;, 3;1313,393,394;, 3;346,1307,345;, 3;1307,346,1306;, 3;406,1322,1327;, 3;1322,406,405;, 3;410,1323,411;, 3;1323,410,1324;, 3;392,1308,1303;, 3;1308,392,393;, 3;1328,1334,1329;, 3;1334,1328,1333;, 3;1329,1335,1330;, 3;1335,1329,1334;, 3;1330,1336,1331;, 3;1336,1330,1335;, 3;1331,1337,1332;, 3;1337,1331,1336;, 3;1333,1339,1334;, 3;1339,1333,1338;, 3;1334,1340,1335;, 3;1340,1334,1339;, 3;1335,1341,1336;, 3;1341,1335,1340;, 3;1336,1342,1337;, 3;1342,1336,1341;, 3;1338,1344,1339;, 3;1344,1338,1343;, 3;1339,1345,1340;, 3;1345,1339,1344;, 3;1340,1346,1341;, 3;1346,1340,1345;, 3;1341,1347,1342;, 3;1347,1341,1346;, 3;1343,1349,1344;, 3;1349,1343,1348;, 3;1344,1350,1345;, 3;1350,1344,1349;, 3;1345,1351,1346;, 3;1351,1345,1350;, 3;1346,1352,1347;, 3;1352,1346,1351;, 3;33,1328,359;, 3;1328,33,402;, 3;412,355,1332;, 3;355,412,34;, 3;40,1352,417;, 3;1352,40,416;, 3;406,421,1348;, 3;421,406,39;, 3;359,1329,358;, 3;1329,359,1328;, 3;413,1332,1337;, 3;1332,413,412;, 3;417,1351,418;, 3;1351,417,1352;, 3;405,1348,1343;, 3;1348,405,406;, 3;358,1330,357;, 3;1330,358,1329;, 3;414,1337,1342;, 3;1337,414,413;, 3;418,1350,419;, 3;1350,418,1351;, 3;404,1343,1338;, 3;1343,404,405;, 3;357,1331,356;, 3;1331,357,1330;, 3;415,1342,1347;, 3;1342,415,414;, 3;419,1349,420;, 3;1349,419,1350;, 3;403,1338,1333;, 3;1338,403,404;, 3;356,1332,355;, 3;1332,356,1331;, 3;416,1347,1352;, 3;1347,416,415;, 3;420,1348,421;, 3;1348,420,1349;, 3;402,1333,1328;, 3;1333,402,403;, 3;1353,1359,1354;, 3;1359,1353,1358;, 3;1354,1360,1355;, 3;1360,1354,1359;, 3;1355,1361,1356;, 3;1361,1355,1360;, 3;1356,1362,1357;, 3;1362,1356,1361;, 3;1358,1364,1359;, 3;1364,1358,1363;, 3;1359,1365,1360;, 3;1365,1359,1364;, 3;1360,1366,1361;, 3;1366,1360,1365;, 3;1361,1367,1362;, 3;1367,1361,1366;, 3;1363,1369,1364;, 3;1369,1363,1368;, 3;1364,1370,1365;, 3;1370,1364,1369;, 3;1365,1371,1366;, 3;1371,1365,1370;, 3;1366,1372,1367;, 3;1372,1366,1371;, 3;1368,1374,1369;, 3;1374,1368,1373;, 3;1369,1375,1370;, 3;1375,1369,1374;, 3;1370,1376,1371;, 3;1376,1370,1375;, 3;1371,1377,1372;, 3;1377,1371,1376;, 3;34,1353,369;, 3;1353,34,412;, 3;422,365,1357;, 3;365,422,35;, 3;41,1377,427;, 3;1377,41,426;, 3;416,431,1373;, 3;431,416,40;, 3;369,1354,368;, 3;1354,369,1353;, 3;423,1357,1362;, 3;1357,423,422;, 3;427,1376,428;, 3;1376,427,1377;, 3;415,1373,1368;, 3;1373,415,416;, 3;368,1355,367;, 3;1355,368,1354;, 3;424,1362,1367;, 3;1362,424,423;, 3;428,1375,429;, 3;1375,428,1376;, 3;414,1368,1363;, 3;1368,414,415;, 3;367,1356,366;, 3;1356,367,1355;, 3;425,1367,1372;, 3;1367,425,424;, 3;429,1374,430;, 3;1374,429,1375;, 3;413,1363,1358;, 3;1363,413,414;, 3;366,1357,365;, 3;1357,366,1356;, 3;426,1372,1377;, 3;1372,426,425;, 3;430,1373,431;, 3;1373,430,1374;, 3;412,1358,1353;, 3;1358,412,413;, 3;1378,1383,1379;, 3;1383,1378,1382;, 3;1379,1384,1380;, 3;1384,1379,1383;, 3;1382,1386,1383;, 3;1386,1382,1385;, 3;1385,1388,1386;, 3;1388,1385,1387;, 3;35,1378,375;, 3;1378,35,422;, 3;375,1379,374;, 3;1379,375,1378;, 3;425,1389,1387;, 3;1389,425,426;, 3;374,1380,373;, 3;1380,374,1379;, 3;424,1387,1385;, 3;1387,424,425;, 3;373,1381,372;, 3;1381,373,1380;, 3;423,1385,1382;, 3;1385,423,424;, 3;422,1382,1378;, 3;1382,422,423;, 3;1390,1396,1391;, 3;1396,1390,1395;, 3;1391,1397,1392;, 3;1397,1391,1396;, 3;1392,1398,1393;, 3;1398,1392,1397;, 3;1393,1399,1394;, 3;1399,1393,1398;, 3;1397,1400,1398;, 3;1398,1401,1399;, 3;1401,1398,1400;, 3;1400,1403,1401;, 3;1403,1400,1402;, 3;36,1390,391;, 3;432,387,1394;, 3;387,432,37;, 3;391,1391,390;, 3;1391,391,1390;, 3;433,1394,1399;, 3;1394,433,432;, 3;390,1392,389;, 3;1392,390,1391;, 3;434,1399,1401;, 3;1399,434,433;, 3;389,1393,388;, 3;1393,389,1392;, 3;435,1401,1403;, 3;1401,435,434;, 3;388,1394,387;, 3;1394,388,1393;, 3;1404,1410,1405;, 3;1410,1404,1409;, 3;1405,1411,1406;, 3;1411,1405,1410;, 3;1406,1412,1407;, 3;1412,1406,1411;, 3;1407,1413,1408;, 3;1413,1407,1412;, 3;1409,1415,1410;, 3;1415,1409,1414;, 3;1410,1416,1411;, 3;1416,1410,1415;, 3;1411,1417,1412;, 3;1417,1411,1416;, 3;1412,1418,1413;, 3;1418,1412,1417;, 3;1414,1420,1415;, 3;1420,1414,1419;, 3;1415,1421,1416;, 3;1421,1415,1420;, 3;1416,1422,1417;, 3;1422,1416,1421;, 3;1417,1423,1418;, 3;1423,1417,1422;, 3;1419,1424,1420;, 3;1420,1425,1421;, 3;1425,1420,1424;, 3;1421,1426,1422;, 3;1426,1421,1425;, 3;1422,1427,1423;, 3;1427,1422,1426;, 3;37,1404,401;, 3;1404,37,432;, 3;436,397,1408;, 3;397,436,38;, 3;42,1427,441;, 3;1427,42,440;, 3;401,1405,400;, 3;1405,401,1404;, 3;437,1408,1413;, 3;1408,437,436;, 3;441,1426,442;, 3;1426,441,1427;, 3;400,1406,399;, 3;1406,400,1405;, 3;438,1413,1418;, 3;1413,438,437;, 3;442,1425,443;, 3;1425,442,1426;, 3;434,1419,1414;, 3;1419,434,435;, 3;399,1407,398;, 3;1407,399,1406;, 3;439,1418,1423;, 3;1418,439,438;, 3;1424,443,1425;, 3;433,1414,1409;, 3;1414,433,434;, 3;398,1408,397;, 3;1408,398,1407;, 3;440,1423,1427;, 3;1423,440,439;, 3;432,1409,1404;, 3;1409,432,433;, 3;1428,1434,1429;, 3;1434,1428,1433;, 3;1429,1435,1430;, 3;1435,1429,1434;, 3;1430,1436,1431;, 3;1436,1430,1435;, 3;1431,1437,1432;, 3;1437,1431,1436;, 3;1433,1439,1434;, 3;1439,1433,1438;, 3;1434,1440,1435;, 3;1440,1434,1439;, 3;1435,1441,1436;, 3;1441,1435,1440;, 3;1436,1442,1437;, 3;1442,1436,1441;, 3;1438,1444,1439;, 3;1444,1438,1443;, 3;1439,1445,1440;, 3;1445,1439,1444;, 3;1440,1446,1441;, 3;1446,1440,1445;, 3;1441,1447,1442;, 3;1447,1441,1446;, 3;1443,1449,1444;, 3;1449,1443,1448;, 3;1444,1450,1445;, 3;1450,1444,1449;, 3;1445,1451,1446;, 3;1451,1445,1450;, 3;1446,1452,1447;, 3;1452,1446,1451;, 3;38,1428,411;, 3;1428,38,436;, 3;444,407,1432;, 3;407,444,39;, 3;43,1452,449;, 3;1452,43,448;, 3;440,453,1448;, 3;453,440,42;, 3;411,1429,410;, 3;1429,411,1428;, 3;445,1432,1437;, 3;1432,445,444;, 3;449,1451,450;, 3;1451,449,1452;, 3;439,1448,1443;, 3;1448,439,440;, 3;410,1430,409;, 3;1430,410,1429;, 3;446,1437,1442;, 3;1437,446,445;, 3;450,1450,451;, 3;1450,450,1451;, 3;438,1443,1438;, 3;1443,438,439;, 3;409,1431,408;, 3;1431,409,1430;, 3;447,1442,1447;, 3;1442,447,446;, 3;451,1449,452;, 3;1449,451,1450;, 3;437,1438,1433;, 3;1438,437,438;, 3;408,1432,407;, 3;1432,408,1431;, 3;448,1447,1452;, 3;1447,448,447;, 3;452,1448,453;, 3;1448,452,1449;, 3;436,1433,1428;, 3;1433,436,437;, 3;1453,1459,1454;, 3;1459,1453,1458;, 3;1454,1460,1455;, 3;1460,1454,1459;, 3;1455,1461,1456;, 3;1461,1455,1460;, 3;1456,1462,1457;, 3;1462,1456,1461;, 3;1458,1464,1459;, 3;1464,1458,1463;, 3;1459,1465,1460;, 3;1465,1459,1464;, 3;1460,1466,1461;, 3;1466,1460,1465;, 3;1461,1467,1462;, 3;1467,1461,1466;, 3;1463,1469,1464;, 3;1469,1463,1468;, 3;1464,1470,1465;, 3;1470,1464,1469;, 3;1465,1471,1466;, 3;1471,1465,1470;, 3;1466,1472,1467;, 3;1472,1466,1471;, 3;1468,1474,1469;, 3;1474,1468,1473;, 3;1469,1475,1470;, 3;1475,1469,1474;, 3;1470,1476,1471;, 3;1476,1470,1475;, 3;39,1453,421;, 3;1453,39,444;, 3;454,417,1457;, 3;417,454,40;, 3;448,459,1473;, 3;459,448,43;, 3;421,1454,420;, 3;1454,421,1453;, 3;455,1457,1462;, 3;1457,455,454;, 3;447,1473,1468;, 3;1473,447,448;, 3;420,1455,419;, 3;1455,420,1454;, 3;456,1462,1467;, 3;1462,456,455;, 3;446,1468,1463;, 3;1468,446,447;, 3;419,1456,418;, 3;1456,419,1455;, 3;457,1467,1472;, 3;1467,457,456;, 3;445,1463,1458;, 3;1463,445,446;, 3;418,1457,417;, 3;1457,418,1456;, 3;458,1473,459;, 3;1473,458,1474;, 3;444,1458,1453;, 3;1458,444,445;, 3;1477,1483,1478;, 3;1483,1477,1482;, 3;1478,1484,1479;, 3;1484,1478,1483;, 3;1479,1485,1480;, 3;1485,1479,1484;, 3;1482,1487,1483;, 3;1487,1482,1486;, 3;1483,1488,1484;, 3;1488,1483,1487;, 3;40,1477,431;, 3;1477,40,454;, 3;431,1478,430;, 3;1478,431,1477;, 3;430,1479,429;, 3;1479,430,1478;, 3;456,1489,1486;, 3;1489,456,457;, 3;429,1480,428;, 3;1480,429,1479;, 3;455,1486,1482;, 3;1486,455,456;, 3;428,1481,427;, 3;1481,428,1480;, 3;454,1482,1477;, 3;1482,454,455;; MeshMaterialList { 1; 1; 0;; Material { 0.945098;0.913726;0.843137;1.000000;; 23.000000; 1.000000;1.000000;1.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "seafloor.bmp"; } } } MeshTextureCoords { 1490; 0.428571;1.000000;, 0.571429;1.000000;, 0.142857;0.857143;, 0.285714;0.857143;, 0.428571;0.857143;, 0.571429;0.857143;, 0.714286;0.857143;, 0.857143;0.857143;, 0.142857;0.714286;, 0.285714;0.714286;, 0.428571;0.714286;, 0.571429;0.714286;, 0.714286;0.714286;, 0.857143;0.714286;, 0.000000;0.571429;, 0.142857;0.571429;, 0.285714;0.571429;, 0.428571;0.571429;, 0.571429;0.571429;, 0.714286;0.571429;, 0.857143;0.571429;, 1.000000;0.571429;, 0.000000;0.428571;, 0.142857;0.428571;, 0.285714;0.428571;, 0.428571;0.428571;, 0.571429;0.428571;, 0.714286;0.428571;, 0.857143;0.428571;, 1.000000;0.428571;, 0.142857;0.285714;, 0.285714;0.285714;, 0.428571;0.285714;, 0.571429;0.285714;, 0.714286;0.285714;, 0.857143;0.285714;, 0.142857;0.142857;, 0.285714;0.142857;, 0.428571;0.142857;, 0.571429;0.142857;, 0.714286;0.142857;, 0.857143;0.142857;, 0.428571;0.000000;, 0.571429;0.000000;, 0.119048;0.857143;, 0.285714;0.952381;, 0.285714;0.928571;, 0.285714;0.904762;, 0.285714;0.880952;, 0.261905;0.857143;, 0.238095;0.857143;, 0.214286;0.857143;, 0.190476;0.857143;, 0.166667;0.857143;, 0.380952;1.000000;, 0.404762;1.000000;, 0.428571;0.976190;, 0.428571;0.952381;, 0.428571;0.928571;, 0.428571;0.904762;, 0.428571;0.880952;, 0.404762;0.857143;, 0.380952;0.857143;, 0.357143;0.857143;, 0.333333;0.857143;, 0.309524;0.857143;, 0.452381;1.000000;, 0.476190;1.000000;, 0.500000;1.000000;, 0.523810;1.000000;, 0.547619;1.000000;, 0.571429;0.976190;, 0.571429;0.952381;, 0.571429;0.928571;, 0.571429;0.904762;, 0.571429;0.880952;, 0.547619;0.857143;, 0.523810;0.857143;, 0.500000;0.857143;, 0.476190;0.857143;, 0.452381;0.857143;, 0.595238;1.000000;, 0.619048;1.000000;, 0.714286;0.952381;, 0.714286;0.928571;, 0.714286;0.904762;, 0.714286;0.880952;, 0.690476;0.857143;, 0.666667;0.857143;, 0.642857;0.857143;, 0.619048;0.857143;, 0.595238;0.857143;, 0.857143;0.880952;, 0.833333;0.857143;, 0.809524;0.857143;, 0.785714;0.857143;, 0.761905;0.857143;, 0.738095;0.857143;, 0.142857;0.833333;, 0.142857;0.809524;, 0.142857;0.785714;, 0.142857;0.761905;, 0.142857;0.738095;, 0.119048;0.714286;, 0.095238;0.714286;, 0.071429;0.714286;, 0.047619;0.714286;, 0.285714;0.833333;, 0.285714;0.809524;, 0.285714;0.785714;, 0.285714;0.761905;, 0.285714;0.738095;, 0.261905;0.714286;, 0.238095;0.714286;, 0.214286;0.714286;, 0.190476;0.714286;, 0.166667;0.714286;, 0.428571;0.833333;, 0.428571;0.809524;, 0.428571;0.785714;, 0.428571;0.761905;, 0.428571;0.738095;, 0.404762;0.714286;, 0.380952;0.714286;, 0.357143;0.714286;, 0.333333;0.714286;, 0.309524;0.714286;, 0.571429;0.833333;, 0.571429;0.809524;, 0.571429;0.785714;, 0.571429;0.761905;, 0.571429;0.738095;, 0.547619;0.714286;, 0.523810;0.714286;, 0.500000;0.714286;, 0.476190;0.714286;, 0.452381;0.714286;, 0.714286;0.833333;, 0.714286;0.809524;, 0.714286;0.785714;, 0.714286;0.761905;, 0.714286;0.738095;, 0.690476;0.714286;, 0.666667;0.714286;, 0.642857;0.714286;, 0.619048;0.714286;, 0.595238;0.714286;, 0.857143;0.833333;, 0.857143;0.809524;, 0.857143;0.785714;, 0.857143;0.761905;, 0.857143;0.738095;, 0.833333;0.714286;, 0.809524;0.714286;, 0.785714;0.714286;, 0.761905;0.714286;, 0.738095;0.714286;, 0.976190;0.714286;, 0.952381;0.714286;, 0.928571;0.714286;, 0.904762;0.714286;, 0.880952;0.714286;, 0.142857;0.690476;, 0.142857;0.666667;, 0.142857;0.642857;, 0.142857;0.619048;, 0.142857;0.595238;, 0.119048;0.571429;, 0.095238;0.571429;, 0.071429;0.571429;, 0.047619;0.571429;, 0.023810;0.571429;, 0.000000;0.595238;, 0.000000;0.619048;, 0.000000;0.642857;, 0.285714;0.690476;, 0.285714;0.666667;, 0.285714;0.642857;, 0.285714;0.619048;, 0.285714;0.595238;, 0.261905;0.571429;, 0.238095;0.571429;, 0.214286;0.571429;, 0.190476;0.571429;, 0.166667;0.571429;, 0.428571;0.690476;, 0.428571;0.666667;, 0.428571;0.642857;, 0.428571;0.619048;, 0.428571;0.595238;, 0.404762;0.571429;, 0.380952;0.571429;, 0.357143;0.571429;, 0.333333;0.571429;, 0.309524;0.571429;, 0.571429;0.690476;, 0.571429;0.666667;, 0.571429;0.642857;, 0.571429;0.619048;, 0.571429;0.595238;, 0.547619;0.571429;, 0.523810;0.571429;, 0.500000;0.571429;, 0.476190;0.571429;, 0.452381;0.571429;, 0.714286;0.690476;, 0.714286;0.666667;, 0.714286;0.642857;, 0.714286;0.619048;, 0.714286;0.595238;, 0.690476;0.571429;, 0.666667;0.571429;, 0.642857;0.571429;, 0.619048;0.571429;, 0.595238;0.571429;, 0.857143;0.690476;, 0.857143;0.666667;, 0.857143;0.642857;, 0.857143;0.619048;, 0.857143;0.595238;, 0.833333;0.571429;, 0.809524;0.571429;, 0.785714;0.571429;, 0.761905;0.571429;, 0.738095;0.571429;, 1.000000;0.619048;, 1.000000;0.595238;, 0.976190;0.571429;, 0.952381;0.571429;, 0.928571;0.571429;, 0.904762;0.571429;, 0.880952;0.571429;, 0.142857;0.547619;, 0.142857;0.523810;, 0.142857;0.500000;, 0.142857;0.476190;, 0.142857;0.452381;, 0.119048;0.428571;, 0.095238;0.428571;, 0.071429;0.428571;, 0.047619;0.428571;, 0.023810;0.428571;, 0.000000;0.452381;, 0.000000;0.476190;, 0.000000;0.500000;, 0.000000;0.523810;, 0.000000;0.547619;, 0.285714;0.547619;, 0.285714;0.523810;, 0.285714;0.500000;, 0.285714;0.476190;, 0.285714;0.452381;, 0.261905;0.428571;, 0.238095;0.428571;, 0.214286;0.428571;, 0.190476;0.428571;, 0.166667;0.428571;, 0.428571;0.547619;, 0.428571;0.523810;, 0.428571;0.500000;, 0.428571;0.476190;, 0.428571;0.452381;, 0.404762;0.428571;, 0.380952;0.428571;, 0.357143;0.428571;, 0.333333;0.428571;, 0.309524;0.428571;, 0.571429;0.547619;, 0.571429;0.523810;, 0.571429;0.500000;, 0.571429;0.476190;, 0.571429;0.452381;, 0.547619;0.428571;, 0.523810;0.428571;, 0.500000;0.428571;, 0.476190;0.428571;, 0.452381;0.428571;, 0.714286;0.547619;, 0.714286;0.523810;, 0.714286;0.500000;, 0.714286;0.476190;, 0.714286;0.452381;, 0.690476;0.428571;, 0.666667;0.428571;, 0.642857;0.428571;, 0.619048;0.428571;, 0.595238;0.428571;, 0.857143;0.547619;, 0.857143;0.523810;, 0.857143;0.500000;, 0.857143;0.476190;, 0.857143;0.452381;, 0.833333;0.428571;, 0.809524;0.428571;, 0.785714;0.428571;, 0.761905;0.428571;, 0.738095;0.428571;, 1.000000;0.547619;, 1.000000;0.523810;, 1.000000;0.500000;, 1.000000;0.476190;, 1.000000;0.452381;, 0.976190;0.428571;, 0.952381;0.428571;, 0.928571;0.428571;, 0.904762;0.428571;, 0.880952;0.428571;, 0.142857;0.404762;, 0.142857;0.380952;, 0.142857;0.357143;, 0.142857;0.333333;, 0.142857;0.309524;, 0.119048;0.285714;, 0.095238;0.285714;, 0.071429;0.285714;, 0.047619;0.285714;, 0.023810;0.285714;, 0.000000;0.357143;, 0.000000;0.380952;, 0.000000;0.404762;, 0.285714;0.404762;, 0.285714;0.380952;, 0.285714;0.357143;, 0.285714;0.333333;, 0.285714;0.309524;, 0.261905;0.285714;, 0.238095;0.285714;, 0.214286;0.285714;, 0.190476;0.285714;, 0.166667;0.285714;, 0.428571;0.404762;, 0.428571;0.380952;, 0.428571;0.357143;, 0.428571;0.333333;, 0.428571;0.309524;, 0.404762;0.285714;, 0.380952;0.285714;, 0.357143;0.285714;, 0.333333;0.285714;, 0.309524;0.285714;, 0.571429;0.404762;, 0.571429;0.380952;, 0.571429;0.357143;, 0.571429;0.333333;, 0.571429;0.309524;, 0.547619;0.285714;, 0.523810;0.285714;, 0.500000;0.285714;, 0.476190;0.285714;, 0.452381;0.285714;, 0.714286;0.404762;, 0.714286;0.380952;, 0.714286;0.357143;, 0.714286;0.333333;, 0.714286;0.309524;, 0.690476;0.285714;, 0.666667;0.285714;, 0.642857;0.285714;, 0.619048;0.285714;, 0.595238;0.285714;, 0.857143;0.404762;, 0.857143;0.380952;, 0.857143;0.357143;, 0.857143;0.333333;, 0.857143;0.309524;, 0.833333;0.285714;, 0.809524;0.285714;, 0.785714;0.285714;, 0.761905;0.285714;, 0.738095;0.285714;, 1.000000;0.404762;, 1.000000;0.380952;, 0.952381;0.285714;, 0.928571;0.285714;, 0.904762;0.285714;, 0.880952;0.285714;, 0.142857;0.261905;, 0.142857;0.238095;, 0.142857;0.214286;, 0.142857;0.190476;, 0.142857;0.166667;, 0.119048;0.142857;, 0.285714;0.261905;, 0.285714;0.238095;, 0.285714;0.214286;, 0.285714;0.190476;, 0.285714;0.166667;, 0.261905;0.142857;, 0.238095;0.142857;, 0.214286;0.142857;, 0.190476;0.142857;, 0.166667;0.142857;, 0.428571;0.261905;, 0.428571;0.238095;, 0.428571;0.214286;, 0.428571;0.190476;, 0.428571;0.166667;, 0.404762;0.142857;, 0.380952;0.142857;, 0.357143;0.142857;, 0.333333;0.142857;, 0.309524;0.142857;, 0.571429;0.261905;, 0.571429;0.238095;, 0.571429;0.214286;, 0.571429;0.190476;, 0.571429;0.166667;, 0.547619;0.142857;, 0.523810;0.142857;, 0.500000;0.142857;, 0.476190;0.142857;, 0.452381;0.142857;, 0.714286;0.261905;, 0.714286;0.238095;, 0.714286;0.214286;, 0.714286;0.190476;, 0.714286;0.166667;, 0.690476;0.142857;, 0.666667;0.142857;, 0.642857;0.142857;, 0.619048;0.142857;, 0.595238;0.142857;, 0.857143;0.261905;, 0.857143;0.238095;, 0.857143;0.214286;, 0.857143;0.190476;, 0.857143;0.166667;, 0.833333;0.142857;, 0.809524;0.142857;, 0.785714;0.142857;, 0.761905;0.142857;, 0.738095;0.142857;, 0.285714;0.119048;, 0.285714;0.095238;, 0.285714;0.071429;, 0.285714;0.047619;, 0.428571;0.119048;, 0.428571;0.095238;, 0.428571;0.071429;, 0.428571;0.047619;, 0.428571;0.023810;, 0.404762;0.000000;, 0.380952;0.000000;, 0.357143;0.000000;, 0.571429;0.119048;, 0.571429;0.095238;, 0.571429;0.071429;, 0.571429;0.047619;, 0.571429;0.023810;, 0.547619;0.000000;, 0.523810;0.000000;, 0.500000;0.000000;, 0.476190;0.000000;, 0.452381;0.000000;, 0.714286;0.119048;, 0.714286;0.095238;, 0.714286;0.071429;, 0.714286;0.047619;, 0.619048;0.000000;, 0.595238;0.000000;, 0.261905;0.952381;, 0.214286;0.928571;, 0.238095;0.928571;, 0.261905;0.928571;, 0.190476;0.904762;, 0.214286;0.904762;, 0.238095;0.904762;, 0.261905;0.904762;, 0.166667;0.880952;, 0.190476;0.880952;, 0.214286;0.880952;, 0.238095;0.880952;, 0.261905;0.880952;, 0.309524;0.976190;, 0.333333;0.976190;, 0.357143;0.976190;, 0.380952;0.976190;, 0.404762;0.976190;, 0.309524;0.952381;, 0.333333;0.952381;, 0.357143;0.952381;, 0.380952;0.952381;, 0.404762;0.952381;, 0.309524;0.928571;, 0.333333;0.928571;, 0.357143;0.928571;, 0.380952;0.928571;, 0.404762;0.928571;, 0.309524;0.904762;, 0.333333;0.904762;, 0.357143;0.904762;, 0.380952;0.904762;, 0.404762;0.904762;, 0.309524;0.880952;, 0.333333;0.880952;, 0.357143;0.880952;, 0.380952;0.880952;, 0.404762;0.880952;, 0.452381;0.976190;, 0.476190;0.976190;, 0.500000;0.976190;, 0.523810;0.976190;, 0.547619;0.976190;, 0.452381;0.952381;, 0.476190;0.952381;, 0.500000;0.952381;, 0.523810;0.952381;, 0.547619;0.952381;, 0.452381;0.928571;, 0.476190;0.928571;, 0.500000;0.928571;, 0.523810;0.928571;, 0.547619;0.928571;, 0.452381;0.904762;, 0.476190;0.904762;, 0.500000;0.904762;, 0.523810;0.904762;, 0.547619;0.904762;, 0.452381;0.880952;, 0.476190;0.880952;, 0.500000;0.880952;, 0.523810;0.880952;, 0.547619;0.880952;, 0.595238;0.976190;, 0.619048;0.976190;, 0.642857;0.976190;, 0.666667;0.976190;, 0.690476;0.976190;, 0.595238;0.952381;, 0.619048;0.952381;, 0.642857;0.952381;, 0.666667;0.952381;, 0.690476;0.952381;, 0.595238;0.928571;, 0.619048;0.928571;, 0.642857;0.928571;, 0.666667;0.928571;, 0.690476;0.928571;, 0.595238;0.904762;, 0.619048;0.904762;, 0.642857;0.904762;, 0.666667;0.904762;, 0.690476;0.904762;, 0.595238;0.880952;, 0.619048;0.880952;, 0.642857;0.880952;, 0.666667;0.880952;, 0.690476;0.880952;, 0.738095;0.952381;, 0.738095;0.928571;, 0.761905;0.928571;, 0.785714;0.928571;, 0.738095;0.904762;, 0.761905;0.904762;, 0.785714;0.904762;, 0.809524;0.904762;, 0.738095;0.880952;, 0.761905;0.880952;, 0.785714;0.880952;, 0.809524;0.880952;, 0.833333;0.880952;, 0.119048;0.833333;, 0.095238;0.809524;, 0.119048;0.809524;, 0.071429;0.785714;, 0.095238;0.785714;, 0.119048;0.785714;, 0.071429;0.761905;, 0.095238;0.761905;, 0.119048;0.761905;, 0.047619;0.738095;, 0.071429;0.738095;, 0.095238;0.738095;, 0.119048;0.738095;, 0.166667;0.833333;, 0.190476;0.833333;, 0.214286;0.833333;, 0.238095;0.833333;, 0.261905;0.833333;, 0.166667;0.809524;, 0.190476;0.809524;, 0.214286;0.809524;, 0.238095;0.809524;, 0.261905;0.809524;, 0.166667;0.785714;, 0.190476;0.785714;, 0.214286;0.785714;, 0.238095;0.785714;, 0.261905;0.785714;, 0.166667;0.761905;, 0.190476;0.761905;, 0.214286;0.761905;, 0.238095;0.761905;, 0.261905;0.761905;, 0.166667;0.738095;, 0.190476;0.738095;, 0.214286;0.738095;, 0.238095;0.738095;, 0.261905;0.738095;, 0.309524;0.833333;, 0.333333;0.833333;, 0.357143;0.833333;, 0.380952;0.833333;, 0.404762;0.833333;, 0.309524;0.809524;, 0.333333;0.809524;, 0.357143;0.809524;, 0.380952;0.809524;, 0.404762;0.809524;, 0.309524;0.785714;, 0.333333;0.785714;, 0.357143;0.785714;, 0.380952;0.785714;, 0.404762;0.785714;, 0.309524;0.761905;, 0.333333;0.761905;, 0.357143;0.761905;, 0.380952;0.761905;, 0.404762;0.761905;, 0.309524;0.738095;, 0.333333;0.738095;, 0.357143;0.738095;, 0.380952;0.738095;, 0.404762;0.738095;, 0.452381;0.833333;, 0.476190;0.833333;, 0.500000;0.833333;, 0.523810;0.833333;, 0.547619;0.833333;, 0.452381;0.809524;, 0.476190;0.809524;, 0.500000;0.809524;, 0.523810;0.809524;, 0.547619;0.809524;, 0.452381;0.785714;, 0.476190;0.785714;, 0.500000;0.785714;, 0.523810;0.785714;, 0.547619;0.785714;, 0.452381;0.761905;, 0.476190;0.761905;, 0.500000;0.761905;, 0.523810;0.761905;, 0.547619;0.761905;, 0.452381;0.738095;, 0.476190;0.738095;, 0.500000;0.738095;, 0.523810;0.738095;, 0.547619;0.738095;, 0.595238;0.833333;, 0.619048;0.833333;, 0.642857;0.833333;, 0.666667;0.833333;, 0.690476;0.833333;, 0.595238;0.809524;, 0.619048;0.809524;, 0.642857;0.809524;, 0.666667;0.809524;, 0.690476;0.809524;, 0.595238;0.785714;, 0.619048;0.785714;, 0.642857;0.785714;, 0.666667;0.785714;, 0.690476;0.785714;, 0.595238;0.761905;, 0.619048;0.761905;, 0.642857;0.761905;, 0.666667;0.761905;, 0.690476;0.761905;, 0.595238;0.738095;, 0.619048;0.738095;, 0.642857;0.738095;, 0.666667;0.738095;, 0.690476;0.738095;, 0.738095;0.833333;, 0.761905;0.833333;, 0.785714;0.833333;, 0.809524;0.833333;, 0.833333;0.833333;, 0.738095;0.809524;, 0.761905;0.809524;, 0.785714;0.809524;, 0.809524;0.809524;, 0.833333;0.809524;, 0.738095;0.785714;, 0.761905;0.785714;, 0.785714;0.785714;, 0.809524;0.785714;, 0.833333;0.785714;, 0.738095;0.761905;, 0.761905;0.761905;, 0.785714;0.761905;, 0.809524;0.761905;, 0.833333;0.761905;, 0.738095;0.738095;, 0.761905;0.738095;, 0.785714;0.738095;, 0.809524;0.738095;, 0.833333;0.738095;, 0.880952;0.833333;, 0.880952;0.809524;, 0.904762;0.809524;, 0.880952;0.785714;, 0.904762;0.785714;, 0.928571;0.785714;, 0.880952;0.761905;, 0.904762;0.761905;, 0.928571;0.761905;, 0.952381;0.761905;, 0.880952;0.738095;, 0.904762;0.738095;, 0.928571;0.738095;, 0.952381;0.738095;, 0.023810;0.690476;, 0.047619;0.690476;, 0.071429;0.690476;, 0.095238;0.690476;, 0.119048;0.690476;, 0.023810;0.666667;, 0.047619;0.666667;, 0.071429;0.666667;, 0.095238;0.666667;, 0.119048;0.666667;, 0.023810;0.642857;, 0.047619;0.642857;, 0.071429;0.642857;, 0.095238;0.642857;, 0.119048;0.642857;, 0.023810;0.619048;, 0.047619;0.619048;, 0.071429;0.619048;, 0.095238;0.619048;, 0.119048;0.619048;, 0.023810;0.595238;, 0.047619;0.595238;, 0.071429;0.595238;, 0.095238;0.595238;, 0.119048;0.595238;, 0.166667;0.690476;, 0.190476;0.690476;, 0.214286;0.690476;, 0.238095;0.690476;, 0.261905;0.690476;, 0.166667;0.666667;, 0.190476;0.666667;, 0.214286;0.666667;, 0.238095;0.666667;, 0.261905;0.666667;, 0.166667;0.642857;, 0.190476;0.642857;, 0.214286;0.642857;, 0.238095;0.642857;, 0.261905;0.642857;, 0.166667;0.619048;, 0.190476;0.619048;, 0.214286;0.619048;, 0.238095;0.619048;, 0.261905;0.619048;, 0.166667;0.595238;, 0.190476;0.595238;, 0.214286;0.595238;, 0.238095;0.595238;, 0.261905;0.595238;, 0.309524;0.690476;, 0.333333;0.690476;, 0.357143;0.690476;, 0.380952;0.690476;, 0.404762;0.690476;, 0.309524;0.666667;, 0.333333;0.666667;, 0.357143;0.666667;, 0.380952;0.666667;, 0.404762;0.666667;, 0.309524;0.642857;, 0.333333;0.642857;, 0.357143;0.642857;, 0.380952;0.642857;, 0.404762;0.642857;, 0.309524;0.619048;, 0.333333;0.619048;, 0.357143;0.619048;, 0.380952;0.619048;, 0.404762;0.619048;, 0.309524;0.595238;, 0.333333;0.595238;, 0.357143;0.595238;, 0.380952;0.595238;, 0.404762;0.595238;, 0.452381;0.690476;, 0.476190;0.690476;, 0.500000;0.690476;, 0.523810;0.690476;, 0.547619;0.690476;, 0.452381;0.666667;, 0.476190;0.666667;, 0.500000;0.666667;, 0.523810;0.666667;, 0.547619;0.666667;, 0.452381;0.642857;, 0.476190;0.642857;, 0.500000;0.642857;, 0.523810;0.642857;, 0.547619;0.642857;, 0.452381;0.619048;, 0.476190;0.619048;, 0.500000;0.619048;, 0.523810;0.619048;, 0.547619;0.619048;, 0.452381;0.595238;, 0.476190;0.595238;, 0.500000;0.595238;, 0.523810;0.595238;, 0.547619;0.595238;, 0.595238;0.690476;, 0.619048;0.690476;, 0.642857;0.690476;, 0.666667;0.690476;, 0.690476;0.690476;, 0.595238;0.666667;, 0.619048;0.666667;, 0.642857;0.666667;, 0.666667;0.666667;, 0.690476;0.666667;, 0.595238;0.642857;, 0.619048;0.642857;, 0.642857;0.642857;, 0.666667;0.642857;, 0.690476;0.642857;, 0.595238;0.619048;, 0.619048;0.619048;, 0.642857;0.619048;, 0.666667;0.619048;, 0.690476;0.619048;, 0.595238;0.595238;, 0.619048;0.595238;, 0.642857;0.595238;, 0.666667;0.595238;, 0.690476;0.595238;, 0.738095;0.690476;, 0.761905;0.690476;, 0.785714;0.690476;, 0.809524;0.690476;, 0.833333;0.690476;, 0.738095;0.666667;, 0.761905;0.666667;, 0.785714;0.666667;, 0.809524;0.666667;, 0.833333;0.666667;, 0.738095;0.642857;, 0.761905;0.642857;, 0.785714;0.642857;, 0.809524;0.642857;, 0.833333;0.642857;, 0.738095;0.619048;, 0.761905;0.619048;, 0.785714;0.619048;, 0.809524;0.619048;, 0.833333;0.619048;, 0.738095;0.595238;, 0.761905;0.595238;, 0.785714;0.595238;, 0.809524;0.595238;, 0.833333;0.595238;, 0.880952;0.690476;, 0.904762;0.690476;, 0.928571;0.690476;, 0.952381;0.690476;, 0.976190;0.690476;, 0.880952;0.666667;, 0.904762;0.666667;, 0.928571;0.666667;, 0.952381;0.666667;, 0.976190;0.666667;, 0.880952;0.642857;, 0.904762;0.642857;, 0.928571;0.642857;, 0.952381;0.642857;, 0.976190;0.642857;, 0.880952;0.619048;, 0.904762;0.619048;, 0.928571;0.619048;, 0.952381;0.619048;, 0.976190;0.619048;, 0.880952;0.595238;, 0.904762;0.595238;, 0.928571;0.595238;, 0.952381;0.595238;, 0.976190;0.595238;, 0.023810;0.547619;, 0.047619;0.547619;, 0.071429;0.547619;, 0.095238;0.547619;, 0.119048;0.547619;, 0.023810;0.523810;, 0.047619;0.523810;, 0.071429;0.523810;, 0.095238;0.523810;, 0.119048;0.523810;, 0.023810;0.500000;, 0.047619;0.500000;, 0.071429;0.500000;, 0.095238;0.500000;, 0.119048;0.500000;, 0.023810;0.476190;, 0.047619;0.476190;, 0.071429;0.476190;, 0.095238;0.476190;, 0.119048;0.476190;, 0.023810;0.452381;, 0.047619;0.452381;, 0.071429;0.452381;, 0.095238;0.452381;, 0.119048;0.452381;, 0.166667;0.547619;, 0.190476;0.547619;, 0.214286;0.547619;, 0.238095;0.547619;, 0.261905;0.547619;, 0.166667;0.523810;, 0.190476;0.523810;, 0.214286;0.523810;, 0.238095;0.523810;, 0.261905;0.523810;, 0.166667;0.500000;, 0.190476;0.500000;, 0.214286;0.500000;, 0.238095;0.500000;, 0.261905;0.500000;, 0.166667;0.476190;, 0.190476;0.476190;, 0.214286;0.476190;, 0.238095;0.476190;, 0.261905;0.476190;, 0.166667;0.452381;, 0.190476;0.452381;, 0.214286;0.452381;, 0.238095;0.452381;, 0.261905;0.452381;, 0.309524;0.547619;, 0.333333;0.547619;, 0.357143;0.547619;, 0.380952;0.547619;, 0.404762;0.547619;, 0.309524;0.523810;, 0.333333;0.523810;, 0.357143;0.523810;, 0.380952;0.523810;, 0.404762;0.523810;, 0.309524;0.500000;, 0.333333;0.500000;, 0.357143;0.500000;, 0.380952;0.500000;, 0.404762;0.500000;, 0.309524;0.476190;, 0.333333;0.476190;, 0.357143;0.476190;, 0.380952;0.476190;, 0.404762;0.476190;, 0.309524;0.452381;, 0.333333;0.452381;, 0.357143;0.452381;, 0.380952;0.452381;, 0.404762;0.452381;, 0.452381;0.547619;, 0.476190;0.547619;, 0.500000;0.547619;, 0.523810;0.547619;, 0.547619;0.547619;, 0.452381;0.523810;, 0.476190;0.523810;, 0.500000;0.523810;, 0.523810;0.523810;, 0.547619;0.523810;, 0.452381;0.500000;, 0.476190;0.500000;, 0.500000;0.500000;, 0.523810;0.500000;, 0.547619;0.500000;, 0.452381;0.476190;, 0.476190;0.476190;, 0.500000;0.476190;, 0.523810;0.476190;, 0.547619;0.476190;, 0.452381;0.452381;, 0.476190;0.452381;, 0.500000;0.452381;, 0.523810;0.452381;, 0.547619;0.452381;, 0.595238;0.547619;, 0.619048;0.547619;, 0.642857;0.547619;, 0.666667;0.547619;, 0.690476;0.547619;, 0.595238;0.523810;, 0.619048;0.523810;, 0.642857;0.523810;, 0.666667;0.523810;, 0.690476;0.523810;, 0.595238;0.500000;, 0.619048;0.500000;, 0.642857;0.500000;, 0.666667;0.500000;, 0.690476;0.500000;, 0.595238;0.476190;, 0.619048;0.476190;, 0.642857;0.476190;, 0.666667;0.476190;, 0.690476;0.476190;, 0.595238;0.452381;, 0.619048;0.452381;, 0.642857;0.452381;, 0.666667;0.452381;, 0.690476;0.452381;, 0.738095;0.547619;, 0.761905;0.547619;, 0.785714;0.547619;, 0.809524;0.547619;, 0.833333;0.547619;, 0.738095;0.523810;, 0.761905;0.523810;, 0.785714;0.523810;, 0.809524;0.523810;, 0.833333;0.523810;, 0.738095;0.500000;, 0.761905;0.500000;, 0.785714;0.500000;, 0.809524;0.500000;, 0.833333;0.500000;, 0.738095;0.476190;, 0.761905;0.476190;, 0.785714;0.476190;, 0.809524;0.476190;, 0.833333;0.476190;, 0.738095;0.452381;, 0.761905;0.452381;, 0.785714;0.452381;, 0.809524;0.452381;, 0.833333;0.452381;, 0.880952;0.547619;, 0.904762;0.547619;, 0.928571;0.547619;, 0.952381;0.547619;, 0.976190;0.547619;, 0.880952;0.523810;, 0.904762;0.523810;, 0.928571;0.523810;, 0.952381;0.523810;, 0.976190;0.523810;, 0.880952;0.500000;, 0.904762;0.500000;, 0.928571;0.500000;, 0.952381;0.500000;, 0.976190;0.500000;, 0.880952;0.476190;, 0.904762;0.476190;, 0.928571;0.476190;, 0.952381;0.476190;, 0.976190;0.476190;, 0.880952;0.452381;, 0.904762;0.452381;, 0.928571;0.452381;, 0.952381;0.452381;, 0.976190;0.452381;, 0.023810;0.404762;, 0.047619;0.404762;, 0.071429;0.404762;, 0.095238;0.404762;, 0.119048;0.404762;, 0.023810;0.380952;, 0.047619;0.380952;, 0.071429;0.380952;, 0.095238;0.380952;, 0.119048;0.380952;, 0.023810;0.357143;, 0.047619;0.357143;, 0.071429;0.357143;, 0.095238;0.357143;, 0.119048;0.357143;, 0.023810;0.333333;, 0.047619;0.333333;, 0.071429;0.333333;, 0.095238;0.333333;, 0.119048;0.333333;, 0.023810;0.309524;, 0.047619;0.309524;, 0.071429;0.309524;, 0.095238;0.309524;, 0.119048;0.309524;, 0.166667;0.404762;, 0.190476;0.404762;, 0.214286;0.404762;, 0.238095;0.404762;, 0.261905;0.404762;, 0.166667;0.380952;, 0.190476;0.380952;, 0.214286;0.380952;, 0.238095;0.380952;, 0.261905;0.380952;, 0.166667;0.357143;, 0.190476;0.357143;, 0.214286;0.357143;, 0.238095;0.357143;, 0.261905;0.357143;, 0.166667;0.333333;, 0.190476;0.333333;, 0.214286;0.333333;, 0.238095;0.333333;, 0.261905;0.333333;, 0.166667;0.309524;, 0.190476;0.309524;, 0.214286;0.309524;, 0.238095;0.309524;, 0.261905;0.309524;, 0.309524;0.404762;, 0.333333;0.404762;, 0.357143;0.404762;, 0.380952;0.404762;, 0.404762;0.404762;, 0.309524;0.380952;, 0.333333;0.380952;, 0.357143;0.380952;, 0.380952;0.380952;, 0.404762;0.380952;, 0.309524;0.357143;, 0.333333;0.357143;, 0.357143;0.357143;, 0.380952;0.357143;, 0.404762;0.357143;, 0.309524;0.333333;, 0.333333;0.333333;, 0.357143;0.333333;, 0.380952;0.333333;, 0.404762;0.333333;, 0.309524;0.309524;, 0.333333;0.309524;, 0.357143;0.309524;, 0.380952;0.309524;, 0.404762;0.309524;, 0.452381;0.404762;, 0.476190;0.404762;, 0.500000;0.404762;, 0.523810;0.404762;, 0.547619;0.404762;, 0.452381;0.380952;, 0.476190;0.380952;, 0.500000;0.380952;, 0.523810;0.380952;, 0.547619;0.380952;, 0.452381;0.357143;, 0.476190;0.357143;, 0.500000;0.357143;, 0.523810;0.357143;, 0.547619;0.357143;, 0.452381;0.333333;, 0.476190;0.333333;, 0.500000;0.333333;, 0.523810;0.333333;, 0.547619;0.333333;, 0.452381;0.309524;, 0.476190;0.309524;, 0.500000;0.309524;, 0.523810;0.309524;, 0.547619;0.309524;, 0.595238;0.404762;, 0.619048;0.404762;, 0.642857;0.404762;, 0.666667;0.404762;, 0.690476;0.404762;, 0.595238;0.380952;, 0.619048;0.380952;, 0.642857;0.380952;, 0.666667;0.380952;, 0.690476;0.380952;, 0.595238;0.357143;, 0.619048;0.357143;, 0.642857;0.357143;, 0.666667;0.357143;, 0.690476;0.357143;, 0.595238;0.333333;, 0.619048;0.333333;, 0.642857;0.333333;, 0.666667;0.333333;, 0.690476;0.333333;, 0.595238;0.309524;, 0.619048;0.309524;, 0.642857;0.309524;, 0.666667;0.309524;, 0.690476;0.309524;, 0.738095;0.404762;, 0.761905;0.404762;, 0.785714;0.404762;, 0.809524;0.404762;, 0.833333;0.404762;, 0.738095;0.380952;, 0.761905;0.380952;, 0.785714;0.380952;, 0.809524;0.380952;, 0.833333;0.380952;, 0.738095;0.357143;, 0.761905;0.357143;, 0.785714;0.357143;, 0.809524;0.357143;, 0.833333;0.357143;, 0.738095;0.333333;, 0.761905;0.333333;, 0.785714;0.333333;, 0.809524;0.333333;, 0.833333;0.333333;, 0.738095;0.309524;, 0.761905;0.309524;, 0.785714;0.309524;, 0.809524;0.309524;, 0.833333;0.309524;, 0.880952;0.404762;, 0.904762;0.404762;, 0.928571;0.404762;, 0.952381;0.404762;, 0.976190;0.404762;, 0.880952;0.380952;, 0.904762;0.380952;, 0.928571;0.380952;, 0.952381;0.380952;, 0.976190;0.380952;, 0.880952;0.357143;, 0.904762;0.357143;, 0.928571;0.357143;, 0.952381;0.357143;, 0.976190;0.357143;, 0.880952;0.333333;, 0.904762;0.333333;, 0.928571;0.333333;, 0.952381;0.333333;, 0.976190;0.333333;, 0.880952;0.309524;, 0.904762;0.309524;, 0.928571;0.309524;, 0.952381;0.309524;, 0.047619;0.261905;, 0.071429;0.261905;, 0.095238;0.261905;, 0.119048;0.261905;, 0.047619;0.238095;, 0.071429;0.238095;, 0.095238;0.238095;, 0.119048;0.238095;, 0.071429;0.214286;, 0.095238;0.214286;, 0.119048;0.214286;, 0.071429;0.190476;, 0.095238;0.190476;, 0.119048;0.190476;, 0.095238;0.166667;, 0.119048;0.166667;, 0.166667;0.261905;, 0.190476;0.261905;, 0.214286;0.261905;, 0.238095;0.261905;, 0.261905;0.261905;, 0.166667;0.238095;, 0.190476;0.238095;, 0.214286;0.238095;, 0.238095;0.238095;, 0.261905;0.238095;, 0.166667;0.214286;, 0.190476;0.214286;, 0.214286;0.214286;, 0.238095;0.214286;, 0.261905;0.214286;, 0.166667;0.190476;, 0.190476;0.190476;, 0.214286;0.190476;, 0.238095;0.190476;, 0.261905;0.190476;, 0.166667;0.166667;, 0.190476;0.166667;, 0.214286;0.166667;, 0.238095;0.166667;, 0.261905;0.166667;, 0.309524;0.261905;, 0.333333;0.261905;, 0.357143;0.261905;, 0.380952;0.261905;, 0.404762;0.261905;, 0.309524;0.238095;, 0.333333;0.238095;, 0.357143;0.238095;, 0.380952;0.238095;, 0.404762;0.238095;, 0.309524;0.214286;, 0.333333;0.214286;, 0.357143;0.214286;, 0.380952;0.214286;, 0.404762;0.214286;, 0.309524;0.190476;, 0.333333;0.190476;, 0.357143;0.190476;, 0.380952;0.190476;, 0.404762;0.190476;, 0.309524;0.166667;, 0.333333;0.166667;, 0.357143;0.166667;, 0.380952;0.166667;, 0.404762;0.166667;, 0.452381;0.261905;, 0.476190;0.261905;, 0.500000;0.261905;, 0.523810;0.261905;, 0.547619;0.261905;, 0.452381;0.238095;, 0.476190;0.238095;, 0.500000;0.238095;, 0.523810;0.238095;, 0.547619;0.238095;, 0.452381;0.214286;, 0.476190;0.214286;, 0.500000;0.214286;, 0.523810;0.214286;, 0.547619;0.214286;, 0.452381;0.190476;, 0.476190;0.190476;, 0.500000;0.190476;, 0.523810;0.190476;, 0.547619;0.190476;, 0.452381;0.166667;, 0.476190;0.166667;, 0.500000;0.166667;, 0.523810;0.166667;, 0.547619;0.166667;, 0.595238;0.261905;, 0.619048;0.261905;, 0.642857;0.261905;, 0.666667;0.261905;, 0.690476;0.261905;, 0.595238;0.238095;, 0.619048;0.238095;, 0.642857;0.238095;, 0.666667;0.238095;, 0.690476;0.238095;, 0.595238;0.214286;, 0.619048;0.214286;, 0.642857;0.214286;, 0.666667;0.214286;, 0.690476;0.214286;, 0.595238;0.190476;, 0.619048;0.190476;, 0.642857;0.190476;, 0.666667;0.190476;, 0.690476;0.190476;, 0.595238;0.166667;, 0.619048;0.166667;, 0.642857;0.166667;, 0.666667;0.166667;, 0.690476;0.166667;, 0.738095;0.261905;, 0.761905;0.261905;, 0.785714;0.261905;, 0.809524;0.261905;, 0.833333;0.261905;, 0.738095;0.238095;, 0.761905;0.238095;, 0.785714;0.238095;, 0.809524;0.238095;, 0.833333;0.238095;, 0.738095;0.214286;, 0.761905;0.214286;, 0.785714;0.214286;, 0.809524;0.214286;, 0.833333;0.214286;, 0.738095;0.190476;, 0.761905;0.190476;, 0.785714;0.190476;, 0.809524;0.190476;, 0.833333;0.190476;, 0.738095;0.166667;, 0.761905;0.166667;, 0.785714;0.166667;, 0.809524;0.166667;, 0.833333;0.166667;, 0.880952;0.261905;, 0.904762;0.261905;, 0.928571;0.261905;, 0.952381;0.261905;, 0.880952;0.238095;, 0.904762;0.238095;, 0.928571;0.238095;, 0.880952;0.214286;, 0.904762;0.214286;, 0.880952;0.190476;, 0.904762;0.190476;, 0.880952;0.166667;, 0.166667;0.119048;, 0.190476;0.119048;, 0.214286;0.119048;, 0.238095;0.119048;, 0.261905;0.119048;, 0.166667;0.095238;, 0.190476;0.095238;, 0.214286;0.095238;, 0.238095;0.095238;, 0.261905;0.095238;, 0.238095;0.071429;, 0.261905;0.071429;, 0.238095;0.047619;, 0.261905;0.047619;, 0.309524;0.119048;, 0.333333;0.119048;, 0.357143;0.119048;, 0.380952;0.119048;, 0.404762;0.119048;, 0.309524;0.095238;, 0.333333;0.095238;, 0.357143;0.095238;, 0.380952;0.095238;, 0.404762;0.095238;, 0.309524;0.071429;, 0.333333;0.071429;, 0.357143;0.071429;, 0.380952;0.071429;, 0.404762;0.071429;, 0.309524;0.047619;, 0.333333;0.047619;, 0.357143;0.047619;, 0.380952;0.047619;, 0.404762;0.047619;, 0.333333;0.023810;, 0.357143;0.023810;, 0.380952;0.023810;, 0.404762;0.023810;, 0.452381;0.119048;, 0.476190;0.119048;, 0.500000;0.119048;, 0.523810;0.119048;, 0.547619;0.119048;, 0.452381;0.095238;, 0.476190;0.095238;, 0.500000;0.095238;, 0.523810;0.095238;, 0.547619;0.095238;, 0.452381;0.071429;, 0.476190;0.071429;, 0.500000;0.071429;, 0.523810;0.071429;, 0.547619;0.071429;, 0.452381;0.047619;, 0.476190;0.047619;, 0.500000;0.047619;, 0.523810;0.047619;, 0.547619;0.047619;, 0.452381;0.023810;, 0.476190;0.023810;, 0.500000;0.023810;, 0.523810;0.023810;, 0.547619;0.023810;, 0.595238;0.119048;, 0.619048;0.119048;, 0.642857;0.119048;, 0.666667;0.119048;, 0.690476;0.119048;, 0.595238;0.095238;, 0.619048;0.095238;, 0.642857;0.095238;, 0.666667;0.095238;, 0.690476;0.095238;, 0.595238;0.071429;, 0.619048;0.071429;, 0.642857;0.071429;, 0.666667;0.071429;, 0.690476;0.071429;, 0.595238;0.047619;, 0.619048;0.047619;, 0.642857;0.047619;, 0.666667;0.047619;, 0.690476;0.047619;, 0.595238;0.023810;, 0.619048;0.023810;, 0.642857;0.023810;, 0.666667;0.023810;, 0.738095;0.119048;, 0.761905;0.119048;, 0.785714;0.119048;, 0.809524;0.119048;, 0.833333;0.119048;, 0.738095;0.095238;, 0.761905;0.095238;, 0.785714;0.095238;, 0.809524;0.095238;, 0.738095;0.071429;, 0.761905;0.071429;, 0.785714;0.071429;, 0.738095;0.047619;; } } } ================================================ FILE: common/Addons/DXTest/DX8DolphinVS/trace.txt ================================================ ================================================ FILE: common/Addons/DXTest/DX9EnvMapping/airplane 2.x ================================================ xof 0303txt 0032 template VertexDuplicationIndices { DWORD nIndices; DWORD nOriginalVertices; array DWORD indices[nIndices]; } template FVFData { DWORD dwFVF; DWORD nDWords; array DWORD data[nDWords]; } template EffectFloats { DWORD nFloats; array FLOAT Floats[nFloats]; } template EffectString { STRING Value; } template EffectDWord { <622c0ed0-956e-4da9-908a-2af94f3ce716> DWORD Value; } template EffectInstance { STRING EffectFilename; [...] } template AnimTicksPerSecond { <9e415a43-7ba6-4a73-8743-b73d47e88476> DWORD AnimTicksPerSecond; } template VertexElement { DWORD Type; DWORD Method; DWORD Usage; DWORD UsageIndex; } template DeclData { DWORD nElements; array VertexElement Elements[nElements]; DWORD nDWords; array DWORD data[nDWords]; } Frame SCENE_ROOT { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Frame airplane_b { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh { 245; 0.350782;0.134766;-3.705020;, -0.299976;0.134766;-3.705020;, 0.350782;0.562877;-3.586500;, -0.299976;0.562877;-3.586500;, 0.435276;0.357646;-2.367070;, -0.384470;0.357646;-2.367070;, 0.390268;-0.269818;-2.919710;, -0.339463;-0.269818;-2.919710;, -0.226041;0.540056;-2.367070;, 0.276847;0.540056;-2.367070;, 0.438828;0.349993;-2.075790;, 0.253892;0.646877;-2.075800;, -0.203087;0.646877;-2.075800;, -0.388023;0.349993;-2.075790;, -0.380393;-0.399859;-2.164040;, 0.431218;-0.400603;-2.164040;, 0.417014;0.254447;-0.762626;, 0.247847;0.503541;-0.762633;, -0.197042;0.503541;-0.762633;, -0.366208;0.254448;-0.762626;, -0.375042;-0.511327;-1.030540;, 0.425848;-0.511328;-1.030540;, 0.127371;0.058052;2.965310;, -0.076567;0.058052;2.965310;, -0.076567;-0.267921;2.965320;, 0.127371;-0.267921;2.965320;, -0.377115;0.302220;-1.419208;, -0.200065;0.575209;-1.419217;, 0.250870;0.575209;-1.419217;, 0.427921;0.302220;-1.419208;, 0.208380;0.642622;-2.036815;, -0.157575;0.642622;-2.036815;, -0.155154;0.579488;-1.441064;, 0.205959;0.579488;-1.441064;, 0.205959;0.570954;-1.397582;, -0.155154;0.570954;-1.397582;, -0.152734;0.507819;-0.801831;, 0.203539;0.507819;-0.801831;, 0.356128;-0.048342;-2.036815;, -0.305322;-0.048342;-2.036815;, -0.305322;-0.104661;-1.441064;, 0.356128;-0.104661;-1.441064;, 0.356128;-0.113195;-1.397582;, -0.305322;-0.113195;-1.397582;, -0.305322;-0.176329;-0.780043;, 0.356128;-0.176329;-0.780043;, 0.356128;-0.267741;-1.908320;, -0.305322;-0.267741;-1.908320;, -0.305322;-0.296094;-1.608397;, 0.356128;-0.296094;-1.608397;, 0.356128;-0.334132;-1.265243;, -0.305322;-0.334132;-1.265243;, -0.305322;-0.365916;-0.954351;, 0.356128;-0.365916;-0.954351;, -0.385296;0.338050;-1.911644;, -0.323268;0.453416;-1.889030;, -0.253817;0.453416;-1.889030;, -0.305322;-0.062422;-1.887877;, -0.379842;0.314164;-1.583353;, -0.320955;0.433134;-1.601430;, -0.251964;0.433134;-1.601430;, -0.305322;-0.090581;-1.590002;, 0.436101;0.338050;-1.911644;, 0.374073;0.453416;-1.889030;, 0.304622;0.453416;-1.889030;, 0.356128;-0.062422;-1.887877;, 0.430648;0.314163;-1.583353;, 0.371759;0.433134;-1.601430;, 0.302769;0.433134;-1.601430;, 0.356128;-0.090581;-1.590002;, 0.425194;0.290277;-1.255062;, 0.375180;0.384325;-1.236900;, 0.305508;0.384325;-1.236900;, 0.356128;-0.128978;-1.243197;, 0.419741;0.266390;-0.926771;, 0.372827;0.354953;-0.926779;, 0.303624;0.354953;-0.926779;, 0.356128;-0.160545;-0.934428;, -0.368935;0.266391;-0.926771;, -0.322022;0.354953;-0.926779;, -0.252819;0.354953;-0.926779;, -0.305322;-0.160545;-0.934428;, -0.374389;0.290277;-1.255062;, -0.324375;0.384325;-1.236900;, -0.254703;0.384325;-1.236900;, -0.305322;-0.128978;-1.243197;, 0.350782;0.562877;-3.586500;, 0.350782;0.134766;-3.705020;, -0.339463;-0.269818;-2.919710;, -0.299976;0.562877;-3.586500;, 0.390268;-0.269818;-2.919710;, 0.350782;0.134766;-3.705020;, 0.350782;0.562877;-3.586500;, -0.299976;0.562877;-3.586500;, -0.384470;0.357646;-2.367070;, 0.276847;0.540056;-2.367070;, 0.350782;0.562877;-3.586500;, -0.299976;0.562877;-3.586500;, 0.127371;0.058052;2.965310;, -0.076567;0.058052;2.965310;, 0.276847;0.540056;-2.367070;, 0.253892;0.646877;-2.075800;, -0.384470;0.357646;-2.367070;, -0.203087;0.646877;-2.075800;, -0.339463;-0.269818;-2.919710;, 0.390268;-0.269818;-2.919710;, 0.431218;-0.400603;-2.164040;, -0.203087;0.646877;-2.075800;, -0.375042;-0.511327;-1.030540;, 0.431218;-0.400603;-2.164040;, 0.247847;0.503541;-0.762633;, 0.127371;0.058052;2.965310;, -0.076567;0.058052;2.965310;, -0.076567;0.058052;2.965310;, -0.375042;-0.511327;-1.030540;, 0.127371;-0.267921;2.965320;, 0.425848;-0.511328;-1.030540;, 0.127371;-0.267921;2.965320;, 0.253892;0.646877;-2.075800;, -0.203087;0.646877;-2.075800;, -0.323268;0.453416;-1.889030;, 0.374073;0.453416;-1.889030;, -0.324375;0.384325;-1.236900;, 0.247847;0.503541;-0.762633;, 0.375180;0.384325;-1.236900;, 0.208380;0.642622;-2.036815;, -0.253817;0.453416;-1.889030;, -0.305322;-0.048342;-2.036815;, 0.205959;0.579488;-1.441064;, 0.205959;0.579488;-1.441064;, 0.302769;0.433134;-1.601430;, 0.205959;0.570954;-1.397582;, -0.254703;0.384325;-1.236900;, -0.305322;-0.113195;-1.397582;, -0.152734;0.507819;-0.801831;, 0.203539;0.507819;-0.801831;, 0.203539;0.507819;-0.801831;, 0.303624;0.354953;-0.926779;, 0.356128;-0.048342;-2.036815;, -0.305322;-0.048342;-2.036815;, 0.356128;-0.267741;-1.908320;, 0.356128;-0.104661;-1.441064;, 0.356128;-0.296094;-1.608397;, -0.305322;-0.296094;-1.608397;, 0.356128;-0.104661;-1.441064;, 0.356128;-0.296094;-1.608397;, 0.356128;-0.113195;-1.397582;, -0.305322;-0.113195;-1.397582;, 0.356128;-0.334132;-1.265243;, 0.356128;-0.176329;-0.780043;, 0.356128;-0.365916;-0.954351;, -0.305322;-0.365916;-0.954351;, 0.356128;-0.176329;-0.780043;, 0.356128;-0.365916;-0.954351;, -0.324375;0.384325;-1.236900;, 0.247847;0.503541;-0.762633;, 0.372827;0.354953;-0.926779;, 0.372827;0.354953;-0.926779;, -0.323268;0.453416;-1.889030;, 0.371759;0.433134;-1.601430;, -0.253817;0.453416;-1.889030;, -0.254703;0.384325;-1.236900;, 0.303624;0.354953;-0.926779;, 0.356128;-0.365916;-0.954351;, 0.356128;-0.334132;-1.265243;, 0.302769;0.433134;-1.601430;, 0.356128;-0.296094;-1.608397;, 0.356128;-0.267741;-1.908320;, -0.320955;0.433134;-1.601430;, -0.155154;0.579488;-1.441064;, -0.155154;0.579488;-1.441064;, -0.305322;-0.296094;-1.608397;, 0.304622;0.453416;-1.889030;, 0.374073;0.453416;-1.889030;, 0.208380;0.642622;-2.036815;, 0.356128;-0.048342;-2.036815;, 0.356128;-0.267741;-1.908320;, 0.356128;-0.048342;-2.036815;, 0.375180;0.384325;-1.236900;, 0.205959;0.570954;-1.397582;, 0.356128;-0.113195;-1.397582;, 0.356128;-0.334132;-1.265243;, 0.356128;-0.113195;-1.397582;, -0.322022;0.354953;-0.926779;, -0.152734;0.507819;-0.801831;, -0.152734;0.507819;-0.801831;, -0.305322;-0.365916;-0.954351;, 0.435276;0.357646;-2.367070;, 0.435276;0.357646;-2.367070;, 0.425848;-0.511328;-1.030540;, 0.127371;-0.267921;2.965320;, 0.127371;0.058052;2.965310;, 0.371759;0.433134;-1.601430;, 0.250870;0.575209;-1.419217;, 0.250870;0.575209;-1.419217;, 0.372827;0.354953;-0.926779;, -0.200065;0.575209;-1.419217;, 0.253892;0.646877;-2.075800;, 0.304622;0.453416;-1.889030;, -0.203087;0.646877;-2.075800;, -0.320955;0.433134;-1.601430;, -0.200065;0.575209;-1.419217;, -0.322022;0.354953;-0.926779;, -0.322022;0.354953;-0.926779;, -0.197042;0.503541;-0.762633;, 0.305508;0.384325;-1.236900;, 0.305508;0.384325;-1.236900;, 0.203539;0.507819;-0.801831;, -0.299976;0.134766;-3.705020;, -0.299976;0.562877;-3.586500;, -0.226041;0.540056;-2.367070;, -0.226041;0.540056;-2.367070;, -0.157575;0.642622;-2.036815;, -0.305322;-0.048342;-2.036815;, -0.305322;-0.267741;-1.908320;, -0.305322;-0.267741;-1.908320;, -0.305322;-0.104661;-1.441064;, -0.305322;-0.104661;-1.441064;, -0.155154;0.570954;-1.397582;, -0.305322;-0.113195;-1.397582;, -0.305322;-0.334132;-1.265243;, -0.305322;-0.334132;-1.265243;, -0.305322;-0.176329;-0.780043;, -0.305322;-0.176329;-0.780043;, -0.197042;0.503541;-0.762633;, -0.197042;0.503541;-0.762633;, -0.076567;-0.267921;2.965320;, -0.076567;-0.267921;2.965320;, -0.380393;-0.399859;-2.164040;, -0.380393;-0.399859;-2.164040;, -0.299976;0.134766;-3.705020;, -0.157575;0.642622;-2.036815;, -0.251964;0.433134;-1.601430;, -0.155154;0.579488;-1.441064;, -0.251964;0.433134;-1.601430;, -0.155154;0.570954;-1.397582;, -0.252819;0.354953;-0.926779;, -0.152734;0.507819;-0.801831;, -0.252819;0.354953;-0.926779;, 0.205959;0.579488;-1.441064;, 0.356128;-0.104661;-1.441064;, 0.203539;0.507819;-0.801831;, 0.356128;-0.176329;-0.780043;, -0.305322;-0.296094;-1.608397;, -0.305322;-0.365916;-0.954351;; 168; 3;0,3,2;, 3;86,9,4;, 3;22,17,23;, 3;6,7,87;, 3;88,5,89;, 3;90,91,92;, 3;8,93,94;, 3;95,96,97;, 3;98,99,25;, 3;4,11,10;, 3;100,12,101;, 3;8,102,103;, 3;5,104,13;, 3;7,6,15;, 3;105,10,106;, 3;63,66,62;, 3;46,48,49;, 3;107,13,55;, 3;20,78,82;, 3;15,21,108;, 3;109,10,62;, 3;16,110,111;, 3;18,19,112;, 3;19,24,113;, 3;114,21,115;, 3;116,16,117;, 3;27,26,83;, 3;50,52,53;, 3;71,74,70;, 3;118,119,30;, 3;120,56,31;, 3;34,28,33;, 3;121,68,67;, 3;122,84,35;, 3;123,37,36;, 3;124,76,75;, 3;125,39,38;, 3;126,57,127;, 3;32,128,41;, 3;129,130,69;, 3;131,43,42;, 3;132,85,133;, 3;134,135,45;, 3;136,137,77;, 3;138,139,140;, 3;127,57,47;, 3;141,142,143;, 3;144,69,145;, 3;146,147,148;, 3;133,85,51;, 3;149,150,151;, 3;152,77,153;, 3;79,83,78;, 3;80,84,154;, 3;37,155,156;, 3;157,16,74;, 3;59,55,58;, 3;60,56,158;, 3;33,28,67;, 3;159,29,66;, 3;61,57,160;, 3;47,57,61;, 3;81,85,161;, 3;51,85,81;, 3;77,162,72;, 3;163,77,164;, 3;69,165,64;, 3;166,69,167;, 3;59,26,27;, 3;60,168,169;, 3;61,170,40;, 3;171,61,40;, 3;63,62,10;, 3;172,173,30;, 3;64,174,175;, 3;176,65,177;, 3;71,70,29;, 3;178,28,34;, 3;72,179,180;, 3;181,73,182;, 3;79,19,18;, 3;80,183,184;, 3;81,185,44;, 3;186,81,44;, 3;88,89,1;, 3;13,88,14;, 3;90,92,187;, 3;10,90,188;, 3;14,54,13;, 3;14,58,54;, 3;14,26,58;, 3;20,26,14;, 3;20,82,26;, 3;78,20,19;, 3;106,29,189;, 3;66,106,62;, 3;29,106,66;, 3;116,70,74;, 3;70,116,29;, 3;116,74,16;, 3;24,19,20;, 3;190,16,191;, 3;103,94,13;, 3;11,4,9;, 3;55,13,54;, 3;58,55,54;, 3;63,10,11;, 3;66,63,192;, 3;29,159,193;, 3;71,29,194;, 3;74,71,195;, 3;26,59,58;, 3;83,26,82;, 3;78,83,82;, 3;19,79,78;, 3;16,157,110;, 3;34,169,35;, 3;169,34,33;, 3;35,169,196;, 3;30,121,197;, 3;68,121,198;, 3;120,31,199;, 3;60,120,200;, 3;33,67,68;, 3;169,168,201;, 3;122,35,196;, 3;80,122,202;, 3;36,203,204;, 3;124,34,205;, 3;76,124,206;, 3;207,75,76;, 3;3,0,208;, 3;95,209,210;, 3;12,95,211;, 3;30,119,31;, 3;39,125,212;, 3;140,213,214;, 3;48,46,215;, 3;141,143,216;, 3;32,41,217;, 3;43,131,218;, 3;148,219,220;, 3;52,50,221;, 3;149,151,222;, 3;134,45,223;, 3;123,36,224;, 3;23,17,225;, 3;25,99,226;, 3;108,115,227;, 3;15,108,228;, 3;7,15,229;, 3;87,7,230;, 3;126,127,231;, 3;61,126,232;, 3;233,61,234;, 3;132,133,235;, 3;81,132,236;, 3;237,81,238;, 3;64,175,65;, 3;69,64,65;, 3;239,69,240;, 3;72,180,73;, 3;77,72,73;, 3;241,77,242;, 3;164,77,73;, 3;167,69,65;, 3;47,61,243;, 3;51,81,244;; MeshNormals { 245; 0.000000;0.266808;-0.963750;, -0.998959;0.012170;-0.043960;, 0.000000;0.266808;-0.963750;, 0.000000;0.266808;-0.963750;, 0.777074;0.629327;0.010145;, -0.997991;-0.018108;-0.060716;, 0.000000;-0.944615;-0.328179;, -0.000237;-0.947423;-0.319985;, -0.754938;0.655688;0.011960;, 0.754937;0.655688;0.011960;, 0.996415;0.079394;-0.029230;, 0.822045;0.567067;-0.051743;, 0.000000;0.938853;-0.344317;, -0.996412;0.079432;-0.029208;, -0.999940;-0.004298;-0.010108;, -0.000466;-0.992027;-0.126022;, 0.989979;0.115716;0.080940;, 0.000000;0.992935;0.118656;, -0.823550;0.559299;0.094602;, -0.989979;0.115715;0.080940;, -0.998471;-0.009568;0.054440;, -0.000001;-0.999666;0.025858;, 0.000000;0.992935;0.118656;, 0.000000;0.992935;0.118656;, -0.997053;-0.010578;0.075983;, 0.000000;0.000031;1.000000;, -0.997843;0.064118;0.014072;, -0.837228;0.542995;0.064850;, 0.289480;0.946159;0.144857;, 0.997844;0.064107;0.014083;, 0.109412;0.900472;0.420927;, -0.149218;0.834089;0.531065;, 0.000000;0.000000;-1.000000;, 0.093231;0.949373;-0.299999;, 0.053670;0.887061;0.458521;, -0.070806;0.838773;0.539857;, -0.147861;0.987223;-0.059393;, 0.238919;0.956807;-0.165642;, 0.000000;0.000000;1.000000;, 0.000000;0.000000;1.000000;, 0.985984;-0.166102;-0.015703;, 0.000000;0.000000;-1.000000;, 0.000000;0.000000;1.000000;, 0.000000;0.000000;1.000000;, 0.985451;-0.169080;-0.017286;, 0.000000;-0.031831;-0.999493;, 0.000000;0.995561;0.094115;, 1.000000;0.000000;0.000000;, 0.000000;0.995561;0.094115;, 0.000000;0.995561;0.094115;, 0.000000;0.994815;0.101705;, 1.000000;0.000000;0.000000;, 0.000000;0.994815;0.101705;, 0.000000;0.994815;0.101705;, -0.997975;0.060060;0.020950;, -0.873164;0.486615;0.028134;, 0.000000;0.901116;0.433577;, 0.997450;-0.071058;-0.006717;, -0.995589;0.091093;0.022464;, -0.864408;0.495225;0.086895;, 0.000000;0.989893;-0.141816;, 0.992556;-0.096346;-0.074495;, 0.997977;0.060033;0.020946;, 0.873163;0.486617;0.028135;, -0.989858;-0.123422;0.070338;, -0.997449;-0.071060;-0.006718;, 0.995593;0.091045;0.022459;, 0.087533;0.940546;-0.328195;, 0.000000;0.989893;-0.141815;, -0.992556;-0.096347;-0.074494;, 0.997898;0.061299;0.021036;, 0.866886;0.497720;0.027980;, -0.989865;-0.124386;0.068523;, -0.997521;-0.070000;-0.007156;, 0.995837;0.088170;0.023112;, 0.000000;0.961996;-0.273062;, 0.000000;0.992194;-0.124703;, -0.992624;-0.093847;-0.076743;, -0.995837;0.088169;0.023114;, -0.853004;0.514724;0.086275;, 0.000000;0.992194;-0.124703;, 0.992624;-0.093846;-0.076744;, -0.997898;0.061298;0.021036;, -0.866887;0.497719;0.027978;, 0.000000;0.908907;0.417000;, 0.997522;-0.069998;-0.007156;, 0.753723;0.654633;0.057950;, 0.000000;-0.888961;-0.457984;, -0.998187;-0.003070;-0.060104;, -0.998037;-0.002773;-0.062566;, 0.998364;-0.010093;-0.056285;, 0.998959;0.012170;-0.043959;, 0.998037;-0.002774;-0.062566;, -0.753723;0.654633;0.057950;, -0.780194;0.623981;0.044103;, 0.000000;0.999844;-0.017632;, 0.000000;0.999825;0.018711;, 0.000000;0.999825;0.018711;, 0.000000;0.000031;1.000000;, 0.000000;0.000031;1.000000;, 0.000000;0.938853;-0.344317;, 0.000000;0.938853;-0.344317;, -0.742922;0.645252;-0.178094;, -0.810819;0.580867;-0.071878;, -0.998134;-0.059495;-0.013738;, 0.998493;-0.003687;-0.054747;, 0.999923;-0.003752;-0.011867;, -0.848788;0.528730;0.001502;, -0.000319;-0.998801;-0.048946;, 0.999804;-0.011987;0.015738;, 0.823550;0.559299;0.094603;, 0.823639;0.559360;0.093461;, -0.823640;0.559359;0.093461;, -0.996995;0.000002;0.077461;, -0.000001;-0.998150;0.060802;, -0.000001;-0.998150;0.060802;, 0.997693;-0.011877;0.066845;, 0.997044;-0.014871;0.075382;, 0.000000;0.994096;0.108500;, 0.000000;0.994096;0.108500;, -0.135252;0.867776;0.478196;, 0.123156;0.967400;0.221293;, -0.067228;0.872590;0.483805;, 0.000000;0.994097;0.108494;, 0.000000;0.953854;0.300270;, 0.000000;0.000000;1.000000;, 0.985155;-0.134238;0.106999;, 0.974843;-0.137104;0.175737;, 0.000000;0.000000;-1.000000;, -0.889652;-0.100364;-0.445472;, -0.889652;-0.100364;-0.445472;, 0.000000;0.000000;1.000000;, 0.985272;-0.135965;0.103693;, 0.974812;-0.140714;0.173036;, 0.000000;-0.031831;-0.999493;, 0.000000;-0.031831;-0.999493;, -0.821165;-0.075242;-0.565709;, -0.821165;-0.075242;-0.565709;, 0.000000;0.505373;0.862901;, 0.000000;0.505373;0.862901;, 0.000000;0.505373;0.862901;, 0.000000;0.658124;-0.752910;, 0.000000;0.658124;-0.752910;, 0.000000;0.658124;-0.752910;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 0.000000;0.513858;0.857875;, 0.000000;0.513858;0.857875;, 0.000000;0.513858;0.857875;, 0.000000;0.676821;-0.736148;, 0.000000;0.676821;-0.736148;, 0.000000;0.676821;-0.736148;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 0.000000;0.995545;0.094289;, 0.432857;0.807272;-0.401182;, 0.432857;0.807272;-0.401182;, 0.837833;0.536170;0.102751;, 0.000000;0.997523;0.070347;, 0.849402;0.516334;0.109159;, 0.995006;-0.099370;-0.009394;, 0.995135;-0.098012;-0.010020;, -0.994755;-0.101085;-0.015617;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -0.994728;-0.101645;-0.013577;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -0.141911;0.799824;-0.583218;, -0.069126;0.983432;-0.167579;, 0.976547;-0.214348;-0.020264;, 1.000000;0.000000;0.000000;, 0.000000;0.615561;0.788090;, 0.000000;0.615561;0.788090;, -0.917390;-0.196164;0.346287;, -0.965892;-0.159283;0.204162;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 0.230131;0.746346;0.624505;, -0.920142;-0.201969;0.335482;, -0.966035;-0.163039;0.200486;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 0.000000;0.632861;-0.774266;, 0.000000;0.632861;-0.774266;, 0.975625;-0.218308;-0.022319;, 1.000000;0.000000;0.000000;, 0.997456;-0.009298;-0.070678;, 0.998134;-0.059499;-0.013735;, 0.999989;-0.000299;0.004708;, 0.996995;0.000002;0.077462;, 0.996995;0.000002;0.077462;, 0.893188;0.448008;0.038781;, 0.831739;0.539441;0.131204;, 0.838991;0.544140;-0.002344;, 0.882523;0.467499;0.050974;, -0.205690;0.786930;0.581750;, 0.385611;0.753550;0.532416;, 0.000000;0.997523;0.070347;, -0.385611;0.753550;0.532416;, 0.000000;0.997523;0.070347;, -0.300854;0.838548;-0.454229;, 0.000000;0.995545;0.094289;, -0.432857;0.807272;-0.401182;, -0.432857;0.807272;-0.401182;, 0.000000;0.652462;0.757821;, 0.000000;0.995545;0.094289;, 0.000000;0.632861;-0.774266;, 0.000000;0.266808;-0.963750;, 0.000000;0.999825;0.018711;, 0.000000;0.999825;0.018711;, 0.000000;0.938853;-0.344317;, 0.000000;0.000000;1.000000;, 0.000000;0.505373;0.862901;, 0.000000;0.505373;0.862901;, 0.000000;0.995561;0.094115;, 0.000000;0.658124;-0.752910;, 0.000000;0.000000;-1.000000;, 0.000000;0.000000;1.000000;, 0.000000;0.513858;0.857875;, 0.000000;0.513858;0.857875;, 0.000000;0.994815;0.101705;, 0.000000;0.676821;-0.736148;, 0.000000;-0.031831;-0.999493;, 0.000000;0.994097;0.108494;, 0.000000;0.992935;0.118656;, 0.000000;0.000031;1.000000;, 0.000000;-0.998150;0.060802;, -0.000912;-0.995199;-0.097863;, -0.000903;-0.985505;-0.169642;, 0.000000;-0.888961;-0.457984;, 0.917390;-0.196163;0.346288;, 0.994728;-0.101643;-0.013577;, 0.889652;-0.100362;-0.445474;, 0.889652;-0.100362;-0.445474;, 0.920141;-0.201967;0.335483;, 0.994755;-0.101083;-0.015617;, 0.821164;-0.075241;-0.565711;, 0.821164;-0.075241;-0.565711;, -0.976547;-0.214350;-0.020264;, -0.976547;-0.214350;-0.020264;, -0.975624;-0.218309;-0.022320;, -0.975624;-0.218309;-0.022320;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;; 168; 3;0,3,2;, 3;86,9,4;, 3;22,17,23;, 3;6,7,87;, 3;88,5,89;, 3;90,91,92;, 3;8,93,94;, 3;95,96,97;, 3;98,99,25;, 3;4,11,10;, 3;100,12,101;, 3;8,102,103;, 3;5,104,13;, 3;7,6,15;, 3;105,10,106;, 3;63,66,62;, 3;46,48,49;, 3;107,13,55;, 3;20,78,82;, 3;15,21,108;, 3;109,10,62;, 3;16,110,111;, 3;18,19,112;, 3;19,24,113;, 3;114,21,115;, 3;116,16,117;, 3;27,26,83;, 3;50,52,53;, 3;71,74,70;, 3;118,119,30;, 3;120,56,31;, 3;34,28,33;, 3;121,68,67;, 3;122,84,35;, 3;123,37,36;, 3;124,76,75;, 3;125,39,38;, 3;126,57,127;, 3;32,128,41;, 3;129,130,69;, 3;131,43,42;, 3;132,85,133;, 3;134,135,45;, 3;136,137,77;, 3;138,139,140;, 3;127,57,47;, 3;141,142,143;, 3;144,69,145;, 3;146,147,148;, 3;133,85,51;, 3;149,150,151;, 3;152,77,153;, 3;79,83,78;, 3;80,84,154;, 3;37,155,156;, 3;157,16,74;, 3;59,55,58;, 3;60,56,158;, 3;33,28,67;, 3;159,29,66;, 3;61,57,160;, 3;47,57,61;, 3;81,85,161;, 3;51,85,81;, 3;77,162,72;, 3;163,77,164;, 3;69,165,64;, 3;166,69,167;, 3;59,26,27;, 3;60,168,169;, 3;61,170,40;, 3;171,61,40;, 3;63,62,10;, 3;172,173,30;, 3;64,174,175;, 3;176,65,177;, 3;71,70,29;, 3;178,28,34;, 3;72,179,180;, 3;181,73,182;, 3;79,19,18;, 3;80,183,184;, 3;81,185,44;, 3;186,81,44;, 3;88,89,1;, 3;13,88,14;, 3;90,92,187;, 3;10,90,188;, 3;14,54,13;, 3;14,58,54;, 3;14,26,58;, 3;20,26,14;, 3;20,82,26;, 3;78,20,19;, 3;106,29,189;, 3;66,106,62;, 3;29,106,66;, 3;116,70,74;, 3;70,116,29;, 3;116,74,16;, 3;24,19,20;, 3;190,16,191;, 3;103,94,13;, 3;11,4,9;, 3;55,13,54;, 3;58,55,54;, 3;63,10,11;, 3;66,63,192;, 3;29,159,193;, 3;71,29,194;, 3;74,71,195;, 3;26,59,58;, 3;83,26,82;, 3;78,83,82;, 3;19,79,78;, 3;16,157,110;, 3;34,169,35;, 3;169,34,33;, 3;35,169,196;, 3;30,121,197;, 3;68,121,198;, 3;120,31,199;, 3;60,120,200;, 3;33,67,68;, 3;169,168,201;, 3;122,35,196;, 3;80,122,202;, 3;36,203,204;, 3;124,34,205;, 3;76,124,206;, 3;207,75,76;, 3;3,0,208;, 3;95,209,210;, 3;12,95,211;, 3;30,119,31;, 3;39,125,212;, 3;140,213,214;, 3;48,46,215;, 3;141,143,216;, 3;32,41,217;, 3;43,131,218;, 3;148,219,220;, 3;52,50,221;, 3;149,151,222;, 3;134,45,223;, 3;123,36,224;, 3;23,17,225;, 3;25,99,226;, 3;108,115,227;, 3;15,108,228;, 3;7,15,229;, 3;87,7,230;, 3;126,127,231;, 3;61,126,232;, 3;233,61,234;, 3;132,133,235;, 3;81,132,236;, 3;237,81,238;, 3;64,175,65;, 3;69,64,65;, 3;239,69,240;, 3;72,180,73;, 3;77,72,73;, 3;241,77,242;, 3;164,77,73;, 3;167,69,65;, 3;47,61,243;, 3;51,81,244;; } MeshTextureCoords { 245; 0.830568;-0.996310;, 0.858212;-0.998666;, 0.829807;-0.954350;, 0.668791;-0.954638;, 0.688022;-0.799051;, 0.814918;-0.798328;, 0.825319;-0.881120;, 0.694015;-0.881868;, 0.780420;-0.798524;, 0.718793;-0.798875;, 0.686482;-0.755391;, 0.736564;-0.755107;, 0.717833;-0.755213;, 0.816116;-0.754652;, 0.958007;-0.767074;, 0.832042;-0.767792;, 0.669243;-0.558620;, 0.797850;-0.557888;, 0.785955;-0.557956;, 0.833064;-0.557686;, 0.978120;-0.597025;, 0.830218;-0.617244;, 0.772987;-0.158226;, 0.736292;-0.158434;, 0.928672;-0.157336;, 0.000000;-3.000000;, 0.824591;-0.656169;, 0.772961;-0.656465;, 0.727517;-0.689972;, 0.677862;-0.657005;, 0.731321;-0.650436;, 0.766017;-0.650238;, 0.766005;-0.688355;, 0.731767;-0.688550;, 0.731783;-0.691332;, 0.766021;-0.691137;, 0.766008;-0.729253;, 0.732230;-0.729445;, 0.717313;-0.650516;, 0.780025;-0.650159;, 0.780242;-0.688273;, 0.717529;-0.688631;, 0.717545;-0.691413;, 0.780258;-0.691055;, 0.780483;-0.730565;, 0.717771;-0.730922;, 0.717360;-0.658737;, 0.780072;-0.658379;, 0.780182;-0.677568;, 0.717469;-0.677925;, 0.717594;-0.699880;, 0.780306;-0.699522;, 0.780420;-0.719412;, 0.717707;-0.719770;, 0.818235;-0.730032;, 0.796397;-0.726765;, 0.775196;-0.659641;, 0.780079;-0.659687;, 0.822472;-0.680790;, 0.799987;-0.683628;, 0.775125;-0.678043;, 0.780188;-0.678745;, 0.684327;-0.730794;, 0.703769;-0.727293;, 0.722250;-0.659943;, 0.717367;-0.660045;, 0.680017;-0.681602;, 0.715989;-0.678380;, 0.722530;-0.678342;, 0.717476;-0.679102;, 0.675707;-0.632409;, 0.691557;-0.629595;, 0.722403;-0.701666;, 0.717602;-0.701290;, 0.671397;-0.583216;, 0.716134;-0.721543;, 0.722695;-0.721506;, 0.717715;-0.721045;, 0.830946;-0.582307;, 0.814197;-0.582403;, 0.775452;-0.721205;, 0.780427;-0.720687;, 0.826709;-0.631548;, 0.808907;-0.628927;, 0.775518;-0.701363;, 0.780315;-0.700933;, 0.723684;-0.981664;, 0.818885;-0.998890;, 0.934058;-0.880501;, 0.777145;-0.981360;, 0.582647;-0.882503;, 0.651567;-0.999844;, 0.723684;-0.981664;, 0.777145;-0.981360;, 0.814918;-0.798328;, 0.804438;-0.798387;, 0.818784;-0.981122;, 0.701690;-0.981789;, 0.000000;-2.000000;, 1.000000;-2.000000;, 0.804438;-0.798387;, 0.800059;-0.754745;, 0.814918;-0.798328;, 0.759968;-0.754974;, 0.934058;-0.880501;, 0.582647;-0.882503;, 0.559939;-0.769342;, 0.759968;-0.754974;, 0.686110;-0.618066;, 0.559939;-0.769342;, 0.711262;-0.558381;, 0.632928;-0.159023;, 0.867023;-0.157690;, 0.867023;-0.157690;, 0.686110;-0.618066;, 0.772987;-0.158224;, 0.540292;-0.599520;, 0.577939;-0.159335;, 0.726992;-0.647967;, 0.770318;-0.647720;, 0.781781;-0.659604;, 0.715665;-0.659981;, 0.782123;-0.701326;, 0.728043;-0.731977;, 0.715798;-0.701704;, 0.731321;-0.650436;, 0.775196;-0.659641;, 0.780025;-0.650159;, 0.731767;-0.688550;, 0.731767;-0.688550;, 0.722530;-0.678342;, 0.731783;-0.691332;, 0.775518;-0.701363;, 0.780258;-0.691055;, 0.766008;-0.729253;, 0.732230;-0.729445;, 0.732230;-0.729445;, 0.722695;-0.721506;, 0.717313;-0.650516;, 0.780025;-0.650159;, 0.717360;-0.658737;, 0.717529;-0.688631;, 0.717469;-0.677925;, 0.780182;-0.677568;, 0.717529;-0.688631;, 0.717469;-0.677925;, 0.717545;-0.691413;, 0.780258;-0.691055;, 0.717594;-0.699880;, 0.717771;-0.730922;, 0.717707;-0.719770;, 0.780420;-0.719412;, 0.717771;-0.730922;, 0.717707;-0.719770;, 0.782123;-0.701326;, 0.728043;-0.731977;, 0.716134;-0.721543;, 0.686337;-0.583132;, 0.781781;-0.659604;, 0.700102;-0.684197;, 0.775196;-0.659641;, 0.775518;-0.701363;, 0.722695;-0.721506;, 0.717707;-0.719770;, 0.717594;-0.699880;, 0.722530;-0.678342;, 0.717469;-0.677925;, 0.717360;-0.658737;, 0.781666;-0.678005;, 0.766005;-0.688355;, 0.766005;-0.688355;, 0.780182;-0.677568;, 0.722250;-0.659943;, 0.715665;-0.659981;, 0.731321;-0.650436;, 0.717313;-0.650516;, 0.717360;-0.658737;, 0.717313;-0.650516;, 0.715798;-0.701704;, 0.731783;-0.691332;, 0.717545;-0.691413;, 0.717594;-0.699880;, 0.717545;-0.691413;, 0.782013;-0.721168;, 0.766008;-0.729253;, 0.766008;-0.729253;, 0.780420;-0.719412;, 0.688022;-0.799051;, 0.688022;-0.799051;, 0.540292;-0.599520;, 0.577939;-0.159335;, 0.632928;-0.159023;, 0.700102;-0.684197;, 0.723913;-0.656744;, 0.723913;-0.656744;, 0.686337;-0.583132;, 0.770271;-0.689728;, 0.726992;-0.647967;, 0.722250;-0.659943;, 0.770318;-0.647720;, 0.781666;-0.678005;, 0.770271;-0.689728;, 0.782013;-0.721168;, 0.782013;-0.721168;, 0.770224;-0.731737;, 0.722403;-0.701666;, 0.722403;-0.701666;, 0.732230;-0.729445;, 0.669552;-0.996598;, 0.701690;-0.981789;, 0.713951;-0.798903;, 0.713951;-0.798903;, 0.766017;-0.650238;, 0.780025;-0.650159;, 0.780072;-0.658379;, 0.780072;-0.658379;, 0.780242;-0.688273;, 0.780242;-0.688273;, 0.766021;-0.691137;, 0.780258;-0.691055;, 0.780306;-0.699522;, 0.780306;-0.699522;, 0.780483;-0.730565;, 0.780483;-0.730565;, 0.770224;-0.731737;, 0.717799;-0.558344;, 1.000000;-3.000000;, 0.736292;-0.158433;, 0.686005;-0.768624;, 0.686005;-0.768624;, 0.701791;-0.999557;, 0.766017;-0.650238;, 0.775125;-0.678043;, 0.766005;-0.688355;, 0.775125;-0.678043;, 0.766021;-0.691137;, 0.775452;-0.721205;, 0.766008;-0.729253;, 0.775452;-0.721205;, 0.731767;-0.688550;, 0.717529;-0.688631;, 0.732230;-0.729445;, 0.717771;-0.730922;, 0.780182;-0.677568;, 0.780420;-0.719412;; } MeshMaterialList { 1; 168; 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; Material { 0.800000;0.800000;0.800000;0.000000;; 0.000000; 0.000000;0.000000;0.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "bihull.bmp"; } } } VertexDuplicationIndices { 245; 86; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 2, 0, 7, 3, 6, 0, 2, 3, 5, 9, 2, 3, 22, 23, 9, 11, 5, 12, 7, 6, 15, 12, 20, 15, 17, 22, 23, 23, 20, 25, 21, 25, 11, 12, 55, 63, 83, 17, 71, 30, 56, 39, 33, 33, 68, 34, 84, 43, 36, 37, 37, 76, 38, 39, 46, 41, 49, 48, 41, 49, 42, 43, 50, 45, 53, 52, 45, 53, 83, 17, 75, 75, 55, 67, 56, 84, 76, 53, 50, 68, 49, 46, 59, 32, 32, 48, 64, 63, 30, 38, 46, 38, 71, 34, 42, 50, 42, 79, 36, 36, 52, 4, 4, 21, 25, 22, 67, 28, 28, 75, 27, 11, 64, 12, 59, 27, 79, 79, 18, 72, 72, 37, 1, 3, 8, 8, 31, 39, 47, 47, 40, 40, 35, 43, 51, 51, 44, 44, 18, 18, 24, 24, 14, 14, 1, 31, 60, 32, 60, 35, 80, 36, 80, 33, 41, 37, 45, 48, 52; } } } Frame wing_poles { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.102858,0.000000,1.000000;; } Mesh { 256; 3.678300;-0.288631;-2.509480;, 3.553570;1.099530;-2.604250;, 3.553570;-0.288631;-2.509480;, 3.678300;1.099530;-2.604250;, 3.678300;-0.299920;-2.369920;, 3.553570;-0.299920;-2.369920;, 3.678300;1.081790;-2.474930;, 3.553570;1.081790;-2.474930;, 3.673010;-0.379267;-1.559630;, 3.548290;1.013120;-1.654870;, 3.548290;-0.379267;-1.559630;, 3.673010;1.013120;-1.654870;, 3.673010;-0.396630;-1.420710;, 3.548290;-0.396630;-1.420710;, 3.673010;0.997639;-1.525250;, 3.548290;0.997639;-1.525250;, 1.741860;-0.288631;-2.509480;, 1.617140;1.099530;-2.604250;, 1.617140;-0.288631;-2.509480;, 1.741860;1.099530;-2.604250;, 1.741860;-0.299920;-2.369920;, 1.617140;-0.299920;-2.369920;, 1.741860;1.081790;-2.474930;, 1.617140;1.081790;-2.474930;, 1.736570;-0.379267;-1.559630;, 1.611850;1.013120;-1.654870;, 1.611850;-0.379267;-1.559630;, 1.736570;1.013120;-1.654870;, 1.736570;-0.396630;-1.420710;, 1.611850;-0.396630;-1.420710;, 1.736570;0.997639;-1.525250;, 1.611850;0.997639;-1.525250;, -1.544050;-0.288631;-2.509480;, -1.668770;1.099530;-2.604250;, -1.668770;-0.288631;-2.509480;, -1.544050;1.099530;-2.604250;, -1.544050;-0.299920;-2.369920;, -1.668770;-0.299920;-2.369920;, -1.544050;1.081790;-2.474930;, -1.668770;1.081790;-2.474930;, -1.549350;-0.379267;-1.559630;, -1.674070;1.013120;-1.654870;, -1.674070;-0.379267;-1.559630;, -1.549350;1.013120;-1.654870;, -1.549350;-0.396629;-1.420710;, -1.674070;-0.396629;-1.420710;, -1.549350;0.997639;-1.525250;, -1.674070;0.997639;-1.525250;, -3.599630;-0.288630;-2.509480;, -3.724350;1.099530;-2.604250;, -3.724350;-0.288630;-2.509480;, -3.599630;1.099530;-2.604250;, -3.599630;-0.299919;-2.369920;, -3.724350;-0.299919;-2.369920;, -3.599630;1.081790;-2.474930;, -3.724350;1.081790;-2.474930;, -3.599630;-0.379267;-1.559630;, -3.724350;1.013120;-1.654870;, -3.724350;-0.379267;-1.559630;, -3.599630;1.013120;-1.654870;, -3.599630;-0.396629;-1.420710;, -3.724350;-0.396629;-1.420710;, -3.599630;0.997639;-1.525250;, -3.724350;0.997639;-1.525250;, 3.553570;-0.288631;-2.509480;, 3.678300;-0.288631;-2.509480;, 3.553570;-0.288631;-2.509480;, 3.553570;-0.299920;-2.369920;, 3.678300;-0.299920;-2.369920;, 3.553570;-0.299920;-2.369920;, 3.678300;1.099530;-2.604250;, 3.553570;1.099530;-2.604250;, 3.553570;1.081790;-2.474930;, 3.678300;1.081790;-2.474930;, 3.678300;1.099530;-2.604250;, 3.553570;1.081790;-2.474930;, 3.553570;-0.299920;-2.369920;, 3.553570;1.081790;-2.474930;, 3.553570;-0.288631;-2.509480;, 3.553570;-0.288631;-2.509480;, 3.553570;1.081790;-2.474930;, 3.553570;1.099530;-2.604250;, 3.678300;1.081790;-2.474930;, 3.678300;-0.299920;-2.369920;, 3.678300;-0.288631;-2.509480;, 3.678300;1.081790;-2.474930;, 3.678300;-0.288631;-2.509480;, 3.678300;1.099530;-2.604250;, 3.548290;-0.379267;-1.559630;, 3.673010;-0.379267;-1.559630;, 3.548290;-0.379267;-1.559630;, 3.548290;-0.396630;-1.420710;, 3.673010;-0.396630;-1.420710;, 3.548290;-0.396630;-1.420710;, 3.673010;1.013120;-1.654870;, 3.548290;1.013120;-1.654870;, 3.548290;0.997639;-1.525250;, 3.673010;0.997639;-1.525250;, 3.673010;1.013120;-1.654870;, 3.548290;0.997639;-1.525250;, 3.548290;-0.396630;-1.420710;, 3.548290;0.997639;-1.525250;, 3.548290;-0.379267;-1.559630;, 3.548290;-0.379267;-1.559630;, 3.548290;0.997639;-1.525250;, 3.548290;1.013120;-1.654870;, 3.673010;0.997639;-1.525250;, 3.673010;-0.396630;-1.420710;, 3.673010;-0.379267;-1.559630;, 3.673010;0.997639;-1.525250;, 3.673010;-0.379267;-1.559630;, 3.673010;1.013120;-1.654870;, 1.617140;-0.288631;-2.509480;, 1.741860;-0.288631;-2.509480;, 1.617140;-0.288631;-2.509480;, 1.617140;-0.299920;-2.369920;, 1.741860;-0.299920;-2.369920;, 1.617140;-0.299920;-2.369920;, 1.741860;1.099530;-2.604250;, 1.617140;1.099530;-2.604250;, 1.617140;1.081790;-2.474930;, 1.741860;1.081790;-2.474930;, 1.741860;1.099530;-2.604250;, 1.617140;1.081790;-2.474930;, 1.617140;-0.299920;-2.369920;, 1.617140;1.081790;-2.474930;, 1.617140;-0.288631;-2.509480;, 1.617140;-0.288631;-2.509480;, 1.617140;1.081790;-2.474930;, 1.617140;1.099530;-2.604250;, 1.741860;1.081790;-2.474930;, 1.741860;-0.299920;-2.369920;, 1.741860;-0.288631;-2.509480;, 1.741860;1.081790;-2.474930;, 1.741860;-0.288631;-2.509480;, 1.741860;1.099530;-2.604250;, 1.611850;-0.379267;-1.559630;, 1.736570;-0.379267;-1.559630;, 1.611850;-0.379267;-1.559630;, 1.611850;-0.396630;-1.420710;, 1.736570;-0.396630;-1.420710;, 1.611850;-0.396630;-1.420710;, 1.736570;1.013120;-1.654870;, 1.611850;1.013120;-1.654870;, 1.611850;0.997639;-1.525250;, 1.736570;0.997639;-1.525250;, 1.736570;1.013120;-1.654870;, 1.611850;0.997639;-1.525250;, 1.611850;-0.396630;-1.420710;, 1.611850;0.997639;-1.525250;, 1.611850;-0.379267;-1.559630;, 1.611850;-0.379267;-1.559630;, 1.611850;0.997639;-1.525250;, 1.611850;1.013120;-1.654870;, 1.736570;0.997639;-1.525250;, 1.736570;-0.396630;-1.420710;, 1.736570;-0.379267;-1.559630;, 1.736570;0.997639;-1.525250;, 1.736570;-0.379267;-1.559630;, 1.736570;1.013120;-1.654870;, -1.668770;-0.288631;-2.509480;, -1.544050;-0.288631;-2.509480;, -1.668770;-0.288631;-2.509480;, -1.668770;-0.299920;-2.369920;, -1.544050;-0.299920;-2.369920;, -1.668770;-0.299920;-2.369920;, -1.544050;1.099530;-2.604250;, -1.668770;1.099530;-2.604250;, -1.668770;1.081790;-2.474930;, -1.544050;1.081790;-2.474930;, -1.544050;1.099530;-2.604250;, -1.668770;1.081790;-2.474930;, -1.668770;-0.299920;-2.369920;, -1.668770;1.081790;-2.474930;, -1.668770;-0.288631;-2.509480;, -1.668770;-0.288631;-2.509480;, -1.668770;1.081790;-2.474930;, -1.668770;1.099530;-2.604250;, -1.544050;1.081790;-2.474930;, -1.544050;-0.299920;-2.369920;, -1.544050;-0.288631;-2.509480;, -1.544050;1.081790;-2.474930;, -1.544050;-0.288631;-2.509480;, -1.544050;1.099530;-2.604250;, -1.674070;-0.379267;-1.559630;, -1.549350;-0.379267;-1.559630;, -1.674070;-0.379267;-1.559630;, -1.674070;-0.396629;-1.420710;, -1.549350;-0.396629;-1.420710;, -1.674070;-0.396629;-1.420710;, -1.549350;1.013120;-1.654870;, -1.674070;1.013120;-1.654870;, -1.674070;0.997639;-1.525250;, -1.549350;0.997639;-1.525250;, -1.549350;1.013120;-1.654870;, -1.674070;0.997639;-1.525250;, -1.674070;-0.396629;-1.420710;, -1.674070;0.997639;-1.525250;, -1.674070;-0.379267;-1.559630;, -1.674070;-0.379267;-1.559630;, -1.674070;0.997639;-1.525250;, -1.674070;1.013120;-1.654870;, -1.549350;0.997639;-1.525250;, -1.549350;-0.396629;-1.420710;, -1.549350;-0.379267;-1.559630;, -1.549350;0.997639;-1.525250;, -1.549350;-0.379267;-1.559630;, -1.549350;1.013120;-1.654870;, -3.724350;-0.288630;-2.509480;, -3.599630;-0.288630;-2.509480;, -3.724350;-0.288630;-2.509480;, -3.724350;-0.299919;-2.369920;, -3.599630;-0.299919;-2.369920;, -3.724350;-0.299919;-2.369920;, -3.599630;1.099530;-2.604250;, -3.724350;1.099530;-2.604250;, -3.724350;1.081790;-2.474930;, -3.599630;1.081790;-2.474930;, -3.599630;1.099530;-2.604250;, -3.724350;1.081790;-2.474930;, -3.724350;-0.299919;-2.369920;, -3.724350;1.081790;-2.474930;, -3.724350;-0.288630;-2.509480;, -3.724350;-0.288630;-2.509480;, -3.724350;1.081790;-2.474930;, -3.724350;1.099530;-2.604250;, -3.599630;1.081790;-2.474930;, -3.599630;-0.299919;-2.369920;, -3.599630;-0.288630;-2.509480;, -3.599630;1.081790;-2.474930;, -3.599630;-0.288630;-2.509480;, -3.599630;1.099530;-2.604250;, -3.724350;-0.379267;-1.559630;, -3.599630;-0.379267;-1.559630;, -3.724350;-0.379267;-1.559630;, -3.724350;-0.396629;-1.420710;, -3.599630;-0.396629;-1.420710;, -3.724350;-0.396629;-1.420710;, -3.599630;1.013120;-1.654870;, -3.724350;1.013120;-1.654870;, -3.724350;0.997639;-1.525250;, -3.599630;0.997639;-1.525250;, -3.599630;1.013120;-1.654870;, -3.724350;0.997639;-1.525250;, -3.724350;-0.396629;-1.420710;, -3.724350;0.997639;-1.525250;, -3.724350;-0.379267;-1.559630;, -3.724350;-0.379267;-1.559630;, -3.724350;0.997639;-1.525250;, -3.724350;1.013120;-1.654870;, -3.599630;0.997639;-1.525250;, -3.599630;-0.396629;-1.420710;, -3.599630;-0.379267;-1.559630;, -3.599630;0.997639;-1.525250;, -3.599630;-0.379267;-1.559630;, -3.599630;1.013120;-1.654870;; 96; 3;0,2,1;, 3;3,0,1;, 3;4,5,64;, 3;65,4,66;, 3;6,7,67;, 3;68,6,69;, 3;70,71,72;, 3;73,74,75;, 3;76,77,78;, 3;79,80,81;, 3;82,83,84;, 3;85,86,87;, 3;8,10,9;, 3;11,8,9;, 3;12,13,88;, 3;89,12,90;, 3;14,15,91;, 3;92,14,93;, 3;94,95,96;, 3;97,98,99;, 3;100,101,102;, 3;103,104,105;, 3;106,107,108;, 3;109,110,111;, 3;16,18,17;, 3;19,16,17;, 3;20,21,112;, 3;113,20,114;, 3;22,23,115;, 3;116,22,117;, 3;118,119,120;, 3;121,122,123;, 3;124,125,126;, 3;127,128,129;, 3;130,131,132;, 3;133,134,135;, 3;24,26,25;, 3;27,24,25;, 3;28,29,136;, 3;137,28,138;, 3;30,31,139;, 3;140,30,141;, 3;142,143,144;, 3;145,146,147;, 3;148,149,150;, 3;151,152,153;, 3;154,155,156;, 3;157,158,159;, 3;32,34,33;, 3;35,32,33;, 3;36,37,160;, 3;161,36,162;, 3;38,39,163;, 3;164,38,165;, 3;166,167,168;, 3;169,170,171;, 3;172,173,174;, 3;175,176,177;, 3;178,179,180;, 3;181,182,183;, 3;40,42,41;, 3;43,40,41;, 3;44,45,184;, 3;185,44,186;, 3;46,47,187;, 3;188,46,189;, 3;190,191,192;, 3;193,194,195;, 3;196,197,198;, 3;199,200,201;, 3;202,203,204;, 3;205,206,207;, 3;48,50,49;, 3;51,48,49;, 3;52,53,208;, 3;209,52,210;, 3;54,55,211;, 3;212,54,213;, 3;214,215,216;, 3;217,218,219;, 3;220,221,222;, 3;223,224,225;, 3;226,227,228;, 3;229,230,231;, 3;56,58,57;, 3;59,56,57;, 3;60,61,232;, 3;233,60,234;, 3;62,63,235;, 3;236,62,237;, 3;238,239,240;, 3;241,242,243;, 3;244,245,246;, 3;247,248,249;, 3;250,251,252;, 3;253,254,255;; MeshNormals { 256; 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.992280;-0.124020;, 0.000000;-0.992280;-0.124020;, 0.000000;0.074768;0.997201;, 0.000000;0.074768;0.997201;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.992280;-0.124020;, 0.000000;-0.992280;-0.124020;, 0.000000;0.074768;0.997201;, 0.000000;0.074768;0.997201;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.992280;-0.124014;, 0.000000;-0.992280;-0.124014;, 0.000000;0.074769;0.997201;, 0.000000;0.074769;0.997201;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.068112;-0.997678;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.068241;-0.997669;, 0.000000;-0.992281;-0.124014;, 0.000000;-0.992281;-0.124014;, 0.000000;0.074769;0.997201;, 0.000000;0.074769;0.997201;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 0.000000;-0.992280;-0.124020;, 0.000000;-0.992280;-0.124020;, 0.000000;-0.992280;-0.124020;, 0.000000;0.074768;0.997201;, 0.000000;0.074768;0.997201;, 0.000000;0.074768;0.997201;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 0.000000;-0.992280;-0.124020;, 0.000000;-0.992280;-0.124020;, 0.000000;-0.992280;-0.124020;, 0.000000;0.074768;0.997201;, 0.000000;0.074768;0.997201;, 0.000000;0.074768;0.997201;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 0.000000;-0.992280;-0.124014;, 0.000000;-0.992280;-0.124014;, 0.000000;-0.992280;-0.124014;, 0.000000;0.074769;0.997201;, 0.000000;0.074769;0.997201;, 0.000000;0.074769;0.997201;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;-0.996744;-0.080627;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;0.075782;0.997124;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, 0.000000;0.990722;0.135906;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 0.000000;-0.992281;-0.124014;, 0.000000;-0.992281;-0.124014;, 0.000000;-0.992281;-0.124014;, 0.000000;0.074769;0.997201;, 0.000000;0.074769;0.997201;, 0.000000;0.074769;0.997201;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, 0.000000;0.992943;0.118591;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;; 96; 3;0,2,1;, 3;3,0,1;, 3;4,5,64;, 3;65,4,66;, 3;6,7,67;, 3;68,6,69;, 3;70,71,72;, 3;73,74,75;, 3;76,77,78;, 3;79,80,81;, 3;82,83,84;, 3;85,86,87;, 3;8,10,9;, 3;11,8,9;, 3;12,13,88;, 3;89,12,90;, 3;14,15,91;, 3;92,14,93;, 3;94,95,96;, 3;97,98,99;, 3;100,101,102;, 3;103,104,105;, 3;106,107,108;, 3;109,110,111;, 3;16,18,17;, 3;19,16,17;, 3;20,21,112;, 3;113,20,114;, 3;22,23,115;, 3;116,22,117;, 3;118,119,120;, 3;121,122,123;, 3;124,125,126;, 3;127,128,129;, 3;130,131,132;, 3;133,134,135;, 3;24,26,25;, 3;27,24,25;, 3;28,29,136;, 3;137,28,138;, 3;30,31,139;, 3;140,30,141;, 3;142,143,144;, 3;145,146,147;, 3;148,149,150;, 3;151,152,153;, 3;154,155,156;, 3;157,158,159;, 3;32,34,33;, 3;35,32,33;, 3;36,37,160;, 3;161,36,162;, 3;38,39,163;, 3;164,38,165;, 3;166,167,168;, 3;169,170,171;, 3;172,173,174;, 3;175,176,177;, 3;178,179,180;, 3;181,182,183;, 3;40,42,41;, 3;43,40,41;, 3;44,45,184;, 3;185,44,186;, 3;46,47,187;, 3;188,46,189;, 3;190,191,192;, 3;193,194,195;, 3;196,197,198;, 3;199,200,201;, 3;202,203,204;, 3;205,206,207;, 3;48,50,49;, 3;51,48,49;, 3;52,53,208;, 3;209,52,210;, 3;54,55,211;, 3;212,54,213;, 3;214,215,216;, 3;217,218,219;, 3;220,221,222;, 3;223,224,225;, 3;226,227,228;, 3;229,230,231;, 3;56,58,57;, 3;59,56,57;, 3;60,61,232;, 3;233,60,234;, 3;62,63,235;, 3;236,62,237;, 3;238,239,240;, 3;241,242,243;, 3;244,245,246;, 3;247,248,249;, 3;250,251,252;, 3;253,254,255;; } MeshTextureCoords { 256; 0.758321;-0.301410;, 0.757168;-0.549623;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.699814;-0.548370;, 0.699814;-0.548370;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.278624;-0.542429;, 0.278624;-0.542429;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.699814;-0.548370;, 0.699814;-0.548370;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.278624;-0.542429;, 0.278624;-0.542429;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.699814;-0.548370;, 0.699814;-0.548370;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.278624;-0.542429;, 0.278624;-0.542429;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.699814;-0.548370;, 0.699814;-0.548370;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.278624;-0.542429;, 0.278624;-0.542429;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.757168;-0.549623;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.699814;-0.548370;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.696424;-0.300613;, 0.699814;-0.548370;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.699814;-0.548370;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.696424;-0.300613;, 0.758321;-0.301410;, 0.699814;-0.548370;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.336112;-0.543522;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.278624;-0.542429;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.275443;-0.293785;, 0.278624;-0.542429;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.278624;-0.542429;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.275443;-0.293785;, 0.337055;-0.295011;, 0.278624;-0.542429;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.757168;-0.549623;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.699814;-0.548370;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.696424;-0.300613;, 0.699814;-0.548370;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.699814;-0.548370;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.696424;-0.300613;, 0.758321;-0.301410;, 0.699814;-0.548370;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.336112;-0.543522;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.278624;-0.542429;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.275443;-0.293785;, 0.278624;-0.542429;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.278624;-0.542429;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.275443;-0.293785;, 0.337055;-0.295011;, 0.278624;-0.542429;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.757168;-0.549623;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.699814;-0.548370;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.696424;-0.300613;, 0.699814;-0.548370;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.699814;-0.548370;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.696424;-0.300613;, 0.758321;-0.301410;, 0.699814;-0.548370;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.336112;-0.543522;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.278624;-0.542429;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.275443;-0.293785;, 0.278624;-0.542429;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.278624;-0.542429;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.275443;-0.293785;, 0.337055;-0.295011;, 0.278624;-0.542429;, 0.337055;-0.295011;, 0.336112;-0.543522;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.696424;-0.300613;, 0.757168;-0.549623;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.699814;-0.548370;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.696424;-0.300613;, 0.699814;-0.548370;, 0.758321;-0.301410;, 0.758321;-0.301410;, 0.699814;-0.548370;, 0.757168;-0.549623;, 0.699814;-0.548370;, 0.696424;-0.300613;, 0.758321;-0.301410;, 0.699814;-0.548370;, 0.758321;-0.301410;, 0.757168;-0.549623;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.275443;-0.293785;, 0.336112;-0.543522;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.278624;-0.542429;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.275443;-0.293785;, 0.278624;-0.542429;, 0.337055;-0.295011;, 0.337055;-0.295011;, 0.278624;-0.542429;, 0.336112;-0.543522;, 0.278624;-0.542429;, 0.275443;-0.293785;, 0.337055;-0.295011;, 0.278624;-0.542429;, 0.337055;-0.295011;, 0.336112;-0.543522;; } MeshMaterialList { 1; 96; 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, 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; Material { 0.800000;0.800000;0.800000;0.000000;; 0.000000; 0.000000;0.000000;0.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "bihull.bmp"; } } } VertexDuplicationIndices { 256; 64; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 2, 0, 2, 5, 4, 5, 3, 1, 7, 6, 3, 7, 5, 7, 2, 2, 7, 1, 6, 4, 0, 6, 0, 3, 10, 8, 10, 13, 12, 13, 11, 9, 15, 14, 11, 15, 13, 15, 10, 10, 15, 9, 14, 12, 8, 14, 8, 11, 18, 16, 18, 21, 20, 21, 19, 17, 23, 22, 19, 23, 21, 23, 18, 18, 23, 17, 22, 20, 16, 22, 16, 19, 26, 24, 26, 29, 28, 29, 27, 25, 31, 30, 27, 31, 29, 31, 26, 26, 31, 25, 30, 28, 24, 30, 24, 27, 34, 32, 34, 37, 36, 37, 35, 33, 39, 38, 35, 39, 37, 39, 34, 34, 39, 33, 38, 36, 32, 38, 32, 35, 42, 40, 42, 45, 44, 45, 43, 41, 47, 46, 43, 47, 45, 47, 42, 42, 47, 41, 46, 44, 40, 46, 40, 43, 50, 48, 50, 53, 52, 53, 51, 49, 55, 54, 51, 55, 53, 55, 50, 50, 55, 49, 54, 52, 48, 54, 48, 51, 58, 56, 58, 61, 60, 61, 59, 57, 63, 62, 59, 63, 61, 63, 58, 58, 63, 57, 62, 60, 56, 62, 56, 59; } } } Frame wings { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.102858,0.000000,1.000000;; } Mesh { 232; -4.473780;0.990354;-1.090251;, -0.345427;0.933506;-1.140405;, -4.473780;0.932796;-1.091078;, -0.345427;0.991065;-1.139578;, -4.641020;1.112137;-1.503675;, -4.641020;1.054581;-1.504503;, -4.766460;1.131689;-2.085040;, -4.766460;1.074128;-2.085866;, -4.543460;1.139982;-2.660581;, -4.543460;1.082430;-2.661408;, 0.027874;1.140218;-2.677020;, 0.027874;1.082668;-2.677857;, 4.543460;1.139982;-2.660581;, 4.543460;1.082430;-2.661408;, 4.766460;1.130975;-2.035712;, 4.766460;1.073424;-2.036540;, 4.710710;1.111661;-1.470787;, 4.710710;1.054106;-1.471615;, 4.529530;0.990117;-1.073802;, 4.529530;0.932558;-1.074629;, 0.393257;0.991065;-1.139578;, 0.393257;0.933506;-1.140405;, 0.013937;1.111899;-1.487227;, 0.013937;1.054343;-1.488064;, -4.301710;-0.500205;-1.103060;, -0.332142;-0.553724;-1.156760;, -4.301710;-0.557592;-1.107570;, -0.332142;-0.496337;-1.152240;, -4.462520;-0.352204;-1.507840;, -4.462520;-0.409591;-1.512360;, -4.583130;-0.295474;-2.086770;, -4.583130;-0.352861;-2.091280;, -4.368720;-0.250351;-2.660590;, -4.368720;-0.307738;-2.665110;, 0.026802;-0.249062;-2.676990;, 0.026802;-0.306449;-2.681500;, 4.368720;-0.250351;-2.660590;, 4.368720;-0.307738;-2.665100;, 4.583130;-0.299342;-2.037580;, 4.583130;-0.356729;-2.042090;, 4.529530;-0.354782;-1.475050;, 4.529530;-0.412169;-1.479570;, 4.355310;-0.501494;-1.086660;, 4.355310;-0.558881;-1.091180;, 0.378131;-0.496337;-1.152240;, 0.378131;-0.553724;-1.156760;, 0.013401;-0.353493;-1.491450;, 0.013401;-0.410880;-1.495960;, -4.473780;0.990354;-1.090251;, -0.345427;0.933506;-1.140405;, -4.473780;0.932796;-1.091078;, -4.473780;0.990354;-1.090251;, -4.641020;1.112137;-1.503675;, -4.473780;0.932796;-1.091078;, -4.641020;1.054581;-1.504503;, -4.641020;1.112137;-1.503675;, -4.766460;1.131689;-2.085040;, -4.641020;1.054581;-1.504503;, -4.766460;1.074128;-2.085866;, -4.766460;1.131689;-2.085040;, -4.543460;1.139982;-2.660581;, -4.766460;1.074128;-2.085866;, -4.543460;1.082430;-2.661408;, -4.543460;1.139982;-2.660581;, 0.027874;1.140218;-2.677020;, -4.543460;1.082430;-2.661408;, 0.027874;1.082668;-2.677857;, 0.027874;1.140218;-2.677020;, 4.543460;1.139982;-2.660581;, 0.027874;1.082668;-2.677857;, 4.543460;1.082430;-2.661408;, 4.543460;1.139982;-2.660581;, 4.766460;1.130975;-2.035712;, 4.543460;1.082430;-2.661408;, 4.766460;1.073424;-2.036540;, 4.766460;1.130975;-2.035712;, 4.710710;1.111661;-1.470787;, 4.766460;1.073424;-2.036540;, 4.710710;1.054106;-1.471615;, 4.710710;1.111661;-1.470787;, 4.529530;0.990117;-1.073802;, 4.710710;1.054106;-1.471615;, 4.529530;0.932558;-1.074629;, 4.529530;0.990117;-1.073802;, 0.393257;0.991065;-1.139578;, 4.529530;0.932558;-1.074629;, 0.393257;0.933506;-1.140405;, 0.393257;0.991065;-1.139578;, 0.013937;1.111899;-1.487227;, 0.393257;0.933506;-1.140405;, -0.345427;0.991065;-1.139578;, -0.345427;0.933506;-1.140405;, 0.013937;1.054343;-1.488064;, 0.013937;1.111899;-1.487227;, -0.345427;0.991065;-1.139578;, 0.013937;1.054343;-1.488064;, 4.543460;1.082430;-2.661408;, 4.766460;1.073424;-2.036540;, 0.027874;1.082668;-2.677857;, 4.766460;1.073424;-2.036540;, 4.710710;1.054106;-1.471615;, 0.027874;1.082668;-2.677857;, 4.710710;1.054106;-1.471615;, 4.529530;0.932558;-1.074629;, 4.529530;0.932558;-1.074629;, 0.393257;0.933506;-1.140405;, 0.393257;0.933506;-1.140405;, 0.013937;1.054343;-1.488064;, 0.013937;1.054343;-1.488064;, -0.345427;0.933506;-1.140405;, -4.473780;0.932796;-1.091078;, -0.345427;0.933506;-1.140405;, -4.473780;0.932796;-1.091078;, -4.641020;1.054581;-1.504503;, -4.766460;1.074128;-2.085866;, -4.543460;1.082430;-2.661408;, -4.641020;1.054581;-1.504503;, -4.766460;1.074128;-2.085866;, 4.766460;1.130975;-2.035712;, 4.543460;1.139982;-2.660581;, 0.027874;1.140218;-2.677020;, 4.710710;1.111661;-1.470787;, 4.766460;1.130975;-2.035712;, 0.027874;1.140218;-2.677020;, 4.529530;0.990117;-1.073802;, 4.710710;1.111661;-1.470787;, 0.393257;0.991065;-1.139578;, 4.529530;0.990117;-1.073802;, 0.013937;1.111899;-1.487227;, 0.393257;0.991065;-1.139578;, -4.766460;1.131689;-2.085040;, -4.543460;1.139982;-2.660581;, 0.013937;1.111899;-1.487227;, -0.345427;0.991065;-1.139578;, -0.345427;0.991065;-1.139578;, -4.473780;0.990354;-1.090251;, -4.766460;1.131689;-2.085040;, -4.641020;1.112137;-1.503675;, -4.641020;1.112137;-1.503675;, -4.473780;0.990354;-1.090251;, -4.301710;-0.500205;-1.103060;, -0.332142;-0.553724;-1.156760;, -4.301710;-0.557592;-1.107570;, -4.301710;-0.500205;-1.103060;, -4.462520;-0.352204;-1.507840;, -4.301710;-0.557592;-1.107570;, -4.462520;-0.409591;-1.512360;, -4.462520;-0.352204;-1.507840;, -4.583130;-0.295474;-2.086770;, -4.462520;-0.409591;-1.512360;, -4.583130;-0.352861;-2.091280;, -4.583130;-0.295474;-2.086770;, -4.368720;-0.250351;-2.660590;, -4.583130;-0.352861;-2.091280;, -4.368720;-0.307738;-2.665110;, -4.368720;-0.250351;-2.660590;, 0.026802;-0.249062;-2.676990;, -4.368720;-0.307738;-2.665110;, 0.026802;-0.306449;-2.681500;, 0.026802;-0.249062;-2.676990;, 4.368720;-0.250351;-2.660590;, 0.026802;-0.306449;-2.681500;, 4.368720;-0.307738;-2.665100;, 4.368720;-0.250351;-2.660590;, 4.583130;-0.299342;-2.037580;, 4.368720;-0.307738;-2.665100;, 4.583130;-0.356729;-2.042090;, 4.583130;-0.299342;-2.037580;, 4.529530;-0.354782;-1.475050;, 4.583130;-0.356729;-2.042090;, 4.529530;-0.412169;-1.479570;, 4.529530;-0.354782;-1.475050;, 4.355310;-0.501494;-1.086660;, 4.529530;-0.412169;-1.479570;, 4.355310;-0.558881;-1.091180;, 4.355310;-0.501494;-1.086660;, 0.378131;-0.496337;-1.152240;, 4.355310;-0.558881;-1.091180;, 0.378131;-0.553724;-1.156760;, 0.378131;-0.496337;-1.152240;, 0.013401;-0.353493;-1.491450;, 0.378131;-0.553724;-1.156760;, -0.332142;-0.496337;-1.152240;, -0.332142;-0.553724;-1.156760;, 0.013401;-0.410880;-1.495960;, 0.013401;-0.353493;-1.491450;, -0.332142;-0.496337;-1.152240;, 0.013401;-0.410880;-1.495960;, 4.368720;-0.307738;-2.665100;, 4.583130;-0.356729;-2.042090;, 0.026802;-0.306449;-2.681500;, 4.583130;-0.356729;-2.042090;, 4.529530;-0.412169;-1.479570;, 0.026802;-0.306449;-2.681500;, 4.529530;-0.412169;-1.479570;, 4.355310;-0.558881;-1.091180;, 4.355310;-0.558881;-1.091180;, 0.378131;-0.553724;-1.156760;, 0.378131;-0.553724;-1.156760;, 0.013401;-0.410880;-1.495960;, 0.013401;-0.410880;-1.495960;, -0.332142;-0.553724;-1.156760;, -4.301710;-0.557592;-1.107570;, -0.332142;-0.553724;-1.156760;, -4.301710;-0.557592;-1.107570;, -4.462520;-0.409591;-1.512360;, -4.583130;-0.352861;-2.091280;, -4.368720;-0.307738;-2.665110;, -4.462520;-0.409591;-1.512360;, -4.583130;-0.352861;-2.091280;, 4.583130;-0.299342;-2.037580;, 4.368720;-0.250351;-2.660590;, 0.026802;-0.249062;-2.676990;, 4.529530;-0.354782;-1.475050;, 4.583130;-0.299342;-2.037580;, 0.026802;-0.249062;-2.676990;, 4.355310;-0.501494;-1.086660;, 4.529530;-0.354782;-1.475050;, 0.378131;-0.496337;-1.152240;, 4.355310;-0.501494;-1.086660;, 0.013401;-0.353493;-1.491450;, 0.378131;-0.496337;-1.152240;, -4.583130;-0.295474;-2.086770;, -4.368720;-0.250351;-2.660590;, 0.013401;-0.353493;-1.491450;, -0.332142;-0.496337;-1.152240;, -0.332142;-0.496337;-1.152240;, -4.301710;-0.500205;-1.103060;, -4.583130;-0.295474;-2.086770;, -4.462520;-0.352204;-1.507840;, -4.462520;-0.352204;-1.507840;, -4.301710;-0.500205;-1.103060;; 88; 3;0,2,1;, 3;3,48,49;, 3;4,5,50;, 3;51,52,53;, 3;6,7,54;, 3;55,56,57;, 3;8,9,58;, 3;59,60,61;, 3;10,11,62;, 3;63,64,65;, 3;12,13,66;, 3;67,68,69;, 3;14,15,70;, 3;71,72,73;, 3;16,17,74;, 3;75,76,77;, 3;18,19,78;, 3;79,80,81;, 3;20,21,82;, 3;83,84,85;, 3;22,23,86;, 3;87,88,89;, 3;90,91,92;, 3;93,94,95;, 3;96,97,98;, 3;99,100,101;, 3;102,103,98;, 3;104,105,98;, 3;106,107,98;, 3;108,109,98;, 3;110,98,111;, 3;98,112,113;, 3;98,114,115;, 3;98,116,117;, 3;118,119,120;, 3;121,122,123;, 3;124,125,120;, 3;126,127,120;, 3;128,129,120;, 3;130,120,131;, 3;132,120,133;, 3;134,120,135;, 3;136,137,120;, 3;120,138,139;, 3;24,26,25;, 3;27,140,141;, 3;28,29,142;, 3;143,144,145;, 3;30,31,146;, 3;147,148,149;, 3;32,33,150;, 3;151,152,153;, 3;34,35,154;, 3;155,156,157;, 3;36,37,158;, 3;159,160,161;, 3;38,39,162;, 3;163,164,165;, 3;40,41,166;, 3;167,168,169;, 3;42,43,170;, 3;171,172,173;, 3;44,45,174;, 3;175,176,177;, 3;46,47,178;, 3;179,180,181;, 3;182,183,184;, 3;185,186,187;, 3;188,189,190;, 3;191,192,193;, 3;194,195,190;, 3;196,197,190;, 3;198,199,190;, 3;200,201,190;, 3;202,190,203;, 3;190,204,205;, 3;190,206,207;, 3;190,208,209;, 3;210,211,212;, 3;213,214,215;, 3;216,217,212;, 3;218,219,212;, 3;220,221,212;, 3;222,212,223;, 3;224,212,225;, 3;226,212,227;, 3;228,229,212;, 3;212,230,231;; MeshNormals { 232; 0.011949;-0.014367;0.999825;, 0.011949;-0.014367;0.999825;, 0.011949;-0.014367;0.999825;, 0.011949;-0.014367;0.999825;, -0.927560;-0.005375;0.373635;, -0.927560;-0.005375;0.373635;, -0.977521;-0.003025;0.210817;, -0.977521;-0.003025;0.210817;, -0.932466;0.005190;-0.361219;, -0.932466;0.005190;-0.361219;, -0.003599;0.014540;-0.999888;, -0.003599;0.014540;-0.999888;, 0.003643;0.014365;-0.999890;, 0.003643;0.014365;-0.999890;, 0.941833;0.004835;-0.336047;, 0.941833;0.004835;-0.336047;, 0.995170;-0.001412;0.098160;, 0.995170;-0.001412;0.098160;, 0.910404;-0.005943;0.413678;, 0.910404;-0.005943;0.413678;, -0.015902;-0.014366;0.999770;, -0.015902;-0.014366;0.999770;, -0.677482;-0.010696;0.735462;, -0.677482;-0.010696;0.735462;, 0.012429;-0.078342;0.996849;, 0.012429;-0.078342;0.996849;, 0.012429;-0.078342;0.996849;, 0.012427;-0.078513;0.996836;, -0.932491;-0.028361;0.360079;, -0.932491;-0.028361;0.360079;, -0.979166;-0.015909;0.202436;, -0.979166;-0.015909;0.202436;, -0.937098;0.027410;-0.347988;, -0.937098;0.027410;-0.347988;, -0.003740;0.078346;-0.996919;, -0.003740;0.078346;-0.996919;, 0.003789;0.078350;-0.996919;, 0.003789;0.078350;-0.996919;, 0.945878;0.025425;-0.323526;, 0.945878;0.025425;-0.323526;, 0.995532;-0.007414;0.094129;, 0.995532;-0.007414;0.094129;, 0.916339;-0.031439;0.399166;, 0.916339;-0.031439;0.399166;, -0.016538;-0.078509;0.996776;, -0.016538;-0.078509;0.996776;, -0.691715;-0.056581;0.719950;, -0.691715;-0.056581;0.719950;, 0.011949;-0.014367;0.999825;, 0.011949;-0.014367;0.999825;, -0.927560;-0.005375;0.373635;, -0.927559;-0.005369;0.373638;, -0.927559;-0.005369;0.373638;, -0.927559;-0.005369;0.373638;, -0.977521;-0.003025;0.210817;, -0.977521;-0.003033;0.210816;, -0.977521;-0.003033;0.210816;, -0.977521;-0.003033;0.210816;, -0.932466;0.005190;-0.361219;, -0.932466;0.005183;-0.361220;, -0.932466;0.005183;-0.361220;, -0.932466;0.005183;-0.361220;, -0.003599;0.014540;-0.999888;, -0.003596;0.014365;-0.999890;, -0.003596;0.014365;-0.999890;, -0.003596;0.014365;-0.999890;, 0.003643;0.014365;-0.999890;, 0.003641;0.014540;-0.999888;, 0.003641;0.014540;-0.999888;, 0.003641;0.014540;-0.999888;, 0.941833;0.004835;-0.336047;, 0.941833;0.004828;-0.336047;, 0.941833;0.004828;-0.336047;, 0.941833;0.004828;-0.336047;, 0.995170;-0.001412;0.098160;, 0.995170;-0.001412;0.098161;, 0.995170;-0.001412;0.098161;, 0.995170;-0.001412;0.098161;, 0.910404;-0.005943;0.413678;, 0.910404;-0.005951;0.413677;, 0.910404;-0.005951;0.413677;, 0.910404;-0.005951;0.413677;, -0.015902;-0.014366;0.999770;, -0.015902;-0.014364;0.999770;, -0.015902;-0.014364;0.999770;, -0.015902;-0.014364;0.999770;, -0.677482;-0.010696;0.735462;, -0.677450;-0.010568;0.735493;, -0.677450;-0.010568;0.735493;, -0.677450;-0.010568;0.735493;, 0.697055;-0.010302;0.716943;, 0.697055;-0.010302;0.716943;, 0.697055;-0.010302;0.716943;, 0.697066;-0.010427;0.716931;, 0.697066;-0.010427;0.716931;, 0.697066;-0.010427;0.716931;, -0.000000;-0.999896;-0.014411;, -0.000000;-0.999896;-0.014411;, -0.000020;-0.995155;-0.098319;, 0.002640;-0.999421;-0.033915;, 0.002640;-0.999421;-0.033915;, 0.002640;-0.999421;-0.033915;, 0.062636;-0.961952;-0.265941;, 0.062636;-0.961952;-0.265941;, 0.001312;-0.995296;-0.096874;, 0.001312;-0.995296;-0.096874;, -0.281605;-0.959175;-0.026133;, -0.281605;-0.959175;-0.026133;, 0.301962;-0.953128;-0.019154;, 0.301962;-0.953128;-0.019154;, -0.000985;-0.995303;-0.096803;, -0.000985;-0.995303;-0.096803;, -0.059505;-0.963815;-0.259846;, -0.059505;-0.963815;-0.259846;, 0.000000;-0.999896;-0.014423;, 0.000000;-0.999896;-0.014423;, -0.002308;-0.999449;-0.033106;, -0.002308;-0.999449;-0.033106;, -0.000000;0.999896;0.014413;, -0.000000;0.999896;0.014413;, 0.000021;0.995155;0.098314;, -0.002640;0.999421;0.033908;, -0.002640;0.999421;0.033908;, -0.002640;0.999421;0.033908;, -0.062635;0.961954;0.265933;, -0.062635;0.961954;0.265933;, -0.001312;0.995296;0.096869;, -0.001312;0.995296;0.096869;, 0.281602;0.959175;0.026129;, 0.281602;0.959175;0.026129;, 0.000000;0.999896;0.014408;, 0.000000;0.999896;0.014408;, -0.301959;0.953129;0.019149;, -0.301959;0.953129;0.019149;, 0.000985;0.995304;0.096797;, 0.000985;0.995304;0.096797;, 0.002311;0.999449;0.033114;, 0.002311;0.999449;0.033114;, 0.059504;0.963816;0.259842;, 0.059504;0.963816;0.259842;, 0.012427;-0.078513;0.996836;, 0.012427;-0.078513;0.996836;, -0.932491;-0.028361;0.360079;, -0.932482;-0.028301;0.360106;, -0.932482;-0.028301;0.360106;, -0.932482;-0.028301;0.360106;, -0.979166;-0.015909;0.202436;, -0.979167;-0.015944;0.202430;, -0.979167;-0.015944;0.202430;, -0.979167;-0.015944;0.202430;, -0.937098;0.027410;-0.347988;, -0.937096;0.027348;-0.347999;, -0.937096;0.027348;-0.347999;, -0.937096;0.027348;-0.347999;, -0.003740;0.078346;-0.996919;, -0.003743;0.078523;-0.996905;, -0.003743;0.078523;-0.996905;, -0.003743;0.078523;-0.996905;, 0.003789;0.078350;-0.996919;, 0.003789;0.078346;-0.996919;, 0.003789;0.078346;-0.996919;, 0.003789;0.078346;-0.996919;, 0.945878;0.025425;-0.323526;, 0.945878;0.025427;-0.323526;, 0.945878;0.025427;-0.323526;, 0.945878;0.025427;-0.323526;, 0.995532;-0.007414;0.094129;, 0.995533;-0.007397;0.094129;, 0.995533;-0.007397;0.094129;, 0.995533;-0.007397;0.094129;, 0.916339;-0.031439;0.399166;, 0.916339;-0.031440;0.399166;, 0.916339;-0.031440;0.399166;, 0.916339;-0.031440;0.399166;, -0.016538;-0.078509;0.996776;, -0.016538;-0.078509;0.996776;, -0.016538;-0.078509;0.996776;, -0.016538;-0.078509;0.996776;, -0.691715;-0.056581;0.719950;, -0.691746;-0.056702;0.719911;, -0.691746;-0.056702;0.719911;, -0.691746;-0.056702;0.719911;, 0.710989;-0.055215;0.701032;, 0.710989;-0.055215;0.701032;, 0.710989;-0.055215;0.701032;, 0.710979;-0.055096;0.701052;, 0.710979;-0.055096;0.701052;, 0.710979;-0.055096;0.701052;, 0.000000;-0.996922;-0.078394;, 0.000000;-0.996922;-0.078394;, -0.000021;-0.986820;-0.161823;, 0.002746;-0.995200;-0.097822;, 0.002746;-0.995200;-0.097822;, 0.002746;-0.995200;-0.097822;, 0.065131;-0.942804;-0.326923;, 0.065131;-0.942804;-0.326923;, 0.001365;-0.987053;-0.160390;, 0.001365;-0.987053;-0.160390;, -0.291928;-0.952457;-0.087199;, -0.291928;-0.952457;-0.087199;, 0.312879;-0.946432;-0.079832;, 0.312879;-0.946432;-0.079832;, -0.001025;-0.987065;-0.160319;, -0.001025;-0.987065;-0.160319;, -0.061874;-0.945069;-0.320960;, -0.061874;-0.945069;-0.320960;, 0.000000;-0.996923;-0.078393;, 0.000000;-0.996923;-0.078393;, -0.002403;-0.995279;-0.097030;, -0.002403;-0.995279;-0.097030;, -0.000000;0.996922;0.078394;, -0.000000;0.996922;0.078394;, 0.000021;0.986820;0.161822;, -0.002745;0.995200;0.097820;, -0.002745;0.995200;0.097820;, -0.002745;0.995200;0.097820;, -0.065131;0.942804;0.326923;, -0.065131;0.942804;0.326923;, -0.001365;0.987053;0.160389;, -0.001365;0.987053;0.160389;, 0.291926;0.952458;0.087199;, 0.291926;0.952458;0.087199;, 0.000000;0.996922;0.078394;, 0.000000;0.996922;0.078394;, -0.312877;0.946433;0.079832;, -0.312877;0.946433;0.079832;, 0.001024;0.987065;0.160318;, 0.001024;0.987065;0.160318;, 0.002402;0.995279;0.097028;, 0.002402;0.995279;0.097028;, 0.061876;0.945067;0.320966;, 0.061876;0.945067;0.320966;; 88; 3;0,2,1;, 3;3,48,49;, 3;4,5,50;, 3;51,52,53;, 3;6,7,54;, 3;55,56,57;, 3;8,9,58;, 3;59,60,61;, 3;10,11,62;, 3;63,64,65;, 3;12,13,66;, 3;67,68,69;, 3;14,15,70;, 3;71,72,73;, 3;16,17,74;, 3;75,76,77;, 3;18,19,78;, 3;79,80,81;, 3;20,21,82;, 3;83,84,85;, 3;22,23,86;, 3;87,88,89;, 3;90,91,92;, 3;93,94,95;, 3;96,97,98;, 3;99,100,101;, 3;102,103,98;, 3;104,105,98;, 3;106,107,98;, 3;108,109,98;, 3;110,98,111;, 3;98,112,113;, 3;98,114,115;, 3;98,116,117;, 3;118,119,120;, 3;121,122,123;, 3;124,125,120;, 3;126,127,120;, 3;128,129,120;, 3;130,120,131;, 3;132,120,133;, 3;134,120,135;, 3;136,137,120;, 3;120,138,139;, 3;24,26,25;, 3;27,140,141;, 3;28,29,142;, 3;143,144,145;, 3;30,31,146;, 3;147,148,149;, 3;32,33,150;, 3;151,152,153;, 3;34,35,154;, 3;155,156,157;, 3;36,37,158;, 3;159,160,161;, 3;38,39,162;, 3;163,164,165;, 3;40,41,166;, 3;167,168,169;, 3;42,43,170;, 3;171,172,173;, 3;44,45,174;, 3;175,176,177;, 3;46,47,178;, 3;179,180,181;, 3;182,183,184;, 3;185,186,187;, 3;188,189,190;, 3;191,192,193;, 3;194,195,190;, 3;196,197,190;, 3;198,199,190;, 3;200,201,190;, 3;202,190,203;, 3;190,204,205;, 3;190,206,207;, 3;190,208,209;, 3;210,211,212;, 3;213,214,215;, 3;216,217,212;, 3;218,219,212;, 3;220,221,212;, 3;222,212,223;, 3;224,212,225;, 3;226,212,227;, 3;228,229,212;, 3;212,230,231;; } MeshTextureCoords { 232; 0.030702;-0.010231;, 0.463765;-0.041427;, 0.030702;-0.010746;, 0.463765;-0.040913;, 0.013159;-0.267384;, 0.013159;-0.267899;, 0.000000;-0.628997;, 0.000000;-0.629511;, 0.023393;-0.986988;, 0.023393;-0.987503;, 0.502924;-0.997213;, 0.502924;-0.997734;, 0.976607;-0.986988;, 0.976607;-0.987503;, 1.000000;-0.598315;, 1.000000;-0.598830;, 0.994152;-0.246928;, 0.994152;-0.247442;, 0.975146;0.000000;, 0.975146;-0.000514;, 0.541252;-0.040913;, 0.541252;-0.041427;, 0.501462;-0.257153;, 0.501462;-0.257674;, 0.048752;-0.018199;, 0.465158;-0.051600;, 0.048752;-0.021004;, 0.465158;-0.048789;, 0.031883;-0.269975;, 0.031883;-0.272786;, 0.019231;-0.630073;, 0.019231;-0.632879;, 0.041723;-0.986994;, 0.041723;-0.989805;, 0.502812;-0.997195;, 0.502812;-1.000000;, 0.958277;-0.986994;, 0.958277;-0.989799;, 0.980769;-0.599477;, 0.980769;-0.602282;, 0.975146;-0.249579;, 0.975146;-0.252391;, 0.956871;-0.007998;, 0.956871;-0.010809;, 0.539666;-0.048789;, 0.539666;-0.051600;, 0.501406;-0.259780;, 0.501406;-0.262585;, 0.030702;-0.010231;, 0.463765;-0.041427;, 0.030702;-0.010746;, 0.030702;-0.010231;, 0.013159;-0.267384;, 0.030702;-0.010746;, 0.013159;-0.267899;, 0.013159;-0.267384;, 0.000000;-0.628997;, 0.013159;-0.267899;, 0.000000;-0.629511;, 0.000000;-0.628997;, 0.023393;-0.986988;, 0.000000;-0.629511;, 0.023393;-0.987503;, 0.023393;-0.986988;, 0.502924;-0.997213;, 0.023393;-0.987503;, 0.502924;-0.997734;, 0.502924;-0.997213;, 0.976607;-0.986988;, 0.502924;-0.997734;, 0.976607;-0.987503;, 0.976607;-0.986988;, 1.000000;-0.598315;, 0.976607;-0.987503;, 1.000000;-0.598830;, 1.000000;-0.598315;, 0.994152;-0.246928;, 1.000000;-0.598830;, 0.994152;-0.247442;, 0.994152;-0.246928;, 0.975146;0.000000;, 0.994152;-0.247442;, 0.975146;-0.000514;, 0.975146;0.000000;, 0.541252;-0.040913;, 0.975146;-0.000514;, 0.541252;-0.041427;, 0.541252;-0.040913;, 0.501462;-0.257153;, 0.541252;-0.041427;, 0.463765;-0.040913;, 0.463765;-0.041427;, 0.501462;-0.257674;, 0.501462;-0.257153;, 0.463765;-0.040913;, 0.501462;-0.257674;, 0.976607;-0.987503;, 1.000000;-0.598830;, 0.502924;-0.997734;, 1.000000;-0.598830;, 0.994152;-0.247442;, 0.502924;-0.997734;, 0.994152;-0.247442;, 0.975146;-0.000514;, 0.975146;-0.000514;, 0.541252;-0.041427;, 0.541252;-0.041427;, 0.501462;-0.257674;, 0.501462;-0.257674;, 0.463765;-0.041427;, 0.030702;-0.010746;, 0.463765;-0.041427;, 0.030702;-0.010746;, 0.013159;-0.267899;, 0.000000;-0.629511;, 0.023393;-0.987503;, 0.013159;-0.267899;, 0.000000;-0.629511;, 1.000000;-0.598315;, 0.976607;-0.986988;, 0.502924;-0.997213;, 0.994152;-0.246928;, 1.000000;-0.598315;, 0.502924;-0.997213;, 0.975146;0.000000;, 0.994152;-0.246928;, 0.541252;-0.040913;, 0.975146;0.000000;, 0.501462;-0.257153;, 0.541252;-0.040913;, 0.000000;-0.628997;, 0.023393;-0.986988;, 0.501462;-0.257153;, 0.463765;-0.040913;, 0.463765;-0.040913;, 0.030702;-0.010231;, 0.000000;-0.628997;, 0.013159;-0.267384;, 0.013159;-0.267384;, 0.030702;-0.010231;, 0.048752;-0.018199;, 0.465158;-0.051600;, 0.048752;-0.021004;, 0.048752;-0.018199;, 0.031883;-0.269975;, 0.048752;-0.021004;, 0.031883;-0.272786;, 0.031883;-0.269975;, 0.019231;-0.630073;, 0.031883;-0.272786;, 0.019231;-0.632879;, 0.019231;-0.630073;, 0.041723;-0.986994;, 0.019231;-0.632879;, 0.041723;-0.989805;, 0.041723;-0.986994;, 0.502812;-0.997195;, 0.041723;-0.989805;, 0.502812;-1.000000;, 0.502812;-0.997195;, 0.958277;-0.986994;, 0.502812;-1.000000;, 0.958277;-0.989799;, 0.958277;-0.986994;, 0.980769;-0.599477;, 0.958277;-0.989799;, 0.980769;-0.602282;, 0.980769;-0.599477;, 0.975146;-0.249579;, 0.980769;-0.602282;, 0.975146;-0.252391;, 0.975146;-0.249579;, 0.956871;-0.007998;, 0.975146;-0.252391;, 0.956871;-0.010809;, 0.956871;-0.007998;, 0.539666;-0.048789;, 0.956871;-0.010809;, 0.539666;-0.051600;, 0.539666;-0.048789;, 0.501406;-0.259780;, 0.539666;-0.051600;, 0.465158;-0.048789;, 0.465158;-0.051600;, 0.501406;-0.262585;, 0.501406;-0.259780;, 0.465158;-0.048789;, 0.501406;-0.262585;, 0.958277;-0.989799;, 0.980769;-0.602282;, 0.502812;-1.000000;, 0.980769;-0.602282;, 0.975146;-0.252391;, 0.502812;-1.000000;, 0.975146;-0.252391;, 0.956871;-0.010809;, 0.956871;-0.010809;, 0.539666;-0.051600;, 0.539666;-0.051600;, 0.501406;-0.262585;, 0.501406;-0.262585;, 0.465158;-0.051600;, 0.048752;-0.021004;, 0.465158;-0.051600;, 0.048752;-0.021004;, 0.031883;-0.272786;, 0.019231;-0.632879;, 0.041723;-0.989805;, 0.031883;-0.272786;, 0.019231;-0.632879;, 0.980769;-0.599477;, 0.958277;-0.986994;, 0.502812;-0.997195;, 0.975146;-0.249579;, 0.980769;-0.599477;, 0.502812;-0.997195;, 0.956871;-0.007998;, 0.975146;-0.249579;, 0.539666;-0.048789;, 0.956871;-0.007998;, 0.501406;-0.259780;, 0.539666;-0.048789;, 0.019231;-0.630073;, 0.041723;-0.986994;, 0.501406;-0.259780;, 0.465158;-0.048789;, 0.465158;-0.048789;, 0.048752;-0.018199;, 0.019231;-0.630073;, 0.031883;-0.269975;, 0.031883;-0.269975;, 0.048752;-0.018199;; } MeshMaterialList { 1; 88; 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, 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; Material { 0.800000;0.800000;0.800000;0.000000;; 0.000000; 0.000000;0.000000;0.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "wings.bmp"; } } } VertexDuplicationIndices { 232; 48; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 1, 2, 0, 4, 2, 5, 4, 6, 5, 7, 6, 8, 7, 9, 8, 10, 9, 11, 10, 12, 11, 13, 12, 14, 13, 15, 14, 16, 15, 17, 16, 18, 17, 19, 18, 20, 19, 21, 20, 22, 21, 3, 1, 23, 22, 3, 23, 13, 15, 11, 15, 17, 11, 17, 19, 19, 21, 21, 23, 23, 1, 2, 1, 2, 5, 7, 9, 5, 7, 14, 12, 10, 16, 14, 10, 18, 16, 20, 18, 22, 20, 6, 8, 22, 3, 3, 0, 6, 4, 4, 0, 24, 25, 26, 24, 28, 26, 29, 28, 30, 29, 31, 30, 32, 31, 33, 32, 34, 33, 35, 34, 36, 35, 37, 36, 38, 37, 39, 38, 40, 39, 41, 40, 42, 41, 43, 42, 44, 43, 45, 44, 46, 45, 27, 25, 47, 46, 27, 47, 37, 39, 35, 39, 41, 35, 41, 43, 43, 45, 45, 47, 47, 25, 26, 25, 26, 29, 31, 33, 29, 31, 38, 36, 34, 40, 38, 34, 42, 40, 44, 42, 46, 44, 30, 32, 46, 27, 27, 24, 30, 28, 28, 24; } } } Frame elevator { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh { 130; -0.128434;-0.037724;3.371460;, -0.066407;-0.031770;2.810290;, -0.128434;-0.094919;3.364950;, -0.066407;0.025424;2.816800;, -0.397218;-0.084501;3.782320;, -0.397218;-0.141695;3.775810;, -1.197060;-0.086840;3.802860;, -1.197060;-0.144034;3.796350;, -1.548550;-0.035385;3.350910;, -1.548550;-0.092580;3.344400;, -1.569220;0.002036;3.022230;, -1.569220;-0.055158;3.015720;, -1.321120;0.044135;2.652450;, -1.321120;-0.013059;2.645940;, -0.831407;0.088573;2.262140;, -0.831407;0.031378;2.255630;, -0.045731;0.142366;1.789650;, -0.045731;0.085171;1.783140;, 0.164738;-0.037724;3.371460;, 0.164738;-0.094919;3.364950;, 0.102711;-0.031770;2.810290;, 0.102711;0.025424;2.816800;, 0.433521;-0.084501;3.782320;, 0.433521;-0.141695;3.775810;, 1.233360;-0.086840;3.802860;, 1.233360;-0.144034;3.796350;, 1.584850;-0.035385;3.350920;, 1.584850;-0.092580;3.344400;, 1.605530;0.002036;3.022230;, 1.605530;-0.055158;3.015720;, 1.357420;0.044135;2.652450;, 1.357420;-0.013059;2.645940;, 0.867711;0.088573;2.262140;, 0.867711;0.031378;2.255630;, 0.082035;0.142366;1.789650;, 0.082035;0.085171;1.783140;, -0.397218;-0.141695;3.775810;, -0.397218;-0.084501;3.782320;, -0.397218;-0.141695;3.775810;, -1.197060;-0.144034;3.796350;, -1.197060;-0.086840;3.802860;, -1.197060;-0.144034;3.796350;, -1.548550;-0.092580;3.344400;, -1.548550;-0.035385;3.350910;, -1.548550;-0.092580;3.344400;, -1.569220;-0.055158;3.015720;, -1.569220;0.002036;3.022230;, -1.569220;-0.055158;3.015720;, -0.045731;0.085171;1.783140;, -0.045731;0.142366;1.789650;, -0.045731;0.085171;1.783140;, -0.045731;0.085171;1.783140;, -0.066407;-0.031770;2.810290;, -0.831407;0.031378;2.255630;, -0.831407;0.031378;2.255630;, -0.066407;-0.031770;2.810290;, -1.321120;-0.013059;2.645940;, -0.128434;-0.094919;3.364950;, -1.321120;-0.013059;2.645940;, -0.128434;-0.094919;3.364950;, -1.569220;-0.055158;3.015720;, -1.569220;-0.055158;3.015720;, -1.548550;-0.092580;3.344400;, -1.548550;-0.092580;3.344400;, -1.197060;-0.144034;3.796350;, -1.197060;-0.144034;3.796350;, -0.397218;-0.141695;3.775810;, -0.066407;0.025424;2.816800;, -0.045731;0.142366;1.789650;, -0.831407;0.088573;2.262140;, -0.066407;0.025424;2.816800;, -0.831407;0.088573;2.262140;, -1.321120;0.044135;2.652450;, -0.128434;-0.037724;3.371460;, -1.321120;0.044135;2.652450;, -0.128434;-0.037724;3.371460;, -1.569220;0.002036;3.022230;, -1.569220;0.002036;3.022230;, -1.548550;-0.035385;3.350910;, -1.548550;-0.035385;3.350910;, -1.197060;-0.086840;3.802860;, -1.197060;-0.086840;3.802860;, -0.397218;-0.084501;3.782320;, 0.433521;-0.141695;3.775810;, 0.433521;-0.084501;3.782320;, 0.433521;-0.141695;3.775810;, 1.233360;-0.144034;3.796350;, 1.233360;-0.086840;3.802860;, 1.233360;-0.144034;3.796350;, 1.584850;-0.092580;3.344400;, 1.584850;-0.035385;3.350920;, 1.584850;-0.092580;3.344400;, 1.605530;-0.055158;3.015720;, 1.605530;0.002036;3.022230;, 1.605530;-0.055158;3.015720;, 0.082035;0.085171;1.783140;, 0.082035;0.142366;1.789650;, 0.082035;0.085171;1.783140;, 0.082035;0.085171;1.783140;, 0.867711;0.031378;2.255630;, 0.102711;-0.031770;2.810290;, 0.867711;0.031378;2.255630;, 1.357420;-0.013059;2.645940;, 0.102711;-0.031770;2.810290;, 1.357420;-0.013059;2.645940;, 0.164738;-0.094919;3.364950;, 1.605530;-0.055158;3.015720;, 0.164738;-0.094919;3.364950;, 1.605530;-0.055158;3.015720;, 1.584850;-0.092580;3.344400;, 1.584850;-0.092580;3.344400;, 1.233360;-0.144034;3.796350;, 1.233360;-0.144034;3.796350;, 0.433521;-0.141695;3.775810;, 0.102711;0.025424;2.816800;, 0.867711;0.088573;2.262140;, 0.082035;0.142366;1.789650;, 0.102711;0.025424;2.816800;, 1.357420;0.044135;2.652450;, 0.867711;0.088573;2.262140;, 0.164738;-0.037724;3.371460;, 1.357420;0.044135;2.652450;, 0.164738;-0.037724;3.371460;, 1.605530;0.002036;3.022230;, 1.584850;-0.035385;3.350920;, 1.605530;0.002036;3.022230;, 1.233360;-0.086840;3.802860;, 1.584850;-0.035385;3.350920;, 0.433521;-0.084501;3.782320;, 1.233360;-0.086840;3.802860;; 64; 3;0,2,1;, 3;3,0,1;, 3;4,5,2;, 3;0,4,2;, 3;6,7,36;, 3;37,6,38;, 3;8,9,39;, 3;40,8,41;, 3;10,11,42;, 3;43,10,44;, 3;12,13,45;, 3;46,12,47;, 3;14,15,13;, 3;12,14,13;, 3;16,17,15;, 3;14,16,15;, 3;3,1,48;, 3;49,3,50;, 3;51,52,53;, 3;54,55,56;, 3;52,57,58;, 3;56,59,60;, 3;61,57,62;, 3;63,57,64;, 3;65,57,66;, 3;67,68,69;, 3;70,71,72;, 3;73,67,74;, 3;75,72,76;, 3;73,77,78;, 3;73,79,80;, 3;73,81,82;, 3;18,20,19;, 3;21,20,18;, 3;22,19,23;, 3;18,19,22;, 3;24,83,25;, 3;84,85,24;, 3;26,86,27;, 3;87,88,26;, 3;28,89,29;, 3;90,91,28;, 3;30,92,31;, 3;93,94,30;, 3;32,31,33;, 3;30,31,32;, 3;34,33,35;, 3;32,33,34;, 3;21,95,20;, 3;96,97,21;, 3;98,99,100;, 3;101,102,103;, 3;100,104,105;, 3;102,106,107;, 3;108,109,105;, 3;110,111,105;, 3;112,113,105;, 3;114,115,116;, 3;117,118,119;, 3;120,121,114;, 3;122,123,118;, 3;120,124,125;, 3;120,126,127;, 3;120,128,129;; MeshNormals { 130; 0.968583;-0.028125;0.247096;, 0.997742;-0.007595;0.066725;, 0.917723;-0.044923;0.394674;, 0.999226;-0.004449;0.039087;, 0.838444;-0.061634;0.541492;, 0.838444;-0.061634;0.541492;, 0.025837;-0.113055;0.993253;, 0.025837;-0.113055;0.993253;, -0.791285;-0.069150;0.607525;, -0.791285;-0.069149;0.607525;, -0.998053;-0.007053;0.061962;, -0.998053;-0.007053;0.061962;, -0.755569;0.074084;-0.650867;, -0.686154;0.082270;-0.722790;, -0.581366;0.092016;-0.808422;, -0.546195;0.094732;-0.832284;, -0.517804;0.096749;-0.850011;, -0.517804;0.096749;-0.850011;, -0.968583;-0.028125;0.247095;, -0.917723;-0.044923;0.394673;, -0.997742;-0.007595;0.066725;, -0.999226;-0.004449;0.039087;, -0.838445;-0.061634;0.541490;, -0.838445;-0.061634;0.541490;, -0.025838;-0.113055;0.993253;, -0.025838;-0.113055;0.993253;, 0.791282;-0.069203;0.607523;, 0.791285;-0.069254;0.607513;, 0.998052;-0.007061;0.061991;, 0.998052;-0.007056;0.061993;, 0.755563;0.074085;-0.650873;, 0.686153;0.082270;-0.722790;, 0.581367;0.092016;-0.808421;, 0.546195;0.094732;-0.832284;, 0.517804;0.096749;-0.850011;, 0.517804;0.096749;-0.850011;, 0.025837;-0.113055;0.993253;, 0.025837;-0.113055;0.993253;, 0.025837;-0.113055;0.993253;, -0.791285;-0.069149;0.607525;, -0.791285;-0.069151;0.607524;, -0.791285;-0.069151;0.607524;, -0.998053;-0.007053;0.061962;, -0.998053;-0.007053;0.061962;, -0.998053;-0.007053;0.061962;, -0.832063;0.062731;-0.551122;, -0.832063;0.062731;-0.551122;, -0.832063;0.062731;-0.551122;, 0.999800;-0.002261;0.019868;, 0.999800;-0.002261;0.019868;, 0.999800;-0.002261;0.019868;, 0.000000;-0.993581;-0.113119;, 0.000000;-0.993581;-0.113120;, 0.000000;-0.993581;-0.113119;, 0.000000;-0.993581;-0.113119;, 0.000000;-0.993581;-0.113119;, -0.000000;-0.993581;-0.113119;, 0.000000;-0.993581;-0.113121;, 0.000000;-0.993581;-0.113121;, -0.000001;-0.993581;-0.113119;, -0.000001;-0.993581;-0.113119;, 0.000001;-0.993581;-0.113125;, 0.000001;-0.993581;-0.113125;, 0.000000;-0.993581;-0.113118;, 0.000000;-0.993581;-0.113118;, 0.000001;-0.993582;-0.113118;, 0.000001;-0.993582;-0.113118;, 0.000000;0.993581;0.113120;, 0.000001;0.993581;0.113120;, 0.000001;0.993581;0.113120;, -0.000001;0.993581;0.113122;, -0.000001;0.993581;0.113122;, -0.000000;0.993581;0.113120;, -0.000000;0.993581;0.113120;, -0.000000;0.993581;0.113119;, 0.000000;0.993582;0.113118;, 0.000000;0.993582;0.113118;, -0.000000;0.993581;0.113122;, -0.000000;0.993581;0.113122;, -0.000000;0.993581;0.113121;, -0.000000;0.993581;0.113121;, -0.000001;0.993581;0.113120;, -0.000001;0.993581;0.113120;, -0.025838;-0.113055;0.993253;, -0.025838;-0.113055;0.993253;, -0.025838;-0.113055;0.993253;, 0.791285;-0.069254;0.607513;, 0.791279;-0.069151;0.607533;, 0.791279;-0.069151;0.607533;, 0.998052;-0.007056;0.061993;, 0.998052;-0.007067;0.061990;, 0.998052;-0.007067;0.061990;, 0.832053;0.062732;-0.551138;, 0.832053;0.062732;-0.551138;, 0.832053;0.062732;-0.551138;, -0.999800;-0.002261;0.019868;, -0.999800;-0.002261;0.019868;, -0.999800;-0.002261;0.019868;, -0.000000;-0.993581;-0.113119;, -0.000000;-0.993581;-0.113119;, -0.000000;-0.993581;-0.113120;, -0.000000;-0.993581;-0.113119;, 0.000000;-0.993581;-0.113119;, -0.000000;-0.993581;-0.113119;, -0.000000;-0.993581;-0.113121;, -0.000000;-0.993581;-0.113121;, 0.000001;-0.993581;-0.113119;, 0.000001;-0.993581;-0.113119;, -0.000001;-0.993581;-0.113125;, -0.000001;-0.993581;-0.113125;, -0.000000;-0.993581;-0.113118;, -0.000000;-0.993581;-0.113118;, -0.000001;-0.993582;-0.113118;, -0.000001;-0.993582;-0.113118;, -0.000000;0.993581;0.113120;, -0.000001;0.993581;0.113120;, -0.000001;0.993581;0.113120;, 0.000001;0.993581;0.113122;, 0.000000;0.993581;0.113120;, 0.000001;0.993581;0.113122;, -0.000000;0.993581;0.113120;, 0.000000;0.993581;0.113119;, -0.000000;0.993582;0.113118;, -0.000000;0.993582;0.113118;, -0.000000;0.993582;0.113118;, -0.000000;0.993582;0.113118;, -0.000000;0.993581;0.113123;, -0.000000;0.993581;0.113123;, 0.000001;0.993581;0.113120;, 0.000001;0.993581;0.113120;; 64; 3;0,2,1;, 3;3,0,1;, 3;4,5,2;, 3;0,4,2;, 3;6,7,36;, 3;37,6,38;, 3;8,9,39;, 3;40,8,41;, 3;10,11,42;, 3;43,10,44;, 3;12,13,45;, 3;46,12,47;, 3;14,15,13;, 3;12,14,13;, 3;16,17,15;, 3;14,16,15;, 3;3,1,48;, 3;49,3,50;, 3;51,52,53;, 3;54,55,56;, 3;52,57,58;, 3;56,59,60;, 3;61,57,62;, 3;63,57,64;, 3;65,57,66;, 3;67,68,69;, 3;70,71,72;, 3;73,67,74;, 3;75,72,76;, 3;73,77,78;, 3;73,79,80;, 3;73,81,82;, 3;18,20,19;, 3;21,20,18;, 3;22,19,23;, 3;18,19,22;, 3;24,83,25;, 3;84,85,24;, 3;26,86,27;, 3;87,88,26;, 3;28,89,29;, 3;90,91,28;, 3;30,92,31;, 3;93,94,30;, 3;32,31,33;, 3;30,31,32;, 3;34,33,35;, 3;32,33,34;, 3;21,95,20;, 3;96,97,21;, 3;98,99,100;, 3;101,102,103;, 3;100,104,105;, 3;102,106,107;, 3;108,109,105;, 3;110,111,105;, 3;112,113,105;, 3;114,115,116;, 3;117,118,119;, 3;120,121,114;, 3;122,123,118;, 3;120,124,125;, 3;120,126,127;, 3;120,128,129;; } MeshTextureCoords { 130; 0.728944;-0.039637;, 0.735880;-0.078113;, 0.728944;-0.040083;, 0.735880;-0.077667;, 0.698889;-0.011466;, 0.698889;-0.011913;, 0.609451;-0.010058;, 0.609451;-0.010504;, 0.570147;-0.041046;, 0.570147;-0.041492;, 0.567836;-0.063581;, 0.567836;-0.064028;, 0.595578;-0.088935;, 0.595578;-0.089381;, 0.650338;-0.115697;, 0.650338;-0.116143;, 0.738192;-0.148093;, 0.738192;-0.148539;, 0.761727;-0.039637;, 0.761727;-0.040083;, 0.754791;-0.078113;, 0.754791;-0.077667;, 0.791782;-0.011466;, 0.791782;-0.011913;, 0.881220;-0.010058;, 0.881220;-0.010504;, 0.920524;-0.041045;, 0.920524;-0.041492;, 0.922836;-0.063581;, 0.922836;-0.064028;, 0.895092;-0.088935;, 0.895092;-0.089381;, 0.840333;-0.115697;, 0.840333;-0.116143;, 0.752479;-0.148093;, 0.752479;-0.148539;, 0.698889;-0.011913;, 0.698889;-0.011466;, 0.698889;-0.011913;, 0.609451;-0.010504;, 0.609451;-0.010058;, 0.609451;-0.010504;, 0.570147;-0.041492;, 0.570147;-0.041046;, 0.570147;-0.041492;, 0.567836;-0.064028;, 0.567836;-0.063581;, 0.567836;-0.064028;, 0.738192;-0.148539;, 0.738192;-0.148093;, 0.738192;-0.148539;, 0.738192;-0.148539;, 0.735880;-0.078113;, 0.650338;-0.116143;, 0.650338;-0.116143;, 0.735880;-0.078113;, 0.595578;-0.089381;, 0.728944;-0.040083;, 0.595578;-0.089381;, 0.728944;-0.040083;, 0.567836;-0.064028;, 0.567836;-0.064028;, 0.570147;-0.041492;, 0.570147;-0.041492;, 0.609451;-0.010504;, 0.609451;-0.010504;, 0.698889;-0.011913;, 0.735880;-0.077667;, 0.738192;-0.148093;, 0.650338;-0.115697;, 0.735880;-0.077667;, 0.650338;-0.115697;, 0.595578;-0.088935;, 0.728944;-0.039637;, 0.595578;-0.088935;, 0.728944;-0.039637;, 0.567836;-0.063581;, 0.567836;-0.063581;, 0.570147;-0.041046;, 0.570147;-0.041046;, 0.609451;-0.010058;, 0.609451;-0.010058;, 0.698889;-0.011466;, 0.791782;-0.011913;, 0.791782;-0.011466;, 0.791782;-0.011913;, 0.881220;-0.010504;, 0.881220;-0.010058;, 0.881220;-0.010504;, 0.920524;-0.041492;, 0.920524;-0.041045;, 0.920524;-0.041492;, 0.922836;-0.064028;, 0.922836;-0.063581;, 0.922836;-0.064028;, 0.752479;-0.148539;, 0.752479;-0.148093;, 0.752479;-0.148539;, 0.752479;-0.148539;, 0.840333;-0.116143;, 0.754791;-0.078113;, 0.840333;-0.116143;, 0.895092;-0.089381;, 0.754791;-0.078113;, 0.895092;-0.089381;, 0.761727;-0.040083;, 0.922836;-0.064028;, 0.761727;-0.040083;, 0.922836;-0.064028;, 0.920524;-0.041492;, 0.920524;-0.041492;, 0.881220;-0.010504;, 0.881220;-0.010504;, 0.791782;-0.011913;, 0.754791;-0.077667;, 0.840333;-0.115697;, 0.752479;-0.148093;, 0.754791;-0.077667;, 0.895092;-0.088935;, 0.840333;-0.115697;, 0.761727;-0.039637;, 0.895092;-0.088935;, 0.761727;-0.039637;, 0.922836;-0.063581;, 0.920524;-0.041045;, 0.922836;-0.063581;, 0.881220;-0.010058;, 0.920524;-0.041045;, 0.791782;-0.011466;, 0.881220;-0.010058;; } MeshMaterialList { 1; 64; 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; Material { 0.800000;0.800000;0.800000;0.000000;; 0.000000; 0.000000;0.000000;0.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "bihull.bmp"; } } } VertexDuplicationIndices { 130; 36; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 5, 4, 5, 7, 6, 7, 9, 8, 9, 11, 10, 11, 17, 16, 17, 17, 1, 15, 15, 1, 13, 2, 13, 2, 11, 11, 9, 9, 7, 7, 5, 3, 16, 14, 3, 14, 12, 0, 12, 0, 10, 10, 8, 8, 6, 6, 4, 23, 22, 23, 25, 24, 25, 27, 26, 27, 29, 28, 29, 35, 34, 35, 35, 33, 20, 33, 31, 20, 31, 19, 29, 19, 29, 27, 27, 25, 25, 23, 21, 32, 34, 21, 30, 32, 18, 30, 18, 28, 26, 28, 24, 26, 22, 24; } } } Frame landing_ge { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh { 115; -0.332232;-0.839157;-2.205240;, -0.301452;-0.399248;-1.389050;, -0.466850;-0.782954;-2.205250;, -0.166834;-0.455451;-1.389050;, -0.118593;-0.343572;-2.500480;, -0.253211;-0.287369;-2.500480;, -0.104810;-0.311602;-2.622040;, -0.239428;-0.255398;-2.622040;, -0.366690;-0.919094;-2.309440;, -0.501308;-0.862891;-2.309440;, -0.373581;-0.935075;-2.092360;, -0.508199;-0.878872;-2.092360;, -0.184063;-0.495413;-1.206710;, -0.318681;-0.439210;-1.206710;, 0.350102;-0.839157;-2.205240;, 0.484721;-0.782954;-2.205250;, 0.319323;-0.399248;-1.389050;, 0.184705;-0.455451;-1.389050;, 0.136464;-0.343572;-2.500480;, 0.271082;-0.287369;-2.500480;, 0.122681;-0.311602;-2.622040;, 0.257299;-0.255398;-2.622040;, 0.384560;-0.919094;-2.309440;, 0.519178;-0.862891;-2.309440;, 0.391452;-0.935075;-2.092360;, 0.526070;-0.878872;-2.092360;, 0.201934;-0.495413;-1.206710;, 0.336552;-0.439210;-1.206710;, 0.477166;-0.784128;-2.245480;, -0.472640;-0.875959;-2.086410;, -0.472640;-0.784128;-2.245480;, 0.477166;-0.875959;-2.086410;, 0.477166;-0.967799;-2.245470;, -0.472640;-0.967799;-2.245470;, -0.466850;-0.782954;-2.205250;, -0.332232;-0.839157;-2.205240;, -0.466850;-0.782954;-2.205250;, -0.501308;-0.862891;-2.309440;, -0.366690;-0.919094;-2.309440;, -0.501308;-0.862891;-2.309440;, -0.508199;-0.878872;-2.092360;, -0.373581;-0.935075;-2.092360;, -0.508199;-0.878872;-2.092360;, -0.318681;-0.439210;-1.206710;, -0.301452;-0.399248;-1.389050;, -0.508199;-0.878872;-2.092360;, -0.301452;-0.399248;-1.389050;, -0.466850;-0.782954;-2.205250;, -0.508199;-0.878872;-2.092360;, -0.466850;-0.782954;-2.205250;, -0.501308;-0.862891;-2.309440;, -0.239428;-0.255398;-2.622040;, -0.501308;-0.862891;-2.309440;, -0.253211;-0.287369;-2.500480;, -0.253211;-0.287369;-2.500480;, -0.166834;-0.455451;-1.389050;, -0.184063;-0.495413;-1.206710;, -0.373581;-0.935075;-2.092360;, -0.332232;-0.839157;-2.205240;, -0.166834;-0.455451;-1.389050;, -0.373581;-0.935075;-2.092360;, -0.332232;-0.839157;-2.205240;, -0.366690;-0.919094;-2.309440;, -0.366690;-0.919094;-2.309440;, -0.104810;-0.311602;-2.622040;, -0.118593;-0.343572;-2.500480;, -0.118593;-0.343572;-2.500480;, 0.484721;-0.782954;-2.205250;, 0.350102;-0.839157;-2.205240;, 0.484721;-0.782954;-2.205250;, 0.519178;-0.862891;-2.309440;, 0.384560;-0.919094;-2.309440;, 0.519178;-0.862891;-2.309440;, 0.526070;-0.878872;-2.092360;, 0.391452;-0.935075;-2.092360;, 0.526070;-0.878872;-2.092360;, 0.336552;-0.439210;-1.206710;, 0.526070;-0.878872;-2.092360;, 0.319323;-0.399248;-1.389050;, 0.319323;-0.399248;-1.389050;, 0.526070;-0.878872;-2.092360;, 0.484721;-0.782954;-2.205250;, 0.519178;-0.862891;-2.309440;, 0.484721;-0.782954;-2.205250;, 0.257299;-0.255398;-2.622040;, 0.271082;-0.287369;-2.500480;, 0.519178;-0.862891;-2.309440;, 0.271082;-0.287369;-2.500480;, 0.184705;-0.455451;-1.389050;, 0.391452;-0.935075;-2.092360;, 0.201934;-0.495413;-1.206710;, 0.350102;-0.839157;-2.205240;, 0.391452;-0.935075;-2.092360;, 0.184705;-0.455451;-1.389050;, 0.350102;-0.839157;-2.205240;, 0.384560;-0.919094;-2.309440;, 0.384560;-0.919094;-2.309440;, 0.136464;-0.343572;-2.500480;, 0.122681;-0.311602;-2.622040;, 0.136464;-0.343572;-2.500480;, -0.472640;-0.784128;-2.245480;, 0.477166;-0.784128;-2.245480;, -0.472640;-0.784128;-2.245480;, 0.477166;-0.875959;-2.086410;, -0.472640;-0.875959;-2.086410;, -0.472640;-0.967799;-2.245470;, 0.477166;-0.967799;-2.245470;, 0.477166;-0.875959;-2.086410;, -0.472640;-0.967799;-2.245470;, -0.472640;-0.784128;-2.245480;, -0.472640;-0.967799;-2.245470;, -0.472640;-0.875959;-2.086410;, 0.477166;-0.967799;-2.245470;, 0.477166;-0.784128;-2.245480;, 0.477166;-0.875959;-2.086410;; 48; 3;0,2,1;, 3;3,0,1;, 3;4,5,34;, 3;35,4,36;, 3;8,9,7;, 3;6,8,7;, 3;10,11,37;, 3;38,10,39;, 3;12,13,40;, 3;41,12,42;, 3;43,44,45;, 3;46,47,48;, 3;45,49,50;, 3;51,52,53;, 3;54,50,47;, 3;55,56,57;, 3;58,59,60;, 3;61,57,62;, 3;63,64,65;, 3;62,66,58;, 3;14,16,15;, 3;17,16,14;, 3;18,67,19;, 3;68,69,18;, 3;22,21,23;, 3;20,21,22;, 3;24,70,25;, 3;71,72,24;, 3;26,73,27;, 3;74,75,26;, 3;76,77,78;, 3;79,80,81;, 3;77,82,83;, 3;84,85,86;, 3;87,81,82;, 3;88,89,90;, 3;91,92,93;, 3;94,95,89;, 3;96,97,98;, 3;95,91,99;, 3;28,30,29;, 3;31,28,29;, 3;32,33,100;, 3;101,32,102;, 3;103,104,105;, 3;106,107,108;, 3;109,110,111;, 3;112,113,114;; MeshNormals { 115; 0.342963;0.821428;-0.455666;, 0.342963;0.821428;-0.455666;, 0.342978;0.821423;-0.455664;, 0.342948;0.821433;-0.455668;, 0.184888;0.442924;0.877288;, 0.184914;0.442907;0.877292;, -0.164614;-0.394279;-0.904127;, -0.164613;-0.394279;-0.904127;, -0.164613;-0.394279;-0.904127;, -0.164612;-0.394279;-0.904128;, -0.384038;-0.919853;-0.079908;, -0.384038;-0.919853;-0.079908;, -0.338924;-0.811793;0.475523;, -0.338924;-0.811794;0.475523;, -0.342962;0.821429;-0.455666;, -0.342976;0.821424;-0.455664;, -0.342962;0.821429;-0.455666;, -0.342948;0.821434;-0.455668;, -0.184888;0.442925;0.877288;, -0.184914;0.442907;0.877292;, 0.164614;-0.394279;-0.904127;, 0.164613;-0.394279;-0.904127;, 0.164613;-0.394279;-0.904127;, 0.164612;-0.394279;-0.904127;, 0.384038;-0.919853;-0.079910;, 0.384038;-0.919853;-0.079910;, 0.338924;-0.811793;0.475523;, 0.338924;-0.811794;0.475523;, 0.000000;0.866045;0.499967;, 0.000000;0.866045;0.499967;, 0.000000;0.866045;0.499967;, 0.000000;0.866045;0.499967;, 0.000000;-0.000055;-1.000000;, 0.000000;-0.000055;-1.000000;, 0.184914;0.442907;0.877292;, 0.184863;0.442942;0.877284;, 0.184863;0.442942;0.877284;, -0.384038;-0.919853;-0.079908;, -0.384038;-0.919853;-0.079909;, -0.384038;-0.919853;-0.079909;, -0.338924;-0.811794;0.475523;, -0.338924;-0.811793;0.475523;, -0.338924;-0.811793;0.475523;, -0.918309;0.395863;-0.000011;, -0.918309;0.395863;-0.000011;, -0.918310;0.395863;-0.000011;, -0.918311;0.395861;-0.000009;, -0.918310;0.395862;-0.000009;, -0.918311;0.395861;-0.000009;, -0.918310;0.395862;-0.000008;, -0.918310;0.395863;-0.000009;, -0.918309;0.395864;-0.000007;, -0.918309;0.395864;-0.000007;, -0.918309;0.395864;-0.000007;, -0.918309;0.395863;-0.000010;, 0.918309;-0.395864;0.000011;, 0.918309;-0.395864;0.000011;, 0.918310;-0.395863;0.000011;, 0.918310;-0.395862;0.000009;, 0.918310;-0.395861;0.000009;, 0.918310;-0.395861;0.000009;, 0.918310;-0.395862;0.000008;, 0.918310;-0.395863;0.000009;, 0.918310;-0.395863;0.000011;, 0.918310;-0.395863;0.000011;, 0.918310;-0.395863;0.000011;, 0.918309;-0.395863;0.000010;, -0.184914;0.442907;0.877292;, -0.184862;0.442943;0.877284;, -0.184862;0.442943;0.877284;, 0.384038;-0.919853;-0.079910;, 0.384038;-0.919853;-0.079910;, 0.384038;-0.919853;-0.079910;, 0.338924;-0.811794;0.475523;, 0.338924;-0.811793;0.475523;, 0.338924;-0.811793;0.475523;, 0.918309;0.395863;-0.000011;, 0.918310;0.395863;-0.000012;, 0.918309;0.395863;-0.000011;, 0.918310;0.395861;-0.000009;, 0.918310;0.395861;-0.000009;, 0.918311;0.395861;-0.000012;, 0.918311;0.395859;-0.000016;, 0.918312;0.395857;-0.000013;, 0.918310;0.395862;-0.000008;, 0.918310;0.395862;-0.000008;, 0.918310;0.395862;-0.000008;, 0.918311;0.395860;-0.000016;, -0.918309;-0.395863;0.000011;, -0.918309;-0.395864;0.000011;, -0.918309;-0.395863;0.000011;, -0.918309;-0.395864;0.000011;, -0.918308;-0.395865;0.000013;, -0.918308;-0.395865;0.000013;, -0.918308;-0.395866;0.000012;, -0.918310;-0.395863;0.000010;, -0.918310;-0.395861;0.000012;, -0.918310;-0.395861;0.000012;, -0.918310;-0.395861;0.000012;, -0.918310;-0.395862;0.000009;, 0.000000;-0.000055;-1.000000;, 0.000000;-0.000055;-1.000000;, 0.000000;-0.000055;-1.000000;, 0.000000;-0.866010;0.500027;, 0.000000;-0.866010;0.500027;, 0.000000;-0.866010;0.500027;, 0.000000;-0.866010;0.500027;, 0.000000;-0.866010;0.500027;, 0.000000;-0.866010;0.500027;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;; 48; 3;0,2,1;, 3;3,0,1;, 3;4,5,34;, 3;35,4,36;, 3;8,9,7;, 3;6,8,7;, 3;10,11,37;, 3;38,10,39;, 3;12,13,40;, 3;41,12,42;, 3;43,44,45;, 3;46,47,48;, 3;45,49,50;, 3;51,52,53;, 3;54,50,47;, 3;55,56,57;, 3;58,59,60;, 3;61,57,62;, 3;63,64,65;, 3;62,66,58;, 3;14,16,15;, 3;17,16,14;, 3;18,67,19;, 3;68,69,18;, 3;22,21,23;, 3;20,21,22;, 3;24,70,25;, 3;71,72,24;, 3;26,73,27;, 3;74,75,26;, 3;76,77,78;, 3;79,80,81;, 3;77,82,83;, 3;84,85,86;, 3;87,81,82;, 3;88,89,90;, 3;91,92,93;, 3;94,95,89;, 3;96,97,98;, 3;95,91,99;, 3;28,30,29;, 3;31,28,29;, 3;32,33,100;, 3;101,32,102;, 3;103,104,105;, 3;106,107,108;, 3;109,110,111;, 3;112,113,114;; } MeshTextureCoords { 115; 0.765075;-0.667283;, 0.719267;-0.701212;, 0.765075;-0.671618;, 0.719267;-0.696878;, 0.781645;-0.705506;, 0.781645;-0.709841;, 0.788467;-0.707972;, 0.788467;-0.712307;, 0.770923;-0.661118;, 0.770923;-0.665453;, 0.758739;-0.659886;, 0.758739;-0.664221;, 0.709033;-0.693795;, 0.709033;-0.698130;, 0.765075;-0.667283;, 0.765075;-0.671618;, 0.719267;-0.701212;, 0.719267;-0.696878;, 0.781645;-0.705506;, 0.781645;-0.709841;, 0.788467;-0.707972;, 0.788467;-0.712307;, 0.770923;-0.661118;, 0.770923;-0.665453;, 0.758739;-0.659886;, 0.758739;-0.664221;, 0.709033;-0.693795;, 0.709033;-0.698130;, 0.767333;-0.671528;, 0.758405;-0.664445;, 0.767333;-0.671528;, 0.758405;-0.664445;, 0.767332;-0.657362;, 0.767332;-0.657362;, 0.765075;-0.671618;, 0.765075;-0.667283;, 0.765075;-0.671618;, 0.770923;-0.665453;, 0.770923;-0.661118;, 0.770923;-0.665453;, 0.758739;-0.664221;, 0.758739;-0.659886;, 0.758739;-0.664221;, 0.709033;-0.698130;, 0.719267;-0.701212;, 0.758739;-0.664221;, 0.719267;-0.701212;, 0.765075;-0.671618;, 0.758739;-0.664221;, 0.765075;-0.671618;, 0.770923;-0.665453;, 0.788467;-0.712307;, 0.770923;-0.665453;, 0.781645;-0.709841;, 0.781645;-0.709841;, 0.719267;-0.696878;, 0.709033;-0.693795;, 0.758739;-0.659886;, 0.765075;-0.667283;, 0.719267;-0.696878;, 0.758739;-0.659886;, 0.765075;-0.667283;, 0.770923;-0.661118;, 0.770923;-0.661118;, 0.788467;-0.707972;, 0.781645;-0.705506;, 0.781645;-0.705506;, 0.765075;-0.671618;, 0.765075;-0.667283;, 0.765075;-0.671618;, 0.770923;-0.665453;, 0.770923;-0.661118;, 0.770923;-0.665453;, 0.758739;-0.664221;, 0.758739;-0.659886;, 0.758739;-0.664221;, 0.709033;-0.698130;, 0.758739;-0.664221;, 0.719267;-0.701212;, 0.719267;-0.701212;, 0.758739;-0.664221;, 0.765075;-0.671618;, 0.770923;-0.665453;, 0.765075;-0.671618;, 0.788467;-0.712307;, 0.781645;-0.709841;, 0.770923;-0.665453;, 0.781645;-0.709841;, 0.719267;-0.696878;, 0.758739;-0.659886;, 0.709033;-0.693795;, 0.765075;-0.667283;, 0.758739;-0.659886;, 0.719267;-0.696878;, 0.765075;-0.667283;, 0.770923;-0.661118;, 0.770923;-0.661118;, 0.781645;-0.705506;, 0.788467;-0.707972;, 0.781645;-0.705506;, 0.767333;-0.671528;, 0.767333;-0.671528;, 0.767333;-0.671528;, 0.758405;-0.664445;, 0.758405;-0.664445;, 0.767332;-0.657362;, 0.767332;-0.657362;, 0.758405;-0.664445;, 0.767332;-0.657362;, 0.767333;-0.671528;, 0.767332;-0.657362;, 0.758405;-0.664445;, 0.767332;-0.657362;, 0.767333;-0.671528;, 0.758405;-0.664445;; } MeshMaterialList { 1; 48; 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; Material { 0.800000;0.800000;0.800000;0.000000;; 0.000000; 0.000000;0.000000;0.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "bihull.bmp"; } } } VertexDuplicationIndices { 115; 34; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 2, 0, 2, 9, 8, 9, 11, 10, 11, 13, 1, 11, 1, 2, 11, 2, 9, 7, 9, 5, 5, 3, 12, 10, 0, 3, 10, 0, 8, 8, 6, 4, 4, 15, 14, 15, 23, 22, 23, 25, 24, 25, 27, 25, 16, 16, 25, 15, 23, 15, 21, 19, 23, 19, 17, 24, 26, 14, 24, 17, 14, 22, 22, 18, 20, 18, 30, 28, 30, 31, 29, 33, 32, 31, 33, 30, 33, 29, 32, 28, 31; } } } Frame propeller { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh { 126; 0.028211;0.340125;-3.703910;, -0.500602;-0.266123;-3.935770;, -0.500602;-0.282022;-3.891560;, 0.028211;0.359467;-3.742510;, -0.704121;-0.324004;-3.948780;, -0.704121;-0.339903;-3.916290;, -0.773006;-0.205283;-3.934830;, -0.773006;-0.227069;-3.861230;, -0.674174;-0.021319;-3.880370;, -0.674175;-0.043106;-3.806770;, -0.042034;0.423927;-3.730310;, -0.042034;0.404586;-3.691700;, 0.765492;0.896056;-3.528760;, 0.765492;0.917842;-3.602350;, 0.110126;0.406971;-3.691250;, 0.110126;0.426312;-3.729860;, 0.837510;1.110660;-3.470300;, 0.837510;1.120700;-3.526240;, 0.722281;1.162050;-3.461600;, 0.722281;1.183810;-3.494090;, 0.527832;1.068700;-3.477651;, 0.527832;1.090480;-3.551250;, 0.045309;0.476535;-3.678090;, 0.045309;0.495876;-3.716690;, 0.041230;0.468197;-3.464810;, 0.041230;0.575044;-3.803820;, 0.141430;0.369703;-3.499430;, 0.141430;0.477488;-3.841010;, -0.058970;0.369703;-3.499430;, -0.058970;0.477488;-3.841010;, 0.041230;0.271208;-3.534050;, 0.041230;0.379933;-3.878200;, -0.500602;-0.282022;-3.891560;, -0.500602;-0.282022;-3.891560;, -0.500602;-0.266123;-3.935770;, -0.704121;-0.339903;-3.916290;, -0.704121;-0.339903;-3.916290;, -0.704121;-0.324004;-3.948780;, -0.773006;-0.227069;-3.861230;, -0.773006;-0.227069;-3.861230;, -0.773006;-0.205283;-3.934830;, -0.042034;0.404586;-3.691700;, 0.028211;0.340125;-3.703910;, 0.028211;0.359467;-3.742510;, -0.042034;0.404586;-3.691700;, 0.028211;0.359467;-3.742510;, -0.042034;0.423927;-3.730310;, -0.042034;0.404586;-3.691700;, -0.500602;-0.282022;-3.891560;, 0.028211;0.340125;-3.703910;, -0.674175;-0.043106;-3.806770;, -0.500602;-0.282022;-3.891560;, -0.042034;0.404586;-3.691700;, -0.773006;-0.227069;-3.861230;, -0.674175;-0.043106;-3.806770;, -0.773006;-0.227069;-3.861230;, -0.704121;-0.339903;-3.916290;, -0.042034;0.423927;-3.730310;, 0.028211;0.359467;-3.742510;, -0.500602;-0.266123;-3.935770;, -0.674174;-0.021319;-3.880370;, -0.042034;0.423927;-3.730310;, -0.500602;-0.266123;-3.935770;, -0.773006;-0.205283;-3.934830;, -0.674174;-0.021319;-3.880370;, -0.773006;-0.205283;-3.934830;, -0.704121;-0.324004;-3.948780;, 0.765492;0.896056;-3.528760;, 0.765492;0.896056;-3.528760;, 0.765492;0.917842;-3.602350;, 0.837510;1.110660;-3.470300;, 0.837510;1.110660;-3.470300;, 0.837510;1.120700;-3.526240;, 0.722281;1.162050;-3.461600;, 0.722281;1.162050;-3.461600;, 0.722281;1.183810;-3.494090;, 0.110126;0.406971;-3.691250;, 0.045309;0.476535;-3.678090;, 0.110126;0.426312;-3.729860;, 0.110126;0.426312;-3.729860;, 0.045309;0.476535;-3.678090;, 0.045309;0.495876;-3.716690;, 0.765492;0.896056;-3.528760;, 0.045309;0.476535;-3.678090;, 0.110126;0.406971;-3.691250;, 0.765492;0.896056;-3.528760;, 0.527832;1.068700;-3.477651;, 0.045309;0.476535;-3.678090;, 0.722281;1.162050;-3.461600;, 0.527832;1.068700;-3.477651;, 0.837510;1.110660;-3.470300;, 0.722281;1.162050;-3.461600;, 0.110126;0.426312;-3.729860;, 0.045309;0.495876;-3.716690;, 0.765492;0.917842;-3.602350;, 0.045309;0.495876;-3.716690;, 0.527832;1.090480;-3.551250;, 0.765492;0.917842;-3.602350;, 0.527832;1.090480;-3.551250;, 0.722281;1.183810;-3.494090;, 0.722281;1.183810;-3.494090;, 0.837510;1.120700;-3.526240;, 0.041230;0.468197;-3.464810;, 0.041230;0.468197;-3.464810;, 0.041230;0.575044;-3.803820;, -0.058970;0.369703;-3.499430;, -0.058970;0.369703;-3.499430;, -0.058970;0.477488;-3.841010;, 0.141430;0.369703;-3.499430;, 0.041230;0.271208;-3.534050;, 0.141430;0.477488;-3.841010;, 0.141430;0.477488;-3.841010;, 0.041230;0.271208;-3.534050;, 0.041230;0.379933;-3.878200;, 0.041230;0.271208;-3.534050;, 0.041230;0.468197;-3.464810;, -0.058970;0.369703;-3.499430;, 0.041230;0.271208;-3.534050;, 0.141430;0.369703;-3.499430;, 0.041230;0.468197;-3.464810;, -0.058970;0.477488;-3.841010;, 0.041230;0.575044;-3.803820;, 0.041230;0.379933;-3.878200;, 0.041230;0.575044;-3.803820;, 0.141430;0.477488;-3.841010;, 0.041230;0.379933;-3.878200;; 52; 3;0,2,1;, 3;0,1,3;, 3;32,5,4;, 3;33,4,34;, 3;35,7,6;, 3;36,6,37;, 3;38,9,8;, 3;39,8,40;, 3;9,11,10;, 3;9,10,8;, 3;41,42,43;, 3;44,45,46;, 3;47,48,49;, 3;50,51,52;, 3;53,48,54;, 3;55,56,48;, 3;57,58,59;, 3;60,61,62;, 3;63,64,59;, 3;65,59,66;, 3;12,14,13;, 3;13,14,15;, 3;16,67,17;, 3;17,68,69;, 3;18,70,19;, 3;19,71,72;, 3;20,73,21;, 3;21,74,75;, 3;22,20,23;, 3;23,20,21;, 3;76,77,78;, 3;79,80,81;, 3;82,83,84;, 3;85,86,87;, 3;82,88,89;, 3;90,91,82;, 3;92,93,94;, 3;95,96,97;, 3;98,99,94;, 3;94,100,101;, 3;24,26,25;, 3;25,26,27;, 3;28,102,29;, 3;29,103,104;, 3;30,105,31;, 3;31,106,107;, 3;108,109,110;, 3;111,112,113;, 3;114,115,116;, 3;117,118,119;, 3;120,121,122;, 3;123,124,125;; MeshNormals { 126; 0.775058;-0.581430;-0.247436;, 0.775058;-0.581430;-0.247436;, 0.775209;-0.594435;-0.213773;, 0.773742;-0.566373;-0.283803;, 0.285789;-0.885233;-0.366997;, 0.295109;-0.858217;-0.419969;, -0.868420;-0.467227;-0.165967;, -0.873871;-0.466163;-0.137987;, -0.716883;0.668521;0.197887;, -0.645648;0.718503;0.258633;, -0.592399;0.756437;0.277250;, -0.581483;0.727398;0.364378;, 0.617941;-0.753882;-0.223183;, 0.614338;-0.740842;-0.271556;, 0.614338;-0.740842;-0.271556;, 0.603930;-0.712626;-0.356978;, 0.951019;-0.304272;-0.054610;, 0.949850;-0.303673;-0.074613;, 0.381383;0.768069;0.514409;, 0.466572;0.832304;0.299302;, -0.746148;0.628060;0.220917;, -0.704705;0.672146;0.227180;, -0.788789;0.549538;0.275353;, -0.789213;0.576613;0.211329;, 0.721289;0.660600;0.208204;, 0.721090;0.660763;0.208379;, 0.721090;0.660763;0.208379;, 0.720891;0.660925;0.208554;, -0.721293;0.660526;0.208428;, -0.721090;0.660763;0.208379;, -0.721300;-0.660448;-0.208651;, -0.721095;-0.660687;-0.208603;, 0.295109;-0.858217;-0.419969;, 0.277863;-0.903944;-0.325081;, 0.277863;-0.903944;-0.325081;, -0.873871;-0.466163;-0.137987;, -0.853381;-0.468231;-0.229129;, -0.853381;-0.468231;-0.229129;, -0.888981;0.439113;0.129974;, -0.888980;0.439113;0.129980;, -0.888980;0.439113;0.129980;, 0.668263;0.665097;0.333273;, 0.668263;0.665097;0.333273;, 0.668263;0.665097;0.333273;, 0.668244;0.665153;0.333197;, 0.668244;0.665153;0.333197;, 0.668244;0.665153;0.333197;, -0.055995;-0.244388;0.968059;, -0.009023;-0.299842;0.953946;, -0.055995;-0.244388;0.968059;, 0.043524;-0.305908;0.951066;, 0.043524;-0.305908;0.951066;, 0.043524;-0.305908;0.951066;, 0.044301;-0.305389;0.951196;, 0.044301;-0.305389;0.951196;, 0.013269;-0.431954;0.901798;, 0.013269;-0.431954;0.901798;, 0.059789;0.248151;-0.966874;, 0.059789;0.248151;-0.966874;, 0.052087;0.231567;-0.971424;, 0.050236;0.254194;-0.965848;, 0.050236;0.254194;-0.965848;, 0.050236;0.254194;-0.965848;, 0.053994;0.256665;-0.964991;, 0.053994;0.256665;-0.964991;, 0.025950;0.131500;-0.990977;, 0.025950;0.131500;-0.990977;, 0.951019;-0.304272;-0.054610;, 0.948712;-0.303138;-0.089743;, 0.948712;-0.303138;-0.089743;, 0.381383;0.768069;0.514409;, 0.507104;0.848330;0.152257;, 0.507104;0.848330;0.152257;, -0.435483;0.863194;0.255443;, -0.490176;0.724204;0.485031;, -0.490176;0.724204;0.485031;, -0.724305;-0.616460;-0.308805;, -0.724305;-0.616460;-0.308805;, -0.724305;-0.616460;-0.308805;, -0.724317;-0.616416;-0.308863;, -0.724317;-0.616416;-0.308863;, -0.724317;-0.616416;-0.308863;, -0.024055;-0.241918;0.969998;, -0.061008;-0.240125;0.968823;, -0.061008;-0.240125;0.968823;, -0.018431;-0.307055;0.951513;, -0.018431;-0.307055;0.951513;, -0.018431;-0.307055;0.951513;, 0.034805;-0.239337;0.970313;, 0.034805;-0.239337;0.970313;, -0.038695;-0.250525;0.967336;, -0.038695;-0.250525;0.967336;, 0.030220;0.213045;-0.976575;, 0.030220;0.213045;-0.976575;, 0.034132;0.304299;-0.951965;, -0.007806;0.273919;-0.961721;, -0.007806;0.273919;-0.961721;, -0.007806;0.273919;-0.961721;, 0.083968;0.387347;-0.918102;, 0.083968;0.387347;-0.918102;, -0.057116;0.368416;-0.927905;, -0.057116;0.368416;-0.927905;, -0.721293;0.660526;0.208428;, -0.720884;0.661003;0.208331;, -0.720884;0.661003;0.208331;, -0.721300;-0.660448;-0.208651;, -0.720888;-0.660928;-0.208555;, -0.720888;-0.660928;-0.208555;, 0.721296;-0.660522;-0.208427;, 0.721296;-0.660522;-0.208427;, 0.721296;-0.660522;-0.208427;, 0.720895;-0.660850;-0.208778;, 0.720895;-0.660850;-0.208778;, 0.720895;-0.660850;-0.208778;, -0.000002;-0.331604;0.943419;, -0.000002;-0.331604;0.943419;, -0.000002;-0.331604;0.943419;, 0.000002;-0.331604;0.943419;, 0.000002;-0.331604;0.943419;, 0.000002;-0.331604;0.943419;, -0.000001;0.356214;-0.934405;, -0.000001;0.356214;-0.934405;, -0.000001;0.356214;-0.934405;, 0.000001;0.356213;-0.934405;, 0.000001;0.356213;-0.934405;, 0.000001;0.356213;-0.934405;; 52; 3;0,2,1;, 3;0,1,3;, 3;32,5,4;, 3;33,4,34;, 3;35,7,6;, 3;36,6,37;, 3;38,9,8;, 3;39,8,40;, 3;9,11,10;, 3;9,10,8;, 3;41,42,43;, 3;44,45,46;, 3;47,48,49;, 3;50,51,52;, 3;53,48,54;, 3;55,56,48;, 3;57,58,59;, 3;60,61,62;, 3;63,64,59;, 3;65,59,66;, 3;12,14,13;, 3;13,14,15;, 3;16,67,17;, 3;17,68,69;, 3;18,70,19;, 3;19,71,72;, 3;20,73,21;, 3;21,74,75;, 3;22,20,23;, 3;23,20,21;, 3;76,77,78;, 3;79,80,81;, 3;82,83,84;, 3;85,86,87;, 3;82,88,89;, 3;90,91,82;, 3;92,93,94;, 3;95,96,97;, 3;98,99,94;, 3;94,100,101;, 3;24,26,25;, 3;25,26,27;, 3;28,102,29;, 3;29,103,104;, 3;30,105,31;, 3;31,106,107;, 3;108,109,110;, 3;111,112,113;, 3;114,115,116;, 3;117,118,119;, 3;120,121,122;, 3;123,124,125;; } MeshMaterialList { 1; 52; 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, 0, 0, 0; Material { 0.800000;0.599216;0.401569;0.000000;; 20.000000; 0.500000;0.500000;0.500000;; 0.000000;0.000000;0.000000;; } } VertexDuplicationIndices { 126; 32; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 2, 2, 1, 5, 5, 4, 7, 7, 6, 11, 0, 3, 11, 3, 10, 11, 2, 0, 9, 2, 11, 7, 9, 7, 5, 10, 3, 1, 8, 10, 1, 6, 8, 6, 4, 12, 12, 13, 16, 16, 17, 18, 18, 19, 14, 22, 15, 15, 22, 23, 12, 22, 14, 12, 20, 22, 18, 20, 16, 18, 15, 23, 13, 23, 21, 13, 21, 19, 19, 17, 24, 24, 25, 28, 28, 29, 26, 30, 27, 27, 30, 31, 30, 24, 28, 30, 26, 24, 29, 25, 31, 25, 27, 31; } } } Frame rudder { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh { 78; 0.061133;0.101338;3.037190;, -0.015619;0.040559;2.809300;, -0.015619;0.101338;3.037190;, 0.061133;0.040559;2.809300;, 0.061133;-0.521583;3.052400;, -0.015619;-0.521583;3.052400;, 0.061133;-0.430417;3.341070;, -0.015619;-0.430417;3.341070;, 0.061133;-0.065769;3.751280;, -0.015619;-0.065769;3.751280;, 0.061133;0.298873;3.948780;, -0.015619;0.298873;3.948780;, 0.061133;0.678702;3.903190;, -0.015619;0.678702;3.903190;, 0.061133;0.952174;3.660090;, -0.015619;0.952174;3.660090;, 0.061133;0.967358;3.341040;, -0.015619;0.967358;3.341040;, 0.061133;0.845805;3.052370;, -0.015619;0.845805;3.052370;, 0.061133;0.086118;2.049640;, -0.015619;0.086118;2.049640;, -0.015619;0.101338;3.037190;, 0.061133;0.101338;3.037190;, -0.015619;0.101338;3.037190;, -0.015619;-0.521583;3.052400;, 0.061133;-0.521583;3.052400;, -0.015619;-0.521583;3.052400;, -0.015619;0.298873;3.948780;, 0.061133;0.298873;3.948780;, -0.015619;0.298873;3.948780;, -0.015619;0.678702;3.903190;, 0.061133;0.678702;3.903190;, -0.015619;0.678702;3.903190;, -0.015619;0.952174;3.660090;, 0.061133;0.952174;3.660090;, -0.015619;0.952174;3.660090;, -0.015619;0.086118;2.049640;, 0.061133;0.086118;2.049640;, -0.015619;0.086118;2.049640;, -0.015619;0.086118;2.049640;, -0.015619;0.040559;2.809300;, -0.015619;0.845805;3.052370;, -0.015619;0.040559;2.809300;, -0.015619;0.101338;3.037190;, -0.015619;0.845805;3.052370;, -0.015619;-0.521583;3.052400;, -0.015619;-0.430417;3.341070;, -0.015619;0.101338;3.037190;, -0.015619;-0.430417;3.341070;, -0.015619;-0.065769;3.751280;, -0.015619;-0.065769;3.751280;, -0.015619;0.298873;3.948780;, -0.015619;0.298873;3.948780;, -0.015619;0.678702;3.903190;, -0.015619;0.678702;3.903190;, -0.015619;0.967358;3.341040;, -0.015619;0.952174;3.660090;, -0.015619;0.967358;3.341040;, 0.061133;0.040559;2.809300;, 0.061133;0.086118;2.049640;, 0.061133;0.845805;3.052370;, 0.061133;0.101338;3.037190;, 0.061133;0.040559;2.809300;, 0.061133;0.845805;3.052370;, 0.061133;-0.430417;3.341070;, 0.061133;-0.521583;3.052400;, 0.061133;0.101338;3.037190;, 0.061133;-0.065769;3.751280;, 0.061133;-0.430417;3.341070;, 0.061133;-0.065769;3.751280;, 0.061133;0.298873;3.948780;, 0.061133;0.678702;3.903190;, 0.061133;0.298873;3.948780;, 0.061133;0.678702;3.903190;, 0.061133;0.967358;3.341040;, 0.061133;0.952174;3.660090;, 0.061133;0.967358;3.341040;; 40; 3;0,2,1;, 3;3,0,1;, 3;4,5,22;, 3;23,4,24;, 3;6,7,25;, 3;26,6,27;, 3;8,9,7;, 3;6,8,7;, 3;10,11,9;, 3;8,10,9;, 3;12,13,28;, 3;29,12,30;, 3;14,15,31;, 3;32,14,33;, 3;16,17,34;, 3;35,16,36;, 3;18,19,17;, 3;16,18,17;, 3;20,21,19;, 3;18,20,19;, 3;3,1,37;, 3;38,3,39;, 3;40,41,42;, 3;43,44,45;, 3;46,47,48;, 3;49,50,44;, 3;44,51,42;, 3;50,52,42;, 3;53,54,42;, 3;42,55,56;, 3;54,57,58;, 3;59,60,61;, 3;62,63,64;, 3;65,66,67;, 3;68,69,62;, 3;70,62,61;, 3;71,68,61;, 3;72,73,61;, 3;74,61,75;, 3;76,72,77;; MeshNormals { 78; 0.000000;-0.966226;0.257696;, 0.000000;-0.998051;0.062406;, 0.000000;-0.966226;0.257696;, 0.000000;-0.999849;-0.017362;, 0.000000;-0.024410;-0.999702;, 0.000000;-0.024410;-0.999702;, 0.000000;-0.874780;0.484520;, 0.000000;-0.803934;0.594719;, 0.000000;-0.681213;0.732085;, 0.000000;-0.592796;0.805353;, 0.000000;-0.476256;0.879306;, 0.000000;-0.476256;0.879306;, 0.000000;0.119173;0.992873;, 0.000000;0.119173;0.992873;, 0.000000;0.664385;0.747391;, 0.000000;0.664385;0.747391;, 0.000000;0.995195;-0.097917;, 0.000000;0.969162;-0.246426;, 0.000000;0.844316;-0.535846;, 0.000000;0.813354;-0.581769;, 0.000000;0.797076;-0.603879;, 0.000000;0.797076;-0.603879;, 0.000000;-0.024410;-0.999702;, 0.000000;-0.024410;-0.999702;, 0.000000;-0.024410;-0.999702;, 0.000000;-0.953576;0.301153;, 0.000000;-0.953576;0.301153;, 0.000000;-0.953576;0.301153;, 0.000000;0.119173;0.992873;, 0.000000;0.119173;0.992873;, 0.000000;0.119173;0.992873;, 0.000000;0.664385;0.747391;, 0.000000;0.664385;0.747391;, 0.000000;0.664385;0.747391;, 0.000000;0.998869;0.047537;, 0.000000;0.998869;0.047537;, 0.000000;0.998869;0.047537;, 0.000000;-0.998206;-0.059865;, 0.000000;-0.998206;-0.059865;, 0.000000;-0.998206;-0.059865;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;; 40; 3;0,2,1;, 3;3,0,1;, 3;4,5,22;, 3;23,4,24;, 3;6,7,25;, 3;26,6,27;, 3;8,9,7;, 3;6,8,7;, 3;10,11,9;, 3;8,10,9;, 3;12,13,28;, 3;29,12,30;, 3;14,15,31;, 3;32,14,33;, 3;16,17,34;, 3;35,16,36;, 3;18,19,17;, 3;16,18,17;, 3;20,21,19;, 3;18,20,19;, 3;3,1,37;, 3;38,3,39;, 3;40,41,42;, 3;43,44,45;, 3;46,47,48;, 3;49,50,44;, 3;44,51,42;, 3;50,52,42;, 3;53,54,42;, 3;42,55,56;, 3;54,57,58;, 3;59,60,61;, 3;62,63,64;, 3;65,66,67;, 3;68,69,62;, 3;70,62,61;, 3;71,68,61;, 3;72,73,61;, 3;74,61,75;, 3;76,72,77;; } MeshTextureCoords { 78; 0.309227;-0.075001;, 0.317107;-0.090309;, 0.309227;-0.075001;, 0.317107;-0.090309;, 0.389982;-0.073979;, 0.389982;-0.073979;, 0.378164;-0.054587;, 0.378164;-0.054587;, 0.330891;-0.027031;, 0.330891;-0.027031;, 0.283619;-0.013764;, 0.283619;-0.013764;, 0.234379;-0.016826;, 0.234379;-0.016826;, 0.198926;-0.033157;, 0.198926;-0.033157;, 0.196958;-0.054589;, 0.196958;-0.054589;, 0.212716;-0.073981;, 0.212716;-0.073981;, 0.311200;-0.141340;, 0.311200;-0.141340;, 0.309227;-0.075001;, 0.309227;-0.075001;, 0.309227;-0.075001;, 0.389982;-0.073979;, 0.389982;-0.073979;, 0.389982;-0.073979;, 0.283619;-0.013764;, 0.283619;-0.013764;, 0.283619;-0.013764;, 0.234379;-0.016826;, 0.234379;-0.016826;, 0.234379;-0.016826;, 0.198926;-0.033157;, 0.198926;-0.033157;, 0.198926;-0.033157;, 0.311200;-0.141340;, 0.311200;-0.141340;, 0.311200;-0.141340;, 0.311200;-0.141340;, 0.317107;-0.090309;, 0.212716;-0.073981;, 0.317107;-0.090309;, 0.309227;-0.075001;, 0.212716;-0.073981;, 0.389982;-0.073979;, 0.378164;-0.054587;, 0.309227;-0.075001;, 0.378164;-0.054587;, 0.330891;-0.027031;, 0.330891;-0.027031;, 0.283619;-0.013764;, 0.283619;-0.013764;, 0.234379;-0.016826;, 0.234379;-0.016826;, 0.196958;-0.054589;, 0.198926;-0.033157;, 0.196958;-0.054589;, 0.317107;-0.090309;, 0.311200;-0.141340;, 0.212716;-0.073981;, 0.309227;-0.075001;, 0.317107;-0.090309;, 0.212716;-0.073981;, 0.378164;-0.054587;, 0.389982;-0.073979;, 0.309227;-0.075001;, 0.330891;-0.027031;, 0.378164;-0.054587;, 0.330891;-0.027031;, 0.283619;-0.013764;, 0.234379;-0.016826;, 0.283619;-0.013764;, 0.234379;-0.016826;, 0.196958;-0.054589;, 0.198926;-0.033157;, 0.196958;-0.054589;; } MeshMaterialList { 1; 40; 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; Material { 0.800000;0.800000;0.800000;0.000000;; 0.000000; 0.000000;0.000000;0.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "bihull.bmp"; } } } VertexDuplicationIndices { 78; 22; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 2, 0, 2, 5, 4, 5, 11, 10, 11, 13, 12, 13, 15, 14, 15, 21, 20, 21, 21, 1, 19, 1, 2, 19, 5, 7, 2, 7, 9, 9, 11, 11, 13, 13, 17, 15, 17, 3, 20, 18, 0, 3, 18, 6, 4, 0, 8, 6, 8, 10, 12, 10, 12, 16, 14, 16; } } } Frame wheels { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;; } Mesh { 100; 0.769060;-0.602981;-2.024790;, 0.490834;-0.893387;-1.857120;, 0.490834;-0.602981;-2.024790;, 0.769060;-0.893387;-1.857120;, 0.769060;-0.602990;-2.360130;, 0.490834;-0.602990;-2.360130;, 0.769060;-0.893404;-2.527790;, 0.490834;-0.893404;-2.527790;, 0.769060;-1.183810;-2.360110;, 0.490834;-1.183810;-2.360110;, 0.769060;-1.183800;-2.024780;, 0.490834;-1.183800;-2.024780;, -0.411969;-0.602981;-2.024790;, -0.690195;-0.893387;-1.857120;, -0.690195;-0.602981;-2.024790;, -0.411969;-0.893387;-1.857120;, -0.411969;-0.602990;-2.360130;, -0.690195;-0.602990;-2.360130;, -0.411969;-0.893404;-2.527790;, -0.690195;-0.893404;-2.527790;, -0.411969;-1.183810;-2.360110;, -0.690195;-1.183810;-2.360110;, -0.411969;-1.183800;-2.024780;, -0.690195;-1.183800;-2.024780;, 0.490834;-0.602981;-2.024790;, 0.769060;-0.602981;-2.024790;, 0.490834;-0.602981;-2.024790;, 0.490834;-0.602990;-2.360130;, 0.769060;-0.602990;-2.360130;, 0.490834;-0.602990;-2.360130;, 0.490834;-0.893404;-2.527790;, 0.769060;-0.893404;-2.527790;, 0.490834;-0.893404;-2.527790;, 0.490834;-1.183810;-2.360110;, 0.769060;-1.183810;-2.360110;, 0.490834;-1.183810;-2.360110;, 0.769060;-0.893387;-1.857120;, 0.490834;-0.893387;-1.857120;, 0.490834;-1.183800;-2.024780;, 0.769060;-1.183800;-2.024780;, 0.769060;-0.893387;-1.857120;, 0.490834;-1.183800;-2.024780;, 0.490834;-0.602981;-2.024790;, 0.490834;-0.602990;-2.360130;, 0.490834;-0.893387;-1.857120;, 0.490834;-0.602990;-2.360130;, 0.490834;-0.893404;-2.527790;, 0.490834;-0.893387;-1.857120;, 0.490834;-0.893404;-2.527790;, 0.490834;-1.183810;-2.360110;, 0.490834;-1.183810;-2.360110;, 0.490834;-1.183800;-2.024780;, 0.769060;-0.602990;-2.360130;, 0.769060;-0.602981;-2.024790;, 0.769060;-0.893387;-1.857120;, 0.769060;-0.893404;-2.527790;, 0.769060;-0.602990;-2.360130;, 0.769060;-0.893387;-1.857120;, 0.769060;-1.183810;-2.360110;, 0.769060;-0.893404;-2.527790;, 0.769060;-1.183800;-2.024780;, 0.769060;-1.183810;-2.360110;, -0.690195;-0.602981;-2.024790;, -0.411969;-0.602981;-2.024790;, -0.690195;-0.602981;-2.024790;, -0.690195;-0.602990;-2.360130;, -0.411969;-0.602990;-2.360130;, -0.690195;-0.602990;-2.360130;, -0.690195;-0.893404;-2.527790;, -0.411969;-0.893404;-2.527790;, -0.690195;-0.893404;-2.527790;, -0.690195;-1.183810;-2.360110;, -0.411969;-1.183810;-2.360110;, -0.690195;-1.183810;-2.360110;, -0.411969;-0.893387;-1.857120;, -0.690195;-0.893387;-1.857120;, -0.690195;-1.183800;-2.024780;, -0.411969;-1.183800;-2.024780;, -0.411969;-0.893387;-1.857120;, -0.690195;-1.183800;-2.024780;, -0.690195;-0.602981;-2.024790;, -0.690195;-0.602990;-2.360130;, -0.690195;-0.893387;-1.857120;, -0.690195;-0.602990;-2.360130;, -0.690195;-0.893404;-2.527790;, -0.690195;-0.893387;-1.857120;, -0.690195;-0.893404;-2.527790;, -0.690195;-1.183810;-2.360110;, -0.690195;-1.183810;-2.360110;, -0.690195;-1.183800;-2.024780;, -0.411969;-0.602990;-2.360130;, -0.411969;-0.602981;-2.024790;, -0.411969;-0.893387;-1.857120;, -0.411969;-0.893404;-2.527790;, -0.411969;-0.602990;-2.360130;, -0.411969;-0.893387;-1.857120;, -0.411969;-1.183810;-2.360110;, -0.411969;-0.893404;-2.527790;, -0.411969;-1.183800;-2.024780;, -0.411969;-1.183810;-2.360110;; 40; 3;0,2,1;, 3;3,0,1;, 3;4,5,24;, 3;25,4,26;, 3;6,7,27;, 3;28,6,29;, 3;8,9,30;, 3;31,8,32;, 3;10,11,33;, 3;34,10,35;, 3;36,37,38;, 3;39,40,41;, 3;42,43,44;, 3;45,46,47;, 3;48,49,44;, 3;50,51,44;, 3;52,53,54;, 3;55,56,57;, 3;58,59,54;, 3;60,61,54;, 3;12,14,13;, 3;15,12,13;, 3;16,17,62;, 3;63,16,64;, 3;18,19,65;, 3;66,18,67;, 3;20,21,68;, 3;69,20,70;, 3;22,23,71;, 3;72,22,73;, 3;74,75,76;, 3;77,78,79;, 3;80,81,82;, 3;83,84,85;, 3;86,87,82;, 3;88,89,82;, 3;90,91,92;, 3;93,94,95;, 3;96,97,92;, 3;98,99,92;; MeshNormals { 100; 0.000000;0.500009;0.866020;, 0.000000;0.500009;0.866020;, 0.000000;0.500009;0.866020;, 0.000000;0.500009;0.866020;, 0.000000;1.000000;-0.000027;, 0.000000;1.000000;-0.000027;, 0.000000;0.499976;-0.866039;, 0.000000;0.499976;-0.866039;, 0.000000;-0.500031;-0.866007;, 0.000000;-0.500031;-0.866007;, 0.000000;-1.000000;0.000030;, 0.000000;-1.000000;0.000030;, 0.000000;0.500009;0.866020;, 0.000000;0.500009;0.866020;, 0.000000;0.500009;0.866020;, 0.000000;0.500009;0.866020;, 0.000000;1.000000;-0.000027;, 0.000000;1.000000;-0.000027;, 0.000000;0.499976;-0.866039;, 0.000000;0.499976;-0.866039;, 0.000000;-0.500031;-0.866007;, 0.000000;-0.500031;-0.866007;, 0.000000;-1.000000;0.000030;, 0.000000;-1.000000;0.000030;, 0.000000;1.000000;-0.000027;, 0.000000;1.000000;-0.000027;, 0.000000;1.000000;-0.000027;, 0.000000;0.499976;-0.866039;, 0.000000;0.499976;-0.866039;, 0.000000;0.499976;-0.866039;, 0.000000;-0.500031;-0.866007;, 0.000000;-0.500031;-0.866007;, 0.000000;-0.500031;-0.866007;, 0.000000;-1.000000;0.000030;, 0.000000;-1.000000;0.000030;, 0.000000;-1.000000;0.000030;, 0.000000;-0.499978;0.866038;, 0.000000;-0.499978;0.866038;, 0.000000;-0.499978;0.866038;, 0.000000;-0.499978;0.866038;, 0.000000;-0.499978;0.866038;, 0.000000;-0.499978;0.866038;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 0.000000;1.000000;-0.000027;, 0.000000;1.000000;-0.000027;, 0.000000;1.000000;-0.000027;, 0.000000;0.499976;-0.866039;, 0.000000;0.499976;-0.866039;, 0.000000;0.499976;-0.866039;, 0.000000;-0.500031;-0.866007;, 0.000000;-0.500031;-0.866007;, 0.000000;-0.500031;-0.866007;, 0.000000;-1.000000;0.000030;, 0.000000;-1.000000;0.000030;, 0.000000;-1.000000;0.000030;, 0.000000;-0.499978;0.866038;, 0.000000;-0.499978;0.866038;, 0.000000;-0.499978;0.866038;, 0.000000;-0.499978;0.866038;, 0.000000;-0.499978;0.866038;, 0.000000;-0.499978;0.866038;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;; 40; 3;0,2,1;, 3;3,0,1;, 3;4,5,24;, 3;25,4,26;, 3;6,7,27;, 3;28,6,29;, 3;8,9,30;, 3;31,8,32;, 3;10,11,33;, 3;34,10,35;, 3;36,37,38;, 3;39,40,41;, 3;42,43,44;, 3;45,46,47;, 3;48,49,44;, 3;50,51,44;, 3;52,53,54;, 3;55,56,57;, 3;58,59,54;, 3;60,61,54;, 3;12,14,13;, 3;15,12,13;, 3;16,17,62;, 3;63,16,64;, 3;18,19,65;, 3;66,18,67;, 3;20,21,68;, 3;69,20,70;, 3;22,23,71;, 3;72,22,73;, 3;74,75,76;, 3;77,78,79;, 3;80,81,82;, 3;83,84,85;, 3;86,87,82;, 3;88,89,82;, 3;90,91,92;, 3;93,94,95;, 3;96,97,92;, 3;98,99,92;; } MeshMaterialList { 1; 40; 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; Material { 0.000000;0.000000;0.000000;0.000000;; 20.000000; 0.256863;0.256863;0.256863;; 0.000000;0.000000;0.000000;; } } VertexDuplicationIndices { 100; 24; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 2, 0, 2, 5, 4, 5, 7, 6, 7, 9, 8, 9, 3, 1, 11, 10, 3, 11, 2, 5, 1, 5, 7, 1, 7, 9, 9, 11, 4, 0, 3, 6, 4, 3, 8, 6, 10, 8, 14, 12, 14, 17, 16, 17, 19, 18, 19, 21, 20, 21, 15, 13, 23, 22, 15, 23, 14, 17, 13, 17, 19, 13, 19, 21, 21, 23, 16, 12, 15, 18, 16, 15, 20, 18, 22, 20; } } } } ================================================ FILE: common/Addons/DXTest/DX9EnvMapping/lobby_skybox.x ================================================ xof 0302txt 0064 template Header { <3D82AB43-62DA-11cf-AB39-0020AF71E433> WORD major; WORD minor; DWORD flags; } template Vector { <3D82AB5E-62DA-11cf-AB39-0020AF71E433> FLOAT x; FLOAT y; FLOAT z; } template Coords2d { FLOAT u; FLOAT v; } template Matrix4x4 { array FLOAT matrix[16]; } template ColorRGBA { <35FF44E0-6C7C-11cf-8F52-0040333594A3> FLOAT red; FLOAT green; FLOAT blue; FLOAT alpha; } template ColorRGB { FLOAT red; FLOAT green; FLOAT blue; } template IndexedColor { <1630B820-7842-11cf-8F52-0040333594A3> DWORD index; ColorRGBA indexColor; } template Boolean { <4885AE61-78E8-11cf-8F52-0040333594A3> WORD truefalse; } template Boolean2d { <4885AE63-78E8-11cf-8F52-0040333594A3> Boolean u; Boolean v; } template MaterialWrap { <4885AE60-78E8-11cf-8F52-0040333594A3> Boolean u; Boolean v; } template TextureFilename { STRING filename; } template Material { <3D82AB4D-62DA-11cf-AB39-0020AF71E433> ColorRGBA faceColor; FLOAT power; ColorRGB specularColor; ColorRGB emissiveColor; [...] } template MeshFace { <3D82AB5F-62DA-11cf-AB39-0020AF71E433> DWORD nFaceVertexIndices; array DWORD faceVertexIndices[nFaceVertexIndices]; } template MeshFaceWraps { <4885AE62-78E8-11cf-8F52-0040333594A3> DWORD nFaceWrapValues; Boolean2d faceWrapValues; } template MeshTextureCoords { DWORD nTextureCoords; array Coords2d textureCoords[nTextureCoords]; } template MeshMaterialList { DWORD nMaterials; DWORD nFaceIndexes; array DWORD faceIndexes[nFaceIndexes]; [Material] } template MeshNormals { DWORD nNormals; array Vector normals[nNormals]; DWORD nFaceNormals; array MeshFace faceNormals[nFaceNormals]; } template MeshVertexColors { <1630B821-7842-11cf-8F52-0040333594A3> DWORD nVertexColors; array IndexedColor vertexColors[nVertexColors]; } template Mesh { <3D82AB44-62DA-11cf-AB39-0020AF71E433> DWORD nVertices; array Vector vertices[nVertices]; DWORD nFaces; array MeshFace faces[nFaces]; [...] } template FrameTransformMatrix { Matrix4x4 frameMatrix; } template Frame { <3D82AB46-62DA-11cf-AB39-0020AF71E433> [...] } Header { 1; 0; 1; } Frame CUBE_Root { FrameTransformMatrix { 3.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000;; } Mesh Unnamed_0 { 4; 1.000000;1.000000;-1.000000;, // 0 -1.000000;1.000000;-1.000000;, // 1 -1.000000;1.000000;1.000000;, // 2 1.000000;1.000000;1.000000;; // 3 2; 3;0,2,1;, 3;0,3,2;; MeshMaterialList { 1; 2; 0, 0; Material { 1.000000;1.000000;1.000000;1.000000;; 0.000000; 1.000000;1.000000;1.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "LobbyYPos.jpg"; } } } MeshNormals { 4; 0.000000;1.000000;0.000000;, 0.000000;1.000000;0.000000;, 0.000000;1.000000;0.000000;, 0.000000;1.000000;0.000000;; 2; 3;0,1,2;, 3;0,2,3;; } MeshTextureCoords { 4; 1.000000;0.000000;; 0.000000;0.000000;, 0.000000;1.000000;, 1.000000;1.000000;, } } Mesh Unnamed_1 { 4; 1.000000;1.000000;-1.000000;, // 0 1.000000;1.000000;1.000000;, // 3 1.000000;-1.000000;1.000000;, // 7 1.000000;-1.000000;-1.000000;, // 4 2; 3;0,2,1;, 3;0,3,2;; MeshMaterialList { 1; 2; 0, 0; Material { 1.000000;1.000000;1.000000;1.000000;; 0.000000; 1.000000;1.000000;1.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "LobbyXPos.jpg"; } } } MeshNormals { 4; 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 1.000000;0.000000;0.000000;, 2; 3;0,1,2;, 3;0,2,3;; } MeshTextureCoords { 4; 1.000000;0.000000;; 0.000000;0.000000;, 0.000000;1.000000;, 1.000000;1.000000;, } } Mesh Unnamed_2 { 4; -1.000000;1.000000;-1.000000;, // 1 -1.000000;-1.000000;-1.000000;, // 5 -1.000000;-1.000000;1.000000;, // 6 -1.000000;1.000000;1.000000;, // 2 2; 3;0,2,1;, 3;0,3,2;; MeshMaterialList { 1; 2; 0, 0; Material { 1.000000;1.000000;1.000000;1.000000;; 0.000000; 1.000000;1.000000;1.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "LobbyXNeg.jpg"; } } } MeshNormals { 4; -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, -1.000000;0.000000;0.000000;, 2; 3;0,1,2;, 3;0,2,3;; } MeshTextureCoords { 4; 0.000000;0.000000;, 0.000000;1.000000;, 1.000000;1.000000;, 1.000000;0.000000;; } } Mesh Unnamed_3 { 4; 1.000000;1.000000;1.000000;, // 3 -1.000000;1.000000;1.000000;, // 2 -1.000000;-1.000000;1.000000;, // 6 1.000000;-1.000000;1.000000;, // 7 2; 3;0,2,1;, 3;0,3,2;; MeshMaterialList { 1; 2; 0, 0; Material { 1.000000;1.000000;1.000000;1.000000;; 0.000000; 1.000000;1.000000;1.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "LobbyZPos.jpg"; } } } MeshNormals { 4; 0.000000;0.000000;1.000000;, 0.000000;0.000000;1.000000;, 0.000000;0.000000;1.000000;, 0.000000;0.000000;1.000000;, 2; 3;0,1,2;, 3;0,2,3;; } MeshTextureCoords { 4; 1.000000;0.000000;; 0.000000;0.000000;, 0.000000;1.000000;, 1.000000;1.000000;, } } Mesh Unnamed_4 { 4; 1.000000;1.000000;-1.000000;, // 0 1.000000;-1.000000;-1.000000;, // 4 -1.000000;-1.000000;-1.000000;, // 5 -1.000000;1.000000;-1.000000;, // 1 2; 3;0,2,1;, 3;0,3,2;; MeshMaterialList { 1; 2; 0, 0; Material { 1.000000;1.000000;1.000000;1.000000;; 0.000000; 1.000000;1.000000;1.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "LobbyZNeg.jpg"; } } } MeshNormals { 4; 0.000000;0.000000;-1.000000;, 0.000000;0.000000;-1.000000;, 0.000000;0.000000;-1.000000;, 0.000000;0.000000;-1.000000;, 2; 3;0,1,2;, 3;0,2,3;; } MeshTextureCoords { 4; 0.000000;0.000000;, 0.000000;1.000000;, 1.000000;1.000000;, 1.000000;0.000000;; } } Mesh Unnamed_5 { 4; 1.000000;-1.000000;-1.000000;, // 4 1.000000;-1.000000;1.000000;, // 7 -1.000000;-1.000000;1.000000;, // 6 -1.000000;-1.000000;-1.000000;; // 5 2; 3;0,2,1;, 3;0,3,2;; MeshMaterialList { 1; 2; 0, 0; Material { 1.000000;1.000000;1.000000;1.000000;; 0.000000; 1.000000;1.000000;1.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "LobbyYNeg.jpg"; } } } MeshNormals { 4; 0.000000;-1.000000;0.000000;, 0.000000;-1.000000;0.000000;, 0.000000;-1.000000;0.000000;, 0.000000;-1.000000;0.000000;; 2; 3;0,1,2;, 3;0,2,3;; } MeshTextureCoords { 4; 1.000000;1.000000;, 1.000000;0.000000;; 0.000000;0.000000;, 0.000000;1.000000;, } } } ================================================ FILE: common/Addons/DXTest/DX9StencilMirror/StencilMirror_d3d9.log ================================================ info: Game: StencilMirror.exe info: DXVK: v1.10.3-async info: Built-in extension providers: info: Win32 WSI info: OpenVR info: OpenXR info: OpenVR: could not open registry key, status 2 info: OpenVR: Failed to locate module info: Enabled instance extensions: info: VK_KHR_get_surface_capabilities2 info: VK_KHR_surface info: VK_KHR_win32_surface info: D3D9: VK_FORMAT_D16_UNORM_S8_UINT -> VK_FORMAT_D24_UNORM_S8_UINT info: Intel(R) HD Graphics 4600 (HSW GT2): info: Driver: 24.2.99 info: Vulkan: 1.2.289 info: Memory Heap[0]: info: Size: 1536 MiB info: Flags: 0x1 info: Memory Type[0]: Property Flags = 0x1 info: Memory Type[1]: Property Flags = 0xf info: Process set as DPI aware info: Device properties: info: Device name: : Intel(R) HD Graphics 4600 (HSW GT2) info: Driver version : 24.2.99 info: Enabled device extensions: info: VK_EXT_4444_formats info: VK_EXT_depth_clip_enable info: VK_EXT_extended_dynamic_state info: VK_EXT_host_query_reset info: VK_EXT_non_seamless_cube_map info: VK_EXT_robustness2 info: VK_EXT_shader_demote_to_helper_invocation info: VK_EXT_shader_viewport_index_layer info: VK_EXT_transform_feedback info: VK_EXT_vertex_attribute_divisor info: VK_KHR_create_renderpass2 info: VK_KHR_depth_stencil_resolve info: VK_KHR_draw_indirect_count info: VK_KHR_driver_properties info: VK_KHR_image_format_list info: VK_KHR_sampler_mirror_clamp_to_edge info: VK_KHR_shader_float_controls info: VK_KHR_swapchain info: VK_KHR_timeline_semaphore info: Device features: info: robustBufferAccess : 1 info: fullDrawIndexUint32 : 1 info: imageCubeArray : 1 info: independentBlend : 1 info: geometryShader : 1 info: tessellationShader : 0 info: sampleRateShading : 1 info: dualSrcBlend : 0 info: logicOp : 0 info: multiDrawIndirect : 0 info: drawIndirectFirstInstance : 0 info: depthClamp : 1 info: depthBiasClamp : 1 info: fillModeNonSolid : 1 info: depthBounds : 0 info: multiViewport : 1 info: samplerAnisotropy : 1 info: textureCompressionBC : 1 info: occlusionQueryPrecise : 1 info: pipelineStatisticsQuery : 1 info: vertexPipelineStoresAndAtomics : 0 info: fragmentStoresAndAtomics : 0 info: shaderImageGatherExtended : 0 info: shaderStorageImageExtendedFormats : 0 info: shaderStorageImageReadWithoutFormat : 0 info: shaderStorageImageWriteWithoutFormat : 1 info: shaderClipDistance : 1 info: shaderCullDistance : 1 info: shaderFloat64 : 0 info: shaderInt64 : 0 info: variableMultisampleRate : 0 info: VK_EXT_4444_formats info: formatA4R4G4B4 : 1 info: formatA4B4G4R4 : 0 info: VK_EXT_custom_border_color info: customBorderColors : 0 info: customBorderColorWithoutFormat : 0 info: VK_EXT_depth_clip_enable info: depthClipEnable : 1 info: VK_EXT_extended_dynamic_state info: extendedDynamicState : 1 info: VK_EXT_host_query_reset info: hostQueryReset : 1 info: VK_EXT_memory_priority info: memoryPriority : 0 info: VK_EXT_non_seamless_cube_map info: nonSeamlessCubeMap : 1 info: VK_EXT_robustness2 info: robustBufferAccess2 : 1 info: robustImageAccess2 : 0 info: nullDescriptor : 1 info: VK_EXT_shader_demote_to_helper_invocation info: shaderDemoteToHelperInvocation : 1 info: VK_EXT_transform_feedback info: transformFeedback : 0 info: geometryStreams : 0 info: VK_EXT_vertex_attribute_divisor info: vertexAttributeInstanceRateDivisor : 1 info: vertexAttributeInstanceRateZeroDivisor : 1 info: VK_KHR_buffer_device_address info: bufferDeviceAddress : 0 info: VK_KHR_timeline_semaphore info: timelineSemaphore : 0 info: Queue families: info: Graphics : 0 info: Transfer : 0 warn: DXVK: No state cache file found warn: DXVK: Creating new state cache file info: D3D9DeviceEx::ResetSwapChain: info: Requested Presentation Parameters info: - Width: 400 info: - Height: 300 info: - Format: D3D9Format::X8R8G8B8 info: - Auto Depth Stencil: true info: ^ Format: D3D9Format::D24S8 info: - Windowed: true info: Presenter: Actual swap chain properties: info: Format: VK_FORMAT_B8G8R8A8_UNORM info: Present mode: VK_PRESENT_MODE_IMMEDIATE_KHR info: Buffer size: 400x300 info: Image count: 3 info: Exclusive FS: 0 warn: D3D9DeviceEx::SetRenderState: Unhandled render state 26 info: Presenter: Actual swap chain properties: info: Format: VK_FORMAT_B8G8R8A8_UNORM info: Present mode: VK_PRESENT_MODE_IMMEDIATE_KHR info: Buffer size: 400x300 info: Image count: 3 info: Exclusive FS: 0 ================================================ FILE: common/Addons/DXTest/DX9StencilMirror/heli.x ================================================ xof 0302txt 0064 // DV3881 Copyright Viewpoint Datalabs Intl., Inc. // www.viewpoint.com, 800-643-8303, 801-229-3333 // for Microsoft Corporation DirectX format only // see license agreement for description of rights // Model by Viewpoint Datalabs Intl., Inc. template Header { <3D82AB43-62DA-11cf-AB39-0020AF71E433> WORD major; WORD minor; DWORD flags; } template ColorRGBA { <35FF44E0-6C7C-11cf-8F52-0040333594A3> FLOAT red; FLOAT green; FLOAT blue; FLOAT alpha; } template ColorRGB { FLOAT red; FLOAT green; FLOAT blue; } template Material { <3D82AB4D-62DA-11cf-AB39-0020AF71E433> ColorRGBA faceColor; FLOAT power; ColorRGB specularColor; ColorRGB emissiveColor; [...] } template Vector { <3D82AB5E-62DA-11cf-AB39-0020AF71E433> FLOAT x; FLOAT y; FLOAT z; } template MeshFace { <3D82AB5F-62DA-11cf-AB39-0020AF71E433> DWORD nFaceVertexIndices; array DWORD faceVertexIndices[nFaceVertexIndices]; } template Mesh { <3D82AB44-62DA-11cf-AB39-0020AF71E433> DWORD nVertices; array Vector vertices[nVertices]; DWORD nFaces; array MeshFace faces[nFaces]; [...] } template MeshMaterialList { DWORD nMaterials; DWORD nFaceIndexes; array DWORD faceIndexes[nFaceIndexes]; [Material] } template Frame { <3D82AB46-62DA-11cf-AB39-0020AF71E433> [...] } template AnimationKey { <10DD46A8-775B-11cf-8F52-0040333594A3> DWORD keyType; DWORD nKeys; array TimedFloatKeys keys[nKeys]; } template Animation { <3D82AB4F-62DA-11cf-AB39-0020AF71E433> [...] } template AnimationSet { <3D82AB50-62DA-11cf-AB39-0020AF71E433> [Animation] } Header { 1; 0; 1; } Frame Root{ Frame guard { Mesh mesh-guard { 8; 0.000190;0.520175;6.491285;, 0.000191;-0.379825;6.531285;, 0.000182;-0.399825;6.161285;, 0.000175;-0.359825;5.891285;, 0.000199;0.310175;6.811285;, 0.000198;0.430175;6.761285;, 0.000198;-0.129825;6.761285;, 0.000146;0.160175;4.791285;; 7; 3; 2,1,0;, 4; 5,4,2,3;, 4; 4,6,1,2;, 3; 1,6,0;, 3; 0,5,3;, 4; 7,3,2,0;, 4; 6,4,5,0;; MeshNormals { 2; -1.000;-0.000;0.000;, 1.000;-0.000;-0.000;; 7; 3;0,0,0;, 4;1,1,1,1;, 4;1,1,1,1;, 3;0,0,0;, 3;1,1,1;, 4;0,0,0,0;, 4;0,0,0,0;; } MeshMaterialList { 1; 7; 0, 0, 0, 0, 0, 0, 0;; Material red { 0.771400;0.000000;0.000000;1.000000;; 136.430000; 0.885700;0.000000;0.000000;; 0.000000;0.000000;0.000000;; } } } } Frame stab { Mesh mesh-stab { 16; 0.950119;0.130175;3.791260;, 0.170119;0.130175;3.791281;, 0.170126;0.130175;4.051281;, 0.950126;0.130175;4.051260;, -0.949881;0.180175;3.791310;, -0.169881;0.180175;3.791289;, -0.169874;0.180175;4.051289;, -0.949874;0.180175;4.051310;, -0.949874;0.130175;4.051310;, -0.169874;0.130175;4.051289;, -0.169881;0.130175;3.791289;, -0.949881;0.130175;3.791310;, 0.950126;0.180175;4.051260;, 0.170126;0.180175;4.051281;, 0.170119;0.180175;3.791281;, 0.950119;0.180175;3.791260;; 12; 4; 3,2,1,0;, 4; 7,6,5,4;, 4; 11,10,9,8;, 4; 15,14,13,12;, 4; 4,11,8,7;, 4; 5,10,11,4;, 4; 6,9,10,5;, 4; 7,8,9,6;, 4; 12,3,0,15;, 4; 13,2,3,12;, 4; 14,1,2,13;, 4; 15,0,1,14;; MeshNormals { 6; 0.000;-1.000;0.000;, -0.000;0.000;-1.000;, 0.000;0.000;1.000;, -1.000;0.000;0.000;, 0.000;1.000;0.000;, 1.000;0.000;-0.000;; 12; 4;0,0,0,0;, 4;4,4,4,4;, 4;0,0,0,0;, 4;4,4,4,4;, 4;3,3,3,3;, 4;1,1,1,1;, 4;5,5,5,5;, 4;2,2,2,2;, 4;5,5,5,5;, 4;2,2,2,2;, 4;3,3,3,3;, 4;1,1,1,1;; } MeshMaterialList { 1; 12; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;; Material red { 0.771400;0.000000;0.000000;1.000000;; 136.430000; 0.885700;0.000000;0.000000;; 0.000000;0.000000;0.000000;; } } } } Frame tail { Mesh mesh-tail { 16; -0.059821;0.410175;6.041286;, 0.060179;0.410175;6.041284;, 0.320046;-0.709825;0.981277;, -0.319954;-0.709825;0.981293;, -0.319956;0.060175;0.911293;, -0.529983;-1.219825;-0.098701;, -0.529983;0.160175;-0.098701;, 0.559968;-1.249825;-1.948730;, 0.559968;0.190175;-1.948730;, -0.560032;0.190175;-1.948700;, -0.560032;-1.249825;-1.948700;, 0.530017;0.160175;-0.098729;, 0.530017;-1.219825;-0.098729;, 0.060182;0.650175;6.161283;, 0.320044;0.060175;0.911277;, -0.059818;0.650175;6.161286;; 14; 4; 3,2,1,0;, 4; 6,5,3,4;, 4; 10,9,8,7;, 4; 5,6,9,10;, 4; 8,9,6,11;, 4; 5,12,2,3;, 4; 2,14,13,1;, 4; 4,3,0,15;, 4; 11,6,4,14;, 4; 15,0,1,13;, 4; 7,8,11,12;, 4; 10,7,12,5;, 4; 12,11,14,2;, 4; 14,4,15,13;; MeshNormals { 12; 0.000;-0.793;0.609;, -0.000;0.994;-0.112;, 0.000;-0.944;0.331;, 0.000;-1.000;0.016;, -0.992;0.002;0.124;, 1.000;0.000;0.016;, 0.000;1.000;0.016;, -0.000;0.000;-1.000;, 0.995;0.000;0.095;, 0.000;-0.977;0.213;, -1.000;0.000;0.016;, 0.000;-0.447;0.894;; 14; 4;2,2,0,0;, 4;4,4,4,4;, 4;7,7,7,7;, 4;4,4,10,10;, 4;6,6,6,6;, 4;9,9,2,2;, 4;8,8,5,5;, 4;4,4,10,10;, 4;6,6,6,6;, 4;11,0,0,11;, 4;5,5,8,8;, 4;3,3,9,9;, 4;8,8,8,8;, 4;6,6,1,1;; } MeshMaterialList { 1; 14; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;; Material red { 0.771400;0.000000;0.000000;1.000000;; 136.430000; 0.885700;0.000000;0.000000;; 0.000000;0.000000;0.000000;; } } } } Frame rrotor { Mesh mesh-rrotor { 40; 0.212859;1.370680;5.720087;, 0.212852;1.326606;5.441804;, 0.212845;1.198697;5.190759;, 0.212840;0.999473;4.991526;, 0.212837;0.748434;4.863605;, 0.212835;0.470153;4.819518;, 0.212837;0.191868;4.863579;, 0.212840;-0.059183;4.991477;, 0.212845;-0.258425;5.190692;, 0.212852;-0.386358;5.441724;, 0.212859;-0.430458;5.720003;, 0.212866;-0.386409;5.998291;, 0.212873;-0.258523;6.249347;, 0.212878;-0.059318;6.448599;, 0.212882;0.191709;6.576543;, 0.212883;0.469986;6.620656;, 0.212882;0.748275;6.576621;, 0.212878;0.999338;6.448746;, 0.212873;1.198599;6.249550;, 0.212866;1.326554;5.998529;, 0.112866;1.326554;5.998529;, 0.112873;1.198599;6.249550;, 0.112878;0.999338;6.448746;, 0.112882;0.748275;6.576621;, 0.112883;0.469986;6.620656;, 0.112882;0.191709;6.576543;, 0.112878;-0.059318;6.448599;, 0.112873;-0.258523;6.249347;, 0.112866;-0.386409;5.998291;, 0.112859;-0.430458;5.720003;, 0.112852;-0.386358;5.441724;, 0.112845;-0.258425;5.190692;, 0.112840;-0.059183;4.991477;, 0.112837;0.191868;4.863579;, 0.112835;0.470153;4.819518;, 0.112837;0.748434;4.863605;, 0.112840;0.999473;4.991526;, 0.112845;1.198697;5.190759;, 0.112852;1.326606;5.441804;, 0.112859;1.370680;5.720087;; 22; 20; 19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0;, 20; 39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20;, 4; 11,28,29,10;, 4; 12,27,28,11;, 4; 13,26,27,12;, 4; 14,25,26,13;, 4; 15,24,25,14;, 4; 16,23,24,15;, 4; 17,22,23,16;, 4; 18,21,22,17;, 4; 19,20,21,18;, 4; 0,39,20,19;, 4; 1,38,39,0;, 4; 2,37,38,1;, 4; 3,36,37,2;, 4; 4,35,36,3;, 4; 5,34,35,4;, 4; 6,33,34,5;, 4; 7,32,33,6;, 4; 9,30,31,8;, 4; 10,29,30,9;, 4; 8,31,32,7;; MeshNormals { 22; 1.000;-0.000;-0.000;, 0.000;1.000;0.000;, 0.000;0.951;-0.309;, 0.000;0.809;-0.588;, 0.000;0.588;-0.809;, 0.000;0.309;-0.951;, 0.000;0.000;-1.000;, 0.000;-0.309;-0.951;, 0.000;-0.588;-0.809;, 0.000;-0.809;-0.588;, 0.000;-0.951;-0.309;, 0.000;-1.000;-0.000;, 0.000;-0.951;0.309;, 0.000;-0.809;0.588;, 0.000;-0.588;0.809;, 0.000;-0.309;0.951;, 0.000;-0.000;1.000;, 0.000;0.309;0.951;, 0.000;0.588;0.809;, 0.000;0.809;0.588;, -1.000;0.000;0.000;, 0.000;0.951;0.309;; 22; 20;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;, 20;20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20;, 4;12,12,11,11;, 4;13,13,12,12;, 4;14,14,13,13;, 4;15,15,14,14;, 4;16,16,15,15;, 4;17,17,16,16;, 4;18,18,17,17;, 4;19,19,18,18;, 4;21,21,19,19;, 4;1,1,21,21;, 4;2,2,1,1;, 4;3,3,2,2;, 4;4,4,3,3;, 4;5,5,4,4;, 4;6,6,5,5;, 4;7,7,6,6;, 4;8,8,7,7;, 4;10,10,9,9;, 4;11,11,10,10;, 4;9,9,8,8;; } MeshMaterialList { 1; 22; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;; Material grey { 0.183700;0.183700;0.183700;0.500000;; 65.890000; 0.500000;0.500000;0.500000;; 0.000000;0.000000;0.000000;; } } } } Frame mroter { Mesh mesh-mroter { 40; 5.765566;1.499817;1.125585;, 4.904222;1.499794;2.815463;, 3.562846;1.499759;4.156475;, 1.872734;1.499714;5.017361;, -0.000684;1.499665;5.313855;, -1.874033;1.499616;5.016938;, -3.563951;1.499571;4.155673;, -4.905024;1.499536;2.814358;, -5.765989;1.499513;1.124287;, -6.062570;1.499506;-0.749118;, -5.765740;1.499513;-2.622481;, -4.904552;1.499536;-4.312439;, -3.563300;1.499571;-5.653574;, -1.873269;1.499616;-6.514617;, 0.000122;1.499665;-6.811285;, 1.873499;1.499714;-6.514541;, 3.563497;1.499759;-5.653433;, 4.904694;1.499794;-4.312243;, 5.765815;1.499817;-2.622251;, 6.062570;1.499825;-0.748874;, 6.062570;1.399825;-0.748874;, 5.765815;1.399817;-2.622251;, 4.904694;1.399794;-4.312243;, 3.563497;1.399759;-5.653433;, 1.873499;1.399714;-6.514541;, 0.000122;1.399665;-6.811285;, -1.873269;1.399616;-6.514617;, -3.563300;1.399571;-5.653574;, -4.904552;1.399536;-4.312439;, -5.765740;1.399513;-2.622481;, -6.062570;1.399506;-0.749118;, -5.765989;1.399513;1.124287;, -4.905024;1.399536;2.814358;, -3.563951;1.399571;4.155673;, -1.874033;1.399616;5.016938;, -0.000684;1.399665;5.313855;, 1.872734;1.399714;5.017361;, 3.562846;1.399759;4.156475;, 4.904222;1.399794;2.815463;, 5.765566;1.399817;1.125585;; 22; 20; 19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0;, 20; 39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20;, 4; 14,25,26,13;, 4; 15,24,25,14;, 4; 16,23,24,15;, 4; 17,22,23,16;, 4; 18,21,22,17;, 4; 19,20,21,18;, 4; 0,39,20,19;, 4; 1,38,39,0;, 4; 2,37,38,1;, 4; 3,36,37,2;, 4; 4,35,36,3;, 4; 5,34,35,4;, 4; 7,32,33,6;, 4; 8,31,32,7;, 4; 10,29,30,9;, 4; 11,28,29,10;, 4; 13,26,27,12;, 4; 6,33,34,5;, 4; 12,27,28,11;, 4; 9,30,31,8;; MeshNormals { 22; -0.000;1.000;-0.000;, 0.951;0.000;0.309;, 0.809;0.000;0.588;, 0.588;0.000;0.809;, 0.309;0.000;0.951;, -0.000;0.000;1.000;, -0.309;0.000;0.951;, -0.588;0.000;0.809;, -0.809;0.000;0.588;, -0.951;0.000;0.309;, -1.000;0.000;-0.000;, -0.951;0.000;-0.309;, -0.809;0.000;-0.588;, -0.588;0.000;-0.809;, -0.309;0.000;-0.951;, 0.000;0.000;-1.000;, 0.309;0.000;-0.951;, 0.588;0.000;-0.809;, 0.809;0.000;-0.588;, 0.951;0.000;-0.309;, 0.000;-1.000;-0.000;, 1.000;0.000;0.000;; 22; 20;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;, 20;20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20;, 4;15,15,14,14;, 4;16,16,15,15;, 4;17,17,16,16;, 4;18,18,17,17;, 4;19,19,18,18;, 4;21,21,19,19;, 4;1,1,21,21;, 4;2,2,1,1;, 4;3,3,2,2;, 4;4,4,3,3;, 4;5,5,4,4;, 4;6,6,5,5;, 4;8,8,7,7;, 4;9,9,8,8;, 4;11,11,10,10;, 4;12,12,11,11;, 4;14,14,13,13;, 4;7,7,6,6;, 4;13,13,12,12;, 4;10,10,9,9;; } MeshMaterialList { 1; 22; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;; Material grey { 0.183700;0.183700;0.183700;0.500000;; 65.890000; 0.500000;0.500000;0.500000;; 0.000000;0.000000;0.000000;; } } } } Frame shaft { Mesh mesh-shaft { 24; -0.260000;-0.079825;-0.748708;, -0.129994;-0.079825;-0.528712;, 0.130006;-0.079825;-0.528718;, -0.130006;-0.079825;-0.978712;, 0.050002;1.470175;-0.658716;, 0.110000;1.470175;-0.748718;, 0.110000;0.900175;-0.748718;, 0.050002;0.900175;-0.658716;, -0.049998;0.900175;-0.658714;, 0.130006;0.710175;-0.528718;, -0.129994;0.710175;-0.528712;, 0.049997;0.900175;-0.848716;, 0.129994;0.710175;-0.978718;, 0.260000;0.710175;-0.748722;, 0.260000;-0.079825;-0.748722;, 0.129994;-0.079825;-0.978718;, -0.260000;0.710175;-0.748708;, -0.050003;1.470175;-0.848714;, 0.049997;1.470175;-0.848716;, -0.050003;0.900175;-0.848714;, -0.130006;0.710175;-0.978712;, -0.110000;1.470175;-0.748712;, -0.110000;0.900175;-0.748712;, -0.049998;1.470175;-0.658714;; 22; 4; 3,2,1,0;, 4; 7,6,5,4;, 4; 10,9,7,8;, 4; 13,12,11,6;, 4; 15,12,13,14;, 4; 2,9,10,1;, 4; 1,10,16,0;, 4; 5,18,17,4;, 4; 12,20,19,11;, 4; 19,22,21,17;, 4; 6,11,18,5;, 4; 4,17,21,23;, 4; 8,7,4,23;, 4; 16,10,8,22;, 4; 9,13,6,7;, 4; 3,20,12,15;, 4; 14,13,9,2;, 4; 0,16,20,3;, 4; 14,2,3,15;, 4; 20,16,22,19;, 4; 22,8,23,21;, 4; 11,19,17,18;; MeshNormals { 25; 0.000;-1.000;0.000;, -0.832;0.000;0.555;, 0.857;0.000;-0.515;, -0.871;0.000;-0.492;, 0.472;0.000;0.882;, 0.832;0.000;0.555;, 0.927;0.375;0.019;, 0.447;0.360;0.819;, -0.444;0.366;0.818;, 0.476;0.298;0.827;, -0.474;0.303;0.827;, 0.459;0.369;-0.808;, 0.481;0.303;-0.823;, 0.953;0.302;0.009;, 0.000;1.000;0.000;, -0.472;0.000;0.882;, -0.953;0.304;0.007;, -0.000;0.000;-1.000;, 0.861;0.000;0.509;, -0.461;0.366;-0.808;, -0.483;0.300;-0.823;, 0.493;0.000;-0.870;, -0.926;0.378;0.016;, -0.493;0.000;-0.870;, -0.861;0.000;0.509;; 22; 4;0,0,0,0;, 4;7,6,5,4;, 4;10,9,7,8;, 4;13,12,11,6;, 4;2,12,13,2;, 4;4,9,10,15;, 4;15,10,16,24;, 4;14,14,14,14;, 4;12,20,19,11;, 4;19,22,3,23;, 4;6,11,21,2;, 4;14,14,14,14;, 4;8,7,4,15;, 4;16,10,8,22;, 4;9,13,6,7;, 4;17,20,12,17;, 4;18,13,9,4;, 4;3,16,20,3;, 4;0,0,0,0;, 4;20,16,22,19;, 4;22,8,15,1;, 4;11,19,23,21;; } MeshMaterialList { 1; 22; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;; Material black { 0.002000;0.002000;0.002000;1.000000;; 157.360000; 0.518400;0.518400;0.518400;; 0.000000;0.000000;0.000000;; } } } } Frame l1grp { Mesh mesh-l1grp { 56; -0.039967;0.040175;0.491286;, -0.039967;0.250175;0.491286;, 0.040033;0.250175;0.491284;, 0.040033;0.040175;0.491284;, 0.040030;0.250175;0.391284;, 0.040030;0.040175;0.391284;, 0.000017;0.310175;-0.108715;, 0.110017;0.360175;-0.108718;, -0.109983;0.360175;-0.108712;, -0.189979;0.280175;0.061290;, 0.000021;0.200175;0.061285;, 0.000017;0.640175;-0.108715;, 0.110017;0.590175;-0.108718;, 0.190021;0.670175;0.061280;, 0.000021;0.750175;0.061285;, -0.189979;0.670175;0.061290;, 0.000029;0.750175;0.371285;, -0.189971;0.670175;0.371290;, 0.190021;0.280175;0.061280;, 0.000029;0.200175;0.371285;, 0.190029;0.280175;0.371280;, 0.000062;0.770175;1.591285;, 0.140062;0.710175;1.601281;, -0.139938;0.710175;1.601288;, 0.000063;0.350175;1.641285;, 0.140063;0.410175;1.631282;, 0.090043;0.380175;0.871283;, 0.000043;0.330175;0.871285;, -0.089957;0.570175;0.871287;, 0.000043;0.620175;0.871285;, 0.090043;0.570175;0.871283;, 0.000033;0.720175;0.501285;, 0.170033;0.650175;0.501280;, -0.089957;0.380175;0.871287;, 0.000033;0.220175;0.501285;, -0.169967;0.300175;0.501290;, -0.239967;0.470175;0.501291;, -0.189971;0.280175;0.371290;, -0.269971;0.470175;0.371292;, 0.240033;0.470175;0.501279;, 0.190029;0.670175;0.371280;, 0.270029;0.470175;0.371278;, -0.109983;0.590175;-0.108712;, -0.159983;0.470175;-0.108711;, -0.169967;0.650175;0.501290;, 0.170033;0.300175;0.501280;, 0.140043;0.470175;0.871281;, -0.139957;0.470175;0.871289;, -0.139937;0.410175;1.631289;, 0.200062;0.560175;1.621280;, -0.269979;0.470175;0.061292;, 0.270021;0.470175;0.061278;, -0.039970;0.040175;0.391286;, -0.039970;0.250175;0.391286;, 0.160017;0.470175;-0.108719;, -0.199938;0.560175;1.621290;; 56; 4; 3,2,1,0;, 4; 5,4,2,3;, 3; 8,7,6;, 4; 10,9,8,6;, 4; 14,13,12,11;, 4; 17,16,14,15;, 4; 20,19,10,18;, 3; 23,22,21;, 4; 27,26,25,24;, 4; 29,28,23,21;, 4; 32,31,29,30;, 4; 35,34,27,33;, 4; 38,37,35,36;, 4; 41,40,32,39;, 3; 43,42,8;, 4; 17,38,36,44;, 4; 20,41,39,45;, 4; 39,32,30,46;, 4; 36,35,33,47;, 4; 33,27,24,48;, 4; 30,29,21,22;, 3; 22,25,49;, 4; 38,17,15,50;, 4; 41,20,18,51;, 4; 18,10,6,7;, 4; 15,14,11,42;, 4; 42,12,7,8;, 4; 52,5,3,0;, 4; 52,53,4,5;, 4; 0,1,53,52;, 3; 7,12,54;, 4; 9,50,43,8;, 4; 13,51,54,12;, 4; 16,40,13,14;, 4; 19,37,9,10;, 3; 48,23,55;, 4; 26,46,49,25;, 4; 28,47,55,23;, 4; 31,44,28,29;, 4; 34,45,26,27;, 4; 37,19,34,35;, 4; 40,16,31,32;, 4; 25,22,23,48;, 4; 16,17,44,31;, 4; 19,20,45,34;, 4; 45,39,46,26;, 4; 44,36,47,28;, 4; 47,33,48,55;, 4; 46,30,22,49;, 3; 25,48,24;, 4; 37,38,50,9;, 4; 40,41,51,13;, 4; 51,18,7,54;, 4; 50,15,42,43;, 3; 12,42,11;, 4; 4,53,1,2;; MeshNormals { 53; 0.000;0.000;1.000;, 0.000;1.000;0.000;, -1.000;0.000;0.000;, -0.000;0.000;-1.000;, 1.000;0.000;-0.000;, -0.013;0.111;0.994;, 0.001;-0.564;-0.826;, 0.388;-0.389;-0.836;, -0.389;-0.388;-0.836;, -0.682;-0.681;-0.268;, 0.001;-0.963;-0.269;, -0.001;0.564;-0.826;, 0.394;0.385;-0.835;, 0.687;0.675;-0.270;, -0.001;0.963;-0.269;, -0.687;0.676;-0.268;, -0.000;0.994;0.107;, -0.709;0.697;0.108;, 0.681;-0.682;-0.268;, -0.001;-0.996;0.090;, 0.703;-0.703;0.107;, 0.000;0.164;0.986;, 0.714;0.679;-0.170;, 0.001;0.977;-0.214;, 0.000;-1.000;0.014;, 0.708;-0.706;-0.005;, -0.715;0.679;-0.168;, -0.001;-0.986;0.165;, -0.725;0.687;0.056;, -0.996;-0.017;-0.092;, 0.723;0.688;0.054;, 0.001;0.969;0.246;, 0.691;0.679;0.246;, -0.704;-0.696;0.142;, -0.002;-0.972;0.235;, -0.695;-0.681;0.230;, -0.969;-0.009;0.246;, -0.704;-0.705;0.089;, -0.994;-0.009;0.107;, 0.970;-0.009;0.245;, 0.709;0.697;0.107;, 0.994;-0.008;0.107;, -0.395;0.387;-0.833;, -0.562;-0.007;-0.827;, -0.692;0.678;0.248;, 0.694;-0.677;0.246;, 0.996;-0.018;-0.090;, 0.560;-0.005;-0.828;, -0.708;-0.707;-0.008;, -0.083;0.099;0.992;, -0.963;-0.009;-0.268;, 0.963;-0.008;-0.270;, 0.083;0.099;0.992;; 56; 4;0,0,0,0;, 4;4,4,4,4;, 3;8,7,6;, 4;10,9,8,6;, 4;14,13,12,11;, 4;17,16,14,15;, 4;20,19,10,18;, 3;5,5,21;, 4;27,20,25,24;, 4;1,28,26,23;, 4;32,31,1,30;, 4;35,34,27,33;, 4;38,37,35,36;, 4;41,40,32,39;, 3;43,42,8;, 4;17,38,36,44;, 4;20,41,39,45;, 4;39,32,30,41;, 4;36,35,33,38;, 4;33,27,24,48;, 4;30,1,23,22;, 3;5,5,49;, 4;38,17,15,50;, 4;41,20,18,51;, 4;18,10,6,7;, 4;15,14,11,42;, 4;42,12,7,8;, 4;24,24,24,24;, 4;3,3,3,3;, 4;2,2,2,2;, 3;7,12,47;, 4;9,50,43,8;, 4;13,51,47,12;, 4;16,40,13,14;, 4;19,37,9,10;, 3;5,5,52;, 4;20,41,46,25;, 4;28,38,29,26;, 4;31,44,28,1;, 4;34,45,20,27;, 4;37,19,34,35;, 4;40,16,31,32;, 4;5,5,5,5;, 4;16,17,44,31;, 4;19,20,45,34;, 4;45,39,41,20;, 4;44,36,38,28;, 4;38,33,48,29;, 4;41,30,22,46;, 3;5,5,21;, 4;37,38,50,9;, 4;40,41,51,13;, 4;51,18,7,47;, 4;50,15,42,43;, 3;12,42,11;, 4;1,1,1,1;; } MeshMaterialList { 1; 56; 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, 0, 0, 0, 0, 0, 0, 0;; Material black { 0.002000;0.002000;0.002000;1.000000;; 157.360000; 0.518400;0.518400;0.518400;; 0.000000;0.000000;0.000000;; } } } } Frame skid { Mesh mesh-skid { 112; -0.850036;-1.169825;-2.098693;, -0.350035;-1.169825;-2.098706;, -0.350035;-1.089825;-2.098706;, -0.850036;-1.089825;-2.098693;, -0.849981;-1.169825;-0.018693;, -0.349981;-1.169825;-0.018706;, -0.349981;-1.089825;-0.018706;, -0.849981;-1.089825;-0.018693;, -0.929983;-1.089825;-0.118691;, -0.929981;-1.089825;-0.018691;, -0.849983;-1.089825;-0.118693;, -0.929983;-1.169825;-0.118691;, -0.849983;-1.169825;-0.118693;, -0.850038;-1.169825;-2.178693;, -0.850036;-1.419825;-2.098693;, -0.850038;-1.419825;-2.178693;, -0.849981;-1.419825;-0.018693;, -0.849983;-1.419825;-0.118693;, -0.849983;-1.499825;-0.118693;, -0.929983;-1.499825;-0.118691;, -0.930036;-1.499825;-2.098691;, -0.850036;-1.499825;-2.098693;, -0.930038;-1.499825;-2.178691;, -0.850038;-1.499825;-2.178693;, -0.929978;-1.419825;0.071309;, -0.849978;-1.419825;0.071307;, -0.929981;-1.419825;-0.018691;, -0.849981;-1.499825;-0.018693;, -0.850088;-1.129825;-4.088693;, -0.850088;-1.049825;-4.088693;, -0.850077;-1.309825;-3.688693;, -0.850077;-1.389825;-3.688693;, -0.930077;-1.389825;-3.688691;, -0.850068;-1.499825;-3.318693;, -0.930068;-1.499825;-3.318690;, -0.930038;-1.419825;-2.178691;, -0.850068;-1.419825;-3.318693;, -0.930068;-1.419825;-3.318690;, 0.350017;-1.169825;-0.118724;, 0.350017;-1.089825;-0.118724;, 0.350019;-1.089825;-0.018724;, 0.350019;-1.169825;-0.018724;, 0.849962;-1.089825;-2.178737;, 0.349962;-1.089825;-2.178724;, 0.349962;-1.169825;-2.178724;, 0.849962;-1.169825;-2.178737;, 0.850017;-1.089825;-0.118737;, 0.850017;-1.169825;-0.118737;, 0.849964;-1.169825;-2.098737;, 0.849964;-1.089825;-2.098737;, 0.929964;-1.089825;-2.098739;, 0.929964;-1.169825;-2.098739;, 0.930019;-1.169825;-0.018739;, 0.930019;-1.089825;-0.018739;, 0.930017;-1.089825;-0.118739;, 0.930017;-1.169825;-0.118739;, 0.929962;-1.169825;-2.178739;, 0.929962;-1.419825;-2.178739;, 0.929964;-1.419825;-2.098739;, 0.930017;-1.419825;-0.118739;, 0.930019;-1.419825;-0.018739;, 0.930017;-1.499825;-0.118739;, 0.929964;-1.499825;-2.098739;, 0.850022;-1.419825;0.071263;, 0.850022;-1.499825;0.071263;, 0.850019;-1.499825;-0.018737;, 0.850019;-1.419825;-0.018737;, 0.930019;-1.499825;-0.018739;, 0.929912;-1.049825;-4.088739;, 0.929912;-1.129825;-4.088739;, 0.929923;-1.389825;-3.688740;, 0.929923;-1.309825;-3.688740;, 0.849923;-1.309825;-3.688737;, 0.929932;-1.419825;-3.318739;, 0.849932;-1.419825;-3.318737;, 0.930022;-1.419825;0.071261;, 0.930022;-1.499825;0.071261;, 0.929962;-1.499825;-2.178739;, 0.929932;-1.499825;-3.318739;, 0.849962;-1.499825;-2.178737;, 0.849932;-1.499825;-3.318737;, 0.849923;-1.389825;-3.688737;, 0.849912;-1.049825;-4.088737;, 0.850017;-1.499825;-0.118737;, 0.849964;-1.419825;-2.098737;, 0.849964;-1.499825;-2.098737;, 0.849962;-1.419825;-2.178737;, 0.850017;-1.419825;-0.118737;, 0.850019;-1.169825;-0.018737;, 0.929962;-1.089825;-2.178739;, 0.349964;-1.169825;-2.098724;, -0.930088;-1.129825;-4.088690;, -0.930088;-1.049825;-4.088690;, -0.930077;-1.309825;-3.688691;, -0.929978;-1.499825;0.071309;, -0.929981;-1.499825;-0.018691;, -0.930036;-1.419825;-2.098691;, -0.929983;-1.419825;-0.118691;, -0.930038;-1.169825;-2.178691;, -0.929981;-1.169825;-0.018691;, -0.930038;-1.089825;-2.178691;, -0.850038;-1.089825;-2.178693;, -0.349983;-1.089825;-0.118706;, -0.350038;-1.089825;-2.178706;, -0.350038;-1.169825;-2.178706;, -0.349983;-1.169825;-0.118706;, -0.930036;-1.089825;-2.098691;, -0.930036;-1.169825;-2.098691;, -0.849978;-1.499825;0.071307;, 0.349964;-1.089825;-2.098724;, 0.850019;-1.089825;-0.018737;, 0.849912;-1.129825;-4.088737;; 108; 4; 3,2,1,0;, 4; 7,6,5,4;, 4; 10,7,9,8;, 4; 12,10,8,11;, 4; 15,14,0,13;, 4; 17,16,4,12;, 4; 21,20,19,18;, 4; 23,22,20,21;, 4; 26,16,25,24;, 4; 17,18,27,16;, 4; 31,30,29,28;, 4; 34,33,31,32;, 4; 37,36,15,35;, 4; 41,40,39,38;, 4; 45,44,43,42;, 4; 47,38,39,46;, 4; 51,50,49,48;, 4; 55,54,53,52;, 4; 58,57,56,51;, 4; 60,59,55,52;, 4; 62,58,59,61;, 4; 66,65,64,63;, 4; 61,59,60,67;, 4; 71,70,69,68;, 4; 74,73,71,72;, 4; 76,75,63,64;, 4; 78,73,57,77;, 4; 80,78,77,79;, 4; 80,74,72,81;, 4; 72,71,68,82;, 4; 83,61,67,65;, 4; 65,67,76,64;, 4; 86,79,85,84;, 4; 84,85,83,87;, 4; 66,60,52,88;, 4; 84,58,51,48;, 4; 56,89,50,51;, 4; 42,49,50,89;, 4; 88,41,38,47;, 4; 48,90,44,45;, 4; 23,15,36,33;, 4; 92,91,28,29;, 4; 37,34,32,93;, 4; 32,31,28,91;, 4; 95,26,24,94;, 4; 22,35,96,20;, 4; 96,14,17,97;, 4; 97,17,12,11;, 4; 35,15,13,98;, 4; 99,9,7,4;, 4; 13,101,100,98;, 4; 10,102,6,7;, 4; 101,103,2,3;, 4; 1,2,103,104;, 4; 0,1,104,13;, 4; 4,5,105,12;, 4; 101,3,106,100;, 4; 98,100,106,107;, 4; 14,96,107,0;, 4; 16,26,99,4;, 4; 14,21,18,17;, 4; 15,23,21,14;, 4; 27,95,94,108;, 4; 18,19,95,27;, 4; 30,93,92,29;, 4; 33,36,30,31;, 4; 33,34,22,23;, 4; 90,109,43,44;, 4; 42,43,109,49;, 4; 46,39,40,110;, 4; 45,42,89,56;, 4; 52,53,110,88;, 4; 57,86,45,56;, 4; 59,87,47,55;, 4; 58,84,87,59;, 4; 77,57,58,62;, 4; 67,60,75,76;, 4; 70,81,111,69;, 4; 73,78,70,71;, 4; 68,69,111,82;, 4; 79,86,74,80;, 4; 73,74,86,57;, 4; 78,80,81,70;, 4; 81,72,82,111;, 4; 87,83,65,66;, 4; 60,66,63,75;, 4; 79,77,62,85;, 4; 85,62,61,83;, 4; 87,66,88,47;, 4; 86,84,48,45;, 4; 47,46,54,55;, 4; 46,110,53,54;, 4; 110,40,41,88;, 4; 49,109,90,48;, 4; 34,37,35,22;, 4; 94,24,25,108;, 4; 36,37,93,30;, 4; 93,32,91,92;, 4; 19,97,26,95;, 4; 16,27,108,25;, 4; 20,96,97,19;, 4; 26,97,11,99;, 4; 96,35,98,107;, 4; 11,8,9,99;, 4; 107,106,3,0;, 4; 12,105,102,10;, 4; 13,104,103,101;, 4; 5,6,102,105;; MeshNormals { 14; -0.000;0.000;-1.000;, 0.000;0.000;1.000;, -1.000;0.000;0.000;, 1.000;0.000;-0.000;, 0.000;1.000;0.000;, 0.000;-1.000;0.000;, 0.000;0.838;0.545;, -0.000;-0.477;-0.879;, -0.000;-0.908;-0.419;, 0.000;0.908;0.419;, 0.000;0.990;0.144;, -0.000;-0.838;-0.545;, 0.000;0.477;0.879;, -0.000;-0.990;-0.144;; 108; 4;0,0,0,0;, 4;0,0,0,0;, 4;5,5,5,5;, 4;1,1,1,1;, 4;2,2,2,2;, 4;2,2,2,2;, 4;4,4,4,4;, 4;4,4,4,4;, 4;5,5,5,5;, 4;2,2,2,2;, 4;2,2,2,2;, 4;10,10,9,9;, 4;13,13,5,5;, 4;2,2,2,2;, 4;0,0,0,0;, 4;0,0,0,0;, 4;1,1,1,1;, 4;3,3,3,3;, 4;3,3,3,3;, 4;3,3,3,3;, 4;3,3,3,3;, 4;2,2,2,2;, 4;3,3,3,3;, 4;3,3,3,3;, 4;10,10,9,9;, 4;1,1,1,1;, 4;3,3,3,3;, 4;13,13,5,5;, 4;2,2,2,2;, 4;9,9,6,6;, 4;5,5,5,5;, 4;5,5,5,5;, 4;2,2,2,2;, 4;2,2,2,2;, 4;1,1,1,1;, 4;1,1,1,1;, 4;3,3,3,3;, 4;4,4,4,4;, 4;5,5,5,5;, 4;5,5,5,5;, 4;2,2,2,2;, 4;1,12,12,1;, 4;3,3,3,3;, 4;9,9,12,12;, 4;3,3,3,3;, 4;3,3,3,3;, 4;5,5,5,5;, 4;1,1,1,1;, 4;1,1,1,1;, 4;0,0,0,0;, 4;1,1,1,1;, 4;5,5,5,5;, 4;5,5,5,5;, 4;2,2,2,2;, 4;4,4,4,4;, 4;4,4,4,4;, 4;5,5,5,5;, 4;3,3,3,3;, 4;0,0,0,0;, 4;0,0,0,0;, 4;2,2,2,2;, 4;2,2,2,2;, 4;4,4,4,4;, 4;4,4,4,4;, 4;8,8,11,11;, 4;2,2,2,2;, 4;10,10,4,4;, 4;2,2,2,2;, 4;4,4,4,4;, 4;4,4,4,4;, 4;0,0,0,0;, 4;1,1,1,1;, 4;0,0,0,0;, 4;0,0,0,0;, 4;4,4,4,4;, 4;3,3,3,3;, 4;3,3,3,3;, 4;8,8,7,7;, 4;3,3,3,3;, 4;0,7,7,0;, 4;2,2,2,2;, 4;10,10,4,4;, 4;13,13,8,8;, 4;2,2,2,2;, 4;2,2,2,2;, 4;4,4,4,4;, 4;5,5,5,5;, 4;5,5,5,5;, 4;2,2,2,2;, 4;2,2,2,2;, 4;0,0,0,0;, 4;4,4,4,4;, 4;1,1,1,1;, 4;1,1,1,1;, 4;3,3,3,3;, 4;0,0,0,0;, 4;13,13,8,8;, 4;3,3,3,3;, 4;3,3,3,3;, 4;2,2,2,2;, 4;3,3,3,3;, 4;3,3,3,3;, 4;3,3,3,3;, 4;3,3,3,3;, 4;0,0,0,0;, 4;1,1,1,1;, 4;1,1,1,1;, 4;2,2,2,2;; } MeshMaterialList { 1; 108; 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;; Material grey { 0.183700;0.183700;0.183700;1.000000;; 65.890000; 0.500000;0.500000;0.500000;; 0.000000;0.000000;0.000000;; } } } } Frame cpit { Mesh mesh-cpit { 109; -0.070086;-0.639825;-4.008713;, -0.060086;-0.679825;-4.008713;, 0.059914;-0.679825;-4.008717;, 0.059914;-0.599825;-4.008717;, -0.060086;-0.599825;-4.008713;, 0.519985;0.210175;-1.318729;, 0.459982;-0.209825;-1.428727;, 0.229982;-0.239825;-1.438721;, 0.279985;0.260175;-1.308722;, -0.770025;-0.599825;-1.718695;, -0.810026;0.110175;-1.718694;, -0.620016;0.130175;-1.338699;, -0.370026;0.530175;-1.718705;, -0.280015;0.260175;-1.308708;, -0.520015;0.210175;-1.318701;, 0.369974;0.530175;-1.718725;, 0.619985;0.130175;-1.338731;, 0.809974;0.110175;-1.718736;, 0.769974;-0.599825;-1.718735;, 0.609975;-0.959825;-1.718731;, 0.299975;-1.059825;-1.718723;, -0.610026;-0.959825;-1.718699;, -0.300026;-1.059825;-1.718707;, -0.310031;-1.229825;-1.918707;, -0.620031;-1.119825;-1.918699;, -0.680026;0.380175;-1.718697;, -0.690031;0.390175;-1.918697;, -0.380031;0.560175;-1.918705;, 0.829969;0.080175;-1.918737;, 0.779969;-0.709825;-1.918735;, 0.309969;-1.229825;-1.918723;, 0.619969;-1.119825;-1.918731;, 0.619957;-1.119825;-2.368731;, 0.309957;-1.229825;-2.368723;, -0.830031;0.080175;-1.918693;, -0.780031;-0.709825;-1.918694;, -0.780043;-0.709825;-2.368695;, -0.830043;0.080175;-2.368693;, 0.689969;0.390175;-1.918733;, 0.379969;0.560175;-1.918725;, 0.379957;0.560175;-2.368725;, 0.689957;0.390175;-2.368733;, 0.339917;-0.799825;-3.918724;, 0.359917;-0.479825;-3.918725;, -0.050086;-0.569825;-4.008714;, -0.030086;-0.549825;-4.008714;, -0.160083;-0.289825;-3.918711;, -0.300083;-0.359825;-3.918707;, -0.360083;-0.479825;-3.918706;, -0.340083;-0.799825;-3.918706;, 0.049914;-0.729825;-4.008716;, 0.019914;-0.739825;-4.008715;, 0.129917;-0.999825;-3.918718;, 0.269917;-0.959825;-3.918722;, -0.130083;-0.999825;-3.918712;, -0.230078;-1.109825;-3.698709;, 0.229922;-1.109825;-3.698721;, 0.299917;-0.359825;-3.918723;, 0.609922;-0.279825;-3.698731;, 0.509922;-0.089825;-3.698728;, -0.510078;-0.089825;-3.698702;, -0.610078;-0.279825;-3.698699;, -0.460078;-1.039825;-3.698703;, -0.580078;-0.779825;-3.698700;, -0.710068;-0.769825;-3.338696;, -0.560068;-1.109825;-3.338700;, 0.579922;-0.779825;-3.698730;, 0.459922;-1.039825;-3.698727;, 0.559932;-1.109825;-3.338730;, 0.709932;-0.769825;-3.338734;, -0.340068;0.300175;-3.338706;, -0.280078;0.020175;-3.698708;, 0.279922;0.020175;-3.698722;, 0.339932;0.300175;-3.338724;, -0.620068;0.160175;-3.338699;, -0.380055;0.480175;-2.858705;, -0.690055;0.310175;-2.858697;, -0.280068;-1.199825;-3.338708;, -0.620055;-1.129825;-2.858699;, -0.310055;-1.229825;-2.858707;, 0.749932;-0.099825;-3.338735;, 0.779944;-0.739825;-2.858735;, 0.829944;0.020175;-2.858737;, -0.780055;-0.739825;-2.858694;, -0.830055;0.020175;-2.858693;, -0.690043;0.390175;-2.368697;, 0.829957;0.080175;-2.368737;, 0.779957;-0.709825;-2.368736;, -0.620043;-1.119825;-2.368699;, 0.379945;0.480175;-2.858725;, -0.380043;0.560175;-2.368705;, 0.619945;-1.129825;-2.858731;, 0.279932;-1.199825;-3.338722;, 0.309945;-1.229825;-2.858723;, -0.750068;-0.099825;-3.338695;, 0.619932;0.160175;-3.338731;, 0.689945;0.310175;-2.858733;, 0.159917;-0.289825;-3.918719;, -0.050086;-0.729825;-4.008714;, -0.270083;-0.959825;-3.918708;, 0.029914;-0.549825;-4.008716;, 0.679974;0.380175;-1.718733;, 0.589983;-0.089825;-1.398730;, -0.590017;-0.089825;-1.398699;, -0.460018;-0.209825;-1.428703;, -0.230018;-0.239825;-1.438709;, 0.049914;-0.569825;-4.008716;, -0.310043;-1.229825;-2.368707;, -0.020086;-0.739825;-4.008715;; 114; 5; 4,3,2,1,0;, 4; 8,7,6,5;, 3; 11,10,9;, 3; 14,13,12;, 3; 15,8,5;, 3; 18,17,16;, 4; 20,19,6,7;, 4; 24,23,22,21;, 4; 27,26,25,12;, 4; 29,28,17,18;, 4; 33,32,31,30;, 4; 37,36,35,34;, 4; 41,40,39,38;, 4; 43,42,2,3;, 4; 47,46,45,44;, 4; 49,48,0,1;, 4; 53,52,51,50;, 4; 56,55,54,52;, 4; 59,58,43,57;, 4; 61,60,47,48;, 4; 65,64,63,62;, 4; 69,68,67,66;, 4; 73,72,71,70;, 4; 76,75,70,74;, 4; 79,78,65,77;, 4; 82,81,69,80;, 4; 37,84,83,36;, 4; 84,37,85,76;, 4; 87,81,82,86;, 4; 78,88,36,83;, 4; 75,90,40,89;, 4; 81,87,32,91;, 4; 93,79,77,92;, 4; 84,76,74,94;, 4; 96,82,80,95;, 4; 80,69,66,58;, 4; 77,65,62,55;, 4; 74,70,71,60;, 4; 72,59,57,97;, 4; 67,56,52,53;, 4; 63,61,48,49;, 4; 99,49,1,98;, 4; 46,97,100,45;, 4; 42,53,50,2;, 4; 40,90,27,39;, 4; 36,88,24,35;, 4; 32,87,29,31;, 4; 28,38,101,17;, 4; 26,34,10,25;, 4; 23,30,20,22;, 4; 19,18,102,6;, 3; 17,101,16;, 3; 25,10,11;, 3; 21,104,103;, 4; 105,7,8,13;, 4; 106,44,45,100;, 4; 50,98,1,2;, 4; 3,4,44,106;, 4; 105,13,14,104;, 3; 9,21,103;, 3; 25,11,14;, 4; 15,12,13,8;, 3; 101,5,16;, 4; 22,20,7,105;, 4; 35,24,21,9;, 4; 39,27,12,15;, 4; 31,29,18,19;, 4; 107,33,30,23;, 4; 85,37,34,26;, 4; 86,41,38,28;, 4; 57,43,3,106;, 4; 48,47,44,4;, 4; 52,54,108,51;, 4; 55,62,99,54;, 4; 58,66,42,43;, 4; 60,71,46,47;, 4; 64,94,61,63;, 4; 68,92,56,67;, 4; 73,95,59,72;, 4; 75,89,73,70;, 4; 78,83,64,65;, 4; 81,91,68,69;, 4; 86,82,96,41;, 4; 76,85,90,75;, 4; 91,32,33,93;, 4; 79,107,88,78;, 4; 89,40,41,96;, 4; 93,33,107,79;, 4; 91,93,92,68;, 4; 83,84,94,64;, 4; 89,96,95,73;, 4; 95,80,58,59;, 4; 92,77,55,56;, 4; 94,74,60,61;, 4; 71,72,97,46;, 4; 66,67,53,42;, 4; 62,63,49,99;, 4; 54,99,98,108;, 3; 48,4,0;, 4; 97,57,106,100;, 4; 87,86,28,29;, 4; 90,85,26,27;, 4; 88,107,23,24;, 4; 30,31,19,20;, 4; 38,39,15,101;, 4; 34,35,9,10;, 4; 21,22,105,104;, 3; 18,16,102;, 3; 101,15,5;, 3; 12,25,14;, 3; 9,103,11;, 4; 16,5,6,102;, 4; 104,14,11,103;, 4; 98,50,51,108;; MeshNormals { 106; -0.169;0.007;-0.986;, -0.142;-0.030;-0.989;, 0.154;-0.032;-0.988;, 0.152;0.024;-0.988;, -0.131;0.048;-0.990;, -0.009;-0.251;0.968;, 0.238;-0.291;0.927;, 0.026;-0.294;0.956;, 0.087;0.823;0.561;, -0.867;-0.207;0.453;, -0.952;0.186;0.243;, -0.552;0.106;0.827;, -0.215;0.921;0.325;, -0.087;0.823;0.561;, -0.413;0.737;0.535;, 0.212;0.914;0.346;, 0.552;0.106;0.827;, 0.948;0.185;0.259;, 0.871;-0.209;0.445;, 0.561;-0.492;0.666;, 0.102;-0.584;0.805;, -0.526;-0.473;0.707;, -0.099;-0.573;0.814;, -0.157;-0.930;0.333;, -0.643;-0.714;0.276;, -0.689;0.678;0.255;, -0.734;0.679;0.025;, -0.249;0.967;0.055;, 0.985;0.167;0.046;, 0.967;-0.237;0.098;, 0.158;-0.932;0.326;, 0.647;-0.719;0.252;, 0.697;-0.717;0.011;, 0.170;-0.985;0.005;, -0.985;0.167;0.031;, -0.964;-0.235;0.121;, -0.977;-0.214;0.004;, -0.982;0.188;-0.012;, 0.733;0.678;0.058;, 0.248;0.966;0.077;, 0.245;0.967;-0.078;, 0.721;0.691;-0.052;, 0.511;-0.143;-0.848;, 0.478;0.074;-0.875;, -0.111;0.109;-0.988;, -0.040;0.187;-0.981;, -0.098;0.440;-0.893;, -0.312;0.307;-0.899;, -0.480;0.076;-0.874;, -0.509;-0.141;-0.849;, 0.121;-0.136;-0.983;, 0.020;-0.174;-0.984;, 0.082;-0.652;-0.754;, 0.360;-0.488;-0.795;, -0.083;-0.653;-0.753;, -0.147;-0.916;-0.372;, 0.147;-0.915;-0.376;, 0.309;0.304;-0.901;, 0.781;0.144;-0.607;, 0.518;0.494;-0.698;, -0.517;0.493;-0.700;, -0.781;0.144;-0.608;, -0.593;-0.653;-0.471;, -0.827;-0.201;-0.526;, -0.948;-0.224;-0.227;, -0.660;-0.724;-0.202;, 0.825;-0.201;-0.528;, 0.592;-0.650;-0.476;, 0.658;-0.722;-0.213;, 0.946;-0.223;-0.233;, -0.210;0.848;-0.487;, -0.160;0.670;-0.725;, 0.161;0.670;-0.724;, 0.211;0.851;-0.480;, -0.643;0.625;-0.443;, -0.243;0.936;-0.255;, -0.717;0.666;-0.206;, -0.155;-0.975;-0.162;, -0.692;-0.721;-0.049;, -0.165;-0.986;-0.036;, 0.929;0.189;-0.319;, 0.974;-0.219;-0.062;, 0.974;0.195;-0.115;, -0.974;-0.219;-0.062;, -0.975;0.189;-0.117;, -0.725;0.687;-0.052;, 0.981;0.195;-0.014;, 0.977;-0.214;0.006;, -0.697;-0.717;0.002;, 0.243;0.937;-0.249;, -0.245;0.967;-0.078;, 0.692;-0.721;-0.046;, 0.155;-0.974;-0.165;, 0.109;0.106;-0.988;, -0.927;0.189;-0.325;, 0.646;0.629;-0.432;, 0.713;0.673;-0.199;, 0.097;0.437;-0.894;, -0.118;-0.135;-0.984;, -0.357;-0.489;-0.796;, 0.039;0.185;-0.982;, 0.683;0.671;0.289;, 0.360;-0.283;0.889;, -0.291;-0.293;0.911;, -0.056;-0.299;0.953;, 0.413;0.737;0.535;; 114; 5;4,3,2,1,0;, 4;5,7,6,5;, 3;11,10,9;, 3;14,13,12;, 3;15,8,105;, 3;18,17,16;, 4;20,19,6,7;, 4;24,23,22,21;, 4;27,26,25,12;, 4;29,28,17,18;, 4;33,32,31,30;, 4;37,36,35,34;, 4;41,40,39,38;, 4;43,42,2,3;, 4;47,46,45,44;, 4;49,48,0,1;, 4;53,52,51,50;, 4;56,55,54,52;, 4;59,58,43,57;, 4;61,60,47,48;, 4;65,64,63,62;, 4;69,68,67,66;, 4;73,72,71,70;, 4;76,75,70,74;, 4;79,78,65,77;, 4;82,81,69,80;, 4;37,84,83,36;, 4;84,37,85,76;, 4;87,81,82,86;, 4;78,88,36,83;, 4;75,90,40,89;, 4;81,87,32,91;, 4;33,79,77,92;, 4;84,76,74,94;, 4;96,82,80,95;, 4;80,69,66,58;, 4;77,65,62,55;, 4;74,70,71,60;, 4;72,59,57,97;, 4;67,56,52,53;, 4;63,61,48,49;, 4;99,49,1,98;, 4;46,97,100,45;, 4;42,53,50,2;, 4;40,90,27,39;, 4;36,88,24,35;, 4;32,87,29,31;, 4;28,38,101,17;, 4;26,34,10,25;, 4;23,30,20,22;, 4;19,18,102,6;, 3;17,101,16;, 3;25,10,11;, 3;21,104,103;, 4;5,7,5,5;, 4;93,44,45,100;, 4;50,98,1,2;, 4;3,4,44,93;, 4;5,5,5,104;, 3;9,21,103;, 3;25,11,14;, 4;15,12,13,8;, 3;101,105,16;, 4;22,20,7,5;, 4;35,24,21,9;, 4;39,27,12,15;, 4;31,29,18,19;, 4;79,33,30,23;, 4;85,37,34,26;, 4;86,41,38,28;, 4;57,43,3,93;, 4;48,47,44,4;, 4;52,54,51,51;, 4;55,62,99,54;, 4;58,66,42,43;, 4;60,71,46,47;, 4;64,94,61,63;, 4;68,92,56,67;, 4;73,95,59,72;, 4;75,89,73,70;, 4;78,83,64,65;, 4;81,91,68,69;, 4;86,82,96,41;, 4;76,85,90,75;, 4;91,32,33,33;, 4;79,79,88,78;, 4;89,40,41,96;, 4;33,33,79,79;, 4;91,33,92,68;, 4;83,84,94,64;, 4;89,96,95,73;, 4;95,80,58,59;, 4;92,77,55,56;, 4;94,74,60,61;, 4;71,72,97,46;, 4;66,67,53,42;, 4;62,63,49,99;, 4;54,99,98,51;, 3;48,4,0;, 4;97,57,93,100;, 4;87,86,28,29;, 4;90,85,26,27;, 4;88,79,23,24;, 4;30,31,19,20;, 4;38,39,15,101;, 4;34,35,9,10;, 4;21,22,5,104;, 3;18,16,102;, 3;101,15,105;, 3;12,25,14;, 3;9,103,11;, 4;16,5,6,102;, 4;104,5,11,103;, 4;98,50,51,51;; } MeshMaterialList { 1; 114; 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;; Material red { 0.771400;0.000000;0.000000;1.000000;; 136.430000; 0.885700;0.000000;0.000000;; 0.000000;0.000000;0.000000;; } } } } } ================================================ FILE: common/Addons/DXTest/DX9StencilMirror/seafloor.x ================================================ xof 0302txt 0064 Header { 1; 0; 1; } Frame x3ds_SeaFloor { FrameTransformMatrix { 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000,-10.000000, 0.000000, 1.000000;; } Mesh SeaFloor { 1490; -14.285719;-0.135096;-100.000000;, 14.285709;-1.018934;-100.000000;, -71.428574;-0.307925;-71.428574;, -42.857147;-0.273623;-71.428574;, -14.285719;-0.105719;-71.428574;, 14.285709;-0.833857;-71.428574;, 42.857140;-0.314925;-71.428574;, 71.428566;-0.882375;-71.428574;, -71.428574;0.237553;-42.857147;, -42.857147;0.431774;-42.857147;, -14.285719;0.101133;-42.857147;, 14.285709;-0.082143;-42.857147;, 42.857140;0.526248;-42.857147;, 71.428566;0.188181;-42.857147;, -100.000000;0.713668;-14.285719;, -71.428574;0.809312;-14.285719;, -42.857147;0.912310;-14.285719;, -14.285719;0.613536;-14.285719;, 14.285709;0.520900;-14.285719;, 42.857140;0.942775;-14.285719;, 71.428566;0.305558;-14.285719;, 99.999992;0.135099;-14.285719;, -100.000000;0.004447;14.285709;, -71.428574;0.556757;14.285709;, -42.857147;0.392118;14.285709;, -14.285719;0.736304;14.285709;, 14.285709;-0.197491;14.285709;, 42.857140;-0.282111;14.285709;, 71.428566;-0.590892;14.285709;, 99.999992;-0.408245;14.285709;, -71.428574;-0.323118;42.857140;, -42.857147;-0.008600;42.857140;, -14.285719;0.211306;42.857140;, 14.285709;0.301397;42.857140;, 42.857140;-0.261847;42.857140;, 71.428566;-0.276548;42.857140;, -71.428574;-0.643011;71.428566;, -42.857147;-0.224026;71.428566;, -14.285719;-0.347621;71.428566;, 14.285709;-0.445051;71.428566;, 42.857140;-0.962680;71.428566;, 71.428566;-0.550829;71.428566;, -14.285719;0.097598;99.999992;, 14.285709;-0.334380;99.999992;, -76.190468;-0.350025;-71.428574;, -42.857143;-0.441021;-90.476181;, -42.857147;-0.907937;-85.714287;, -42.857147;-1.142959;-80.952377;, -42.857147;-1.552437;-76.190475;, -47.619049;-0.468403;-71.428574;, -52.380955;-0.233633;-71.428558;, -57.142860;0.234804;-71.428574;, -61.904766;0.256296;-71.428574;, -66.666672;-0.268906;-71.428574;, -23.809528;0.089565;-100.000000;, -19.047623;0.099161;-100.000000;, -14.285719;0.203792;-95.238091;, -14.285717;0.338728;-90.476181;, -14.285719;0.057991;-85.714287;, -14.285719;-0.359968;-80.952377;, -14.285719;0.016018;-76.190475;, -19.047621;-0.192406;-71.428574;, -23.809525;0.134232;-71.428558;, -28.571434;-0.406027;-71.428574;, -33.333336;-0.182656;-71.428574;, -38.095242;-0.113404;-71.428574;, -9.523813;0.412146;-99.999992;, -4.761909;0.014920;-99.999985;, -0.000005;-0.100070;-100.000000;, 4.761901;0.085441;-100.000000;, 9.523804;-0.537958;-100.000000;, 14.285707;-1.093982;-95.238091;, 14.285707;-0.775956;-90.476181;, 14.285709;-0.471833;-85.714287;, 14.285707;0.375411;-80.952377;, 14.285709;-0.608159;-76.190475;, 9.523804;-0.531067;-71.428574;, 4.761899;-0.149243;-71.428558;, -0.000005;0.311526;-71.428574;, -4.761910;0.094294;-71.428574;, -9.523813;0.247405;-71.428574;, 19.047613;-0.288111;-99.999992;, 23.809519;-0.432924;-99.999985;, 42.857136;-0.456084;-90.476181;, 42.857140;0.010033;-85.714287;, 42.857140;-0.404199;-80.952377;, 42.857140;-0.552525;-76.190475;, 38.095234;0.155982;-71.428574;, 33.333328;0.912775;-71.428558;, 28.571423;0.696381;-71.428574;, 23.809519;0.386063;-71.428574;, 19.047615;0.369331;-71.428574;, 71.428566;-0.588181;-76.190475;, 66.666656;-1.049700;-71.428574;, 61.904755;-0.913305;-71.428558;, 57.142853;0.193122;-71.428574;, 52.380947;-0.192729;-71.428574;, 47.619045;0.338611;-71.428574;, -71.428574;-0.241318;-66.666664;, -71.428558;-0.603029;-61.904758;, -71.428574;-0.217375;-57.142864;, -71.428574;0.028318;-52.380951;, -71.428574;0.587854;-47.619053;, -76.190468;0.561106;-42.857147;, -80.952370;0.501583;-42.857143;, -85.714279;0.946841;-42.857147;, -90.476189;-0.158061;-42.857147;, -42.857147;0.228752;-66.666664;, -42.857143;-0.562465;-61.904758;, -42.857147;-0.859382;-57.142864;, -42.857147;-0.007008;-52.380951;, -42.857147;0.154437;-47.619053;, -47.619049;0.141752;-42.857147;, -52.380955;0.157896;-42.857143;, -57.142860;0.078797;-42.857147;, -61.904766;0.214786;-42.857147;, -66.666672;0.865034;-42.857147;, -14.285719;0.811342;-66.666664;, -14.285717;-0.196288;-61.904758;, -14.285719;0.023182;-57.142864;, -14.285719;0.091712;-52.380951;, -14.285719;0.171870;-47.619053;, -19.047621;0.282091;-42.857147;, -23.809525;0.509501;-42.857143;, -28.571434;-0.060183;-42.857147;, -33.333336;0.406079;-42.857147;, -38.095242;-0.392864;-42.857147;, 14.285707;0.130527;-66.666664;, 14.285707;-0.698166;-61.904758;, 14.285709;-0.182321;-57.142864;, 14.285707;-0.197670;-52.380951;, 14.285709;-0.200434;-47.619053;, 9.523804;0.031800;-42.857147;, 4.761899;0.280455;-42.857143;, -0.000005;0.140762;-42.857147;, -4.761910;0.591689;-42.857147;, -9.523813;-0.218071;-42.857147;, 42.857140;-0.226362;-66.666664;, 42.857136;0.738809;-61.904758;, 42.857140;0.179423;-57.142864;, 42.857140;0.378334;-52.380951;, 42.857140;0.820125;-47.619053;, 38.095234;0.853592;-42.857147;, 33.333328;-0.018476;-42.857143;, 28.571423;1.015341;-42.857147;, 23.809519;0.538136;-42.857147;, 19.047615;-0.198490;-42.857147;, 71.428558;-0.679641;-66.666664;, 71.428558;-0.461165;-61.904758;, 71.428566;0.446923;-57.142864;, 71.428566;-0.014271;-52.380951;, 71.428566;0.207117;-47.619053;, 66.666656;0.327562;-42.857147;, 61.904755;0.103409;-42.857143;, 57.142853;-0.221917;-42.857147;, 52.380947;0.665427;-42.857147;, 47.619045;1.094022;-42.857147;, 95.238075;0.454392;-42.857147;, 90.476173;0.364723;-42.857143;, 85.714279;0.485237;-42.857147;, 80.952377;0.118603;-42.857147;, 76.190475;-0.336103;-42.857147;, -71.428574;0.467962;-38.095242;, -71.428558;0.764602;-33.333336;, -71.428574;0.977364;-28.571432;, -71.428574;1.280020;-23.809528;, -71.428574;1.180180;-19.047623;, -76.190468;0.880916;-14.285718;, -80.952370;0.382879;-14.285717;, -85.714279;0.352142;-14.285719;, -90.476189;0.207240;-14.285719;, -95.238098;-0.018347;-14.285719;, -99.999992;0.251241;-19.047621;, -99.999985;0.167263;-23.809525;, -100.000000;0.050628;-28.571434;, -42.857147;-0.612424;-38.095242;, -42.857143;-0.013090;-33.333336;, -42.857147;0.794656;-28.571432;, -42.857147;0.799792;-23.809528;, -42.857147;1.508822;-19.047623;, -47.619049;0.850131;-14.285718;, -52.380955;1.256059;-14.285717;, -57.142860;1.383449;-14.285719;, -61.904766;0.533856;-14.285719;, -66.666672;1.164416;-14.285719;, -14.285719;0.036708;-38.095242;, -14.285717;0.592788;-33.333336;, -14.285719;-0.055841;-28.571432;, -14.285719;0.533173;-23.809528;, -14.285719;0.474651;-19.047623;, -19.047621;0.135255;-14.285718;, -23.809525;0.747218;-14.285717;, -28.571434;0.255237;-14.285719;, -33.333336;0.906706;-14.285719;, -38.095242;0.899367;-14.285719;, 14.285707;-0.142404;-38.095242;, 14.285707;0.716628;-33.333336;, 14.285709;0.651095;-28.571432;, 14.285707;1.172098;-23.809528;, 14.285709;0.759930;-19.047623;, 9.523804;0.735744;-14.285718;, 4.761899;0.725145;-14.285717;, -0.000005;0.411798;-14.285719;, -4.761910;0.761873;-14.285719;, -9.523813;0.430274;-14.285719;, 42.857140;0.426968;-38.095242;, 42.857136;0.449123;-33.333336;, 42.857140;1.083668;-28.571432;, 42.857140;1.438282;-23.809528;, 42.857140;1.176020;-19.047623;, 38.095234;-0.011468;-14.285718;, 33.333328;0.612236;-14.285717;, 28.571423;1.162916;-14.285719;, 23.809519;0.809581;-14.285719;, 19.047615;0.797696;-14.285719;, 71.428558;0.957744;-38.095242;, 71.428558;0.863921;-33.333336;, 71.428566;0.919251;-28.571432;, 71.428566;0.468944;-23.809528;, 71.428566;-0.199780;-19.047623;, 66.666656;0.422344;-14.285718;, 61.904755;0.898708;-14.285717;, 57.142853;0.673347;-14.285719;, 52.380947;0.642073;-14.285719;, 47.619045;1.169447;-14.285719;, 99.999985;0.229194;-23.809528;, 99.999992;0.329644;-19.047623;, 95.238075;0.326864;-14.285718;, 90.476173;-0.572017;-14.285717;, 85.714279;-0.058216;-14.285719;, 80.952377;0.529773;-14.285719;, 76.190475;0.501918;-14.285719;, -71.428574;0.704634;-9.523813;, -71.428558;0.782750;-4.761908;, -71.428574;0.557799;-0.000005;, -71.428574;0.375774;4.761900;, -71.428574;0.528790;9.523805;, -76.190468;0.623954;14.285707;, -80.952370;0.408449;14.285707;, -85.714279;0.557152;14.285709;, -90.476189;-0.328164;14.285708;, -95.238098;0.071238;14.285710;, -99.999992;0.206027;9.523804;, -99.999985;-0.113214;4.761899;, -100.000000;0.182745;-0.000005;, -100.000000;0.192273;-4.761910;, -100.000000;0.021115;-9.523813;, -42.857147;0.755936;-9.523813;, -42.857143;0.162534;-4.761908;, -42.857147;0.257527;-0.000005;, -42.857147;0.903496;4.761900;, -42.857147;0.489498;9.523805;, -47.619049;0.151162;14.285707;, -52.380955;-0.193396;14.285707;, -57.142860;1.133530;14.285709;, -61.904766;0.626719;14.285708;, -66.666672;0.678700;14.285710;, -14.285719;0.429847;-9.523813;, -14.285717;0.631708;-4.761908;, -14.285719;1.100993;-0.000005;, -14.285719;0.530112;4.761900;, -14.285719;0.092696;9.523805;, -19.047621;0.117114;14.285707;, -23.809525;-0.007938;14.285707;, -28.571434;-0.031347;14.285709;, -33.333336;-0.141815;14.285708;, -38.095242;0.261257;14.285710;, 14.285707;0.208703;-9.523813;, 14.285707;0.211788;-4.761908;, 14.285709;0.475223;-0.000005;, 14.285707;0.964629;4.761900;, 14.285709;1.008226;9.523805;, 9.523804;0.989429;14.285707;, 4.761899;0.945728;14.285707;, -0.000005;0.221178;14.285709;, -4.761910;0.686866;14.285708;, -9.523813;0.626730;14.285710;, 42.857140;1.010462;-9.523813;, 42.857136;0.352587;-4.761908;, 42.857140;-0.224639;-0.000005;, 42.857140;-0.260482;4.761900;, 42.857140;0.138258;9.523805;, 38.095234;0.165571;14.285707;, 33.333328;-0.010969;14.285707;, 28.571423;-0.125291;14.285709;, 23.809519;0.187099;14.285708;, 19.047615;0.869021;14.285710;, 71.428558;0.508842;-9.523813;, 71.428558;0.840931;-4.761908;, 71.428566;0.284687;-0.000005;, 71.428566;-0.243677;4.761900;, 71.428566;-0.171505;9.523805;, 66.666656;-0.213838;14.285707;, 61.904755;0.078522;14.285707;, 57.142853;0.070022;14.285709;, 52.380947;0.182034;14.285708;, 47.619045;0.667903;14.285710;, 99.999992;0.094004;-9.523813;, 99.999985;0.379086;-4.761909;, 99.999992;0.098439;-0.000005;, 99.999985;0.297234;4.761901;, 99.999992;-0.136030;9.523805;, 95.238075;-0.306846;14.285707;, 90.476173;-0.311506;14.285707;, 85.714279;-0.168183;14.285709;, 80.952377;-0.256323;14.285708;, 76.190475;0.321061;14.285710;, -71.428574;0.327637;19.047613;, -71.428558;0.617808;23.809519;, -71.428574;0.457445;28.571423;, -71.428574;0.144485;33.333328;, -71.428574;-0.015872;38.095234;, -76.190468;-0.202490;42.857140;, -80.952370;0.073814;42.857136;, -85.714279;0.682053;42.857140;, -90.476189;0.292514;42.857140;, -95.238098;-0.619205;42.857140;, -100.000000;0.331048;28.571423;, -100.000000;-0.086507;23.809519;, -100.000000;-0.222385;19.047615;, -42.857147;0.343030;19.047613;, -42.857143;0.665933;23.809519;, -42.857147;0.723581;28.571423;, -42.857147;0.173923;33.333328;, -42.857147;-0.111467;38.095234;, -47.619049;-0.099223;42.857140;, -52.380955;0.268527;42.857136;, -57.142860;0.327154;42.857140;, -61.904766;0.255922;42.857140;, -66.666672;0.127546;42.857140;, -14.285719;0.941067;19.047613;, -14.285717;0.404930;23.809519;, -14.285719;0.591995;28.571423;, -14.285719;0.895216;33.333328;, -14.285719;0.559608;38.095234;, -19.047621;0.156090;42.857140;, -23.809525;0.375621;42.857136;, -28.571434;0.320363;42.857140;, -33.333336;-0.061159;42.857140;, -38.095242;-0.087877;42.857140;, 14.285707;0.367362;19.047613;, 14.285707;0.127668;23.809519;, 14.285709;0.470778;28.571423;, 14.285707;0.580796;33.333328;, 14.285709;0.198341;38.095234;, 9.523804;-0.512508;42.857140;, 4.761899;0.445894;42.857136;, -0.000005;1.368379;42.857140;, -4.761910;1.112172;42.857140;, -9.523813;0.619264;42.857140;, 42.857140;-0.214846;19.047613;, 42.857136;-0.014231;23.809519;, 42.857140;0.684959;28.571423;, 42.857140;-0.573070;33.333328;, 42.857140;-0.226664;38.095234;, 38.095234;0.478938;42.857140;, 33.333328;0.659463;42.857136;, 28.571423;0.218665;42.857140;, 23.809519;0.908736;42.857140;, 19.047615;0.434395;42.857140;, 71.428558;0.109958;19.047613;, 71.428558;-0.379407;23.809519;, 71.428566;-0.991344;28.571423;, 71.428566;-0.379050;33.333328;, 71.428566;-0.167809;38.095234;, 66.666656;-0.321815;42.857140;, 61.904755;-0.448380;42.857136;, 57.142853;-0.777358;42.857140;, 52.380947;-0.764991;42.857140;, 47.619045;-0.099739;42.857140;, 99.999992;-0.144340;19.047613;, 99.999985;-0.541099;23.809519;, 90.476173;-0.659219;42.857136;, 85.714279;-0.455414;42.857140;, 80.952377;-0.204183;42.857140;, 76.190475;0.194762;42.857140;, -71.428574;0.281622;47.619041;, -71.428558;-0.044956;52.380943;, -71.428574;-0.720373;57.142849;, -71.428574;-0.063963;61.904755;, -71.428574;0.233860;66.666656;, -76.190468;-0.093972;71.428558;, -42.857147;-0.316298;47.619041;, -42.857143;-0.253962;52.380943;, -42.857147;-0.545225;57.142849;, -42.857147;-0.607017;61.904755;, -42.857147;-1.006271;66.666656;, -47.619049;-0.292324;71.428558;, -52.380955;-0.839913;71.428558;, -57.142860;-0.282055;71.428566;, -61.904766;-0.288374;71.428566;, -66.666672;-0.813121;71.428566;, -14.285719;1.076631;47.619041;, -14.285717;0.051704;52.380943;, -14.285719;0.258576;57.142849;, -14.285719;-0.205593;61.904755;, -14.285719;0.006442;66.666656;, -19.047621;0.447580;71.428558;, -23.809525;-0.650777;71.428558;, -28.571434;-0.030014;71.428566;, -33.333336;-0.474398;71.428566;, -38.095242;-0.982600;71.428566;, 14.285707;-0.220121;47.619041;, 14.285707;-1.204683;52.380943;, 14.285709;-0.473230;57.142849;, 14.285707;-0.330069;61.904755;, 14.285709;-0.960922;66.666656;, 9.523804;-1.140873;71.428558;, 4.761899;-0.792691;71.428558;, -0.000005;-0.404453;71.428566;, -4.761910;0.013935;71.428566;, -9.523813;0.088346;71.428566;, 42.857140;-0.202450;47.619041;, 42.857136;0.309247;52.380943;, 42.857140;0.242164;57.142849;, 42.857140;0.608813;61.904755;, 42.857140;0.156971;66.666656;, 38.095234;-0.075689;71.428558;, 33.333328;-0.110703;71.428558;, 28.571423;0.163211;71.428566;, 23.809519;-0.448917;71.428566;, 19.047615;-0.805722;71.428566;, 71.428558;-0.825014;47.619041;, 71.428558;-0.469043;52.380943;, 71.428566;0.034489;57.142849;, 71.428566;-0.200289;61.904755;, 71.428566;0.045184;66.666656;, 66.666656;-0.407994;71.428558;, 61.904755;-0.229676;71.428558;, 57.142853;0.593403;71.428566;, 52.380947;-0.092017;71.428566;, 47.619045;-0.035994;71.428566;, -42.857147;-0.427180;76.190468;, -42.857143;0.314200;80.952370;, -42.857147;-0.057606;85.714279;, -42.857147;0.372523;90.476181;, -14.285719;0.019902;76.190468;, -14.285717;-0.469934;80.952370;, -14.285719;-0.360965;85.714279;, -14.285719;-0.127913;90.476181;, -14.285719;-0.098582;95.238083;, -19.047621;-0.021066;99.999992;, -23.809525;0.079518;99.999985;, -28.571434;0.911401;99.999992;, 14.285707;-0.502925;76.190468;, 14.285707;-0.298658;80.952370;, 14.285709;-0.081354;85.714279;, 14.285707;-0.389222;90.476181;, 14.285709;0.108639;95.238083;, 9.523804;-0.039113;99.999992;, 4.761899;-0.055326;99.999985;, -0.000005;0.095156;99.999992;, -4.761910;0.063914;99.999985;, -9.523813;-0.125103;99.999992;, 42.857140;-1.034266;76.190468;, 42.857136;-1.173705;80.952370;, 42.857140;-0.110575;85.714279;, 42.857140;0.089482;90.476181;, 23.809519;-0.215739;99.999985;, 19.047615;0.263260;99.999992;, -47.619053;-0.896381;-90.476189;, -57.142868;-0.328173;-85.714279;, -52.380959;-0.656298;-85.714287;, -47.619053;-0.432877;-85.714287;, -61.904762;-0.513313;-80.952385;, -57.142857;-0.960566;-80.952377;, -52.380955;-0.566089;-80.952385;, -47.619049;-1.267757;-80.952377;, -66.666672;-0.336182;-76.190483;, -61.904762;-0.397067;-76.190475;, -57.142857;-0.479988;-76.190475;, -52.380959;-0.531276;-76.190483;, -47.619049;-0.742459;-76.190475;, -38.095245;0.045469;-95.238098;, -33.333336;0.102977;-95.238091;, -28.571430;0.130415;-95.238091;, -23.809528;-0.216483;-95.238106;, -19.047625;-0.169905;-95.238091;, -38.095245;-0.444137;-90.476181;, -33.333332;-0.695001;-90.476196;, -28.571432;0.611303;-90.476204;, -23.809528;-0.606146;-90.476189;, -19.047625;0.362023;-90.476189;, -38.095245;-1.056779;-85.714272;, -33.333340;-0.718648;-85.714279;, -28.571434;0.199615;-85.714279;, -23.809530;-0.253343;-85.714287;, -19.047623;-0.399376;-85.714287;, -38.095245;-0.913340;-80.952385;, -33.333336;-0.903951;-80.952385;, -28.571436;-0.603099;-80.952377;, -23.809532;-0.025633;-80.952385;, -19.047625;0.198069;-80.952377;, -38.095242;-0.220551;-76.190483;, -33.333340;-0.775552;-76.190475;, -28.571432;-0.088182;-76.190475;, -23.809528;-0.321007;-76.190483;, -19.047623;0.017947;-76.190475;, -9.523815;-0.077893;-95.238098;, -4.761909;0.308261;-95.238091;, -0.000005;-0.490944;-95.238091;, 4.761901;-0.627974;-95.238106;, 9.523804;-0.424610;-95.238091;, -9.523813;-0.044581;-90.476181;, -4.761909;0.159439;-90.476196;, -0.000005;-0.443794;-90.476204;, 4.761900;-0.127339;-90.476189;, 9.523804;-0.250573;-90.476189;, -9.523813;-0.061567;-85.714272;, -4.761909;0.264794;-85.714279;, -0.000004;0.601675;-85.714279;, 4.761900;-0.576284;-85.714287;, 9.523804;-0.400029;-85.714287;, -9.523813;0.294668;-80.952385;, -4.761909;-0.135345;-80.952385;, -0.000005;0.062585;-80.952377;, 4.761900;-0.023677;-80.952385;, 9.523804;-0.732768;-80.952377;, -9.523815;0.351763;-76.190483;, -4.761909;0.180779;-76.190475;, -0.000005;0.126858;-76.190475;, 4.761901;0.035790;-76.190483;, 9.523804;-0.244378;-76.190475;, 19.047617;-0.575421;-95.238098;, 23.809519;0.061376;-95.238091;, 28.571426;-0.336216;-95.238091;, 33.333332;0.180103;-95.238106;, 38.095234;-0.950449;-95.238091;, 19.047615;-0.320800;-90.476181;, 23.809519;-0.205761;-90.476196;, 28.571424;-0.332053;-90.476204;, 33.333328;0.028708;-90.476189;, 38.095230;-0.358080;-90.476189;, 19.047617;-0.081426;-85.714272;, 23.809517;-0.106021;-85.714279;, 28.571426;-0.354572;-85.714279;, 33.333332;-0.169037;-85.714287;, 38.095234;-0.146862;-85.714287;, 19.047615;0.048051;-80.952385;, 23.809521;-0.574941;-80.952385;, 28.571423;0.019022;-80.952377;, 33.333328;-0.485126;-80.952385;, 38.095234;0.118830;-80.952377;, 19.047617;-0.137680;-76.190483;, 23.809519;-0.555381;-76.190475;, 28.571423;0.379704;-76.190475;, 33.333328;0.264785;-76.190483;, 38.095230;-0.129358;-76.190475;, 47.619045;0.240993;-90.476181;, 47.619045;0.370391;-85.714272;, 52.380959;-0.804926;-85.714279;, 57.142849;-0.681500;-85.714279;, 47.619049;-0.513063;-80.952385;, 52.380947;0.252851;-80.952385;, 57.142857;0.166456;-80.952377;, 61.904758;-0.092455;-80.952385;, 47.619041;0.081938;-76.190483;, 52.380955;-0.371723;-76.190475;, 57.142857;0.392582;-76.190475;, 61.904751;-0.302392;-76.190483;, 66.666656;-0.426238;-76.190475;, -76.190475;-0.348970;-66.666672;, -80.952385;-0.405730;-61.904762;, -76.190475;-0.803196;-61.904766;, -85.714279;-0.199913;-57.142860;, -80.952385;-0.717034;-57.142860;, -76.190475;-0.750128;-57.142857;, -85.714287;-0.086299;-52.380962;, -80.952385;-0.218255;-52.380955;, -76.190475;-0.017879;-52.380959;, -90.476189;0.289871;-47.619053;, -85.714287;0.408372;-47.619049;, -80.952377;0.272326;-47.619057;, -76.190475;0.132861;-47.619049;, -66.666672;0.266427;-66.666664;, -61.904770;-0.072512;-66.666664;, -57.142864;-0.150835;-66.666664;, -52.380962;-0.021293;-66.666672;, -47.619057;-0.474822;-66.666672;, -66.666672;0.487985;-61.904766;, -61.904758;-0.309201;-61.904766;, -57.142860;0.319654;-61.904766;, -52.380955;1.311962;-61.904762;, -47.619053;-0.171303;-61.904766;, -66.666672;-0.229193;-57.142864;, -61.904766;0.417655;-57.142853;, -57.142868;0.166550;-57.142860;, -52.380959;0.317161;-57.142860;, -47.619053;0.296120;-57.142857;, -66.666672;0.130392;-52.380959;, -61.904762;-0.005004;-52.380955;, -57.142857;-0.630300;-52.380962;, -52.380955;0.486425;-52.380955;, -47.619049;-0.289771;-52.380959;, -66.666672;0.395921;-47.619045;, -61.904762;0.500003;-47.619053;, -57.142857;0.402763;-47.619049;, -52.380959;0.551308;-47.619057;, -47.619049;-0.121532;-47.619049;, -38.095245;-0.010068;-66.666664;, -33.333336;-0.289168;-66.666664;, -28.571430;-0.496295;-66.666664;, -23.809528;-0.467309;-66.666672;, -19.047625;0.277623;-66.666672;, -38.095245;-0.132215;-61.904766;, -33.333332;-1.095695;-61.904766;, -28.571432;-0.030175;-61.904766;, -23.809528;-0.633231;-61.904762;, -19.047625;0.155150;-61.904766;, -38.095245;-0.245004;-57.142864;, -33.333340;-0.246470;-57.142853;, -28.571434;-0.801827;-57.142860;, -23.809530;-0.406785;-57.142860;, -19.047623;-0.079546;-57.142857;, -38.095245;-0.125901;-52.380959;, -33.333336;-0.249462;-52.380955;, -28.571436;-0.489908;-52.380962;, -23.809532;-0.264658;-52.380955;, -19.047625;-0.025563;-52.380959;, -38.095242;0.434170;-47.619045;, -33.333340;0.213746;-47.619053;, -28.571432;0.227585;-47.619049;, -23.809528;0.409066;-47.619057;, -19.047623;0.586967;-47.619049;, -9.523815;0.243269;-66.666664;, -4.761909;0.305613;-66.666664;, -0.000005;0.749702;-66.666664;, 4.761901;-0.041101;-66.666672;, 9.523804;-0.224528;-66.666672;, -9.523813;-0.138317;-61.904766;, -4.761909;0.969622;-61.904766;, -0.000005;0.390296;-61.904766;, 4.761900;0.515348;-61.904762;, 9.523804;0.101632;-61.904766;, -9.523813;0.508570;-57.142864;, -4.761909;0.220557;-57.142853;, -0.000004;0.053783;-57.142860;, 4.761900;0.033699;-57.142860;, 9.523804;0.194044;-57.142857;, -9.523813;-0.169694;-52.380959;, -4.761909;0.481576;-52.380955;, -0.000005;0.347434;-52.380962;, 4.761900;0.266849;-52.380955;, 9.523804;-0.116532;-52.380959;, -9.523815;-0.231660;-47.619045;, -4.761909;-0.377175;-47.619053;, -0.000005;0.112933;-47.619049;, 4.761901;0.317320;-47.619057;, 9.523804;-0.017629;-47.619049;, 19.047617;0.135771;-66.666664;, 23.809519;0.019960;-66.666664;, 28.571426;-0.267989;-66.666664;, 33.333332;0.653463;-66.666672;, 38.095234;1.169628;-66.666672;, 19.047615;-0.067673;-61.904766;, 23.809519;0.597693;-61.904766;, 28.571424;0.044806;-61.904766;, 33.333328;-0.036723;-61.904762;, 38.095230;0.271063;-61.904766;, 19.047617;-0.361246;-57.142864;, 23.809517;-0.058579;-57.142853;, 28.571426;0.609813;-57.142860;, 33.333332;0.330539;-57.142860;, 38.095234;-0.057024;-57.142857;, 19.047615;-0.436143;-52.380959;, 23.809521;0.470412;-52.380955;, 28.571423;0.448475;-52.380962;, 33.333328;0.713128;-52.380955;, 38.095234;0.489472;-52.380959;, 19.047617;-0.600673;-47.619045;, 23.809519;-0.377628;-47.619053;, 28.571423;0.918299;-47.619049;, 33.333328;1.202303;-47.619057;, 38.095230;0.447862;-47.619049;, 47.619041;0.033839;-66.666664;, 52.380955;-0.946366;-66.666664;, 57.142857;-0.235814;-66.666664;, 61.904755;-0.488056;-66.666672;, 66.666656;0.116058;-66.666672;, 47.619045;-0.261705;-61.904766;, 52.380947;-0.553567;-61.904766;, 57.142849;-0.841473;-61.904766;, 61.904758;-0.209702;-61.904762;, 66.666656;-0.157042;-61.904766;, 47.619045;0.525451;-57.142864;, 52.380959;-0.712736;-57.142853;, 57.142849;-0.364831;-57.142860;, 61.904758;-0.605710;-57.142860;, 66.666664;-0.069805;-57.142857;, 47.619049;0.038909;-52.380959;, 52.380947;-0.769230;-52.380955;, 57.142857;-0.503422;-52.380962;, 61.904758;0.345566;-52.380955;, 66.666656;-0.560847;-52.380959;, 47.619041;0.506564;-47.619045;, 52.380955;-0.508165;-47.619053;, 57.142857;0.135078;-47.619049;, 61.904751;-1.073132;-47.619057;, 66.666656;-0.165831;-47.619049;, 76.190483;-0.072807;-66.666664;, 76.190475;-0.486434;-61.904766;, 80.952377;0.095965;-61.904766;, 76.190468;0.392118;-57.142864;, 80.952362;-0.160010;-57.142857;, 85.714279;0.029156;-57.142864;, 76.190475;0.389107;-52.380959;, 80.952385;-0.270554;-52.380955;, 85.714279;0.304861;-52.380959;, 90.476181;0.029144;-52.380955;, 76.190475;-0.280273;-47.619045;, 80.952377;0.047318;-47.619053;, 85.714279;0.077279;-47.619049;, 90.476181;0.522156;-47.619057;, -95.238091;0.146004;-38.095249;, -90.476189;-0.135323;-38.095245;, -85.714302;-0.094774;-38.095245;, -80.952385;-0.012592;-38.095238;, -76.190475;0.214362;-38.095242;, -95.238091;-0.663445;-33.333336;, -90.476196;-0.571629;-33.333336;, -85.714287;0.142352;-33.333340;, -80.952385;-0.006924;-33.333336;, -76.190475;0.942335;-33.333336;, -95.238091;0.105121;-28.571430;, -90.476196;0.379096;-28.571432;, -85.714279;0.025746;-28.571434;, -80.952385;0.014520;-28.571434;, -76.190475;0.436127;-28.571432;, -95.238098;0.037560;-23.809530;, -90.476196;0.267005;-23.809528;, -85.714287;0.863584;-23.809528;, -80.952385;-0.166361;-23.809530;, -76.190475;0.196967;-23.809528;, -95.238098;-0.104465;-19.047628;, -90.476189;0.122242;-19.047621;, -85.714287;0.447682;-19.047623;, -80.952377;0.063871;-19.047625;, -76.190475;0.343448;-19.047625;, -66.666672;0.590940;-38.095249;, -61.904770;0.608232;-38.095245;, -57.142864;0.552512;-38.095245;, -52.380962;0.320589;-38.095238;, -47.619057;0.278432;-38.095242;, -66.666672;1.271968;-33.333336;, -61.904758;0.403147;-33.333336;, -57.142860;0.108861;-33.333340;, -52.380955;-0.191607;-33.333336;, -47.619053;0.253385;-33.333336;, -66.666672;1.065984;-28.571430;, -61.904766;0.646968;-28.571432;, -57.142868;0.768861;-28.571434;, -52.380959;0.366157;-28.571434;, -47.619053;0.675626;-28.571432;, -66.666672;1.103412;-23.809530;, -61.904762;1.158456;-23.809528;, -57.142857;0.210519;-23.809528;, -52.380955;0.972075;-23.809530;, -47.619049;0.647467;-23.809528;, -66.666672;1.283420;-19.047628;, -61.904762;1.341369;-19.047621;, -57.142857;1.247629;-19.047623;, -52.380959;0.956362;-19.047625;, -47.619049;1.172287;-19.047625;, -38.095245;-0.214886;-38.095249;, -33.333336;0.484496;-38.095245;, -28.571430;-0.136695;-38.095245;, -23.809528;0.848725;-38.095238;, -19.047625;0.345354;-38.095242;, -38.095245;-0.436160;-33.333336;, -33.333332;0.551390;-33.333336;, -28.571432;0.495749;-33.333340;, -23.809528;0.666285;-33.333336;, -19.047625;0.129059;-33.333336;, -38.095245;0.679556;-28.571430;, -33.333340;0.879020;-28.571432;, -28.571434;0.751337;-28.571434;, -23.809530;0.503239;-28.571434;, -19.047623;0.511175;-28.571432;, -38.095245;0.953050;-23.809530;, -33.333336;0.333945;-23.809528;, -28.571436;0.857836;-23.809528;, -23.809532;-0.429330;-23.809530;, -19.047625;-0.056639;-23.809528;, -38.095242;1.071013;-19.047628;, -33.333340;0.435640;-19.047621;, -28.571432;0.770570;-19.047623;, -23.809528;0.340346;-19.047625;, -19.047623;0.447750;-19.047625;, -9.523815;-0.086783;-38.095249;, -4.761909;0.113547;-38.095245;, -0.000005;-0.197065;-38.095245;, 4.761901;-0.054983;-38.095238;, 9.523804;0.692805;-38.095242;, -9.523813;0.274385;-33.333336;, -4.761909;-0.232459;-33.333336;, -0.000005;-0.380196;-33.333340;, 4.761900;0.399482;-33.333336;, 9.523804;0.062564;-33.333336;, -9.523813;0.297241;-28.571430;, -4.761909;0.415487;-28.571432;, -0.000004;0.800085;-28.571434;, 4.761900;0.788055;-28.571434;, 9.523804;0.737738;-28.571432;, -9.523813;0.525031;-23.809530;, -4.761909;0.399502;-23.809528;, -0.000005;0.520640;-23.809528;, 4.761900;0.163826;-23.809530;, 9.523804;1.190181;-23.809528;, -9.523815;0.465551;-19.047628;, -4.761909;0.210487;-19.047621;, -0.000005;0.555673;-19.047623;, 4.761901;0.842914;-19.047625;, 9.523804;0.660211;-19.047625;, 19.047617;0.451290;-38.095249;, 23.809519;0.286698;-38.095245;, 28.571426;0.805214;-38.095245;, 33.333332;0.989717;-38.095238;, 38.095234;0.593022;-38.095242;, 19.047615;1.319814;-33.333336;, 23.809519;1.135292;-33.333336;, 28.571424;1.117218;-33.333340;, 33.333328;1.023826;-33.333336;, 38.095230;0.911118;-33.333336;, 19.047617;0.540009;-28.571430;, 23.809517;0.881057;-28.571432;, 28.571426;0.618853;-28.571434;, 33.333332;0.981026;-28.571434;, 38.095234;0.603346;-28.571432;, 19.047615;0.622427;-23.809530;, 23.809521;0.594324;-23.809528;, 28.571423;0.218313;-23.809528;, 33.333328;1.047722;-23.809530;, 38.095234;1.451933;-23.809528;, 19.047617;0.620442;-19.047628;, 23.809519;0.343850;-19.047621;, 28.571423;0.528112;-19.047623;, 33.333328;0.528256;-19.047625;, 38.095230;0.711731;-19.047625;, 47.619041;1.491915;-38.095249;, 52.380955;0.149788;-38.095245;, 57.142857;-0.120143;-38.095245;, 61.904755;-0.000747;-38.095238;, 66.666656;1.339226;-38.095242;, 47.619045;0.151090;-33.333336;, 52.380947;0.313079;-33.333336;, 57.142849;0.156893;-33.333340;, 61.904758;0.354590;-33.333336;, 66.666656;0.247437;-33.333336;, 47.619045;1.023633;-28.571430;, 52.380959;-0.145311;-28.571432;, 57.142849;0.631876;-28.571434;, 61.904758;0.844891;-28.571434;, 66.666664;1.026587;-28.571432;, 47.619049;0.998444;-23.809530;, 52.380947;0.614895;-23.809528;, 57.142857;-0.185409;-23.809528;, 61.904758;0.752258;-23.809530;, 66.666656;0.566804;-23.809528;, 47.619041;1.884505;-19.047628;, 52.380955;0.703374;-19.047621;, 57.142857;0.932738;-19.047623;, 61.904751;-0.012433;-19.047625;, 66.666656;0.598260;-19.047625;, 76.190483;0.585609;-38.095249;, 80.952385;0.112419;-38.095245;, 85.714272;0.569965;-38.095245;, 90.476196;0.070365;-38.095238;, 95.238098;0.810845;-38.095242;, 76.190475;0.958473;-33.333336;, 80.952377;0.519011;-33.333336;, 85.714279;1.036680;-33.333340;, 90.476189;0.312387;-33.333336;, 95.238091;0.684369;-33.333336;, 76.190468;0.903687;-28.571430;, 80.952362;0.370712;-28.571432;, 85.714279;0.401624;-28.571434;, 90.476189;0.465031;-28.571434;, 95.238083;0.871782;-28.571432;, 76.190475;0.067014;-23.809530;, 80.952385;-0.059502;-23.809528;, 85.714279;-0.401895;-23.809528;, 90.476181;0.112269;-23.809530;, 95.238083;0.295354;-23.809528;, 76.190475;0.241683;-19.047628;, 80.952377;0.139077;-19.047621;, 85.714279;0.032044;-19.047623;, 90.476181;0.370127;-19.047625;, 95.238083;0.035993;-19.047625;, -95.238091;-0.635028;-9.523814;, -90.476189;0.081866;-9.523813;, -85.714302;0.542680;-9.523813;, -80.952385;0.072004;-9.523814;, -76.190475;0.769015;-9.523814;, -95.238091;0.370450;-4.761909;, -90.476196;0.126042;-4.761909;, -85.714287;-0.035015;-4.761909;, -80.952385;0.433681;-4.761909;, -76.190475;0.785710;-4.761909;, -95.238091;0.243324;-0.000005;, -90.476196;0.458492;-0.000005;, -85.714279;0.686098;-0.000005;, -80.952385;0.255165;-0.000005;, -76.190475;0.671934;-0.000005;, -95.238098;0.680216;4.761900;, -90.476196;0.493188;4.761901;, -85.714287;0.510967;4.761900;, -80.952385;-0.085318;4.761900;, -76.190475;0.153707;4.761900;, -95.238098;-0.113884;9.523805;, -90.476189;-0.062231;9.523803;, -85.714287;0.013318;9.523803;, -80.952377;0.501502;9.523804;, -76.190475;0.116553;9.523804;, -66.666672;0.648186;-9.523814;, -61.904770;1.037785;-9.523813;, -57.142864;1.118643;-9.523813;, -52.380962;0.152270;-9.523814;, -47.619057;0.382152;-9.523814;, -66.666672;-0.263512;-4.761909;, -61.904758;1.228136;-4.761909;, -57.142860;1.333070;-4.761909;, -52.380955;0.844646;-4.761909;, -47.619053;0.275482;-4.761909;, -66.666672;-0.122993;-0.000005;, -61.904766;-0.001749;-0.000005;, -57.142868;0.388759;-0.000005;, -52.380959;0.776936;-0.000005;, -47.619053;0.057072;-0.000005;, -66.666672;-0.154972;4.761900;, -61.904762;-0.245416;4.761901;, -57.142857;0.150180;4.761900;, -52.380955;0.469004;4.761900;, -47.619049;0.523502;4.761900;, -66.666672;0.668283;9.523805;, -61.904762;0.014012;9.523803;, -57.142857;1.073029;9.523803;, -52.380959;0.621311;9.523804;, -47.619049;0.676246;9.523804;, -38.095245;0.257905;-9.523814;, -33.333336;0.409918;-9.523813;, -28.571430;0.237781;-9.523813;, -23.809528;1.043879;-9.523814;, -19.047625;0.787480;-9.523814;, -38.095245;0.408669;-4.761909;, -33.333332;-0.055927;-4.761909;, -28.571432;0.258839;-4.761909;, -23.809528;0.549747;-4.761909;, -19.047625;0.945331;-4.761909;, -38.095245;0.346291;-0.000005;, -33.333340;0.166681;-0.000005;, -28.571434;0.184476;-0.000005;, -23.809530;0.419668;-0.000005;, -19.047623;0.156914;-0.000005;, -38.095245;0.484803;4.761900;, -33.333336;0.414197;4.761901;, -28.571436;0.395152;4.761900;, -23.809532;0.548786;4.761900;, -19.047625;-0.148510;4.761900;, -38.095242;0.264819;9.523805;, -33.333340;0.227147;9.523803;, -28.571432;0.518521;9.523803;, -23.809528;-0.044758;9.523804;, -19.047623;0.149496;9.523804;, -9.523815;0.995608;-9.523814;, -4.761909;1.512732;-9.523813;, -0.000005;0.859293;-9.523813;, 4.761901;0.560019;-9.523814;, 9.523804;0.686237;-9.523814;, -9.523813;1.376515;-4.761909;, -4.761909;0.789060;-4.761909;, -0.000005;0.791284;-4.761909;, 4.761900;0.844546;-4.761909;, 9.523804;0.953963;-4.761909;, -9.523813;0.748610;-0.000005;, -4.761909;-0.118583;-0.000005;, -0.000004;0.563196;-0.000005;, 4.761900;0.647850;-0.000005;, 9.523804;0.984808;-0.000005;, -9.523813;0.464913;4.761900;, -4.761909;0.729785;4.761901;, -0.000005;0.889329;4.761900;, 4.761900;0.917057;4.761900;, 9.523804;1.329822;4.761900;, -9.523815;-0.044570;9.523805;, -4.761909;0.210753;9.523803;, -0.000005;0.873260;9.523803;, 4.761901;0.876039;9.523804;, 9.523804;1.378626;9.523804;, 19.047617;0.670248;-9.523814;, 23.809519;0.631106;-9.523813;, 28.571426;0.236182;-9.523813;, 33.333332;0.132501;-9.523814;, 38.095234;0.736855;-9.523814;, 19.047615;0.106248;-4.761909;, 23.809519;-0.385313;-4.761909;, 28.571424;0.358606;-4.761909;, 33.333328;0.369490;-4.761909;, 38.095230;-0.458202;-4.761909;, 19.047617;0.438385;-0.000005;, 23.809517;0.103508;-0.000005;, 28.571426;0.654476;-0.000005;, 33.333332;0.197987;-0.000005;, 38.095234;-0.468729;-0.000005;, 19.047615;0.402630;4.761900;, 23.809521;0.413054;4.761901;, 28.571423;0.697183;4.761900;, 33.333328;-0.211688;4.761900;, 38.095234;-0.481783;4.761900;, 19.047617;1.188652;9.523805;, 23.809519;0.765385;9.523803;, 28.571423;0.633057;9.523803;, 33.333328;-0.037992;9.523804;, 38.095230;-0.279323;9.523804;, 47.619041;1.065258;-9.523814;, 52.380955;0.678198;-9.523813;, 57.142857;0.212120;-9.523813;, 61.904755;1.334492;-9.523814;, 66.666656;0.436235;-9.523814;, 47.619045;0.288181;-4.761909;, 52.380947;1.176908;-4.761909;, 57.142849;0.975162;-4.761909;, 61.904758;0.550585;-4.761909;, 66.666656;0.058083;-4.761909;, 47.619045;-0.404481;-0.000005;, 52.380959;0.548954;-0.000005;, 57.142849;0.225667;-0.000005;, 61.904758;0.339342;-0.000005;, 66.666664;0.584654;-0.000005;, 47.619049;0.216021;4.761900;, 52.380947;0.048065;4.761901;, 57.142857;0.231755;4.761900;, 61.904758;-0.012498;4.761900;, 66.666656;0.332744;4.761900;, 47.619041;-0.071246;9.523805;, 52.380955;-0.208520;9.523803;, 57.142857;0.279395;9.523803;, 61.904751;0.154010;9.523804;, 66.666656;-0.188532;9.523804;, 76.190483;-0.088690;-9.523814;, 80.952385;0.390631;-9.523813;, 85.714272;-0.161228;-9.523813;, 90.476196;-0.238980;-9.523814;, 95.238098;0.173079;-9.523814;, 76.190475;-0.134629;-4.761909;, 80.952377;-0.278623;-4.761909;, 85.714279;0.152124;-4.761909;, 90.476189;-0.788111;-4.761909;, 95.238091;0.056065;-4.761909;, 76.190468;0.151857;-0.000005;, 80.952362;0.013362;-0.000005;, 85.714279;0.238772;-0.000004;, 90.476189;-0.584571;-0.000005;, 95.238083;-0.271175;-0.000005;, 76.190475;0.288078;4.761900;, 80.952385;-0.006765;4.761901;, 85.714279;-0.320527;4.761900;, 90.476181;-0.171760;4.761901;, 95.238083;-0.106328;4.761900;, 76.190475;-0.488811;9.523805;, 80.952377;0.259892;9.523803;, 85.714279;-0.964793;9.523803;, 90.476181;-0.619212;9.523804;, 95.238083;0.091132;9.523804;, -95.238091;-0.201637;19.047617;, -90.476189;-0.149839;19.047615;, -85.714302;0.006371;19.047617;, -80.952385;-0.033042;19.047615;, -76.190475;-0.317115;19.047615;, -95.238091;0.209303;23.809517;, -90.476196;0.460540;23.809519;, -85.714287;0.020164;23.809519;, -80.952385;-0.128085;23.809521;, -76.190475;0.149817;23.809519;, -95.238091;0.420094;28.571424;, -90.476196;0.492581;28.571423;, -85.714279;0.095347;28.571424;, -80.952385;0.419620;28.571423;, -76.190475;0.362057;28.571423;, -95.238098;-0.150883;33.333332;, -90.476196;-0.282124;33.333332;, -85.714287;-0.187727;33.333332;, -80.952385;0.259263;33.333332;, -76.190475;0.594422;33.333328;, -95.238098;-0.571404;38.095238;, -90.476189;-0.486190;38.095230;, -85.714287;0.357521;38.095226;, -80.952377;0.504628;38.095230;, -76.190475;0.373769;38.095230;, -66.666672;0.502245;19.047617;, -61.904770;0.511736;19.047615;, -57.142864;0.360597;19.047617;, -52.380962;0.735265;19.047615;, -47.619057;0.127262;19.047615;, -66.666672;0.514087;23.809517;, -61.904758;0.519105;23.809519;, -57.142860;0.519451;23.809519;, -52.380955;0.782563;23.809521;, -47.619053;0.444003;23.809519;, -66.666672;-0.234723;28.571424;, -61.904766;0.326034;28.571423;, -57.142868;0.051950;28.571424;, -52.380959;-0.173723;28.571423;, -47.619053;-0.238126;28.571423;, -66.666672;0.537940;33.333332;, -61.904762;-0.058904;33.333332;, -57.142857;0.204335;33.333332;, -52.380955;-0.088778;33.333332;, -47.619049;0.203796;33.333328;, -66.666672;0.652848;38.095238;, -61.904762;0.415248;38.095230;, -57.142857;0.087422;38.095226;, -52.380959;-0.090355;38.095230;, -47.619049;-0.059427;38.095230;, -38.095245;0.161836;19.047617;, -33.333336;-0.440482;19.047615;, -28.571430;-0.285349;19.047617;, -23.809528;0.407627;19.047615;, -19.047625;0.433981;19.047615;, -38.095245;0.020594;23.809517;, -33.333332;-0.073424;23.809519;, -28.571432;0.625639;23.809519;, -23.809528;0.315404;23.809521;, -19.047625;0.293077;23.809519;, -38.095245;0.766912;28.571424;, -33.333340;0.504977;28.571423;, -28.571434;0.369143;28.571424;, -23.809530;0.445399;28.571423;, -19.047623;0.100101;28.571423;, -38.095245;0.201413;33.333332;, -33.333336;1.294783;33.333332;, -28.571436;0.968459;33.333332;, -23.809532;0.558453;33.333332;, -19.047625;0.277103;33.333328;, -38.095242;0.575762;38.095238;, -33.333340;0.453316;38.095230;, -28.571432;1.285199;38.095226;, -23.809528;0.488240;38.095230;, -19.047623;0.187016;38.095230;, -9.523815;0.996402;19.047617;, -4.761909;0.775935;19.047615;, -0.000005;0.880439;19.047617;, 4.761901;0.612420;19.047615;, 9.523804;0.571617;19.047615;, -9.523813;1.616749;23.809517;, -4.761909;0.377220;23.809519;, -0.000005;0.720718;23.809519;, 4.761900;0.472201;23.809521;, 9.523804;0.317466;23.809519;, -9.523813;0.431987;28.571424;, -4.761909;0.345291;28.571423;, -0.000004;-0.074424;28.571424;, 4.761900;-0.542948;28.571423;, 9.523804;0.259391;28.571423;, -9.523813;0.669768;33.333332;, -4.761909;0.340621;33.333332;, -0.000005;-0.096041;33.333332;, 4.761900;-0.622098;33.333332;, 9.523804;0.051470;33.333328;, -9.523815;0.390742;38.095238;, -4.761909;0.199370;38.095230;, -0.000005;0.857651;38.095226;, 4.761901;0.552805;38.095230;, 9.523804;-0.119714;38.095230;, 19.047617;0.459538;19.047617;, 23.809519;0.618532;19.047615;, 28.571426;0.356688;19.047617;, 33.333332;0.198981;19.047615;, 38.095234;0.222746;19.047615;, 19.047615;0.095561;23.809517;, 23.809519;0.536586;23.809519;, 28.571424;0.152821;23.809519;, 33.333328;-0.680507;23.809521;, 38.095230;0.177823;23.809519;, 19.047617;0.005467;28.571424;, 23.809517;-0.100124;28.571423;, 28.571426;-0.181885;28.571424;, 33.333332;-0.433794;28.571423;, 38.095234;-0.490281;28.571423;, 19.047615;0.185628;33.333332;, 23.809521;-0.394754;33.333332;, 28.571423;-0.515903;33.333332;, 33.333328;-0.266749;33.333332;, 38.095234;-0.440623;33.333328;, 19.047617;-0.215529;38.095238;, 23.809519;-0.145184;38.095230;, 28.571423;-0.328802;38.095226;, 33.333328;-0.118301;38.095230;, 38.095230;-0.068659;38.095230;, 47.619041;0.250273;19.047617;, 52.380955;-0.139636;19.047615;, 57.142857;0.045368;19.047617;, 61.904755;0.484037;19.047615;, 66.666656;-0.962253;19.047615;, 47.619045;-0.242349;23.809517;, 52.380947;0.047723;23.809519;, 57.142849;-0.259574;23.809519;, 61.904758;0.171286;23.809521;, 66.666656;0.119474;23.809519;, 47.619045;0.854265;28.571424;, 52.380959;0.709659;28.571423;, 57.142849;0.114179;28.571424;, 61.904758;-0.737622;28.571423;, 66.666664;-0.540622;28.571423;, 47.619049;0.196880;33.333332;, 52.380947;0.418325;33.333332;, 57.142857;-0.165413;33.333332;, 61.904758;-0.018578;33.333332;, 66.666656;-0.542027;33.333328;, 47.619041;0.040305;38.095238;, 52.380955;-0.305511;38.095230;, 57.142857;-0.801721;38.095226;, 61.904751;-0.693914;38.095230;, 66.666656;-0.260167;38.095230;, 76.190483;-0.350931;19.047617;, 80.952385;-0.270984;19.047615;, 85.714272;-0.653663;19.047617;, 90.476196;-0.588821;19.047615;, 95.238098;-0.166806;19.047615;, 76.190475;-0.982747;23.809517;, 80.952377;-0.280588;23.809519;, 85.714279;-0.809163;23.809519;, 90.476189;-0.707869;23.809521;, 95.238091;-0.191508;23.809521;, 76.190468;-1.361749;28.571424;, 80.952362;-1.537214;28.571423;, 85.714279;-0.557252;28.571424;, 90.476189;-0.858880;28.571423;, 95.238083;-0.540427;28.571423;, 76.190475;-0.991974;33.333332;, 80.952385;-0.341072;33.333332;, 85.714279;-0.480612;33.333332;, 90.476181;-0.357981;33.333332;, 95.238083;-0.068596;33.333332;, 76.190475;-0.649106;38.095238;, 80.952377;-0.559025;38.095230;, 85.714279;-0.386252;38.095226;, 90.476181;0.099080;38.095230;, -90.476189;-0.876558;47.619049;, -85.714302;-0.346224;47.619041;, -80.952385;-0.279265;47.619049;, -76.190475;-0.593621;47.619045;, -90.476196;-0.496902;52.380939;, -85.714287;-0.441395;52.380951;, -80.952385;-0.030910;52.380947;, -76.190475;0.249934;52.380951;, -85.714279;-0.433317;57.142853;, -80.952385;-0.000843;57.142857;, -76.190475;-0.835901;57.142849;, -85.714287;0.363133;61.904758;, -80.952385;-0.122559;61.904758;, -76.190475;-0.282176;61.904758;, -80.952377;0.289427;66.666664;, -76.190475;0.455423;66.666664;, -66.666672;0.605411;47.619045;, -61.904770;-0.101593;47.619049;, -57.142864;0.010784;47.619041;, -52.380962;-0.305407;47.619049;, -47.619057;-0.352808;47.619045;, -66.666672;-0.066875;52.380955;, -61.904758;-0.453473;52.380939;, -57.142860;0.087123;52.380951;, -52.380955;-0.189693;52.380947;, -47.619053;0.324851;52.380951;, -66.666672;-0.553944;57.142853;, -61.904766;-0.676060;57.142849;, -57.142868;-0.862220;57.142853;, -52.380959;-0.121714;57.142857;, -47.619053;-0.157393;57.142849;, -66.666672;-0.748001;61.904766;, -61.904762;-0.196270;61.904755;, -57.142857;-0.844559;61.904758;, -52.380955;-0.766034;61.904758;, -47.619049;-0.394087;61.904758;, -66.666672;-0.406123;66.666649;, -61.904762;-0.455862;66.666656;, -57.142857;-0.281796;66.666664;, -52.380959;-0.495838;66.666664;, -47.619049;-1.226247;66.666664;, -38.095245;0.092546;47.619045;, -33.333336;0.097091;47.619049;, -28.571430;0.451482;47.619041;, -23.809528;0.626763;47.619049;, -19.047625;-0.020122;47.619045;, -38.095245;-0.419869;52.380955;, -33.333332;-0.212224;52.380939;, -28.571432;-0.223933;52.380951;, -23.809528;0.030272;52.380947;, -19.047625;0.380474;52.380951;, -38.095245;-0.268773;57.142853;, -33.333340;0.039447;57.142849;, -28.571434;-0.597401;57.142853;, -23.809530;-0.248587;57.142857;, -19.047623;0.346370;57.142849;, -38.095245;-0.955208;61.904766;, -33.333336;-0.925934;61.904755;, -28.571436;-0.662956;61.904758;, -23.809532;-0.401054;61.904758;, -19.047625;0.134505;61.904758;, -38.095242;-0.814418;66.666649;, -33.333340;-1.112140;66.666656;, -28.571432;-0.516252;66.666664;, -23.809528;-0.760757;66.666664;, -19.047623;-0.348394;66.666664;, -9.523815;-0.110413;47.619045;, -4.761909;0.305821;47.619049;, -0.000005;0.281593;47.619041;, 4.761901;0.292163;47.619049;, 9.523804;-0.293571;47.619045;, -9.523813;0.220246;52.380955;, -4.761909;-0.295488;52.380939;, -0.000005;-0.155451;52.380951;, 4.761900;0.391777;52.380947;, 9.523804;-0.325865;52.380951;, -9.523813;0.437661;57.142853;, -4.761909;-0.513525;57.142849;, -0.000004;-0.649736;57.142853;, 4.761900;-0.020130;57.142857;, 9.523804;-0.557592;57.142849;, -9.523813;-0.414858;61.904766;, -4.761909;-0.065868;61.904755;, -0.000005;-0.010068;61.904758;, 4.761900;-0.069373;61.904758;, 9.523804;-0.799663;61.904758;, -9.523815;-0.369522;66.666649;, -4.761909;-0.696942;66.666656;, -0.000005;0.025907;66.666664;, 4.761901;-1.007324;66.666664;, 9.523804;-0.574893;66.666664;, 19.047617;0.325343;47.619045;, 23.809519;0.473680;47.619049;, 28.571426;0.275061;47.619041;, 33.333332;-0.256181;47.619049;, 38.095234;0.483084;47.619045;, 19.047615;-0.350834;52.380955;, 23.809519;-0.013383;52.380939;, 28.571424;-0.273459;52.380951;, 33.333328;0.254800;52.380947;, 38.095230;0.599137;52.380951;, 19.047617;-0.194767;57.142853;, 23.809517;-0.314225;57.142849;, 28.571426;-0.353765;57.142853;, 33.333332;0.507339;57.142857;, 38.095234;0.010199;57.142849;, 19.047615;-0.016212;61.904766;, 23.809521;0.033933;61.904755;, 28.571423;-0.351155;61.904758;, 33.333328;-0.111704;61.904758;, 38.095234;-0.173389;61.904758;, 19.047617;0.042704;66.666649;, 23.809519;-0.981737;66.666656;, 28.571423;-0.207663;66.666664;, 33.333328;-0.098233;66.666664;, 38.095230;0.349205;66.666664;, 47.619041;-0.111488;47.619045;, 52.380955;-0.173820;47.619049;, 57.142857;-0.055898;47.619041;, 61.904755;-0.458990;47.619049;, 66.666656;0.068232;47.619045;, 47.619045;-0.448598;52.380955;, 52.380947;-0.643468;52.380939;, 57.142849;-0.963284;52.380951;, 61.904758;-0.282064;52.380947;, 66.666656;-0.610852;52.380951;, 47.619045;0.255676;57.142853;, 52.380959;0.043661;57.142849;, 57.142849;-0.450146;57.142853;, 61.904758;-0.734543;57.142857;, 66.666664;-0.595717;57.142849;, 47.619049;0.295272;61.904766;, 52.380947;0.224996;61.904755;, 57.142857;0.410076;61.904758;, 61.904758;-0.102180;61.904758;, 66.666656;-0.641119;61.904758;, 47.619041;-0.063889;66.666649;, 52.380955;-0.052278;66.666656;, 57.142857;-0.260962;66.666664;, 61.904751;0.211714;66.666664;, 66.666656;-0.891935;66.666664;, 76.190483;0.384868;47.619045;, 80.952385;-0.498316;47.619049;, 85.714272;-0.452842;47.619045;, 90.476196;-0.679208;47.619049;, 76.190475;0.383476;52.380955;, 80.952377;0.228437;52.380943;, 85.714279;-0.298431;52.380951;, 76.190468;0.030241;57.142853;, 80.952362;-0.057542;57.142849;, 76.190475;-0.149108;61.904766;, 80.952385;0.231597;61.904755;, 76.190475;0.684127;66.666649;, -66.666672;-0.805704;76.190475;, -61.904770;-0.639796;76.190468;, -57.142864;-0.707538;76.190475;, -52.380962;-1.071568;76.190475;, -47.619057;-0.374410;76.190468;, -66.666672;-0.417351;80.952377;, -61.904758;-0.230551;80.952385;, -57.142860;-0.240226;80.952370;, -52.380955;0.515422;80.952385;, -47.619053;-0.344058;80.952370;, -52.380959;-0.267540;85.714279;, -47.619053;-0.400396;85.714272;, -52.380955;0.632710;90.476189;, -47.619049;0.289989;90.476181;, -38.095245;-0.131742;76.190475;, -33.333336;-0.165298;76.190468;, -28.571430;0.479944;76.190475;, -23.809528;-0.376538;76.190475;, -19.047625;-0.480150;76.190468;, -38.095245;-0.001046;80.952377;, -33.333332;-0.343873;80.952385;, -28.571432;0.302766;80.952370;, -23.809528;0.061208;80.952385;, -19.047625;-0.168522;80.952370;, -38.095245;0.534184;85.714272;, -33.333340;0.319921;85.714272;, -28.571434;0.235242;85.714279;, -23.809530;0.387477;85.714279;, -19.047623;0.091821;85.714272;, -38.095245;-0.278674;90.476181;, -33.333336;-0.722953;90.476196;, -28.571436;-0.670441;90.476181;, -23.809532;-0.490729;90.476189;, -19.047625;-0.106003;90.476181;, -33.333340;-0.228621;95.238091;, -28.571432;0.184142;95.238091;, -23.809528;-0.230569;95.238091;, -19.047623;-0.329850;95.238083;, -9.523815;-0.422359;76.190475;, -4.761909;-0.279259;76.190468;, -0.000005;-0.393888;76.190475;, 4.761901;-0.153724;76.190475;, 9.523804;-0.603998;76.190468;, -9.523813;-0.517870;80.952377;, -4.761909;-0.318783;80.952385;, -0.000005;-0.221239;80.952370;, 4.761900;-0.203658;80.952385;, 9.523804;-0.281561;80.952370;, -9.523813;-0.602386;85.714272;, -4.761909;-0.275787;85.714272;, -0.000004;-0.346190;85.714279;, 4.761900;-0.680653;85.714279;, 9.523804;-0.553402;85.714272;, -9.523813;-0.672190;90.476181;, -4.761909;-0.708849;90.476196;, -0.000005;-0.185962;90.476181;, 4.761900;-0.110973;90.476189;, 9.523804;-0.155267;90.476181;, -9.523815;0.470404;95.238083;, -4.761909;0.108812;95.238091;, -0.000005;-0.220810;95.238091;, 4.761901;-0.266211;95.238091;, 9.523804;0.384882;95.238083;, 19.047617;-0.379222;76.190475;, 23.809519;-0.648977;76.190468;, 28.571426;-0.178253;76.190475;, 33.333332;-0.078896;76.190475;, 38.095234;-0.675569;76.190468;, 19.047615;-0.109131;80.952377;, 23.809519;0.306690;80.952385;, 28.571424;-0.406478;80.952370;, 33.333328;-0.045989;80.952385;, 38.095230;-0.416376;80.952370;, 19.047617;-0.794436;85.714272;, 23.809517;-0.613818;85.714272;, 28.571426;-0.121993;85.714279;, 33.333332;0.033380;85.714279;, 38.095234;-0.071678;85.714272;, 19.047615;-0.322759;90.476181;, 23.809521;0.144414;90.476196;, 28.571423;0.629921;90.476181;, 33.333328;-0.051256;90.476189;, 38.095234;0.560947;90.476181;, 19.047617;0.169525;95.238083;, 23.809519;-0.366049;95.238091;, 28.571423;-0.622185;95.238091;, 33.333328;-0.079609;95.238091;, 47.619041;-0.304020;76.190475;, 52.380955;-0.227923;76.190468;, 57.142857;-0.457192;76.190475;, 61.904755;-0.708188;76.190475;, 66.666656;-0.840111;76.190468;, 47.619045;-1.493818;80.952377;, 52.380947;-0.057613;80.952385;, 57.142849;-0.457289;80.952370;, 61.904758;-0.765565;80.952385;, 47.619045;-0.240735;85.714272;, 52.380959;-0.726876;85.714272;, 57.142849;-0.889818;85.714279;, 47.619049;-0.358727;90.476181;; 2830; 3;461,466,462;, 3;466,461,465;, 3;462,467,463;, 3;467,462,466;, 3;464,470,465;, 3;470,464,469;, 3;465,471,466;, 3;471,465,470;, 3;466,472,467;, 3;472,466,471;, 3;3,472,49;, 3;472,3,48;, 3;49,471,50;, 3;471,49,472;, 3;46,460,463;, 3;460,46,45;, 3;50,470,51;, 3;470,50,471;, 3;47,463,467;, 3;463,47,46;, 3;51,469,52;, 3;469,51,470;, 3;48,467,472;, 3;467,48,47;, 3;52,468,53;, 3;468,52,469;, 3;473,479,474;, 3;479,473,478;, 3;474,480,475;, 3;480,474,479;, 3;475,481,476;, 3;481,475,480;, 3;476,482,477;, 3;482,476,481;, 3;478,484,479;, 3;484,478,483;, 3;479,485,480;, 3;485,479,484;, 3;480,486,481;, 3;486,480,485;, 3;481,487,482;, 3;487,481,486;, 3;483,489,484;, 3;489,483,488;, 3;484,490,485;, 3;490,484,489;, 3;485,491,486;, 3;491,485,490;, 3;486,492,487;, 3;492,486,491;, 3;488,494,489;, 3;494,488,493;, 3;489,495,490;, 3;495,489,494;, 3;490,496,491;, 3;496,490,495;, 3;491,497,492;, 3;497,491,496;, 3;56,55,477;, 3;55,56,0;, 3;4,497,61;, 3;497,4,60;, 3;48,65,493;, 3;65,48,3;, 3;57,477,482;, 3;477,57,56;, 3;61,496,62;, 3;496,61,497;, 3;47,493,488;, 3;493,47,48;, 3;58,482,487;, 3;482,58,57;, 3;62,495,63;, 3;495,62,496;, 3;46,488,483;, 3;488,46,47;, 3;59,487,492;, 3;487,59,58;, 3;63,494,64;, 3;494,63,495;, 3;45,483,478;, 3;483,45,46;, 3;54,477,55;, 3;477,54,476;, 3;60,492,497;, 3;492,60,59;, 3;64,493,65;, 3;493,64,494;, 3;498,504,499;, 3;504,498,503;, 3;499,505,500;, 3;505,499,504;, 3;500,506,501;, 3;506,500,505;, 3;501,507,502;, 3;507,501,506;, 3;503,509,504;, 3;509,503,508;, 3;504,510,505;, 3;510,504,509;, 3;505,511,506;, 3;511,505,510;, 3;506,512,507;, 3;512,506,511;, 3;508,514,509;, 3;514,508,513;, 3;509,515,510;, 3;515,509,514;, 3;510,516,511;, 3;516,510,515;, 3;511,517,512;, 3;517,511,516;, 3;513,519,514;, 3;519,513,518;, 3;514,520,515;, 3;520,514,519;, 3;515,521,516;, 3;521,515,520;, 3;516,522,517;, 3;522,516,521;, 3;0,498,66;, 3;498,0,56;, 3;71,70,502;, 3;70,71,1;, 3;5,522,76;, 3;522,5,75;, 3;60,80,518;, 3;80,60,4;, 3;66,499,67;, 3;499,66,498;, 3;72,502,507;, 3;502,72,71;, 3;76,521,77;, 3;521,76,522;, 3;59,518,513;, 3;518,59,60;, 3;67,500,68;, 3;500,67,499;, 3;73,507,512;, 3;507,73,72;, 3;77,520,78;, 3;520,77,521;, 3;58,513,508;, 3;513,58,59;, 3;68,501,69;, 3;501,68,500;, 3;74,512,517;, 3;512,74,73;, 3;78,519,79;, 3;519,78,520;, 3;57,508,503;, 3;508,57,58;, 3;69,502,70;, 3;502,69,501;, 3;75,517,522;, 3;517,75,74;, 3;79,518,80;, 3;518,79,519;, 3;56,503,498;, 3;503,56,57;, 3;523,529,524;, 3;529,523,528;, 3;524,530,525;, 3;530,524,529;, 3;525,531,526;, 3;531,525,530;, 3;526,532,527;, 3;532,526,531;, 3;528,534,529;, 3;534,528,533;, 3;529,535,530;, 3;535,529,534;, 3;530,536,531;, 3;536,530,535;, 3;531,537,532;, 3;537,531,536;, 3;533,539,534;, 3;539,533,538;, 3;534,540,535;, 3;540,534,539;, 3;535,541,536;, 3;541,535,540;, 3;536,542,537;, 3;542,536,541;, 3;538,544,539;, 3;544,538,543;, 3;539,545,540;, 3;545,539,544;, 3;540,546,541;, 3;546,540,545;, 3;541,547,542;, 3;547,541,546;, 3;1,523,81;, 3;523,1,71;, 3;6,547,87;, 3;547,6,86;, 3;75,91,543;, 3;91,75,5;, 3;81,524,82;, 3;524,81,523;, 3;83,527,532;, 3;87,546,88;, 3;546,87,547;, 3;74,543,538;, 3;543,74,75;, 3;525,82,524;, 3;84,532,537;, 3;532,84,83;, 3;88,545,89;, 3;545,88,546;, 3;73,538,533;, 3;538,73,74;, 3;85,537,542;, 3;537,85,84;, 3;89,544,90;, 3;544,89,545;, 3;72,533,528;, 3;533,72,73;, 3;86,542,547;, 3;542,86,85;, 3;90,543,91;, 3;543,90,544;, 3;71,528,523;, 3;528,71,72;, 3;550,548,549;, 3;549,553,550;, 3;553,549,552;, 3;550,554,551;, 3;554,550,553;, 3;555,551,554;, 3;552,557,553;, 3;557,552,556;, 3;553,558,554;, 3;558,553,557;, 3;554,559,555;, 3;559,554,558;, 3;560,555,559;, 3;7,560,93;, 3;560,7,92;, 3;86,97,556;, 3;97,86,6;, 3;93,559,94;, 3;559,93,560;, 3;85,556,552;, 3;556,85,86;, 3;94,558,95;, 3;558,94,559;, 3;84,552,549;, 3;552,84,85;, 3;95,557,96;, 3;557,95,558;, 3;83,549,548;, 3;549,83,84;, 3;96,556,97;, 3;556,96,557;, 3;562,566,563;, 3;566,562,565;, 3;564,568,565;, 3;568,564,567;, 3;565,569,566;, 3;569,565,568;, 3;567,572,568;, 3;572,567,571;, 3;568,573,569;, 3;573,568,572;, 3;98,44,561;, 3;44,98,2;, 3;8,573,103;, 3;573,8,102;, 3;99,561,563;, 3;561,99,98;, 3;103,572,104;, 3;572,103,573;, 3;100,563,566;, 3;563,100,99;, 3;104,571,105;, 3;571,104,572;, 3;101,566,569;, 3;566,101,100;, 3;105,570,106;, 3;570,105,571;, 3;102,569,573;, 3;569,102,101;, 3;574,580,575;, 3;580,574,579;, 3;575,581,576;, 3;581,575,580;, 3;576,582,577;, 3;582,576,581;, 3;577,583,578;, 3;583,577,582;, 3;579,585,580;, 3;585,579,584;, 3;580,586,581;, 3;586,580,585;, 3;581,587,582;, 3;587,581,586;, 3;582,588,583;, 3;588,582,587;, 3;584,590,585;, 3;590,584,589;, 3;585,591,586;, 3;591,585,590;, 3;586,592,587;, 3;592,586,591;, 3;587,593,588;, 3;593,587,592;, 3;589,595,590;, 3;595,589,594;, 3;590,596,591;, 3;596,590,595;, 3;591,597,592;, 3;597,591,596;, 3;592,598,593;, 3;598,592,597;, 3;2,574,53;, 3;574,2,98;, 3;107,49,578;, 3;49,107,3;, 3;9,598,112;, 3;598,9,111;, 3;102,116,594;, 3;116,102,8;, 3;53,575,52;, 3;575,53,574;, 3;108,578,583;, 3;578,108,107;, 3;112,597,113;, 3;597,112,598;, 3;101,594,589;, 3;594,101,102;, 3;52,576,51;, 3;576,52,575;, 3;109,583,588;, 3;583,109,108;, 3;113,596,114;, 3;596,113,597;, 3;100,589,584;, 3;589,100,101;, 3;51,577,50;, 3;577,51,576;, 3;110,588,593;, 3;588,110,109;, 3;114,595,115;, 3;595,114,596;, 3;99,584,579;, 3;584,99,100;, 3;50,578,49;, 3;578,50,577;, 3;111,593,598;, 3;593,111,110;, 3;115,594,116;, 3;594,115,595;, 3;98,579,574;, 3;579,98,99;, 3;599,605,600;, 3;605,599,604;, 3;600,606,601;, 3;606,600,605;, 3;601,607,602;, 3;607,601,606;, 3;602,608,603;, 3;608,602,607;, 3;604,610,605;, 3;610,604,609;, 3;605,611,606;, 3;611,605,610;, 3;606,612,607;, 3;612,606,611;, 3;607,613,608;, 3;613,607,612;, 3;609,615,610;, 3;615,609,614;, 3;610,616,611;, 3;616,610,615;, 3;611,617,612;, 3;617,611,616;, 3;612,618,613;, 3;618,612,617;, 3;614,620,615;, 3;620,614,619;, 3;615,621,616;, 3;621,615,620;, 3;616,622,617;, 3;622,616,621;, 3;617,623,618;, 3;623,617,622;, 3;3,599,65;, 3;599,3,107;, 3;117,61,603;, 3;61,117,4;, 3;10,623,122;, 3;623,10,121;, 3;111,126,619;, 3;126,111,9;, 3;65,600,64;, 3;600,65,599;, 3;118,603,608;, 3;603,118,117;, 3;122,622,123;, 3;622,122,623;, 3;110,619,614;, 3;619,110,111;, 3;64,601,63;, 3;601,64,600;, 3;119,608,613;, 3;608,119,118;, 3;123,621,124;, 3;621,123,622;, 3;109,614,609;, 3;614,109,110;, 3;63,602,62;, 3;602,63,601;, 3;120,613,618;, 3;613,120,119;, 3;124,620,125;, 3;620,124,621;, 3;108,609,604;, 3;609,108,109;, 3;62,603,61;, 3;603,62,602;, 3;121,618,623;, 3;618,121,120;, 3;125,619,126;, 3;619,125,620;, 3;107,604,599;, 3;604,107,108;, 3;624,630,625;, 3;630,624,629;, 3;625,631,626;, 3;631,625,630;, 3;626,632,627;, 3;632,626,631;, 3;627,633,628;, 3;633,627,632;, 3;629,635,630;, 3;635,629,634;, 3;630,636,631;, 3;636,630,635;, 3;631,637,632;, 3;637,631,636;, 3;632,638,633;, 3;638,632,637;, 3;634,640,635;, 3;640,634,639;, 3;635,641,636;, 3;641,635,640;, 3;636,642,637;, 3;642,636,641;, 3;637,643,638;, 3;643,637,642;, 3;639,645,640;, 3;645,639,644;, 3;640,646,641;, 3;646,640,645;, 3;641,647,642;, 3;647,641,646;, 3;642,648,643;, 3;648,642,647;, 3;4,624,80;, 3;624,4,117;, 3;127,76,628;, 3;76,127,5;, 3;11,648,132;, 3;648,11,131;, 3;121,136,644;, 3;136,121,10;, 3;80,625,79;, 3;625,80,624;, 3;128,628,633;, 3;628,128,127;, 3;132,647,133;, 3;647,132,648;, 3;120,644,639;, 3;644,120,121;, 3;79,626,78;, 3;626,79,625;, 3;129,633,638;, 3;633,129,128;, 3;133,646,134;, 3;646,133,647;, 3;119,639,634;, 3;639,119,120;, 3;78,627,77;, 3;627,78,626;, 3;130,638,643;, 3;638,130,129;, 3;134,645,135;, 3;645,134,646;, 3;118,634,629;, 3;634,118,119;, 3;77,628,76;, 3;628,77,627;, 3;131,643,648;, 3;643,131,130;, 3;135,644,136;, 3;644,135,645;, 3;117,629,624;, 3;629,117,118;, 3;649,655,650;, 3;655,649,654;, 3;650,656,651;, 3;656,650,655;, 3;651,657,652;, 3;657,651,656;, 3;652,658,653;, 3;658,652,657;, 3;654,660,655;, 3;660,654,659;, 3;655,661,656;, 3;661,655,660;, 3;656,662,657;, 3;662,656,661;, 3;657,663,658;, 3;663,657,662;, 3;659,665,660;, 3;665,659,664;, 3;660,666,661;, 3;666,660,665;, 3;661,667,662;, 3;667,661,666;, 3;662,668,663;, 3;668,662,667;, 3;664,670,665;, 3;670,664,669;, 3;665,671,666;, 3;671,665,670;, 3;666,672,667;, 3;672,666,671;, 3;667,673,668;, 3;673,667,672;, 3;5,649,91;, 3;649,5,127;, 3;137,87,653;, 3;87,137,6;, 3;12,673,142;, 3;673,12,141;, 3;131,146,669;, 3;146,131,11;, 3;91,650,90;, 3;650,91,649;, 3;138,653,658;, 3;653,138,137;, 3;142,672,143;, 3;672,142,673;, 3;130,669,664;, 3;669,130,131;, 3;90,651,89;, 3;651,90,650;, 3;139,658,663;, 3;658,139,138;, 3;143,671,144;, 3;671,143,672;, 3;129,664,659;, 3;664,129,130;, 3;89,652,88;, 3;652,89,651;, 3;140,663,668;, 3;663,140,139;, 3;144,670,145;, 3;670,144,671;, 3;128,659,654;, 3;659,128,129;, 3;88,653,87;, 3;653,88,652;, 3;141,668,673;, 3;668,141,140;, 3;145,669,146;, 3;669,145,670;, 3;127,654,649;, 3;654,127,128;, 3;674,680,675;, 3;680,674,679;, 3;675,681,676;, 3;681,675,680;, 3;676,682,677;, 3;682,676,681;, 3;677,683,678;, 3;683,677,682;, 3;679,685,680;, 3;685,679,684;, 3;680,686,681;, 3;686,680,685;, 3;681,687,682;, 3;687,681,686;, 3;682,688,683;, 3;688,682,687;, 3;684,690,685;, 3;690,684,689;, 3;685,691,686;, 3;691,685,690;, 3;686,692,687;, 3;692,686,691;, 3;687,693,688;, 3;693,687,692;, 3;689,695,690;, 3;695,689,694;, 3;690,696,691;, 3;696,690,695;, 3;691,697,692;, 3;697,691,696;, 3;692,698,693;, 3;698,692,697;, 3;6,674,97;, 3;674,6,137;, 3;147,93,678;, 3;93,147,7;, 3;13,698,152;, 3;698,13,151;, 3;141,156,694;, 3;156,141,12;, 3;97,675,96;, 3;675,97,674;, 3;148,678,683;, 3;678,148,147;, 3;152,697,153;, 3;697,152,698;, 3;140,694,689;, 3;694,140,141;, 3;96,676,95;, 3;676,96,675;, 3;149,683,688;, 3;683,149,148;, 3;153,696,154;, 3;696,153,697;, 3;139,689,684;, 3;689,139,140;, 3;95,677,94;, 3;677,95,676;, 3;150,688,693;, 3;688,150,149;, 3;154,695,155;, 3;695,154,696;, 3;138,684,679;, 3;684,138,139;, 3;94,678,93;, 3;678,94,677;, 3;151,693,698;, 3;693,151,150;, 3;155,694,156;, 3;694,155,695;, 3;137,679,674;, 3;679,137,138;, 3;701,699,700;, 3;700,703,701;, 3;703,700,702;, 3;704,701,703;, 3;702,706,703;, 3;706,702,705;, 3;703,707,704;, 3;707,703,706;, 3;708,704,707;, 3;705,710,706;, 3;710,705,709;, 3;706,711,707;, 3;711,706,710;, 3;707,712,708;, 3;712,707,711;, 3;699,7,147;, 3;151,161,709;, 3;161,151,13;, 3;157,712,158;, 3;150,709,705;, 3;709,150,151;, 3;158,711,159;, 3;711,158,712;, 3;149,705,702;, 3;705,149,150;, 3;159,710,160;, 3;710,159,711;, 3;148,702,700;, 3;702,148,149;, 3;160,709,161;, 3;709,160,710;, 3;147,700,699;, 3;700,147,148;, 3;713,719,714;, 3;719,713,718;, 3;714,720,715;, 3;720,714,719;, 3;715,721,716;, 3;721,715,720;, 3;716,722,717;, 3;722,716,721;, 3;718,724,719;, 3;724,718,723;, 3;719,725,720;, 3;725,719,724;, 3;720,726,721;, 3;726,720,725;, 3;721,727,722;, 3;727,721,726;, 3;723,729,724;, 3;729,723,728;, 3;724,730,725;, 3;730,724,729;, 3;725,731,726;, 3;731,725,730;, 3;726,732,727;, 3;732,726,731;, 3;728,734,729;, 3;734,728,733;, 3;729,735,730;, 3;735,729,734;, 3;730,736,731;, 3;736,730,735;, 3;731,737,732;, 3;737,731,736;, 3;162,103,717;, 3;103,162,8;, 3;15,737,167;, 3;737,15,166;, 3;172,171,733;, 3;171,172,14;, 3;163,717,722;, 3;717,163,162;, 3;167,736,168;, 3;736,167,737;, 3;173,733,728;, 3;733,173,172;, 3;106,715,105;, 3;715,106,714;, 3;164,722,727;, 3;722,164,163;, 3;168,735,169;, 3;735,168,736;, 3;174,728,723;, 3;728,174,173;, 3;105,716,104;, 3;716,105,715;, 3;165,727,732;, 3;727,165,164;, 3;169,734,170;, 3;734,169,735;, 3;104,717,103;, 3;717,104,716;, 3;166,732,737;, 3;732,166,165;, 3;170,733,171;, 3;733,170,734;, 3;738,744,739;, 3;744,738,743;, 3;739,745,740;, 3;745,739,744;, 3;740,746,741;, 3;746,740,745;, 3;741,747,742;, 3;747,741,746;, 3;743,749,744;, 3;749,743,748;, 3;744,750,745;, 3;750,744,749;, 3;745,751,746;, 3;751,745,750;, 3;746,752,747;, 3;752,746,751;, 3;748,754,749;, 3;754,748,753;, 3;749,755,750;, 3;755,749,754;, 3;750,756,751;, 3;756,750,755;, 3;751,757,752;, 3;757,751,756;, 3;753,759,754;, 3;759,753,758;, 3;754,760,755;, 3;760,754,759;, 3;755,761,756;, 3;761,755,760;, 3;756,762,757;, 3;762,756,761;, 3;8,738,116;, 3;738,8,162;, 3;175,112,742;, 3;112,175,9;, 3;16,762,180;, 3;762,16,179;, 3;166,184,758;, 3;184,166,15;, 3;116,739,115;, 3;739,116,738;, 3;176,742,747;, 3;742,176,175;, 3;180,761,181;, 3;761,180,762;, 3;165,758,753;, 3;758,165,166;, 3;115,740,114;, 3;740,115,739;, 3;177,747,752;, 3;747,177,176;, 3;181,760,182;, 3;760,181,761;, 3;164,753,748;, 3;753,164,165;, 3;114,741,113;, 3;741,114,740;, 3;178,752,757;, 3;752,178,177;, 3;182,759,183;, 3;759,182,760;, 3;163,748,743;, 3;748,163,164;, 3;113,742,112;, 3;742,113,741;, 3;179,757,762;, 3;757,179,178;, 3;183,758,184;, 3;758,183,759;, 3;162,743,738;, 3;743,162,163;, 3;763,769,764;, 3;769,763,768;, 3;764,770,765;, 3;770,764,769;, 3;765,771,766;, 3;771,765,770;, 3;766,772,767;, 3;772,766,771;, 3;768,774,769;, 3;774,768,773;, 3;769,775,770;, 3;775,769,774;, 3;770,776,771;, 3;776,770,775;, 3;771,777,772;, 3;777,771,776;, 3;773,779,774;, 3;779,773,778;, 3;774,780,775;, 3;780,774,779;, 3;775,781,776;, 3;781,775,780;, 3;776,782,777;, 3;782,776,781;, 3;778,784,779;, 3;784,778,783;, 3;779,785,780;, 3;785,779,784;, 3;780,786,781;, 3;786,780,785;, 3;781,787,782;, 3;787,781,786;, 3;9,763,126;, 3;763,9,175;, 3;185,122,767;, 3;122,185,10;, 3;17,787,190;, 3;787,17,189;, 3;179,194,783;, 3;194,179,16;, 3;126,764,125;, 3;764,126,763;, 3;186,767,772;, 3;767,186,185;, 3;190,786,191;, 3;786,190,787;, 3;178,783,778;, 3;783,178,179;, 3;125,765,124;, 3;765,125,764;, 3;187,772,777;, 3;772,187,186;, 3;191,785,192;, 3;785,191,786;, 3;177,778,773;, 3;778,177,178;, 3;124,766,123;, 3;766,124,765;, 3;188,777,782;, 3;777,188,187;, 3;192,784,193;, 3;784,192,785;, 3;176,773,768;, 3;773,176,177;, 3;123,767,122;, 3;767,123,766;, 3;189,782,787;, 3;782,189,188;, 3;193,783,194;, 3;783,193,784;, 3;175,768,763;, 3;768,175,176;, 3;788,794,789;, 3;794,788,793;, 3;789,795,790;, 3;795,789,794;, 3;790,796,791;, 3;796,790,795;, 3;791,797,792;, 3;797,791,796;, 3;793,799,794;, 3;799,793,798;, 3;794,800,795;, 3;800,794,799;, 3;795,801,796;, 3;801,795,800;, 3;796,802,797;, 3;802,796,801;, 3;798,804,799;, 3;804,798,803;, 3;799,805,800;, 3;805,799,804;, 3;800,806,801;, 3;806,800,805;, 3;801,807,802;, 3;807,801,806;, 3;803,809,804;, 3;809,803,808;, 3;804,810,805;, 3;810,804,809;, 3;805,811,806;, 3;811,805,810;, 3;806,812,807;, 3;812,806,811;, 3;10,788,136;, 3;788,10,185;, 3;195,132,792;, 3;132,195,11;, 3;18,812,200;, 3;812,18,199;, 3;189,204,808;, 3;204,189,17;, 3;136,789,135;, 3;789,136,788;, 3;196,792,797;, 3;792,196,195;, 3;200,811,201;, 3;811,200,812;, 3;188,808,803;, 3;808,188,189;, 3;135,790,134;, 3;790,135,789;, 3;197,797,802;, 3;797,197,196;, 3;201,810,202;, 3;810,201,811;, 3;187,803,798;, 3;803,187,188;, 3;134,791,133;, 3;791,134,790;, 3;198,802,807;, 3;802,198,197;, 3;202,809,203;, 3;809,202,810;, 3;186,798,793;, 3;798,186,187;, 3;133,792,132;, 3;792,133,791;, 3;199,807,812;, 3;807,199,198;, 3;203,808,204;, 3;808,203,809;, 3;185,793,788;, 3;793,185,186;, 3;813,819,814;, 3;819,813,818;, 3;814,820,815;, 3;820,814,819;, 3;815,821,816;, 3;821,815,820;, 3;816,822,817;, 3;822,816,821;, 3;818,824,819;, 3;824,818,823;, 3;819,825,820;, 3;825,819,824;, 3;820,826,821;, 3;826,820,825;, 3;821,827,822;, 3;827,821,826;, 3;823,829,824;, 3;829,823,828;, 3;824,830,825;, 3;830,824,829;, 3;825,831,826;, 3;831,825,830;, 3;826,832,827;, 3;832,826,831;, 3;828,834,829;, 3;834,828,833;, 3;829,835,830;, 3;835,829,834;, 3;830,836,831;, 3;836,830,835;, 3;831,837,832;, 3;837,831,836;, 3;11,813,146;, 3;813,11,195;, 3;205,142,817;, 3;142,205,12;, 3;19,837,210;, 3;837,19,209;, 3;199,214,833;, 3;214,199,18;, 3;146,814,145;, 3;814,146,813;, 3;206,817,822;, 3;817,206,205;, 3;210,836,211;, 3;836,210,837;, 3;198,833,828;, 3;833,198,199;, 3;145,815,144;, 3;815,145,814;, 3;207,822,827;, 3;822,207,206;, 3;211,835,212;, 3;835,211,836;, 3;197,828,823;, 3;828,197,198;, 3;144,816,143;, 3;816,144,815;, 3;208,827,832;, 3;827,208,207;, 3;212,834,213;, 3;834,212,835;, 3;196,823,818;, 3;823,196,197;, 3;143,817,142;, 3;817,143,816;, 3;209,832,837;, 3;832,209,208;, 3;213,833,214;, 3;833,213,834;, 3;195,818,813;, 3;818,195,196;, 3;838,844,839;, 3;844,838,843;, 3;839,845,840;, 3;845,839,844;, 3;840,846,841;, 3;846,840,845;, 3;841,847,842;, 3;847,841,846;, 3;843,849,844;, 3;849,843,848;, 3;844,850,845;, 3;850,844,849;, 3;845,851,846;, 3;851,845,850;, 3;846,852,847;, 3;852,846,851;, 3;848,854,849;, 3;854,848,853;, 3;849,855,850;, 3;855,849,854;, 3;850,856,851;, 3;856,850,855;, 3;851,857,852;, 3;857,851,856;, 3;853,859,854;, 3;859,853,858;, 3;854,860,855;, 3;860,854,859;, 3;855,861,856;, 3;861,855,860;, 3;856,862,857;, 3;862,856,861;, 3;12,838,156;, 3;838,12,205;, 3;215,152,842;, 3;152,215,13;, 3;20,862,220;, 3;862,20,219;, 3;209,224,858;, 3;224,209,19;, 3;156,839,155;, 3;839,156,838;, 3;216,842,847;, 3;842,216,215;, 3;220,861,221;, 3;861,220,862;, 3;208,858,853;, 3;858,208,209;, 3;155,840,154;, 3;840,155,839;, 3;217,847,852;, 3;847,217,216;, 3;221,860,222;, 3;860,221,861;, 3;207,853,848;, 3;853,207,208;, 3;154,841,153;, 3;841,154,840;, 3;218,852,857;, 3;852,218,217;, 3;222,859,223;, 3;859,222,860;, 3;206,848,843;, 3;848,206,207;, 3;153,842,152;, 3;842,153,841;, 3;219,857,862;, 3;857,219,218;, 3;223,858,224;, 3;858,223,859;, 3;205,843,838;, 3;843,205,206;, 3;863,869,864;, 3;869,863,868;, 3;864,870,865;, 3;870,864,869;, 3;865,871,866;, 3;871,865,870;, 3;866,872,867;, 3;872,866,871;, 3;868,874,869;, 3;874,868,873;, 3;869,875,870;, 3;875,869,874;, 3;870,876,871;, 3;876,870,875;, 3;871,877,872;, 3;877,871,876;, 3;873,879,874;, 3;879,873,878;, 3;874,880,875;, 3;880,874,879;, 3;875,881,876;, 3;881,875,880;, 3;876,882,877;, 3;882,876,881;, 3;878,884,879;, 3;884,878,883;, 3;879,885,880;, 3;885,879,884;, 3;880,886,881;, 3;886,880,885;, 3;881,887,882;, 3;887,881,886;, 3;13,863,161;, 3;863,13,215;, 3;21,887,227;, 3;887,21,226;, 3;219,231,883;, 3;231,219,20;, 3;161,864,160;, 3;864,161,863;, 3;227,886,228;, 3;886,227,887;, 3;218,883,878;, 3;883,218,219;, 3;160,865,159;, 3;865,160,864;, 3;228,885,229;, 3;885,228,886;, 3;217,878,873;, 3;878,217,218;, 3;159,866,158;, 3;866,159,865;, 3;225,877,882;, 3;229,884,230;, 3;884,229,885;, 3;216,873,868;, 3;873,216,217;, 3;158,867,157;, 3;867,158,866;, 3;226,882,887;, 3;882,226,225;, 3;230,883,231;, 3;883,230,884;, 3;215,868,863;, 3;868,215,216;, 3;888,894,889;, 3;894,888,893;, 3;889,895,890;, 3;895,889,894;, 3;890,896,891;, 3;896,890,895;, 3;891,897,892;, 3;897,891,896;, 3;893,899,894;, 3;899,893,898;, 3;894,900,895;, 3;900,894,899;, 3;895,901,896;, 3;901,895,900;, 3;896,902,897;, 3;902,896,901;, 3;898,904,899;, 3;904,898,903;, 3;899,905,900;, 3;905,899,904;, 3;900,906,901;, 3;906,900,905;, 3;901,907,902;, 3;907,901,906;, 3;903,909,904;, 3;909,903,908;, 3;904,910,905;, 3;910,904,909;, 3;905,911,906;, 3;911,905,910;, 3;906,912,907;, 3;912,906,911;, 3;14,888,171;, 3;888,14,246;, 3;232,167,892;, 3;167,232,15;, 3;23,912,237;, 3;912,23,236;, 3;242,241,908;, 3;241,242,22;, 3;171,889,170;, 3;889,171,888;, 3;233,892,897;, 3;892,233,232;, 3;237,911,238;, 3;911,237,912;, 3;243,908,903;, 3;908,243,242;, 3;170,890,169;, 3;890,170,889;, 3;234,897,902;, 3;897,234,233;, 3;238,910,239;, 3;910,238,911;, 3;244,903,898;, 3;903,244,243;, 3;169,891,168;, 3;891,169,890;, 3;235,902,907;, 3;902,235,234;, 3;239,909,240;, 3;909,239,910;, 3;245,898,893;, 3;898,245,244;, 3;168,892,167;, 3;892,168,891;, 3;236,907,912;, 3;907,236,235;, 3;240,908,241;, 3;908,240,909;, 3;246,893,888;, 3;893,246,245;, 3;913,919,914;, 3;919,913,918;, 3;914,920,915;, 3;920,914,919;, 3;915,921,916;, 3;921,915,920;, 3;916,922,917;, 3;922,916,921;, 3;918,924,919;, 3;924,918,923;, 3;919,925,920;, 3;925,919,924;, 3;920,926,921;, 3;926,920,925;, 3;921,927,922;, 3;927,921,926;, 3;923,929,924;, 3;929,923,928;, 3;924,930,925;, 3;930,924,929;, 3;925,931,926;, 3;931,925,930;, 3;926,932,927;, 3;932,926,931;, 3;928,934,929;, 3;934,928,933;, 3;929,935,930;, 3;935,929,934;, 3;930,936,931;, 3;936,930,935;, 3;931,937,932;, 3;937,931,936;, 3;15,913,184;, 3;913,15,232;, 3;247,180,917;, 3;180,247,16;, 3;24,937,252;, 3;937,24,251;, 3;236,256,933;, 3;256,236,23;, 3;184,914,183;, 3;914,184,913;, 3;248,917,922;, 3;917,248,247;, 3;252,936,253;, 3;936,252,937;, 3;235,933,928;, 3;933,235,236;, 3;183,915,182;, 3;915,183,914;, 3;249,922,927;, 3;922,249,248;, 3;253,935,254;, 3;935,253,936;, 3;234,928,923;, 3;928,234,235;, 3;182,916,181;, 3;916,182,915;, 3;250,927,932;, 3;927,250,249;, 3;254,934,255;, 3;934,254,935;, 3;233,923,918;, 3;923,233,234;, 3;181,917,180;, 3;917,181,916;, 3;251,932,937;, 3;932,251,250;, 3;255,933,256;, 3;933,255,934;, 3;232,918,913;, 3;918,232,233;, 3;938,944,939;, 3;944,938,943;, 3;939,945,940;, 3;945,939,944;, 3;940,946,941;, 3;946,940,945;, 3;941,947,942;, 3;947,941,946;, 3;943,949,944;, 3;949,943,948;, 3;944,950,945;, 3;950,944,949;, 3;945,951,946;, 3;951,945,950;, 3;946,952,947;, 3;952,946,951;, 3;948,954,949;, 3;954,948,953;, 3;949,955,950;, 3;955,949,954;, 3;950,956,951;, 3;956,950,955;, 3;951,957,952;, 3;957,951,956;, 3;953,959,954;, 3;959,953,958;, 3;954,960,955;, 3;960,954,959;, 3;955,961,956;, 3;961,955,960;, 3;956,962,957;, 3;962,956,961;, 3;16,938,194;, 3;938,16,247;, 3;257,190,942;, 3;190,257,17;, 3;25,962,262;, 3;962,25,261;, 3;251,266,958;, 3;266,251,24;, 3;194,939,193;, 3;939,194,938;, 3;258,942,947;, 3;942,258,257;, 3;262,961,263;, 3;961,262,962;, 3;250,958,953;, 3;958,250,251;, 3;193,940,192;, 3;940,193,939;, 3;259,947,952;, 3;947,259,258;, 3;263,960,264;, 3;960,263,961;, 3;249,953,948;, 3;953,249,250;, 3;192,941,191;, 3;941,192,940;, 3;260,952,957;, 3;952,260,259;, 3;264,959,265;, 3;959,264,960;, 3;248,948,943;, 3;948,248,249;, 3;191,942,190;, 3;942,191,941;, 3;261,957,962;, 3;957,261,260;, 3;265,958,266;, 3;958,265,959;, 3;247,943,938;, 3;943,247,248;, 3;963,969,964;, 3;969,963,968;, 3;964,970,965;, 3;970,964,969;, 3;965,971,966;, 3;971,965,970;, 3;966,972,967;, 3;972,966,971;, 3;968,974,969;, 3;974,968,973;, 3;969,975,970;, 3;975,969,974;, 3;970,976,971;, 3;976,970,975;, 3;971,977,972;, 3;977,971,976;, 3;973,979,974;, 3;979,973,978;, 3;974,980,975;, 3;980,974,979;, 3;975,981,976;, 3;981,975,980;, 3;976,982,977;, 3;982,976,981;, 3;978,984,979;, 3;984,978,983;, 3;979,985,980;, 3;985,979,984;, 3;980,986,981;, 3;986,980,985;, 3;981,987,982;, 3;987,981,986;, 3;17,963,204;, 3;963,17,257;, 3;267,200,967;, 3;200,267,18;, 3;26,987,272;, 3;987,26,271;, 3;261,276,983;, 3;276,261,25;, 3;204,964,203;, 3;964,204,963;, 3;268,967,972;, 3;967,268,267;, 3;272,986,273;, 3;986,272,987;, 3;260,983,978;, 3;983,260,261;, 3;203,965,202;, 3;965,203,964;, 3;269,972,977;, 3;972,269,268;, 3;273,985,274;, 3;985,273,986;, 3;259,978,973;, 3;978,259,260;, 3;202,966,201;, 3;966,202,965;, 3;270,977,982;, 3;977,270,269;, 3;274,984,275;, 3;984,274,985;, 3;258,973,968;, 3;973,258,259;, 3;201,967,200;, 3;967,201,966;, 3;271,982,987;, 3;982,271,270;, 3;275,983,276;, 3;983,275,984;, 3;257,968,963;, 3;968,257,258;, 3;988,994,989;, 3;994,988,993;, 3;989,995,990;, 3;995,989,994;, 3;990,996,991;, 3;996,990,995;, 3;991,997,992;, 3;997,991,996;, 3;993,999,994;, 3;999,993,998;, 3;994,1000,995;, 3;1000,994,999;, 3;995,1001,996;, 3;1001,995,1000;, 3;996,1002,997;, 3;1002,996,1001;, 3;998,1004,999;, 3;1004,998,1003;, 3;999,1005,1000;, 3;1005,999,1004;, 3;1000,1006,1001;, 3;1006,1000,1005;, 3;1001,1007,1002;, 3;1007,1001,1006;, 3;1003,1009,1004;, 3;1009,1003,1008;, 3;1004,1010,1005;, 3;1010,1004,1009;, 3;1005,1011,1006;, 3;1011,1005,1010;, 3;1006,1012,1007;, 3;1012,1006,1011;, 3;18,988,214;, 3;988,18,267;, 3;277,210,992;, 3;210,277,19;, 3;27,1012,282;, 3;1012,27,281;, 3;271,286,1008;, 3;286,271,26;, 3;214,989,213;, 3;989,214,988;, 3;278,992,997;, 3;992,278,277;, 3;282,1011,283;, 3;1011,282,1012;, 3;270,1008,1003;, 3;1008,270,271;, 3;213,990,212;, 3;990,213,989;, 3;279,997,1002;, 3;997,279,278;, 3;283,1010,284;, 3;1010,283,1011;, 3;269,1003,998;, 3;1003,269,270;, 3;212,991,211;, 3;991,212,990;, 3;280,1002,1007;, 3;1002,280,279;, 3;284,1009,285;, 3;1009,284,1010;, 3;268,998,993;, 3;998,268,269;, 3;211,992,210;, 3;992,211,991;, 3;281,1007,1012;, 3;1007,281,280;, 3;285,1008,286;, 3;1008,285,1009;, 3;267,993,988;, 3;993,267,268;, 3;1013,1019,1014;, 3;1019,1013,1018;, 3;1014,1020,1015;, 3;1020,1014,1019;, 3;1015,1021,1016;, 3;1021,1015,1020;, 3;1016,1022,1017;, 3;1022,1016,1021;, 3;1018,1024,1019;, 3;1024,1018,1023;, 3;1019,1025,1020;, 3;1025,1019,1024;, 3;1020,1026,1021;, 3;1026,1020,1025;, 3;1021,1027,1022;, 3;1027,1021,1026;, 3;1023,1029,1024;, 3;1029,1023,1028;, 3;1024,1030,1025;, 3;1030,1024,1029;, 3;1025,1031,1026;, 3;1031,1025,1030;, 3;1026,1032,1027;, 3;1032,1026,1031;, 3;1028,1034,1029;, 3;1034,1028,1033;, 3;1029,1035,1030;, 3;1035,1029,1034;, 3;1030,1036,1031;, 3;1036,1030,1035;, 3;1031,1037,1032;, 3;1037,1031,1036;, 3;19,1013,224;, 3;1013,19,277;, 3;287,220,1017;, 3;220,287,20;, 3;28,1037,292;, 3;1037,28,291;, 3;281,296,1033;, 3;296,281,27;, 3;224,1014,223;, 3;1014,224,1013;, 3;288,1017,1022;, 3;1017,288,287;, 3;292,1036,293;, 3;1036,292,1037;, 3;280,1033,1028;, 3;1033,280,281;, 3;223,1015,222;, 3;1015,223,1014;, 3;289,1022,1027;, 3;1022,289,288;, 3;293,1035,294;, 3;1035,293,1036;, 3;279,1028,1023;, 3;1028,279,280;, 3;222,1016,221;, 3;1016,222,1015;, 3;290,1027,1032;, 3;1027,290,289;, 3;294,1034,295;, 3;1034,294,1035;, 3;278,1023,1018;, 3;1023,278,279;, 3;221,1017,220;, 3;1017,221,1016;, 3;291,1032,1037;, 3;1032,291,290;, 3;295,1033,296;, 3;1033,295,1034;, 3;277,1018,1013;, 3;1018,277,278;, 3;1038,1044,1039;, 3;1044,1038,1043;, 3;1039,1045,1040;, 3;1045,1039,1044;, 3;1040,1046,1041;, 3;1046,1040,1045;, 3;1041,1047,1042;, 3;1047,1041,1046;, 3;1043,1049,1044;, 3;1049,1043,1048;, 3;1044,1050,1045;, 3;1050,1044,1049;, 3;1045,1051,1046;, 3;1051,1045,1050;, 3;1046,1052,1047;, 3;1052,1046,1051;, 3;1048,1054,1049;, 3;1054,1048,1053;, 3;1049,1055,1050;, 3;1055,1049,1054;, 3;1050,1056,1051;, 3;1056,1050,1055;, 3;1051,1057,1052;, 3;1057,1051,1056;, 3;1053,1059,1054;, 3;1059,1053,1058;, 3;1054,1060,1055;, 3;1060,1054,1059;, 3;1055,1061,1056;, 3;1061,1055,1060;, 3;1056,1062,1057;, 3;1062,1056,1061;, 3;20,1038,231;, 3;1038,20,287;, 3;297,227,1042;, 3;227,297,21;, 3;29,1062,302;, 3;1062,29,301;, 3;291,306,1058;, 3;306,291,28;, 3;231,1039,230;, 3;1039,231,1038;, 3;298,1042,1047;, 3;1042,298,297;, 3;302,1061,303;, 3;1061,302,1062;, 3;290,1058,1053;, 3;1058,290,291;, 3;230,1040,229;, 3;1040,230,1039;, 3;299,1047,1052;, 3;1047,299,298;, 3;303,1060,304;, 3;1060,303,1061;, 3;289,1053,1048;, 3;1053,289,290;, 3;229,1041,228;, 3;1041,229,1040;, 3;300,1052,1057;, 3;1052,300,299;, 3;304,1059,305;, 3;1059,304,1060;, 3;288,1048,1043;, 3;1048,288,289;, 3;228,1042,227;, 3;1042,228,1041;, 3;301,1057,1062;, 3;1057,301,300;, 3;305,1058,306;, 3;1058,305,1059;, 3;287,1043,1038;, 3;1043,287,288;, 3;1063,1069,1064;, 3;1069,1063,1068;, 3;1064,1070,1065;, 3;1070,1064,1069;, 3;1065,1071,1066;, 3;1071,1065,1070;, 3;1066,1072,1067;, 3;1072,1066,1071;, 3;1068,1074,1069;, 3;1074,1068,1073;, 3;1069,1075,1070;, 3;1075,1069,1074;, 3;1070,1076,1071;, 3;1076,1070,1075;, 3;1071,1077,1072;, 3;1077,1071,1076;, 3;1073,1079,1074;, 3;1079,1073,1078;, 3;1074,1080,1075;, 3;1080,1074,1079;, 3;1075,1081,1076;, 3;1081,1075,1080;, 3;1076,1082,1077;, 3;1082,1076,1081;, 3;1078,1084,1079;, 3;1084,1078,1083;, 3;1079,1085,1080;, 3;1085,1079,1084;, 3;1080,1086,1081;, 3;1086,1080,1085;, 3;1081,1087,1082;, 3;1087,1081,1086;, 3;22,1063,241;, 3;1063,22,319;, 3;307,237,1067;, 3;237,307,23;, 3;30,1087,312;, 3;1087,30,311;, 3;241,1064,240;, 3;1064,241,1063;, 3;308,1067,1072;, 3;1067,308,307;, 3;312,1086,313;, 3;1086,312,1087;, 3;240,1065,239;, 3;1065,240,1064;, 3;309,1072,1077;, 3;1072,309,308;, 3;313,1085,314;, 3;1085,313,1086;, 3;317,1078,1073;, 3;239,1066,238;, 3;1066,239,1065;, 3;310,1077,1082;, 3;1077,310,309;, 3;314,1084,315;, 3;1084,314,1085;, 3;318,1073,1068;, 3;1073,318,317;, 3;238,1067,237;, 3;1067,238,1066;, 3;311,1082,1087;, 3;1082,311,310;, 3;315,1083,316;, 3;1083,315,1084;, 3;319,1068,1063;, 3;1068,319,318;, 3;1088,1094,1089;, 3;1094,1088,1093;, 3;1089,1095,1090;, 3;1095,1089,1094;, 3;1090,1096,1091;, 3;1096,1090,1095;, 3;1091,1097,1092;, 3;1097,1091,1096;, 3;1093,1099,1094;, 3;1099,1093,1098;, 3;1094,1100,1095;, 3;1100,1094,1099;, 3;1095,1101,1096;, 3;1101,1095,1100;, 3;1096,1102,1097;, 3;1102,1096,1101;, 3;1098,1104,1099;, 3;1104,1098,1103;, 3;1099,1105,1100;, 3;1105,1099,1104;, 3;1100,1106,1101;, 3;1106,1100,1105;, 3;1101,1107,1102;, 3;1107,1101,1106;, 3;1103,1109,1104;, 3;1109,1103,1108;, 3;1104,1110,1105;, 3;1110,1104,1109;, 3;1105,1111,1106;, 3;1111,1105,1110;, 3;1106,1112,1107;, 3;1112,1106,1111;, 3;23,1088,256;, 3;1088,23,307;, 3;320,252,1092;, 3;252,320,24;, 3;31,1112,325;, 3;1112,31,324;, 3;311,329,1108;, 3;329,311,30;, 3;256,1089,255;, 3;1089,256,1088;, 3;321,1092,1097;, 3;1092,321,320;, 3;325,1111,326;, 3;1111,325,1112;, 3;310,1108,1103;, 3;1108,310,311;, 3;255,1090,254;, 3;1090,255,1089;, 3;322,1097,1102;, 3;1097,322,321;, 3;326,1110,327;, 3;1110,326,1111;, 3;309,1103,1098;, 3;1103,309,310;, 3;254,1091,253;, 3;1091,254,1090;, 3;323,1102,1107;, 3;1102,323,322;, 3;327,1109,328;, 3;1109,327,1110;, 3;308,1098,1093;, 3;1098,308,309;, 3;253,1092,252;, 3;1092,253,1091;, 3;324,1107,1112;, 3;1107,324,323;, 3;328,1108,329;, 3;1108,328,1109;, 3;307,1093,1088;, 3;1093,307,308;, 3;1113,1119,1114;, 3;1119,1113,1118;, 3;1114,1120,1115;, 3;1120,1114,1119;, 3;1115,1121,1116;, 3;1121,1115,1120;, 3;1116,1122,1117;, 3;1122,1116,1121;, 3;1118,1124,1119;, 3;1124,1118,1123;, 3;1119,1125,1120;, 3;1125,1119,1124;, 3;1120,1126,1121;, 3;1126,1120,1125;, 3;1121,1127,1122;, 3;1127,1121,1126;, 3;1123,1129,1124;, 3;1129,1123,1128;, 3;1124,1130,1125;, 3;1130,1124,1129;, 3;1125,1131,1126;, 3;1131,1125,1130;, 3;1126,1132,1127;, 3;1132,1126,1131;, 3;1128,1134,1129;, 3;1134,1128,1133;, 3;1129,1135,1130;, 3;1135,1129,1134;, 3;1130,1136,1131;, 3;1136,1130,1135;, 3;1131,1137,1132;, 3;1137,1131,1136;, 3;24,1113,266;, 3;1113,24,320;, 3;330,262,1117;, 3;262,330,25;, 3;32,1137,335;, 3;1137,32,334;, 3;324,339,1133;, 3;339,324,31;, 3;266,1114,265;, 3;1114,266,1113;, 3;331,1117,1122;, 3;1117,331,330;, 3;335,1136,336;, 3;1136,335,1137;, 3;323,1133,1128;, 3;1133,323,324;, 3;265,1115,264;, 3;1115,265,1114;, 3;332,1122,1127;, 3;1122,332,331;, 3;336,1135,337;, 3;1135,336,1136;, 3;322,1128,1123;, 3;1128,322,323;, 3;264,1116,263;, 3;1116,264,1115;, 3;333,1127,1132;, 3;1127,333,332;, 3;337,1134,338;, 3;1134,337,1135;, 3;321,1123,1118;, 3;1123,321,322;, 3;263,1117,262;, 3;1117,263,1116;, 3;334,1132,1137;, 3;1132,334,333;, 3;338,1133,339;, 3;1133,338,1134;, 3;320,1118,1113;, 3;1118,320,321;, 3;1138,1144,1139;, 3;1144,1138,1143;, 3;1139,1145,1140;, 3;1145,1139,1144;, 3;1140,1146,1141;, 3;1146,1140,1145;, 3;1141,1147,1142;, 3;1147,1141,1146;, 3;1143,1149,1144;, 3;1149,1143,1148;, 3;1144,1150,1145;, 3;1150,1144,1149;, 3;1145,1151,1146;, 3;1151,1145,1150;, 3;1146,1152,1147;, 3;1152,1146,1151;, 3;1148,1154,1149;, 3;1154,1148,1153;, 3;1149,1155,1150;, 3;1155,1149,1154;, 3;1150,1156,1151;, 3;1156,1150,1155;, 3;1151,1157,1152;, 3;1157,1151,1156;, 3;1153,1159,1154;, 3;1159,1153,1158;, 3;1154,1160,1155;, 3;1160,1154,1159;, 3;1155,1161,1156;, 3;1161,1155,1160;, 3;1156,1162,1157;, 3;1162,1156,1161;, 3;25,1138,276;, 3;1138,25,330;, 3;340,272,1142;, 3;272,340,26;, 3;33,1162,345;, 3;1162,33,344;, 3;334,349,1158;, 3;349,334,32;, 3;276,1139,275;, 3;1139,276,1138;, 3;341,1142,1147;, 3;1142,341,340;, 3;345,1161,346;, 3;1161,345,1162;, 3;333,1158,1153;, 3;1158,333,334;, 3;275,1140,274;, 3;1140,275,1139;, 3;342,1147,1152;, 3;1147,342,341;, 3;346,1160,347;, 3;1160,346,1161;, 3;332,1153,1148;, 3;1153,332,333;, 3;274,1141,273;, 3;1141,274,1140;, 3;343,1152,1157;, 3;1152,343,342;, 3;347,1159,348;, 3;1159,347,1160;, 3;331,1148,1143;, 3;1148,331,332;, 3;273,1142,272;, 3;1142,273,1141;, 3;344,1157,1162;, 3;1157,344,343;, 3;348,1158,349;, 3;1158,348,1159;, 3;330,1143,1138;, 3;1143,330,331;, 3;1163,1169,1164;, 3;1169,1163,1168;, 3;1164,1170,1165;, 3;1170,1164,1169;, 3;1165,1171,1166;, 3;1171,1165,1170;, 3;1166,1172,1167;, 3;1172,1166,1171;, 3;1168,1174,1169;, 3;1174,1168,1173;, 3;1169,1175,1170;, 3;1175,1169,1174;, 3;1170,1176,1171;, 3;1176,1170,1175;, 3;1171,1177,1172;, 3;1177,1171,1176;, 3;1173,1179,1174;, 3;1179,1173,1178;, 3;1174,1180,1175;, 3;1180,1174,1179;, 3;1175,1181,1176;, 3;1181,1175,1180;, 3;1176,1182,1177;, 3;1182,1176,1181;, 3;1178,1184,1179;, 3;1184,1178,1183;, 3;1179,1185,1180;, 3;1185,1179,1184;, 3;1180,1186,1181;, 3;1186,1180,1185;, 3;1181,1187,1182;, 3;1187,1181,1186;, 3;26,1163,286;, 3;1163,26,340;, 3;350,282,1167;, 3;282,350,27;, 3;34,1187,355;, 3;1187,34,354;, 3;344,359,1183;, 3;359,344,33;, 3;286,1164,285;, 3;1164,286,1163;, 3;351,1167,1172;, 3;1167,351,350;, 3;355,1186,356;, 3;1186,355,1187;, 3;343,1183,1178;, 3;1183,343,344;, 3;285,1165,284;, 3;1165,285,1164;, 3;352,1172,1177;, 3;1172,352,351;, 3;356,1185,357;, 3;1185,356,1186;, 3;342,1178,1173;, 3;1178,342,343;, 3;284,1166,283;, 3;1166,284,1165;, 3;353,1177,1182;, 3;1177,353,352;, 3;357,1184,358;, 3;1184,357,1185;, 3;341,1173,1168;, 3;1173,341,342;, 3;283,1167,282;, 3;1167,283,1166;, 3;354,1182,1187;, 3;1182,354,353;, 3;358,1183,359;, 3;1183,358,1184;, 3;340,1168,1163;, 3;1168,340,341;, 3;1188,1194,1189;, 3;1194,1188,1193;, 3;1189,1195,1190;, 3;1195,1189,1194;, 3;1190,1196,1191;, 3;1196,1190,1195;, 3;1191,1197,1192;, 3;1197,1191,1196;, 3;1193,1199,1194;, 3;1199,1193,1198;, 3;1194,1200,1195;, 3;1200,1194,1199;, 3;1195,1201,1196;, 3;1201,1195,1200;, 3;1196,1202,1197;, 3;1202,1196,1201;, 3;1198,1204,1199;, 3;1204,1198,1203;, 3;1199,1205,1200;, 3;1205,1199,1204;, 3;1200,1206,1201;, 3;1206,1200,1205;, 3;1201,1207,1202;, 3;1207,1201,1206;, 3;1203,1209,1204;, 3;1209,1203,1208;, 3;1204,1210,1205;, 3;1210,1204,1209;, 3;1205,1211,1206;, 3;1211,1205,1210;, 3;1206,1212,1207;, 3;1212,1206,1211;, 3;27,1188,296;, 3;1188,27,350;, 3;360,292,1192;, 3;292,360,28;, 3;35,1212,365;, 3;1212,35,364;, 3;354,369,1208;, 3;369,354,34;, 3;296,1189,295;, 3;1189,296,1188;, 3;361,1192,1197;, 3;1192,361,360;, 3;365,1211,366;, 3;1211,365,1212;, 3;353,1208,1203;, 3;1208,353,354;, 3;295,1190,294;, 3;1190,295,1189;, 3;362,1197,1202;, 3;1197,362,361;, 3;366,1210,367;, 3;1210,366,1211;, 3;352,1203,1198;, 3;1203,352,353;, 3;294,1191,293;, 3;1191,294,1190;, 3;363,1202,1207;, 3;1202,363,362;, 3;367,1209,368;, 3;1209,367,1210;, 3;351,1198,1193;, 3;1198,351,352;, 3;293,1192,292;, 3;1192,293,1191;, 3;364,1207,1212;, 3;1207,364,363;, 3;368,1208,369;, 3;1208,368,1209;, 3;350,1193,1188;, 3;1193,350,351;, 3;1213,1219,1214;, 3;1219,1213,1218;, 3;1214,1220,1215;, 3;1220,1214,1219;, 3;1215,1221,1216;, 3;1221,1215,1220;, 3;1216,1222,1217;, 3;1222,1216,1221;, 3;1218,1224,1219;, 3;1224,1218,1223;, 3;1219,1225,1220;, 3;1225,1219,1224;, 3;1220,1226,1221;, 3;1226,1220,1225;, 3;1221,1227,1222;, 3;1227,1221,1226;, 3;1223,1229,1224;, 3;1229,1223,1228;, 3;1224,1230,1225;, 3;1230,1224,1229;, 3;1225,1231,1226;, 3;1231,1225,1230;, 3;1226,1232,1227;, 3;1232,1226,1231;, 3;1228,1234,1229;, 3;1234,1228,1233;, 3;1229,1235,1230;, 3;1235,1229,1234;, 3;1230,1236,1231;, 3;1236,1230,1235;, 3;28,1213,306;, 3;1213,28,360;, 3;370,302,1217;, 3;302,370,29;, 3;364,375,1233;, 3;375,364,35;, 3;306,1214,305;, 3;1214,306,1213;, 3;371,1217,1222;, 3;1217,371,370;, 3;363,1233,1228;, 3;1233,363,364;, 3;305,1215,304;, 3;1215,305,1214;, 3;372,1235,373;, 3;1235,372,1236;, 3;362,1228,1223;, 3;1228,362,363;, 3;304,1216,303;, 3;1216,304,1215;, 3;373,1234,374;, 3;1234,373,1235;, 3;361,1223,1218;, 3;1223,361,362;, 3;303,1217,302;, 3;1217,303,1216;, 3;374,1233,375;, 3;1233,374,1234;, 3;360,1218,1213;, 3;1218,360,361;, 3;1237,1242,1238;, 3;1242,1237,1241;, 3;1238,1243,1239;, 3;1243,1238,1242;, 3;1239,1244,1240;, 3;1244,1239,1243;, 3;1241,1245,1242;, 3;1242,1246,1243;, 3;1246,1242,1245;, 3;1243,1247,1244;, 3;1247,1243,1246;, 3;1245,1249,1246;, 3;1249,1245,1248;, 3;1246,1250,1247;, 3;1250,1246,1249;, 3;1248,1251,1249;, 3;1249,1252,1250;, 3;1252,1249,1251;, 3;376,312,1240;, 3;312,376,30;, 3;36,1252,381;, 3;1252,36,380;, 3;316,1237,315;, 3;377,1240,1244;, 3;1240,377,376;, 3;1251,381,1252;, 3;315,1238,314;, 3;1238,315,1237;, 3;378,1244,1247;, 3;1244,378,377;, 3;314,1239,313;, 3;1239,314,1238;, 3;379,1247,1250;, 3;1247,379,378;, 3;313,1240,312;, 3;1240,313,1239;, 3;380,1250,1252;, 3;1250,380,379;, 3;1253,1259,1254;, 3;1259,1253,1258;, 3;1254,1260,1255;, 3;1260,1254,1259;, 3;1255,1261,1256;, 3;1261,1255,1260;, 3;1256,1262,1257;, 3;1262,1256,1261;, 3;1258,1264,1259;, 3;1264,1258,1263;, 3;1259,1265,1260;, 3;1265,1259,1264;, 3;1260,1266,1261;, 3;1266,1260,1265;, 3;1261,1267,1262;, 3;1267,1261,1266;, 3;1263,1269,1264;, 3;1269,1263,1268;, 3;1264,1270,1265;, 3;1270,1264,1269;, 3;1265,1271,1266;, 3;1271,1265,1270;, 3;1266,1272,1267;, 3;1272,1266,1271;, 3;1268,1274,1269;, 3;1274,1268,1273;, 3;1269,1275,1270;, 3;1275,1269,1274;, 3;1270,1276,1271;, 3;1276,1270,1275;, 3;1271,1277,1272;, 3;1277,1271,1276;, 3;30,1253,329;, 3;1253,30,376;, 3;382,325,1257;, 3;325,382,31;, 3;37,1277,387;, 3;1277,37,386;, 3;380,391,1273;, 3;391,380,36;, 3;329,1254,328;, 3;1254,329,1253;, 3;383,1257,1262;, 3;1257,383,382;, 3;387,1276,388;, 3;1276,387,1277;, 3;379,1273,1268;, 3;1273,379,380;, 3;328,1255,327;, 3;1255,328,1254;, 3;384,1262,1267;, 3;1262,384,383;, 3;388,1275,389;, 3;1275,388,1276;, 3;378,1268,1263;, 3;1268,378,379;, 3;327,1256,326;, 3;1256,327,1255;, 3;385,1267,1272;, 3;1267,385,384;, 3;389,1274,390;, 3;1274,389,1275;, 3;377,1263,1258;, 3;1263,377,378;, 3;326,1257,325;, 3;1257,326,1256;, 3;386,1272,1277;, 3;1272,386,385;, 3;390,1273,391;, 3;1273,390,1274;, 3;376,1258,1253;, 3;1258,376,377;, 3;1278,1284,1279;, 3;1284,1278,1283;, 3;1279,1285,1280;, 3;1285,1279,1284;, 3;1280,1286,1281;, 3;1286,1280,1285;, 3;1281,1287,1282;, 3;1287,1281,1286;, 3;1283,1289,1284;, 3;1289,1283,1288;, 3;1284,1290,1285;, 3;1290,1284,1289;, 3;1285,1291,1286;, 3;1291,1285,1290;, 3;1286,1292,1287;, 3;1292,1286,1291;, 3;1288,1294,1289;, 3;1294,1288,1293;, 3;1289,1295,1290;, 3;1295,1289,1294;, 3;1290,1296,1291;, 3;1296,1290,1295;, 3;1291,1297,1292;, 3;1297,1291,1296;, 3;1293,1299,1294;, 3;1299,1293,1298;, 3;1294,1300,1295;, 3;1300,1294,1299;, 3;1295,1301,1296;, 3;1301,1295,1300;, 3;1296,1302,1297;, 3;1302,1296,1301;, 3;31,1278,339;, 3;1278,31,382;, 3;392,335,1282;, 3;335,392,32;, 3;38,1302,397;, 3;1302,38,396;, 3;386,401,1298;, 3;401,386,37;, 3;339,1279,338;, 3;1279,339,1278;, 3;393,1282,1287;, 3;1282,393,392;, 3;397,1301,398;, 3;1301,397,1302;, 3;385,1298,1293;, 3;1298,385,386;, 3;338,1280,337;, 3;1280,338,1279;, 3;394,1287,1292;, 3;1287,394,393;, 3;398,1300,399;, 3;1300,398,1301;, 3;384,1293,1288;, 3;1293,384,385;, 3;337,1281,336;, 3;1281,337,1280;, 3;395,1292,1297;, 3;1292,395,394;, 3;399,1299,400;, 3;1299,399,1300;, 3;383,1288,1283;, 3;1288,383,384;, 3;336,1282,335;, 3;1282,336,1281;, 3;396,1297,1302;, 3;1297,396,395;, 3;400,1298,401;, 3;1298,400,1299;, 3;382,1283,1278;, 3;1283,382,383;, 3;1303,1309,1304;, 3;1309,1303,1308;, 3;1304,1310,1305;, 3;1310,1304,1309;, 3;1305,1311,1306;, 3;1311,1305,1310;, 3;1306,1312,1307;, 3;1312,1306,1311;, 3;1308,1314,1309;, 3;1314,1308,1313;, 3;1309,1315,1310;, 3;1315,1309,1314;, 3;1310,1316,1311;, 3;1316,1310,1315;, 3;1311,1317,1312;, 3;1317,1311,1316;, 3;1313,1319,1314;, 3;1319,1313,1318;, 3;1314,1320,1315;, 3;1320,1314,1319;, 3;1315,1321,1316;, 3;1321,1315,1320;, 3;1316,1322,1317;, 3;1322,1316,1321;, 3;1318,1324,1319;, 3;1324,1318,1323;, 3;1319,1325,1320;, 3;1325,1319,1324;, 3;1320,1326,1321;, 3;1326,1320,1325;, 3;1321,1327,1322;, 3;1327,1321,1326;, 3;32,1303,349;, 3;1303,32,392;, 3;402,345,1307;, 3;345,402,33;, 3;39,1327,407;, 3;1327,39,406;, 3;396,411,1323;, 3;411,396,38;, 3;349,1304,348;, 3;1304,349,1303;, 3;403,1307,1312;, 3;1307,403,402;, 3;407,1326,408;, 3;1326,407,1327;, 3;395,1323,1318;, 3;1323,395,396;, 3;348,1305,347;, 3;1305,348,1304;, 3;404,1312,1317;, 3;1312,404,403;, 3;408,1325,409;, 3;1325,408,1326;, 3;394,1318,1313;, 3;1318,394,395;, 3;347,1306,346;, 3;1306,347,1305;, 3;405,1317,1322;, 3;1317,405,404;, 3;409,1324,410;, 3;1324,409,1325;, 3;393,1313,1308;, 3;1313,393,394;, 3;346,1307,345;, 3;1307,346,1306;, 3;406,1322,1327;, 3;1322,406,405;, 3;410,1323,411;, 3;1323,410,1324;, 3;392,1308,1303;, 3;1308,392,393;, 3;1328,1334,1329;, 3;1334,1328,1333;, 3;1329,1335,1330;, 3;1335,1329,1334;, 3;1330,1336,1331;, 3;1336,1330,1335;, 3;1331,1337,1332;, 3;1337,1331,1336;, 3;1333,1339,1334;, 3;1339,1333,1338;, 3;1334,1340,1335;, 3;1340,1334,1339;, 3;1335,1341,1336;, 3;1341,1335,1340;, 3;1336,1342,1337;, 3;1342,1336,1341;, 3;1338,1344,1339;, 3;1344,1338,1343;, 3;1339,1345,1340;, 3;1345,1339,1344;, 3;1340,1346,1341;, 3;1346,1340,1345;, 3;1341,1347,1342;, 3;1347,1341,1346;, 3;1343,1349,1344;, 3;1349,1343,1348;, 3;1344,1350,1345;, 3;1350,1344,1349;, 3;1345,1351,1346;, 3;1351,1345,1350;, 3;1346,1352,1347;, 3;1352,1346,1351;, 3;33,1328,359;, 3;1328,33,402;, 3;412,355,1332;, 3;355,412,34;, 3;40,1352,417;, 3;1352,40,416;, 3;406,421,1348;, 3;421,406,39;, 3;359,1329,358;, 3;1329,359,1328;, 3;413,1332,1337;, 3;1332,413,412;, 3;417,1351,418;, 3;1351,417,1352;, 3;405,1348,1343;, 3;1348,405,406;, 3;358,1330,357;, 3;1330,358,1329;, 3;414,1337,1342;, 3;1337,414,413;, 3;418,1350,419;, 3;1350,418,1351;, 3;404,1343,1338;, 3;1343,404,405;, 3;357,1331,356;, 3;1331,357,1330;, 3;415,1342,1347;, 3;1342,415,414;, 3;419,1349,420;, 3;1349,419,1350;, 3;403,1338,1333;, 3;1338,403,404;, 3;356,1332,355;, 3;1332,356,1331;, 3;416,1347,1352;, 3;1347,416,415;, 3;420,1348,421;, 3;1348,420,1349;, 3;402,1333,1328;, 3;1333,402,403;, 3;1353,1359,1354;, 3;1359,1353,1358;, 3;1354,1360,1355;, 3;1360,1354,1359;, 3;1355,1361,1356;, 3;1361,1355,1360;, 3;1356,1362,1357;, 3;1362,1356,1361;, 3;1358,1364,1359;, 3;1364,1358,1363;, 3;1359,1365,1360;, 3;1365,1359,1364;, 3;1360,1366,1361;, 3;1366,1360,1365;, 3;1361,1367,1362;, 3;1367,1361,1366;, 3;1363,1369,1364;, 3;1369,1363,1368;, 3;1364,1370,1365;, 3;1370,1364,1369;, 3;1365,1371,1366;, 3;1371,1365,1370;, 3;1366,1372,1367;, 3;1372,1366,1371;, 3;1368,1374,1369;, 3;1374,1368,1373;, 3;1369,1375,1370;, 3;1375,1369,1374;, 3;1370,1376,1371;, 3;1376,1370,1375;, 3;1371,1377,1372;, 3;1377,1371,1376;, 3;34,1353,369;, 3;1353,34,412;, 3;422,365,1357;, 3;365,422,35;, 3;41,1377,427;, 3;1377,41,426;, 3;416,431,1373;, 3;431,416,40;, 3;369,1354,368;, 3;1354,369,1353;, 3;423,1357,1362;, 3;1357,423,422;, 3;427,1376,428;, 3;1376,427,1377;, 3;415,1373,1368;, 3;1373,415,416;, 3;368,1355,367;, 3;1355,368,1354;, 3;424,1362,1367;, 3;1362,424,423;, 3;428,1375,429;, 3;1375,428,1376;, 3;414,1368,1363;, 3;1368,414,415;, 3;367,1356,366;, 3;1356,367,1355;, 3;425,1367,1372;, 3;1367,425,424;, 3;429,1374,430;, 3;1374,429,1375;, 3;413,1363,1358;, 3;1363,413,414;, 3;366,1357,365;, 3;1357,366,1356;, 3;426,1372,1377;, 3;1372,426,425;, 3;430,1373,431;, 3;1373,430,1374;, 3;412,1358,1353;, 3;1358,412,413;, 3;1378,1383,1379;, 3;1383,1378,1382;, 3;1379,1384,1380;, 3;1384,1379,1383;, 3;1382,1386,1383;, 3;1386,1382,1385;, 3;1385,1388,1386;, 3;1388,1385,1387;, 3;35,1378,375;, 3;1378,35,422;, 3;375,1379,374;, 3;1379,375,1378;, 3;425,1389,1387;, 3;1389,425,426;, 3;374,1380,373;, 3;1380,374,1379;, 3;424,1387,1385;, 3;1387,424,425;, 3;373,1381,372;, 3;1381,373,1380;, 3;423,1385,1382;, 3;1385,423,424;, 3;422,1382,1378;, 3;1382,422,423;, 3;1390,1396,1391;, 3;1396,1390,1395;, 3;1391,1397,1392;, 3;1397,1391,1396;, 3;1392,1398,1393;, 3;1398,1392,1397;, 3;1393,1399,1394;, 3;1399,1393,1398;, 3;1397,1400,1398;, 3;1398,1401,1399;, 3;1401,1398,1400;, 3;1400,1403,1401;, 3;1403,1400,1402;, 3;36,1390,391;, 3;432,387,1394;, 3;387,432,37;, 3;391,1391,390;, 3;1391,391,1390;, 3;433,1394,1399;, 3;1394,433,432;, 3;390,1392,389;, 3;1392,390,1391;, 3;434,1399,1401;, 3;1399,434,433;, 3;389,1393,388;, 3;1393,389,1392;, 3;435,1401,1403;, 3;1401,435,434;, 3;388,1394,387;, 3;1394,388,1393;, 3;1404,1410,1405;, 3;1410,1404,1409;, 3;1405,1411,1406;, 3;1411,1405,1410;, 3;1406,1412,1407;, 3;1412,1406,1411;, 3;1407,1413,1408;, 3;1413,1407,1412;, 3;1409,1415,1410;, 3;1415,1409,1414;, 3;1410,1416,1411;, 3;1416,1410,1415;, 3;1411,1417,1412;, 3;1417,1411,1416;, 3;1412,1418,1413;, 3;1418,1412,1417;, 3;1414,1420,1415;, 3;1420,1414,1419;, 3;1415,1421,1416;, 3;1421,1415,1420;, 3;1416,1422,1417;, 3;1422,1416,1421;, 3;1417,1423,1418;, 3;1423,1417,1422;, 3;1419,1424,1420;, 3;1420,1425,1421;, 3;1425,1420,1424;, 3;1421,1426,1422;, 3;1426,1421,1425;, 3;1422,1427,1423;, 3;1427,1422,1426;, 3;37,1404,401;, 3;1404,37,432;, 3;436,397,1408;, 3;397,436,38;, 3;42,1427,441;, 3;1427,42,440;, 3;401,1405,400;, 3;1405,401,1404;, 3;437,1408,1413;, 3;1408,437,436;, 3;441,1426,442;, 3;1426,441,1427;, 3;400,1406,399;, 3;1406,400,1405;, 3;438,1413,1418;, 3;1413,438,437;, 3;442,1425,443;, 3;1425,442,1426;, 3;434,1419,1414;, 3;1419,434,435;, 3;399,1407,398;, 3;1407,399,1406;, 3;439,1418,1423;, 3;1418,439,438;, 3;1424,443,1425;, 3;433,1414,1409;, 3;1414,433,434;, 3;398,1408,397;, 3;1408,398,1407;, 3;440,1423,1427;, 3;1423,440,439;, 3;432,1409,1404;, 3;1409,432,433;, 3;1428,1434,1429;, 3;1434,1428,1433;, 3;1429,1435,1430;, 3;1435,1429,1434;, 3;1430,1436,1431;, 3;1436,1430,1435;, 3;1431,1437,1432;, 3;1437,1431,1436;, 3;1433,1439,1434;, 3;1439,1433,1438;, 3;1434,1440,1435;, 3;1440,1434,1439;, 3;1435,1441,1436;, 3;1441,1435,1440;, 3;1436,1442,1437;, 3;1442,1436,1441;, 3;1438,1444,1439;, 3;1444,1438,1443;, 3;1439,1445,1440;, 3;1445,1439,1444;, 3;1440,1446,1441;, 3;1446,1440,1445;, 3;1441,1447,1442;, 3;1447,1441,1446;, 3;1443,1449,1444;, 3;1449,1443,1448;, 3;1444,1450,1445;, 3;1450,1444,1449;, 3;1445,1451,1446;, 3;1451,1445,1450;, 3;1446,1452,1447;, 3;1452,1446,1451;, 3;38,1428,411;, 3;1428,38,436;, 3;444,407,1432;, 3;407,444,39;, 3;43,1452,449;, 3;1452,43,448;, 3;440,453,1448;, 3;453,440,42;, 3;411,1429,410;, 3;1429,411,1428;, 3;445,1432,1437;, 3;1432,445,444;, 3;449,1451,450;, 3;1451,449,1452;, 3;439,1448,1443;, 3;1448,439,440;, 3;410,1430,409;, 3;1430,410,1429;, 3;446,1437,1442;, 3;1437,446,445;, 3;450,1450,451;, 3;1450,450,1451;, 3;438,1443,1438;, 3;1443,438,439;, 3;409,1431,408;, 3;1431,409,1430;, 3;447,1442,1447;, 3;1442,447,446;, 3;451,1449,452;, 3;1449,451,1450;, 3;437,1438,1433;, 3;1438,437,438;, 3;408,1432,407;, 3;1432,408,1431;, 3;448,1447,1452;, 3;1447,448,447;, 3;452,1448,453;, 3;1448,452,1449;, 3;436,1433,1428;, 3;1433,436,437;, 3;1453,1459,1454;, 3;1459,1453,1458;, 3;1454,1460,1455;, 3;1460,1454,1459;, 3;1455,1461,1456;, 3;1461,1455,1460;, 3;1456,1462,1457;, 3;1462,1456,1461;, 3;1458,1464,1459;, 3;1464,1458,1463;, 3;1459,1465,1460;, 3;1465,1459,1464;, 3;1460,1466,1461;, 3;1466,1460,1465;, 3;1461,1467,1462;, 3;1467,1461,1466;, 3;1463,1469,1464;, 3;1469,1463,1468;, 3;1464,1470,1465;, 3;1470,1464,1469;, 3;1465,1471,1466;, 3;1471,1465,1470;, 3;1466,1472,1467;, 3;1472,1466,1471;, 3;1468,1474,1469;, 3;1474,1468,1473;, 3;1469,1475,1470;, 3;1475,1469,1474;, 3;1470,1476,1471;, 3;1476,1470,1475;, 3;39,1453,421;, 3;1453,39,444;, 3;454,417,1457;, 3;417,454,40;, 3;448,459,1473;, 3;459,448,43;, 3;421,1454,420;, 3;1454,421,1453;, 3;455,1457,1462;, 3;1457,455,454;, 3;447,1473,1468;, 3;1473,447,448;, 3;420,1455,419;, 3;1455,420,1454;, 3;456,1462,1467;, 3;1462,456,455;, 3;446,1468,1463;, 3;1468,446,447;, 3;419,1456,418;, 3;1456,419,1455;, 3;457,1467,1472;, 3;1467,457,456;, 3;445,1463,1458;, 3;1463,445,446;, 3;418,1457,417;, 3;1457,418,1456;, 3;458,1473,459;, 3;1473,458,1474;, 3;444,1458,1453;, 3;1458,444,445;, 3;1477,1483,1478;, 3;1483,1477,1482;, 3;1478,1484,1479;, 3;1484,1478,1483;, 3;1479,1485,1480;, 3;1485,1479,1484;, 3;1482,1487,1483;, 3;1487,1482,1486;, 3;1483,1488,1484;, 3;1488,1483,1487;, 3;40,1477,431;, 3;1477,40,454;, 3;431,1478,430;, 3;1478,431,1477;, 3;430,1479,429;, 3;1479,430,1478;, 3;456,1489,1486;, 3;1489,456,457;, 3;429,1480,428;, 3;1480,429,1479;, 3;455,1486,1482;, 3;1486,455,456;, 3;428,1481,427;, 3;1481,428,1480;, 3;454,1482,1477;, 3;1482,454,455;; MeshMaterialList { 1; 1; 0;; Material { 0.945098;0.913726;0.843137;1.000000;; 23.000000; 1.000000;1.000000;1.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "seafloor.bmp"; } } } MeshTextureCoords { 1490; 0.428571;1.000000;, 0.571429;1.000000;, 0.142857;0.857143;, 0.285714;0.857143;, 0.428571;0.857143;, 0.571429;0.857143;, 0.714286;0.857143;, 0.857143;0.857143;, 0.142857;0.714286;, 0.285714;0.714286;, 0.428571;0.714286;, 0.571429;0.714286;, 0.714286;0.714286;, 0.857143;0.714286;, 0.000000;0.571429;, 0.142857;0.571429;, 0.285714;0.571429;, 0.428571;0.571429;, 0.571429;0.571429;, 0.714286;0.571429;, 0.857143;0.571429;, 1.000000;0.571429;, 0.000000;0.428571;, 0.142857;0.428571;, 0.285714;0.428571;, 0.428571;0.428571;, 0.571429;0.428571;, 0.714286;0.428571;, 0.857143;0.428571;, 1.000000;0.428571;, 0.142857;0.285714;, 0.285714;0.285714;, 0.428571;0.285714;, 0.571429;0.285714;, 0.714286;0.285714;, 0.857143;0.285714;, 0.142857;0.142857;, 0.285714;0.142857;, 0.428571;0.142857;, 0.571429;0.142857;, 0.714286;0.142857;, 0.857143;0.142857;, 0.428571;0.000000;, 0.571429;0.000000;, 0.119048;0.857143;, 0.285714;0.952381;, 0.285714;0.928571;, 0.285714;0.904762;, 0.285714;0.880952;, 0.261905;0.857143;, 0.238095;0.857143;, 0.214286;0.857143;, 0.190476;0.857143;, 0.166667;0.857143;, 0.380952;1.000000;, 0.404762;1.000000;, 0.428571;0.976190;, 0.428571;0.952381;, 0.428571;0.928571;, 0.428571;0.904762;, 0.428571;0.880952;, 0.404762;0.857143;, 0.380952;0.857143;, 0.357143;0.857143;, 0.333333;0.857143;, 0.309524;0.857143;, 0.452381;1.000000;, 0.476190;1.000000;, 0.500000;1.000000;, 0.523810;1.000000;, 0.547619;1.000000;, 0.571429;0.976190;, 0.571429;0.952381;, 0.571429;0.928571;, 0.571429;0.904762;, 0.571429;0.880952;, 0.547619;0.857143;, 0.523810;0.857143;, 0.500000;0.857143;, 0.476190;0.857143;, 0.452381;0.857143;, 0.595238;1.000000;, 0.619048;1.000000;, 0.714286;0.952381;, 0.714286;0.928571;, 0.714286;0.904762;, 0.714286;0.880952;, 0.690476;0.857143;, 0.666667;0.857143;, 0.642857;0.857143;, 0.619048;0.857143;, 0.595238;0.857143;, 0.857143;0.880952;, 0.833333;0.857143;, 0.809524;0.857143;, 0.785714;0.857143;, 0.761905;0.857143;, 0.738095;0.857143;, 0.142857;0.833333;, 0.142857;0.809524;, 0.142857;0.785714;, 0.142857;0.761905;, 0.142857;0.738095;, 0.119048;0.714286;, 0.095238;0.714286;, 0.071429;0.714286;, 0.047619;0.714286;, 0.285714;0.833333;, 0.285714;0.809524;, 0.285714;0.785714;, 0.285714;0.761905;, 0.285714;0.738095;, 0.261905;0.714286;, 0.238095;0.714286;, 0.214286;0.714286;, 0.190476;0.714286;, 0.166667;0.714286;, 0.428571;0.833333;, 0.428571;0.809524;, 0.428571;0.785714;, 0.428571;0.761905;, 0.428571;0.738095;, 0.404762;0.714286;, 0.380952;0.714286;, 0.357143;0.714286;, 0.333333;0.714286;, 0.309524;0.714286;, 0.571429;0.833333;, 0.571429;0.809524;, 0.571429;0.785714;, 0.571429;0.761905;, 0.571429;0.738095;, 0.547619;0.714286;, 0.523810;0.714286;, 0.500000;0.714286;, 0.476190;0.714286;, 0.452381;0.714286;, 0.714286;0.833333;, 0.714286;0.809524;, 0.714286;0.785714;, 0.714286;0.761905;, 0.714286;0.738095;, 0.690476;0.714286;, 0.666667;0.714286;, 0.642857;0.714286;, 0.619048;0.714286;, 0.595238;0.714286;, 0.857143;0.833333;, 0.857143;0.809524;, 0.857143;0.785714;, 0.857143;0.761905;, 0.857143;0.738095;, 0.833333;0.714286;, 0.809524;0.714286;, 0.785714;0.714286;, 0.761905;0.714286;, 0.738095;0.714286;, 0.976190;0.714286;, 0.952381;0.714286;, 0.928571;0.714286;, 0.904762;0.714286;, 0.880952;0.714286;, 0.142857;0.690476;, 0.142857;0.666667;, 0.142857;0.642857;, 0.142857;0.619048;, 0.142857;0.595238;, 0.119048;0.571429;, 0.095238;0.571429;, 0.071429;0.571429;, 0.047619;0.571429;, 0.023810;0.571429;, 0.000000;0.595238;, 0.000000;0.619048;, 0.000000;0.642857;, 0.285714;0.690476;, 0.285714;0.666667;, 0.285714;0.642857;, 0.285714;0.619048;, 0.285714;0.595238;, 0.261905;0.571429;, 0.238095;0.571429;, 0.214286;0.571429;, 0.190476;0.571429;, 0.166667;0.571429;, 0.428571;0.690476;, 0.428571;0.666667;, 0.428571;0.642857;, 0.428571;0.619048;, 0.428571;0.595238;, 0.404762;0.571429;, 0.380952;0.571429;, 0.357143;0.571429;, 0.333333;0.571429;, 0.309524;0.571429;, 0.571429;0.690476;, 0.571429;0.666667;, 0.571429;0.642857;, 0.571429;0.619048;, 0.571429;0.595238;, 0.547619;0.571429;, 0.523810;0.571429;, 0.500000;0.571429;, 0.476190;0.571429;, 0.452381;0.571429;, 0.714286;0.690476;, 0.714286;0.666667;, 0.714286;0.642857;, 0.714286;0.619048;, 0.714286;0.595238;, 0.690476;0.571429;, 0.666667;0.571429;, 0.642857;0.571429;, 0.619048;0.571429;, 0.595238;0.571429;, 0.857143;0.690476;, 0.857143;0.666667;, 0.857143;0.642857;, 0.857143;0.619048;, 0.857143;0.595238;, 0.833333;0.571429;, 0.809524;0.571429;, 0.785714;0.571429;, 0.761905;0.571429;, 0.738095;0.571429;, 1.000000;0.619048;, 1.000000;0.595238;, 0.976190;0.571429;, 0.952381;0.571429;, 0.928571;0.571429;, 0.904762;0.571429;, 0.880952;0.571429;, 0.142857;0.547619;, 0.142857;0.523810;, 0.142857;0.500000;, 0.142857;0.476190;, 0.142857;0.452381;, 0.119048;0.428571;, 0.095238;0.428571;, 0.071429;0.428571;, 0.047619;0.428571;, 0.023810;0.428571;, 0.000000;0.452381;, 0.000000;0.476190;, 0.000000;0.500000;, 0.000000;0.523810;, 0.000000;0.547619;, 0.285714;0.547619;, 0.285714;0.523810;, 0.285714;0.500000;, 0.285714;0.476190;, 0.285714;0.452381;, 0.261905;0.428571;, 0.238095;0.428571;, 0.214286;0.428571;, 0.190476;0.428571;, 0.166667;0.428571;, 0.428571;0.547619;, 0.428571;0.523810;, 0.428571;0.500000;, 0.428571;0.476190;, 0.428571;0.452381;, 0.404762;0.428571;, 0.380952;0.428571;, 0.357143;0.428571;, 0.333333;0.428571;, 0.309524;0.428571;, 0.571429;0.547619;, 0.571429;0.523810;, 0.571429;0.500000;, 0.571429;0.476190;, 0.571429;0.452381;, 0.547619;0.428571;, 0.523810;0.428571;, 0.500000;0.428571;, 0.476190;0.428571;, 0.452381;0.428571;, 0.714286;0.547619;, 0.714286;0.523810;, 0.714286;0.500000;, 0.714286;0.476190;, 0.714286;0.452381;, 0.690476;0.428571;, 0.666667;0.428571;, 0.642857;0.428571;, 0.619048;0.428571;, 0.595238;0.428571;, 0.857143;0.547619;, 0.857143;0.523810;, 0.857143;0.500000;, 0.857143;0.476190;, 0.857143;0.452381;, 0.833333;0.428571;, 0.809524;0.428571;, 0.785714;0.428571;, 0.761905;0.428571;, 0.738095;0.428571;, 1.000000;0.547619;, 1.000000;0.523810;, 1.000000;0.500000;, 1.000000;0.476190;, 1.000000;0.452381;, 0.976190;0.428571;, 0.952381;0.428571;, 0.928571;0.428571;, 0.904762;0.428571;, 0.880952;0.428571;, 0.142857;0.404762;, 0.142857;0.380952;, 0.142857;0.357143;, 0.142857;0.333333;, 0.142857;0.309524;, 0.119048;0.285714;, 0.095238;0.285714;, 0.071429;0.285714;, 0.047619;0.285714;, 0.023810;0.285714;, 0.000000;0.357143;, 0.000000;0.380952;, 0.000000;0.404762;, 0.285714;0.404762;, 0.285714;0.380952;, 0.285714;0.357143;, 0.285714;0.333333;, 0.285714;0.309524;, 0.261905;0.285714;, 0.238095;0.285714;, 0.214286;0.285714;, 0.190476;0.285714;, 0.166667;0.285714;, 0.428571;0.404762;, 0.428571;0.380952;, 0.428571;0.357143;, 0.428571;0.333333;, 0.428571;0.309524;, 0.404762;0.285714;, 0.380952;0.285714;, 0.357143;0.285714;, 0.333333;0.285714;, 0.309524;0.285714;, 0.571429;0.404762;, 0.571429;0.380952;, 0.571429;0.357143;, 0.571429;0.333333;, 0.571429;0.309524;, 0.547619;0.285714;, 0.523810;0.285714;, 0.500000;0.285714;, 0.476190;0.285714;, 0.452381;0.285714;, 0.714286;0.404762;, 0.714286;0.380952;, 0.714286;0.357143;, 0.714286;0.333333;, 0.714286;0.309524;, 0.690476;0.285714;, 0.666667;0.285714;, 0.642857;0.285714;, 0.619048;0.285714;, 0.595238;0.285714;, 0.857143;0.404762;, 0.857143;0.380952;, 0.857143;0.357143;, 0.857143;0.333333;, 0.857143;0.309524;, 0.833333;0.285714;, 0.809524;0.285714;, 0.785714;0.285714;, 0.761905;0.285714;, 0.738095;0.285714;, 1.000000;0.404762;, 1.000000;0.380952;, 0.952381;0.285714;, 0.928571;0.285714;, 0.904762;0.285714;, 0.880952;0.285714;, 0.142857;0.261905;, 0.142857;0.238095;, 0.142857;0.214286;, 0.142857;0.190476;, 0.142857;0.166667;, 0.119048;0.142857;, 0.285714;0.261905;, 0.285714;0.238095;, 0.285714;0.214286;, 0.285714;0.190476;, 0.285714;0.166667;, 0.261905;0.142857;, 0.238095;0.142857;, 0.214286;0.142857;, 0.190476;0.142857;, 0.166667;0.142857;, 0.428571;0.261905;, 0.428571;0.238095;, 0.428571;0.214286;, 0.428571;0.190476;, 0.428571;0.166667;, 0.404762;0.142857;, 0.380952;0.142857;, 0.357143;0.142857;, 0.333333;0.142857;, 0.309524;0.142857;, 0.571429;0.261905;, 0.571429;0.238095;, 0.571429;0.214286;, 0.571429;0.190476;, 0.571429;0.166667;, 0.547619;0.142857;, 0.523810;0.142857;, 0.500000;0.142857;, 0.476190;0.142857;, 0.452381;0.142857;, 0.714286;0.261905;, 0.714286;0.238095;, 0.714286;0.214286;, 0.714286;0.190476;, 0.714286;0.166667;, 0.690476;0.142857;, 0.666667;0.142857;, 0.642857;0.142857;, 0.619048;0.142857;, 0.595238;0.142857;, 0.857143;0.261905;, 0.857143;0.238095;, 0.857143;0.214286;, 0.857143;0.190476;, 0.857143;0.166667;, 0.833333;0.142857;, 0.809524;0.142857;, 0.785714;0.142857;, 0.761905;0.142857;, 0.738095;0.142857;, 0.285714;0.119048;, 0.285714;0.095238;, 0.285714;0.071429;, 0.285714;0.047619;, 0.428571;0.119048;, 0.428571;0.095238;, 0.428571;0.071429;, 0.428571;0.047619;, 0.428571;0.023810;, 0.404762;0.000000;, 0.380952;0.000000;, 0.357143;0.000000;, 0.571429;0.119048;, 0.571429;0.095238;, 0.571429;0.071429;, 0.571429;0.047619;, 0.571429;0.023810;, 0.547619;0.000000;, 0.523810;0.000000;, 0.500000;0.000000;, 0.476190;0.000000;, 0.452381;0.000000;, 0.714286;0.119048;, 0.714286;0.095238;, 0.714286;0.071429;, 0.714286;0.047619;, 0.619048;0.000000;, 0.595238;0.000000;, 0.261905;0.952381;, 0.214286;0.928571;, 0.238095;0.928571;, 0.261905;0.928571;, 0.190476;0.904762;, 0.214286;0.904762;, 0.238095;0.904762;, 0.261905;0.904762;, 0.166667;0.880952;, 0.190476;0.880952;, 0.214286;0.880952;, 0.238095;0.880952;, 0.261905;0.880952;, 0.309524;0.976190;, 0.333333;0.976190;, 0.357143;0.976190;, 0.380952;0.976190;, 0.404762;0.976190;, 0.309524;0.952381;, 0.333333;0.952381;, 0.357143;0.952381;, 0.380952;0.952381;, 0.404762;0.952381;, 0.309524;0.928571;, 0.333333;0.928571;, 0.357143;0.928571;, 0.380952;0.928571;, 0.404762;0.928571;, 0.309524;0.904762;, 0.333333;0.904762;, 0.357143;0.904762;, 0.380952;0.904762;, 0.404762;0.904762;, 0.309524;0.880952;, 0.333333;0.880952;, 0.357143;0.880952;, 0.380952;0.880952;, 0.404762;0.880952;, 0.452381;0.976190;, 0.476190;0.976190;, 0.500000;0.976190;, 0.523810;0.976190;, 0.547619;0.976190;, 0.452381;0.952381;, 0.476190;0.952381;, 0.500000;0.952381;, 0.523810;0.952381;, 0.547619;0.952381;, 0.452381;0.928571;, 0.476190;0.928571;, 0.500000;0.928571;, 0.523810;0.928571;, 0.547619;0.928571;, 0.452381;0.904762;, 0.476190;0.904762;, 0.500000;0.904762;, 0.523810;0.904762;, 0.547619;0.904762;, 0.452381;0.880952;, 0.476190;0.880952;, 0.500000;0.880952;, 0.523810;0.880952;, 0.547619;0.880952;, 0.595238;0.976190;, 0.619048;0.976190;, 0.642857;0.976190;, 0.666667;0.976190;, 0.690476;0.976190;, 0.595238;0.952381;, 0.619048;0.952381;, 0.642857;0.952381;, 0.666667;0.952381;, 0.690476;0.952381;, 0.595238;0.928571;, 0.619048;0.928571;, 0.642857;0.928571;, 0.666667;0.928571;, 0.690476;0.928571;, 0.595238;0.904762;, 0.619048;0.904762;, 0.642857;0.904762;, 0.666667;0.904762;, 0.690476;0.904762;, 0.595238;0.880952;, 0.619048;0.880952;, 0.642857;0.880952;, 0.666667;0.880952;, 0.690476;0.880952;, 0.738095;0.952381;, 0.738095;0.928571;, 0.761905;0.928571;, 0.785714;0.928571;, 0.738095;0.904762;, 0.761905;0.904762;, 0.785714;0.904762;, 0.809524;0.904762;, 0.738095;0.880952;, 0.761905;0.880952;, 0.785714;0.880952;, 0.809524;0.880952;, 0.833333;0.880952;, 0.119048;0.833333;, 0.095238;0.809524;, 0.119048;0.809524;, 0.071429;0.785714;, 0.095238;0.785714;, 0.119048;0.785714;, 0.071429;0.761905;, 0.095238;0.761905;, 0.119048;0.761905;, 0.047619;0.738095;, 0.071429;0.738095;, 0.095238;0.738095;, 0.119048;0.738095;, 0.166667;0.833333;, 0.190476;0.833333;, 0.214286;0.833333;, 0.238095;0.833333;, 0.261905;0.833333;, 0.166667;0.809524;, 0.190476;0.809524;, 0.214286;0.809524;, 0.238095;0.809524;, 0.261905;0.809524;, 0.166667;0.785714;, 0.190476;0.785714;, 0.214286;0.785714;, 0.238095;0.785714;, 0.261905;0.785714;, 0.166667;0.761905;, 0.190476;0.761905;, 0.214286;0.761905;, 0.238095;0.761905;, 0.261905;0.761905;, 0.166667;0.738095;, 0.190476;0.738095;, 0.214286;0.738095;, 0.238095;0.738095;, 0.261905;0.738095;, 0.309524;0.833333;, 0.333333;0.833333;, 0.357143;0.833333;, 0.380952;0.833333;, 0.404762;0.833333;, 0.309524;0.809524;, 0.333333;0.809524;, 0.357143;0.809524;, 0.380952;0.809524;, 0.404762;0.809524;, 0.309524;0.785714;, 0.333333;0.785714;, 0.357143;0.785714;, 0.380952;0.785714;, 0.404762;0.785714;, 0.309524;0.761905;, 0.333333;0.761905;, 0.357143;0.761905;, 0.380952;0.761905;, 0.404762;0.761905;, 0.309524;0.738095;, 0.333333;0.738095;, 0.357143;0.738095;, 0.380952;0.738095;, 0.404762;0.738095;, 0.452381;0.833333;, 0.476190;0.833333;, 0.500000;0.833333;, 0.523810;0.833333;, 0.547619;0.833333;, 0.452381;0.809524;, 0.476190;0.809524;, 0.500000;0.809524;, 0.523810;0.809524;, 0.547619;0.809524;, 0.452381;0.785714;, 0.476190;0.785714;, 0.500000;0.785714;, 0.523810;0.785714;, 0.547619;0.785714;, 0.452381;0.761905;, 0.476190;0.761905;, 0.500000;0.761905;, 0.523810;0.761905;, 0.547619;0.761905;, 0.452381;0.738095;, 0.476190;0.738095;, 0.500000;0.738095;, 0.523810;0.738095;, 0.547619;0.738095;, 0.595238;0.833333;, 0.619048;0.833333;, 0.642857;0.833333;, 0.666667;0.833333;, 0.690476;0.833333;, 0.595238;0.809524;, 0.619048;0.809524;, 0.642857;0.809524;, 0.666667;0.809524;, 0.690476;0.809524;, 0.595238;0.785714;, 0.619048;0.785714;, 0.642857;0.785714;, 0.666667;0.785714;, 0.690476;0.785714;, 0.595238;0.761905;, 0.619048;0.761905;, 0.642857;0.761905;, 0.666667;0.761905;, 0.690476;0.761905;, 0.595238;0.738095;, 0.619048;0.738095;, 0.642857;0.738095;, 0.666667;0.738095;, 0.690476;0.738095;, 0.738095;0.833333;, 0.761905;0.833333;, 0.785714;0.833333;, 0.809524;0.833333;, 0.833333;0.833333;, 0.738095;0.809524;, 0.761905;0.809524;, 0.785714;0.809524;, 0.809524;0.809524;, 0.833333;0.809524;, 0.738095;0.785714;, 0.761905;0.785714;, 0.785714;0.785714;, 0.809524;0.785714;, 0.833333;0.785714;, 0.738095;0.761905;, 0.761905;0.761905;, 0.785714;0.761905;, 0.809524;0.761905;, 0.833333;0.761905;, 0.738095;0.738095;, 0.761905;0.738095;, 0.785714;0.738095;, 0.809524;0.738095;, 0.833333;0.738095;, 0.880952;0.833333;, 0.880952;0.809524;, 0.904762;0.809524;, 0.880952;0.785714;, 0.904762;0.785714;, 0.928571;0.785714;, 0.880952;0.761905;, 0.904762;0.761905;, 0.928571;0.761905;, 0.952381;0.761905;, 0.880952;0.738095;, 0.904762;0.738095;, 0.928571;0.738095;, 0.952381;0.738095;, 0.023810;0.690476;, 0.047619;0.690476;, 0.071429;0.690476;, 0.095238;0.690476;, 0.119048;0.690476;, 0.023810;0.666667;, 0.047619;0.666667;, 0.071429;0.666667;, 0.095238;0.666667;, 0.119048;0.666667;, 0.023810;0.642857;, 0.047619;0.642857;, 0.071429;0.642857;, 0.095238;0.642857;, 0.119048;0.642857;, 0.023810;0.619048;, 0.047619;0.619048;, 0.071429;0.619048;, 0.095238;0.619048;, 0.119048;0.619048;, 0.023810;0.595238;, 0.047619;0.595238;, 0.071429;0.595238;, 0.095238;0.595238;, 0.119048;0.595238;, 0.166667;0.690476;, 0.190476;0.690476;, 0.214286;0.690476;, 0.238095;0.690476;, 0.261905;0.690476;, 0.166667;0.666667;, 0.190476;0.666667;, 0.214286;0.666667;, 0.238095;0.666667;, 0.261905;0.666667;, 0.166667;0.642857;, 0.190476;0.642857;, 0.214286;0.642857;, 0.238095;0.642857;, 0.261905;0.642857;, 0.166667;0.619048;, 0.190476;0.619048;, 0.214286;0.619048;, 0.238095;0.619048;, 0.261905;0.619048;, 0.166667;0.595238;, 0.190476;0.595238;, 0.214286;0.595238;, 0.238095;0.595238;, 0.261905;0.595238;, 0.309524;0.690476;, 0.333333;0.690476;, 0.357143;0.690476;, 0.380952;0.690476;, 0.404762;0.690476;, 0.309524;0.666667;, 0.333333;0.666667;, 0.357143;0.666667;, 0.380952;0.666667;, 0.404762;0.666667;, 0.309524;0.642857;, 0.333333;0.642857;, 0.357143;0.642857;, 0.380952;0.642857;, 0.404762;0.642857;, 0.309524;0.619048;, 0.333333;0.619048;, 0.357143;0.619048;, 0.380952;0.619048;, 0.404762;0.619048;, 0.309524;0.595238;, 0.333333;0.595238;, 0.357143;0.595238;, 0.380952;0.595238;, 0.404762;0.595238;, 0.452381;0.690476;, 0.476190;0.690476;, 0.500000;0.690476;, 0.523810;0.690476;, 0.547619;0.690476;, 0.452381;0.666667;, 0.476190;0.666667;, 0.500000;0.666667;, 0.523810;0.666667;, 0.547619;0.666667;, 0.452381;0.642857;, 0.476190;0.642857;, 0.500000;0.642857;, 0.523810;0.642857;, 0.547619;0.642857;, 0.452381;0.619048;, 0.476190;0.619048;, 0.500000;0.619048;, 0.523810;0.619048;, 0.547619;0.619048;, 0.452381;0.595238;, 0.476190;0.595238;, 0.500000;0.595238;, 0.523810;0.595238;, 0.547619;0.595238;, 0.595238;0.690476;, 0.619048;0.690476;, 0.642857;0.690476;, 0.666667;0.690476;, 0.690476;0.690476;, 0.595238;0.666667;, 0.619048;0.666667;, 0.642857;0.666667;, 0.666667;0.666667;, 0.690476;0.666667;, 0.595238;0.642857;, 0.619048;0.642857;, 0.642857;0.642857;, 0.666667;0.642857;, 0.690476;0.642857;, 0.595238;0.619048;, 0.619048;0.619048;, 0.642857;0.619048;, 0.666667;0.619048;, 0.690476;0.619048;, 0.595238;0.595238;, 0.619048;0.595238;, 0.642857;0.595238;, 0.666667;0.595238;, 0.690476;0.595238;, 0.738095;0.690476;, 0.761905;0.690476;, 0.785714;0.690476;, 0.809524;0.690476;, 0.833333;0.690476;, 0.738095;0.666667;, 0.761905;0.666667;, 0.785714;0.666667;, 0.809524;0.666667;, 0.833333;0.666667;, 0.738095;0.642857;, 0.761905;0.642857;, 0.785714;0.642857;, 0.809524;0.642857;, 0.833333;0.642857;, 0.738095;0.619048;, 0.761905;0.619048;, 0.785714;0.619048;, 0.809524;0.619048;, 0.833333;0.619048;, 0.738095;0.595238;, 0.761905;0.595238;, 0.785714;0.595238;, 0.809524;0.595238;, 0.833333;0.595238;, 0.880952;0.690476;, 0.904762;0.690476;, 0.928571;0.690476;, 0.952381;0.690476;, 0.976190;0.690476;, 0.880952;0.666667;, 0.904762;0.666667;, 0.928571;0.666667;, 0.952381;0.666667;, 0.976190;0.666667;, 0.880952;0.642857;, 0.904762;0.642857;, 0.928571;0.642857;, 0.952381;0.642857;, 0.976190;0.642857;, 0.880952;0.619048;, 0.904762;0.619048;, 0.928571;0.619048;, 0.952381;0.619048;, 0.976190;0.619048;, 0.880952;0.595238;, 0.904762;0.595238;, 0.928571;0.595238;, 0.952381;0.595238;, 0.976190;0.595238;, 0.023810;0.547619;, 0.047619;0.547619;, 0.071429;0.547619;, 0.095238;0.547619;, 0.119048;0.547619;, 0.023810;0.523810;, 0.047619;0.523810;, 0.071429;0.523810;, 0.095238;0.523810;, 0.119048;0.523810;, 0.023810;0.500000;, 0.047619;0.500000;, 0.071429;0.500000;, 0.095238;0.500000;, 0.119048;0.500000;, 0.023810;0.476190;, 0.047619;0.476190;, 0.071429;0.476190;, 0.095238;0.476190;, 0.119048;0.476190;, 0.023810;0.452381;, 0.047619;0.452381;, 0.071429;0.452381;, 0.095238;0.452381;, 0.119048;0.452381;, 0.166667;0.547619;, 0.190476;0.547619;, 0.214286;0.547619;, 0.238095;0.547619;, 0.261905;0.547619;, 0.166667;0.523810;, 0.190476;0.523810;, 0.214286;0.523810;, 0.238095;0.523810;, 0.261905;0.523810;, 0.166667;0.500000;, 0.190476;0.500000;, 0.214286;0.500000;, 0.238095;0.500000;, 0.261905;0.500000;, 0.166667;0.476190;, 0.190476;0.476190;, 0.214286;0.476190;, 0.238095;0.476190;, 0.261905;0.476190;, 0.166667;0.452381;, 0.190476;0.452381;, 0.214286;0.452381;, 0.238095;0.452381;, 0.261905;0.452381;, 0.309524;0.547619;, 0.333333;0.547619;, 0.357143;0.547619;, 0.380952;0.547619;, 0.404762;0.547619;, 0.309524;0.523810;, 0.333333;0.523810;, 0.357143;0.523810;, 0.380952;0.523810;, 0.404762;0.523810;, 0.309524;0.500000;, 0.333333;0.500000;, 0.357143;0.500000;, 0.380952;0.500000;, 0.404762;0.500000;, 0.309524;0.476190;, 0.333333;0.476190;, 0.357143;0.476190;, 0.380952;0.476190;, 0.404762;0.476190;, 0.309524;0.452381;, 0.333333;0.452381;, 0.357143;0.452381;, 0.380952;0.452381;, 0.404762;0.452381;, 0.452381;0.547619;, 0.476190;0.547619;, 0.500000;0.547619;, 0.523810;0.547619;, 0.547619;0.547619;, 0.452381;0.523810;, 0.476190;0.523810;, 0.500000;0.523810;, 0.523810;0.523810;, 0.547619;0.523810;, 0.452381;0.500000;, 0.476190;0.500000;, 0.500000;0.500000;, 0.523810;0.500000;, 0.547619;0.500000;, 0.452381;0.476190;, 0.476190;0.476190;, 0.500000;0.476190;, 0.523810;0.476190;, 0.547619;0.476190;, 0.452381;0.452381;, 0.476190;0.452381;, 0.500000;0.452381;, 0.523810;0.452381;, 0.547619;0.452381;, 0.595238;0.547619;, 0.619048;0.547619;, 0.642857;0.547619;, 0.666667;0.547619;, 0.690476;0.547619;, 0.595238;0.523810;, 0.619048;0.523810;, 0.642857;0.523810;, 0.666667;0.523810;, 0.690476;0.523810;, 0.595238;0.500000;, 0.619048;0.500000;, 0.642857;0.500000;, 0.666667;0.500000;, 0.690476;0.500000;, 0.595238;0.476190;, 0.619048;0.476190;, 0.642857;0.476190;, 0.666667;0.476190;, 0.690476;0.476190;, 0.595238;0.452381;, 0.619048;0.452381;, 0.642857;0.452381;, 0.666667;0.452381;, 0.690476;0.452381;, 0.738095;0.547619;, 0.761905;0.547619;, 0.785714;0.547619;, 0.809524;0.547619;, 0.833333;0.547619;, 0.738095;0.523810;, 0.761905;0.523810;, 0.785714;0.523810;, 0.809524;0.523810;, 0.833333;0.523810;, 0.738095;0.500000;, 0.761905;0.500000;, 0.785714;0.500000;, 0.809524;0.500000;, 0.833333;0.500000;, 0.738095;0.476190;, 0.761905;0.476190;, 0.785714;0.476190;, 0.809524;0.476190;, 0.833333;0.476190;, 0.738095;0.452381;, 0.761905;0.452381;, 0.785714;0.452381;, 0.809524;0.452381;, 0.833333;0.452381;, 0.880952;0.547619;, 0.904762;0.547619;, 0.928571;0.547619;, 0.952381;0.547619;, 0.976190;0.547619;, 0.880952;0.523810;, 0.904762;0.523810;, 0.928571;0.523810;, 0.952381;0.523810;, 0.976190;0.523810;, 0.880952;0.500000;, 0.904762;0.500000;, 0.928571;0.500000;, 0.952381;0.500000;, 0.976190;0.500000;, 0.880952;0.476190;, 0.904762;0.476190;, 0.928571;0.476190;, 0.952381;0.476190;, 0.976190;0.476190;, 0.880952;0.452381;, 0.904762;0.452381;, 0.928571;0.452381;, 0.952381;0.452381;, 0.976190;0.452381;, 0.023810;0.404762;, 0.047619;0.404762;, 0.071429;0.404762;, 0.095238;0.404762;, 0.119048;0.404762;, 0.023810;0.380952;, 0.047619;0.380952;, 0.071429;0.380952;, 0.095238;0.380952;, 0.119048;0.380952;, 0.023810;0.357143;, 0.047619;0.357143;, 0.071429;0.357143;, 0.095238;0.357143;, 0.119048;0.357143;, 0.023810;0.333333;, 0.047619;0.333333;, 0.071429;0.333333;, 0.095238;0.333333;, 0.119048;0.333333;, 0.023810;0.309524;, 0.047619;0.309524;, 0.071429;0.309524;, 0.095238;0.309524;, 0.119048;0.309524;, 0.166667;0.404762;, 0.190476;0.404762;, 0.214286;0.404762;, 0.238095;0.404762;, 0.261905;0.404762;, 0.166667;0.380952;, 0.190476;0.380952;, 0.214286;0.380952;, 0.238095;0.380952;, 0.261905;0.380952;, 0.166667;0.357143;, 0.190476;0.357143;, 0.214286;0.357143;, 0.238095;0.357143;, 0.261905;0.357143;, 0.166667;0.333333;, 0.190476;0.333333;, 0.214286;0.333333;, 0.238095;0.333333;, 0.261905;0.333333;, 0.166667;0.309524;, 0.190476;0.309524;, 0.214286;0.309524;, 0.238095;0.309524;, 0.261905;0.309524;, 0.309524;0.404762;, 0.333333;0.404762;, 0.357143;0.404762;, 0.380952;0.404762;, 0.404762;0.404762;, 0.309524;0.380952;, 0.333333;0.380952;, 0.357143;0.380952;, 0.380952;0.380952;, 0.404762;0.380952;, 0.309524;0.357143;, 0.333333;0.357143;, 0.357143;0.357143;, 0.380952;0.357143;, 0.404762;0.357143;, 0.309524;0.333333;, 0.333333;0.333333;, 0.357143;0.333333;, 0.380952;0.333333;, 0.404762;0.333333;, 0.309524;0.309524;, 0.333333;0.309524;, 0.357143;0.309524;, 0.380952;0.309524;, 0.404762;0.309524;, 0.452381;0.404762;, 0.476190;0.404762;, 0.500000;0.404762;, 0.523810;0.404762;, 0.547619;0.404762;, 0.452381;0.380952;, 0.476190;0.380952;, 0.500000;0.380952;, 0.523810;0.380952;, 0.547619;0.380952;, 0.452381;0.357143;, 0.476190;0.357143;, 0.500000;0.357143;, 0.523810;0.357143;, 0.547619;0.357143;, 0.452381;0.333333;, 0.476190;0.333333;, 0.500000;0.333333;, 0.523810;0.333333;, 0.547619;0.333333;, 0.452381;0.309524;, 0.476190;0.309524;, 0.500000;0.309524;, 0.523810;0.309524;, 0.547619;0.309524;, 0.595238;0.404762;, 0.619048;0.404762;, 0.642857;0.404762;, 0.666667;0.404762;, 0.690476;0.404762;, 0.595238;0.380952;, 0.619048;0.380952;, 0.642857;0.380952;, 0.666667;0.380952;, 0.690476;0.380952;, 0.595238;0.357143;, 0.619048;0.357143;, 0.642857;0.357143;, 0.666667;0.357143;, 0.690476;0.357143;, 0.595238;0.333333;, 0.619048;0.333333;, 0.642857;0.333333;, 0.666667;0.333333;, 0.690476;0.333333;, 0.595238;0.309524;, 0.619048;0.309524;, 0.642857;0.309524;, 0.666667;0.309524;, 0.690476;0.309524;, 0.738095;0.404762;, 0.761905;0.404762;, 0.785714;0.404762;, 0.809524;0.404762;, 0.833333;0.404762;, 0.738095;0.380952;, 0.761905;0.380952;, 0.785714;0.380952;, 0.809524;0.380952;, 0.833333;0.380952;, 0.738095;0.357143;, 0.761905;0.357143;, 0.785714;0.357143;, 0.809524;0.357143;, 0.833333;0.357143;, 0.738095;0.333333;, 0.761905;0.333333;, 0.785714;0.333333;, 0.809524;0.333333;, 0.833333;0.333333;, 0.738095;0.309524;, 0.761905;0.309524;, 0.785714;0.309524;, 0.809524;0.309524;, 0.833333;0.309524;, 0.880952;0.404762;, 0.904762;0.404762;, 0.928571;0.404762;, 0.952381;0.404762;, 0.976190;0.404762;, 0.880952;0.380952;, 0.904762;0.380952;, 0.928571;0.380952;, 0.952381;0.380952;, 0.976190;0.380952;, 0.880952;0.357143;, 0.904762;0.357143;, 0.928571;0.357143;, 0.952381;0.357143;, 0.976190;0.357143;, 0.880952;0.333333;, 0.904762;0.333333;, 0.928571;0.333333;, 0.952381;0.333333;, 0.976190;0.333333;, 0.880952;0.309524;, 0.904762;0.309524;, 0.928571;0.309524;, 0.952381;0.309524;, 0.047619;0.261905;, 0.071429;0.261905;, 0.095238;0.261905;, 0.119048;0.261905;, 0.047619;0.238095;, 0.071429;0.238095;, 0.095238;0.238095;, 0.119048;0.238095;, 0.071429;0.214286;, 0.095238;0.214286;, 0.119048;0.214286;, 0.071429;0.190476;, 0.095238;0.190476;, 0.119048;0.190476;, 0.095238;0.166667;, 0.119048;0.166667;, 0.166667;0.261905;, 0.190476;0.261905;, 0.214286;0.261905;, 0.238095;0.261905;, 0.261905;0.261905;, 0.166667;0.238095;, 0.190476;0.238095;, 0.214286;0.238095;, 0.238095;0.238095;, 0.261905;0.238095;, 0.166667;0.214286;, 0.190476;0.214286;, 0.214286;0.214286;, 0.238095;0.214286;, 0.261905;0.214286;, 0.166667;0.190476;, 0.190476;0.190476;, 0.214286;0.190476;, 0.238095;0.190476;, 0.261905;0.190476;, 0.166667;0.166667;, 0.190476;0.166667;, 0.214286;0.166667;, 0.238095;0.166667;, 0.261905;0.166667;, 0.309524;0.261905;, 0.333333;0.261905;, 0.357143;0.261905;, 0.380952;0.261905;, 0.404762;0.261905;, 0.309524;0.238095;, 0.333333;0.238095;, 0.357143;0.238095;, 0.380952;0.238095;, 0.404762;0.238095;, 0.309524;0.214286;, 0.333333;0.214286;, 0.357143;0.214286;, 0.380952;0.214286;, 0.404762;0.214286;, 0.309524;0.190476;, 0.333333;0.190476;, 0.357143;0.190476;, 0.380952;0.190476;, 0.404762;0.190476;, 0.309524;0.166667;, 0.333333;0.166667;, 0.357143;0.166667;, 0.380952;0.166667;, 0.404762;0.166667;, 0.452381;0.261905;, 0.476190;0.261905;, 0.500000;0.261905;, 0.523810;0.261905;, 0.547619;0.261905;, 0.452381;0.238095;, 0.476190;0.238095;, 0.500000;0.238095;, 0.523810;0.238095;, 0.547619;0.238095;, 0.452381;0.214286;, 0.476190;0.214286;, 0.500000;0.214286;, 0.523810;0.214286;, 0.547619;0.214286;, 0.452381;0.190476;, 0.476190;0.190476;, 0.500000;0.190476;, 0.523810;0.190476;, 0.547619;0.190476;, 0.452381;0.166667;, 0.476190;0.166667;, 0.500000;0.166667;, 0.523810;0.166667;, 0.547619;0.166667;, 0.595238;0.261905;, 0.619048;0.261905;, 0.642857;0.261905;, 0.666667;0.261905;, 0.690476;0.261905;, 0.595238;0.238095;, 0.619048;0.238095;, 0.642857;0.238095;, 0.666667;0.238095;, 0.690476;0.238095;, 0.595238;0.214286;, 0.619048;0.214286;, 0.642857;0.214286;, 0.666667;0.214286;, 0.690476;0.214286;, 0.595238;0.190476;, 0.619048;0.190476;, 0.642857;0.190476;, 0.666667;0.190476;, 0.690476;0.190476;, 0.595238;0.166667;, 0.619048;0.166667;, 0.642857;0.166667;, 0.666667;0.166667;, 0.690476;0.166667;, 0.738095;0.261905;, 0.761905;0.261905;, 0.785714;0.261905;, 0.809524;0.261905;, 0.833333;0.261905;, 0.738095;0.238095;, 0.761905;0.238095;, 0.785714;0.238095;, 0.809524;0.238095;, 0.833333;0.238095;, 0.738095;0.214286;, 0.761905;0.214286;, 0.785714;0.214286;, 0.809524;0.214286;, 0.833333;0.214286;, 0.738095;0.190476;, 0.761905;0.190476;, 0.785714;0.190476;, 0.809524;0.190476;, 0.833333;0.190476;, 0.738095;0.166667;, 0.761905;0.166667;, 0.785714;0.166667;, 0.809524;0.166667;, 0.833333;0.166667;, 0.880952;0.261905;, 0.904762;0.261905;, 0.928571;0.261905;, 0.952381;0.261905;, 0.880952;0.238095;, 0.904762;0.238095;, 0.928571;0.238095;, 0.880952;0.214286;, 0.904762;0.214286;, 0.880952;0.190476;, 0.904762;0.190476;, 0.880952;0.166667;, 0.166667;0.119048;, 0.190476;0.119048;, 0.214286;0.119048;, 0.238095;0.119048;, 0.261905;0.119048;, 0.166667;0.095238;, 0.190476;0.095238;, 0.214286;0.095238;, 0.238095;0.095238;, 0.261905;0.095238;, 0.238095;0.071429;, 0.261905;0.071429;, 0.238095;0.047619;, 0.261905;0.047619;, 0.309524;0.119048;, 0.333333;0.119048;, 0.357143;0.119048;, 0.380952;0.119048;, 0.404762;0.119048;, 0.309524;0.095238;, 0.333333;0.095238;, 0.357143;0.095238;, 0.380952;0.095238;, 0.404762;0.095238;, 0.309524;0.071429;, 0.333333;0.071429;, 0.357143;0.071429;, 0.380952;0.071429;, 0.404762;0.071429;, 0.309524;0.047619;, 0.333333;0.047619;, 0.357143;0.047619;, 0.380952;0.047619;, 0.404762;0.047619;, 0.333333;0.023810;, 0.357143;0.023810;, 0.380952;0.023810;, 0.404762;0.023810;, 0.452381;0.119048;, 0.476190;0.119048;, 0.500000;0.119048;, 0.523810;0.119048;, 0.547619;0.119048;, 0.452381;0.095238;, 0.476190;0.095238;, 0.500000;0.095238;, 0.523810;0.095238;, 0.547619;0.095238;, 0.452381;0.071429;, 0.476190;0.071429;, 0.500000;0.071429;, 0.523810;0.071429;, 0.547619;0.071429;, 0.452381;0.047619;, 0.476190;0.047619;, 0.500000;0.047619;, 0.523810;0.047619;, 0.547619;0.047619;, 0.452381;0.023810;, 0.476190;0.023810;, 0.500000;0.023810;, 0.523810;0.023810;, 0.547619;0.023810;, 0.595238;0.119048;, 0.619048;0.119048;, 0.642857;0.119048;, 0.666667;0.119048;, 0.690476;0.119048;, 0.595238;0.095238;, 0.619048;0.095238;, 0.642857;0.095238;, 0.666667;0.095238;, 0.690476;0.095238;, 0.595238;0.071429;, 0.619048;0.071429;, 0.642857;0.071429;, 0.666667;0.071429;, 0.690476;0.071429;, 0.595238;0.047619;, 0.619048;0.047619;, 0.642857;0.047619;, 0.666667;0.047619;, 0.690476;0.047619;, 0.595238;0.023810;, 0.619048;0.023810;, 0.642857;0.023810;, 0.666667;0.023810;, 0.738095;0.119048;, 0.761905;0.119048;, 0.785714;0.119048;, 0.809524;0.119048;, 0.833333;0.119048;, 0.738095;0.095238;, 0.761905;0.095238;, 0.785714;0.095238;, 0.809524;0.095238;, 0.738095;0.071429;, 0.761905;0.071429;, 0.785714;0.071429;, 0.738095;0.047619;; } } } ================================================ FILE: common/Start Menu/DX Test/DirectX - 8/DolphinVS.bat ================================================ @echo off start /unix C:/Addons/DXTest/DX8DolphinVS/DolphinVS.exe ================================================ FILE: common/Start Menu/DX Test/DirectX - 9/CubeMap.bat ================================================ @echo off start /unix C:/Addons/DXTest/DX9EnvMapping/CubeMap.exe ================================================ FILE: common/Start Menu/DX Test/DirectX - 9/SphereMap.bat ================================================ @echo off start /unix C:/Addons/DXTest/DX9EnvMapping/SphereMap.exe ================================================ FILE: common/Start Menu/DX Test/DirectX - 9/StencilMirror.bat ================================================ @echo off start /unix C:/Addons/DXTest/DX9StencilMirror/StencilMirror.exe ================================================ FILE: common/Start Menu/Regedit Tweak/Fake GPU/6600GT.reg.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/6600GT.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake GPU/9600GT.reg.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/9600GT.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake GPU/ATIHD5800.reg.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/ATIHD5800.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake GPU/GMAQ33.reg.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/GMAQ33.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake GPU/GTX1050.reg.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/GTX1050.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake GPU/GTX470.reg.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/GTX470.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake GPU/IntelHD4000.reg.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/IntelHD4000.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake GPU/RX480.reg.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/RX480.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake GPU/VMWareSVGA3D.reg.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/VMWareSVGA3D.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake GPU/VirtIOGPU.reg.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/VirtIOGPU.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake VRAM/128MB.bat ================================================ @echo off regedit C:/Addons/VRAMSize/VideoMemorySize_128.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake VRAM/1GB.bat ================================================ @echo off regedit C:/Addons/VRAMSize/VideoMemorySize_1024.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake VRAM/256MB.bat ================================================ @echo off regedit C:/Addons/VRAMSize/VideoMemorySize_256.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake VRAM/2GB.bat ================================================ @echo off regedit C:/Addons/VRAMSize/VideoMemorySize_2048.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake VRAM/3GB.bat ================================================ @echo off regedit C:/Addons/VRAMSize/VideoMemorySize_3072.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake VRAM/4GB.bat ================================================ @echo off regedit C:/Addons/VRAMSize/VideoMemorySize_4096.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake VRAM/512MB.bat ================================================ @echo off regedit C:/Addons/VRAMSize/VideoMemorySize_512.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake VRAM/6GB.bat ================================================ @echo off regedit C:/Addons/VRAMSize/VideoMemorySize_6144.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake VRAM/768MB.bat ================================================ @echo off regedit C:/Addons/VRAMSize/VideoMemorySize_768.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Fake VRAM/8GB.bat ================================================ @echo off regedit C:/Addons/VRAMSize/VideoMemorySize_8196.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Graphics Settings/CSMT/0.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/csmt_0.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Graphics Settings/CSMT/1.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/csmt_1.reg ================================================ FILE: common/Start Menu/Regedit Tweak/Graphics Settings/CSMT/3.bat ================================================ @echo off regedit C:/Addons/FakeGPUs/csmt_3.reg ================================================ FILE: common/Start Menu/Update Prefix.bat ================================================ @echo off C:\\windows\\system32\\wineboot -u ================================================ FILE: create-rootfs-rat.sh ================================================ #!/bin/bash if [ $# -lt 1 ]; then echo "Specify Architecture for Building RootFS." exit 0 fi if [ "$1" != "aarch64" ] && [ "$1" != "x86_64" ]; then echo "Invalid Architecture Specified, Available 'aarch64' and 'x86_64'" exit 0 fi export PREFIX=/data/data/com.micewine.emu/files/usr export INIT_DIR=$PWD export ARCH=$1 export GIT_SHORT_SHA=$(git rev-parse --short HEAD) if [ ! -d "$INIT_DIR/built-pkgs" ]; then echo "built-pkgs: Don't Exist. Run 'build-all.sh' for generate the needed libs for creating a rootfs for MiceWine." exit 0 fi export ROOTFS_PKGS=$(find "$INIT_DIR/built-pkgs" -name "*$ARCH*.rat" | sort) export WINE_PKG=$(find "$INIT_DIR/built-pkgs" -name "*wine*.rat") export WINE_UTILS_PKG="$INIT_DIR/Wine-Utils-($GIT_SHORT_SHA)-any.rat" if [ ! -f "$WINE_UTILS_PKG" ]; then $INIT_DIR/tools/download-external-dependencies.sh $INIT_DIR/tools/create-rat-pkg.sh "Wine-Utils" "Wine Utils" "" "any" "($GIT_SHORT_SHA)" "wine-utils" "$INIT_DIR/wine-utils" "$INIT_DIR" fi ROOTFS_PKGS+=" $WINE_UTILS_PKG" if [ -f "$WINE_PKG" ]; then ROOTFS_PKGS+=" $WINE_PKG" else echo "Warning, Wine Not Found." fi resolvePath() { if [ -f "$1" ]; then echo "$1" elif [ -f "$INIT_DIR/$1" ]; then echo "$INIT_DIR/$1" fi } getElementFromHeader() { echo "$(cat pkg-header | head -n $1 | tail -n 1 | cut -d "=" -f 2)" } export RAND_VAL=$RANDOM mkdir -p /tmp/$RAND_VAL cd /tmp/$RAND_VAL mkdir -p "vulkanDrivers" mkdir -p "adrenoTools" mkdir -p "box64" mkdir -p "wine" touch new_makeSymlinks.sh for i in $ROOTFS_PKGS; do resolvedPath=$(resolvePath "$i") if [ -n "$resolvedPath" ] && [ ! -f "$INIT_DIR/built-pkgs/$(basename $i | sed "s/.rat/.isOptional/g")" ]; then echo "Extracting '$(basename $resolvedPath)'..." tar -xf "$resolvedPath" pkg-header packageCategory=$(getElementFromHeader 2) if [ "$packageCategory" == "VulkanDriver" ]; then cp -f "$resolvedPath" "vulkanDrivers" elif [ "$packageCategory" == "Box64" ]; then cp -f "$resolvedPath" "box64" elif [ "$packageCategory" == "Wine" ]; then cp -f "$resolvedPath" "wine" elif [ "$packageCategory" == "AdrenoTools" ]; then cp -f "$resolvedPath" "adrenoTools" else tar -xf "$resolvedPath" fi if [ -f "makeSymlinks.sh" ]; then cat makeSymlinks.sh >> new_makeSymlinks.sh rm -f makeSymlinks.sh fi fi done mv new_makeSymlinks.sh makeSymlinks.sh $INIT_DIR/tools/create-rat-pkg.sh "MiceWine-RootFS" "MiceWine RootFS" "" "$ARCH" "($GIT_SHORT_SHA)" "rootfs" "$PWD" "$INIT_DIR" cd "$INIT_DIR" rm -rf /tmp/$RAND_VAL ================================================ FILE: packages/FreeGLUT/build.sh ================================================ PKG_VER=3.4.0 SRC_URL=https://downloads.sourceforge.net/freeglut/freeglut-$PKG_VER.tar.gz CMAKE_ARGS="-DANDROID=OFF -DCMAKE_LIBRARY_PATH=$PREFIX_DIR/lib" CFLAGS="-I$PREFIX_DIR/include" LDFLAGS="-L$PREFIX_DIR/lib -lGL -landroid-shmem" DEPENDENCIES="libX11 libXi libXrandr libXxf86vm GLU android-shmem" ================================================ FILE: packages/FreeGLUT/fix-cmake-minimum.patch ================================================ diff -uNr freeglut-3.4.0/CMakeLists.txt freeglut-3.4.0-fix/CMakeLists.txt --- freeglut-3.4.0/CMakeLists.txt 2022-10-07 13:12:51.000000000 -0300 +++ freeglut-3.4.0-fix/CMakeLists.txt 2025-04-16 14:32:50.880357391 -0300 @@ -1,4 +1,4 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 3.0.0 FATAL_ERROR) +CMAKE_MINIMUM_REQUIRED(VERSION 3.12...3.21 FATAL_ERROR) PROJECT(freeglut C) # for multiarch LIBDIR support (requires cmake>=2.8.8) ================================================ FILE: packages/FreeGLUT/src-fg_internal.h.patch ================================================ diff -uNr freeglut-3.2.1/src/fg_internal.h freeglut-3.2.1.mod/src/fg_internal.h --- freeglut-3.2.1/src/fg_internal.h 2019-09-25 13:08:07.000000000 +0300 +++ freeglut-3.2.1.mod/src/fg_internal.h 2019-12-22 01:43:56.649519813 +0200 @@ -46,7 +46,7 @@ || ( defined(__CYGWIN__) && defined(X_DISPLAY_MISSING) ) # define TARGET_HOST_MS_WINDOWS 1 -#elif defined (__ANDROID__) +#elif 0 # define TARGET_HOST_ANDROID 1 #elif defined (__QNXNTO__) || defined (__PLAYBOOK__) ================================================ FILE: packages/FreeGLUT/src-x11-fg_main_x11.c.patch ================================================ https://github.com/termux/termux-packages/issues/15852 --- a/src/x11/fg_main_x11.c +++ b/src/x11/fg_main_x11.c @@ -30,6 +30,7 @@ #include "../fg_internal.h" #include #include +#include /* ================================================ FILE: packages/GLU/build.sh ================================================ PKG_VER=9.0.3 SRC_URL=https://mesa.freedesktop.org/archive/glu/glu-$PKG_VER.tar.xz MESON_ARGS=" " DEPENDENCIES="libglvnd" ================================================ FILE: packages/Vulkan-Headers/build.sh ================================================ PKG_VER=1.4.304 SRC_URL=https://github.com/KhronosGroup/Vulkan-Headers/archive/v$PKG_VER.tar.gz CMAKE_ARGS=" " ================================================ FILE: packages/Vulkan-Loader/0001-fix-hardcoded-pathes.patch ================================================ --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -149,9 +149,9 @@ set(LOADER_HELPER_FOLDER "Helper Targets") if(UNIX) - set(FALLBACK_CONFIG_DIRS "/etc/xdg" CACHE STRING + set(FALLBACK_CONFIG_DIRS "/data/data/com.micewine.emu/files/usr/etc/xdg" CACHE STRING "Search path to use when XDG_CONFIG_DIRS is unset or empty or the current process is SUID/SGID. Default is freedesktop compliant.") - set(FALLBACK_DATA_DIRS "/usr/local/share:/usr/share" CACHE STRING + set(FALLBACK_DATA_DIRS "/data/data/com.micewine.emu/files/usr/share" CACHE STRING "Search path to use when XDG_DATA_DIRS is unset or empty or the current process is SUID/SGID. Default is freedesktop compliant.") set(SYSCONFDIR "" CACHE STRING "System-wide search directory. If not set or empty, CMAKE_INSTALL_FULL_SYSCONFDIR and /etc are used.") @@ -338,8 +338,8 @@ target_compile_definitions(loader_common_options INTERFACE SYSCONFDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}") # Make sure /etc is searched by the loader - if(NOT (CMAKE_INSTALL_FULL_SYSCONFDIR STREQUAL "/etc")) - target_compile_definitions(loader_common_options INTERFACE EXTRASYSCONFDIR="/etc") + if(NOT (CMAKE_INSTALL_FULL_SYSCONFDIR STREQUAL "/data/data/com.micewine.emu/files/usr/etc")) + target_compile_definitions(loader_common_options INTERFACE EXTRASYSCONFDIR="/data/data/com.micewine.emu/files/usr/etc") endif() endif() endif() ================================================ FILE: packages/Vulkan-Loader/0002-properly-enable-extensions.patch ================================================ diff -uNr 37-Vulkan-Loader/CMakeLists.txt 37-Vulkan-Loader.mod/CMakeLists.txt --- 37-Vulkan-Loader/CMakeLists.txt 2024-03-16 23:47:45.918186172 -0300 +++ 37-Vulkan-Loader.mod/CMakeLists.txt 2024-03-16 23:52:09.421513293 -0300 @@ -109,6 +109,10 @@ find_package(PkgConfig REQUIRED QUIET) # Use PkgConfig to find Linux system libraries + if(ANDROID) + target_compile_definitions(platform_wsi INTERFACE VK_USE_PLATFORM_ANDROID_KHR) + endif() + if(BUILD_WSI_XCB_SUPPORT) pkg_check_modules(XCB REQUIRED QUIET IMPORTED_TARGET xcb) target_compile_definitions(platform_wsi INTERFACE VK_USE_PLATFORM_XCB_KHR) ================================================ FILE: packages/Vulkan-Loader/build.sh ================================================ PKG_VER=1.4.304 SRC_URL=https://github.com/KhronosGroup/Vulkan-Loader/archive/refs/tags/v$PKG_VER.tar.gz CMAKE_ARGS="-DBUILD_TESTS=OFF -DCMAKE_SYSTEM_NAME=Linux -DENABLE_WERROR=OFF -DVULKAN_HEADERS_INSTALL_DIR=$PREFIX -DUSE_GAS=OFF" DEPENDENCIES="Vulkan-Headers libX11 libXrandr" ================================================ FILE: packages/Vulkan-Tools/01-no-android.patch ================================================ --- a/cube/CMakeLists.txt +++ b/cube/CMakeLists.txt @@ -61,11 +61,7 @@ endif() endif() -if(ANDROID OR APPLE) - set(WSI_DISPLAY_DEFAULT_SETTING "OFF") -else() set(WSI_DISPLAY_DEFAULT_SETTING "ON") -endif() option(BUILD_WSI_DISPLAY_SUPPORT "Build DISPLAY WSI support" ${WSI_DISPLAY_DEFAULT_SETTING}) @@ -167,8 +163,6 @@ if(WIN32) add_definitions(-DWIN32_LEAN_AND_MEAN -DNOMINMAX) list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_WIN32_KHR) -elseif(ANDROID) - list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_ANDROID_KHR) elseif(APPLE) list(APPEND ENABLED_CUBE_PLATFORMS VK_USE_PLATFORM_METAL_EXT) elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU") @@ -231,13 +225,6 @@ if(APPLE) add_subdirectory(macOS/cube) -elseif (ANDROID) - add_library(vkcube MODULE) - - target_sources(vkcube PRIVATE cube.c) - - add_subdirectory(android) - elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|BSD|GNU") add_executable(vkcube) target_sources(vkcube PRIVATE @@ -285,9 +272,7 @@ target_include_directories(vkcube PRIVATE .) target_link_libraries(vkcube Vulkan::Headers volk::volk_headers) -if (ANDROID) - install(TARGETS vkcube DESTINATION ${CMAKE_INSTALL_LIBDIR}) -elseif(APPLE) +if(APPLE) install( TARGETS vkcube # Install runtime dependencies like the Vulkan::Loader so the app is self-contained @@ -301,10 +286,6 @@ install(TARGETS vkcube) endif() -if (ANDROID) - return() -endif() - if (XCB_LINK_LIBRARIES) target_compile_definitions(vkcube PRIVATE "XCB_LIBRARY=\"${XCB_LINK_LIBRARIES}\"") endif() --- a/cube/cube.c +++ b/cube/cube.c @@ -105,7 +105,7 @@ fflush(stdout); } -#elif defined __ANDROID__ +#elif 0 #include #define ERR_EXIT(err_msg, err_class) \ do { \ @@ -643,7 +643,7 @@ if (!demo->suppress_popups) MessageBox(NULL, message, "Alert", MB_OK); in_callback = false; -#elif defined(ANDROID) +#elif 0 if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) { __android_log_print(ANDROID_LOG_INFO, APP_SHORT_NAME, "%s", message); @@ -4703,7 +4703,7 @@ i++; continue; } -#if defined(ANDROID) +#if 0 ERR_EXIT("Usage: vkcube [--validate]\n", "Usage"); #else @@ -4913,7 +4913,7 @@ } #endif -#if defined(VK_USE_PLATFORM_ANDROID_KHR) +#if 0 #include #include #include "android_util.h" ================================================ FILE: packages/Vulkan-Tools/02-do-not-search-KHR_display-automatically.patch ================================================ https://github.com/termux/termux-packages/issues/22542 --- a/cube/cube.c +++ b/cube/cube.c @@ -3931,7 +3931,11 @@ static void demo_init_vk(struct demo *demo) { #endif #if defined(VK_USE_PLATFORM_DISPLAY_KHR) if (!strcmp(VK_KHR_DISPLAY_EXTENSION_NAME, instance_extensions[i].extensionName) && +#ifdef __ANDROID__ + (demo->wsi_platform == WSI_PLATFORM_DISPLAY)) { +#else (demo->wsi_platform == WSI_PLATFORM_AUTO || demo->wsi_platform == WSI_PLATFORM_DISPLAY)) { +#endif platformSurfaceExtFound = true; demo->extension_names[demo->enabled_extension_count++] = VK_KHR_DISPLAY_EXTENSION_NAME; } diff --git a/cube/cube.cpp b/cube/cube.cpp index 6c4f9b05..e488f2ef 100644 --- a/cube/cube.cpp +++ b/cube/cube.cpp @@ -1534,7 +1534,11 @@ void Demo::init_vk() { #endif #if defined(VK_USE_PLATFORM_DISPLAY_KHR) else if (!strcmp(VK_KHR_DISPLAY_EXTENSION_NAME, extension.extensionName) && +#ifdef __ANDROID__ + (wsi_platform == WsiPlatform::display)) { +#else (wsi_platform == WsiPlatform::auto_ || wsi_platform == WsiPlatform::display)) { +#endif platformSurfaceExtFound = 1; enabled_instance_extensions.push_back(VK_KHR_DISPLAY_EXTENSION_NAME); } ================================================ FILE: packages/Vulkan-Tools/build.sh ================================================ PKG_VER=1.4.304 SRC_URL=https://github.com/KhronosGroup/Vulkan-Tools/archive/refs/tags/v$PKG_VER.tar.gz CMAKE_ARGS="-DCMAKE_SYSTEM_NAME=Linux -DBUILD_CUBE=ON -DBUILD_ICD=OFF -DBUILD_WSI_WAYLAND_SUPPORT=OFF -DBUILD_WSI_XCB_SUPPORT=ON -DBUILD_WSI_XLIB_SUPPORT=ON -DVULKAN_HEADERS_INSTALL_DIR=$PREFIX" DEPENDENCIES="Vulkan-Loader Vulkan-Volk libX11 libXrandr libxcb" ================================================ FILE: packages/Vulkan-Volk/build.sh ================================================ PKG_VER=1.4.304 SRC_URL=https://github.com/zeux/volk/archive/refs/tags/$PKG_VER.tar.gz CMAKE_ARGS="-DVOLK_INSTALL=ON" DEPENDENCIES="Vulkan-Headers" ================================================ FILE: packages/android-shmem/build.sh ================================================ PKG_VER=0.4 SRC_URL=https://github.com/termux/libandroid-shmem/archive/v$PKG_VER.tar.gz ================================================ FILE: packages/android-shmem/fix-build.patch ================================================ diff -uNr 58-android-shmem/shmem.c 58-android-shmem.mod/shmem.c --- 58-android-shmem/shmem.c 2022-03-27 13:15:50.000000000 -0300 +++ 58-android-shmem.mod/shmem.c 2024-04-13 19:22:22.244764249 -0300 @@ -16,8 +16,12 @@ #include "shm.h" +#include +#include + #define DBG(...) __android_log_print(ANDROID_LOG_INFO, "shmem", __VA_ARGS__) #define ASHV_KEY_SYMLINK_PATH _PATH_TMP "ashv_key_%d" +#define _PATH_TMP "/data/data/com.micewine.emu/files/usr/tmp" #define ANDROID_SHMEM_SOCKNAME "/dev/shm/%08x" #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) ================================================ FILE: packages/box64-0.3.2/build.sh ================================================ PKG_VER=0.3.2 PKG_CATEGORY="Box64" PKG_PRETTY_NAME="Box64" PKG_DOWNLOADABLE=1 GIT_URL=https://github.com/ptitSeb/box64 GIT_COMMIT=769c6c8f6139c20099f8569582c4f5854c6d13e6 CMAKE_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DANDROID=1 -DBAD_SIGNAL=1 -DARM_DYNAREC=1" BLACKLIST_ARCH=x86_64 ================================================ FILE: packages/box64-0.3.2/custom-make-install.sh ================================================ mkdir -p $DESTDIR/$PREFIX/bin mkdir -p $DESTDIR/$PREFIX/etc cp box64 $DESTDIR/$PREFIX/bin cp ../system/box64.box64rc $DESTDIR/$PREFIX/etc ================================================ FILE: packages/box64-0.3.2/fix-signal.patch ================================================ diff --git a/src/include/signals.h b/src/include/signals.h index ef72f401..2fae6c60 100644 --- a/src/include/signals.h +++ b/src/include/signals.h @@ -4,6 +4,17 @@ typedef void (*sighandler_t)(int); +#ifdef ANDROID +typedef struct x64_sigaction_s { + int sa_flags; + union { + sighandler_t _sa_handler; + void (*_sa_sigaction)(int, siginfo_t *, void *); + } _u; + sigset_t sa_mask; + void (*sa_restorer)(void); +} x64_sigaction_t; +#else typedef struct x64_sigaction_s { union { sighandler_t _sa_handler; @@ -13,6 +24,7 @@ typedef struct x64_sigaction_s { uint32_t sa_flags; void (*sa_restorer)(void); } x64_sigaction_t; +#endif typedef struct x64_sigaction_restorer_s { union { ================================================ FILE: packages/box64-0.3.3-8bb53e1/build.sh ================================================ PKG_VER=0.3.3-[gss] PKG_CATEGORY="Box64" PKG_PRETTY_NAME="Box64" PKG_DOWNLOADABLE=1 GIT_URL=https://github.com/ptitSeb/box64 GIT_COMMIT=8bb53e10018e7ebee785afc8ad571f1cee5f9bef CMAKE_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DANDROID=1 -DBAD_SIGNAL=1 -DARM_DYNAREC=1" BLACKLIST_ARCH=x86_64 ================================================ FILE: packages/box64-0.3.3-8bb53e1/custom-make-install.sh ================================================ mkdir -p $DESTDIR/$PREFIX/bin mkdir -p $DESTDIR/$PREFIX/etc cp box64 $DESTDIR/$PREFIX/bin cp ../system/box64.box64rc $DESTDIR/$PREFIX/etc ================================================ FILE: packages/box64-0.3.4/build.sh ================================================ PKG_VER=0.3.4 PKG_CATEGORY="Box64" PKG_PRETTY_NAME="Box64" PKG_DOWNLOADABLE=1 GIT_URL=https://github.com/ptitSeb/box64 GIT_COMMIT=2b300bd199a7a65a3de1eecd24d6dff5593a9b55 CMAKE_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DANDROID=1 -DBAD_SIGNAL=1 -DARM_DYNAREC=1" BLACKLIST_ARCH=x86_64 ================================================ FILE: packages/box64-0.3.4/custom-make-install.sh ================================================ mkdir -p $DESTDIR/$PREFIX/bin mkdir -p $DESTDIR/$PREFIX/etc cp box64 $DESTDIR/$PREFIX/bin cp ../system/box64.box64rc $DESTDIR/$PREFIX/etc ================================================ FILE: packages/box64-0.3.6/build.sh ================================================ PKG_VER=0.3.6 PKG_CATEGORY="Box64" PKG_PRETTY_NAME="Box64" PKG_DOWNLOADABLE=1 GIT_URL=https://github.com/ptitSeb/box64 GIT_COMMIT=03d220b1d297a9e5be81760833b014edf9dfe7ab CMAKE_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DANDROID=1 -DBAD_SIGNAL=1 -DARM_DYNAREC=1" BLACKLIST_ARCH=x86_64 ================================================ FILE: packages/box64-0.3.6/custom-make-install.sh ================================================ mkdir -p $DESTDIR/$PREFIX/bin mkdir -p $DESTDIR/$PREFIX/etc cp box64 $DESTDIR/$PREFIX/bin cp ../system/box64.box64rc $DESTDIR/$PREFIX/etc ================================================ FILE: packages/box64-0.3.7-cb2c29c/build.sh ================================================ PKG_VER=0.3.7-cb2c29c PKG_CATEGORY="Box64" PKG_PRETTY_NAME="Box64" GIT_URL=https://github.com/ptitSeb/box64 GIT_COMMIT=cb2c29c5f992cb4e5ec481f8d99b973b90411403 CMAKE_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DANDROID=1 -DBAD_SIGNAL=1 -DARM_DYNAREC=1" BLACKLIST_ARCH=x86_64 ================================================ FILE: packages/box64-0.3.7-cb2c29c/custom-make-install.sh ================================================ mkdir -p $DESTDIR/$PREFIX/bin mkdir -p $DESTDIR/$PREFIX/etc cp box64 $DESTDIR/$PREFIX/bin cp ../system/box64.box64rc $DESTDIR/$PREFIX/etc ================================================ FILE: packages/box64-0.3.8/build.sh ================================================ PKG_VER=0.3.8 PKG_CATEGORY="Box64" PKG_PRETTY_NAME="Box64" PKG_DOWNLOADABLE=1 GIT_URL=https://github.com/ptitSeb/box64 GIT_COMMIT=81c56d7155cdd7a4c49173a2fe4d7bdd87698683 CMAKE_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DANDROID=1 -DBAD_SIGNAL=1 -DARM_DYNAREC=1" BLACKLIST_ARCH=x86_64 ================================================ FILE: packages/box64-0.3.8/custom-make-install.sh ================================================ mkdir -p $DESTDIR/$PREFIX/bin mkdir -p $DESTDIR/$PREFIX/etc cp box64 $DESTDIR/$PREFIX/bin cp ../system/box64.box64rc $DESTDIR/$PREFIX/etc ================================================ FILE: packages/box64-0.3.9-056999e/build.sh ================================================ PKG_VER=0.3.9-056999e PKG_CATEGORY="Box64" PKG_PRETTY_NAME="Box64" PKG_DOWNLOADABLE=1 GIT_URL=https://github.com/ptitSeb/box64 GIT_COMMIT=056999e8fd7ec7649762179f52e32819ef5e48e1 CMAKE_ARGS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DANDROID=1 -DBAD_SIGNAL=1 -DARM_DYNAREC=1" BLACKLIST_ARCH=x86_64 ================================================ FILE: packages/box64-0.3.9-056999e/custom-make-install.sh ================================================ mkdir -p $DESTDIR/$PREFIX/bin mkdir -p $DESTDIR/$PREFIX/etc cp box64 $DESTDIR/$PREFIX/bin cp ../system/box64.box64rc $DESTDIR/$PREFIX/etc ================================================ FILE: packages/brotli/build.sh ================================================ PKG_VER=1.1.0 SRC_URL=https://github.com/google/brotli/archive/v$PKG_VER.tar.gz CMAKE_ARGS=" " ================================================ FILE: packages/fakeintl/Makefile ================================================ install: install -Dm600 libintl.h $(DESTDIR)/$(PREFIX)/include/libintl.h ================================================ FILE: packages/fakeintl/build.sh ================================================ PKG_VER=1 BUILD_IN_SRC=1 ================================================ FILE: packages/fakeintl/libintl.h ================================================ #ifndef _LIBINTL_H #define _LIBINTL_H #include #include static __inline__ char* gettext(const char* msgid) { return (char*) msgid; } static __inline__ char* dgettext(const char* domainname, const char* msgid) { return (char*) msgid; } static __inline__ char* dcgettext(const char* domainname, const char* msgid, int category) { return (char*) msgid; } static __inline__ char* ngettext(const char* msgid1, const char* msgid2, unsigned long int n) { return (char *) ((n == 1) ? msgid1 : msgid2); } static __inline__ char* dngettext(const char* domainname, const char* msgid1, const char* msgid2, unsigned long int n) { return (char *) ((n == 1) ? msgid1 : msgid2); } static __inline__ char* dcngettext(const char* domainname, const char* msgid1, const char* msgid2, unsigned long int n, int category) { return (char *) ((n == 1) ? msgid1 : msgid2); } static __inline__ char* textdomain(const char* domainname) { static const char default_str[] = "messages"; if (domainname && *domainname && strcmp(domainname, default_str)) { errno = EINVAL; return NULL; } return (char*) default_str; } static __inline__ char* bindtextdomain(const char* domainname, const char* dirname) { static const char dir[] = "/"; if (!domainname || !*domainname || (dirname && ((dirname[0] != '/') || dirname[1]))) { errno = EINVAL; return NULL; } return (char*) dir; } static __inline__ char* bind_textdomain_codeset(const char* domainname, const char* codeset) { if (!domainname || !*domainname || (codeset && strcasecmp(codeset, "UTF-8"))) { errno = EINVAL; } return NULL; } #endif ================================================ FILE: packages/freetype/build.sh ================================================ PKG_VER=2.13.3 SRC_URL=https://downloads.sourceforge.net/freetype/freetype-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --without-bzip2 --without-harfbuzz" DEPENDENCIES="brotli libpng zlib" ================================================ FILE: packages/glib/build.sh ================================================ PKG_VER=2.82.4 SRC_URL=https://download.gnome.org/sources/glib/${PKG_VER%.*}/glib-$PKG_VER.tar.xz MESON_ARGS="-Dintrospection=disabled -Druntime_dir=$PREFIX/var/run -Dlibmount=disabled -Dman-pages=enabled -Dtests=false -Dselinux=disabled -Dlibelf=disabled" CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib -l:libiconv.a" DEPENDENCIES="zlib libiconv pcre2 libffi" ================================================ FILE: packages/glib/gio-gdbusprivate.c.patch ================================================ --- ./gio/gdbusprivate.c.orig 2021-12-10 17:28:44.551721009 +0530 +++ ./gio/gdbusprivate.c 2021-12-10 19:24:17.521718364 +0530 @@ -2477,8 +2477,9 @@ /* Copy what dbus.git does: allow the /var/lib path to be configurable at * build time, but hard-code the system-wide machine ID path in /etc. */ + /* Note that LOCALSTATEDIR is defined as "/data/data/com.micewine.emu/files/usr/var". */ const gchar *var_lib_path = LOCALSTATEDIR "/lib/dbus/machine-id"; - const gchar *etc_path = "/etc/machine-id"; + const gchar *etc_path = "/data/data/com.micewine.emu/files/usr/etc/machine-id"; if (!g_file_get_contents (var_lib_path, &ret, ================================================ FILE: packages/glib/gio-gkeyfilesettingsbackend.c.patch ================================================ --- ./gio/gkeyfilesettingsbackend.c.orig 2021-12-10 19:39:09.321718024 +0530 +++ ./gio/gkeyfilesettingsbackend.c 2021-12-10 19:39:26.371718018 +0530 @@ -662,7 +662,7 @@ load_system_settings (GKeyfileSettingsBackend *kfsb) { GError *error = NULL; - const char *dir = "/etc/glib-2.0/settings"; + const char *dir = "/data/data/com.micewine.emu/files/usr/etc/glib-2.0/settings"; char *path; char *contents; ================================================ FILE: packages/glib/gio-gnetworking.h.in.patch ================================================ --- ./gio/gnetworking.h.in.orig 2021-12-10 19:44:29.271717902 +0530 +++ ./gio/gnetworking.h.in 2021-12-10 19:45:00.881717890 +0530 @@ -51,7 +51,7 @@ #endif #ifndef _PATH_RESCONF -#define _PATH_RESCONF "/etc/resolv.conf" +#define _PATH_RESCONF "/data/data/com.micewine.emu/files/usr/etc/resolv.conf" #endif #ifndef CMSG_LEN ================================================ FILE: packages/glib/gio-gunixmounts.c.patch ================================================ --- ./gio/gunixmounts.c.orig 2021-12-10 16:01:41.791723001 +0530 +++ ./gio/gunixmounts.c 2021-12-10 16:03:20.861722964 +0530 @@ -20,6 +20,8 @@ * Author: Alexander Larsson */ +#include + /* Prologue {{{1 */ #include "config.h" ================================================ FILE: packages/glib/gio-xdgmime-xdgmime.c.patch ================================================ --- ./gio/xdgmime/xdgmime.c.orig 2021-12-10 20:05:07.591717430 +0530 +++ ./gio/xdgmime/xdgmime.c 2021-12-10 20:05:11.861717428 +0530 @@ -235,7 +235,7 @@ xdg_data_dirs = getenv ("XDG_DATA_DIRS"); if (xdg_data_dirs == NULL) - xdg_data_dirs = "/usr/local/share/:/usr/share/"; + xdg_data_dirs = "/data/data/com.micewine.emu/files/usr/local/share/:/data/data/com.micewine.emu/files/usr/share/"; /* Work out how many dirs we’re dealing with. */ if (xdg_data_home != NULL || home != NULL) ================================================ FILE: packages/glib/glib-gcharset.c.patch ================================================ --- ./glib/gcharset.c.orig 2021-12-10 21:38:06.571715302 +0530 +++ ./glib/gcharset.c 2021-12-10 21:38:11.361715300 +0530 @@ -503,7 +503,7 @@ if (g_once_init_enter_pointer (&alias_table)) { GHashTable *table = g_hash_table_new (g_str_hash, g_str_equal); - read_aliases ("/usr/share/locale/locale.alias", table); + read_aliases ("/data/data/com.micewine.emu/files/usr/share/locale/locale.alias", table); g_once_init_leave_pointer (&alias_table, table); } ================================================ FILE: packages/glib/glib-gspawn.c.patch ================================================ +++ ./glib/gspawn-posix.c @@ -1404,7 +1404,7 @@ * * what to search if PATH is unset. POSIX may, dunno. * */ - chosen_search_path = "/bin:/usr/bin:."; + chosen_search_path = "/data/data/com.micewine.emu/files/usr/bin:."; } if (search_path || search_path_from_envp) @@ -1815,7 +1815,7 @@ if (argc + 2 > argv_buffer_len) return FALSE; - argv_buffer[0] = (char *) "/bin/sh"; + argv_buffer[0] = (char *) "/data/data/com.micewine.emu/files/usr/bin/sh"; argv_buffer[1] = (char *) file; while (argc > 0) { ================================================ FILE: packages/glib/glib-gthread-posix.c.patch ================================================ +++ ./glib/gthread-posix.c @@ -1079,7 +1079,7 @@ sampled = cond->i[0]; g_mutex_unlock (mutex); -#if defined(HAVE_FUTEX_TIME64) +#if 0 #if defined(__ANDROID__) if (__builtin_available (android 30, *)) { #else ================================================ FILE: packages/glib/glib-gthreadprivate.h.patch ================================================ +++ ./glib/gthreadprivate.h @@ -46,6 +46,10 @@ #include #include +#ifndef __LP64__ +#include +#endif + #ifndef FUTEX_WAIT_PRIVATE #define FUTEX_WAIT_PRIVATE FUTEX_WAIT #define FUTEX_WAKE_PRIVATE FUTEX_WAKE @@ -73,7 +77,7 @@ * This must not be called with a timeout parameter as that differs * in size between the two syscall variants! */ -#if defined(HAVE_FUTEX) && defined(HAVE_FUTEX_TIME64) +#if defined(HAVE_FUTEX) && defined(HAVE_FUTEX_TIME64) && !defined(__ANDROID__) #if defined(__ANDROID__) #define g_futex_simple(uaddr, futex_op, ...) \ G_STMT_START \ @@ -117,7 +121,7 @@ } \ G_STMT_END #endif /* defined(__ANDROID__) */ -#elif defined(HAVE_FUTEX_TIME64) +#elif defined(HAVE_FUTEX_TIME64) && !defined(__ANDROID__) #define g_futex_simple(uaddr, futex_op, ...) \ G_STMT_START \ { \ ================================================ FILE: packages/glib/glib-gtimezone.patch ================================================ --- ./glib/gtimezone.c.orig 2021-12-11 16:52:41.154480293 +0530 +++ ./glib/gtimezone.c 2021-12-11 16:53:59.829643030 +0530 @@ -46,6 +46,10 @@ #include #endif +#ifdef __ANDROID__ +#include +#endif + /** * SECTION:timezone * @title: GTimeZone @@ -509,6 +513,135 @@ return resolved_identifier; } +/* Android uses a 'persist.sys.timezone' system property for the + * current timezone instead of a /etc/localtime file: + * https://android.googlesource.com/platform/ndk/+/android-2.2_r1/docs/system/libc/OVERVIEW.TXT#67 + * + * There are no files under /usr/share/zoneinfo - instead a single + * /system/usr/share/zoneinfo/tzdata file is used which contains all + * files compiled together with the following tool: + * https://android.googlesource.com/platform/system/timezone/+/master/zone_compactor/main/java/ZoneCompactor.java + */ +static GBytes * +zone_info_android (const gchar *identifier, + gchar **out_identifier) +{ + char sys_timezone[PROP_VALUE_MAX]; + GMappedFile *file; + gchar *tzdata; + gsize tzdata_length; + const gsize index_entry_size = 52; + gint32 header_index_offset, header_data_offset; + gint32 entry_count, current_index; + char* entry_name; + gint32 entry_offset, entry_length; + guint32 entry_name_start, entry_name_end; + guint32 zoneinfo_start, zoneinfo_end; + GBytes *zoneinfo; + GError *error = NULL; + + if (identifier == NULL) + { + if (__system_property_get ("persist.sys.timezone", sys_timezone) < 1) + { + g_warning ("__system_property_get(\"persist.sys.timezone\") failed"); + return NULL; + } + identifier = sys_timezone; + } + + file = g_mapped_file_new ("/system/usr/share/zoneinfo/tzdata", FALSE, &error); + if (file == NULL) + { + g_warning ("Failed mapping tzdata file: %s", error->message); + g_error_free (error); + return NULL; + } + + tzdata = g_mapped_file_get_contents (file); + tzdata_length = g_mapped_file_get_length (file); + if (tzdata == NULL || tzdata_length < 24) + { + g_warning ("Too small tzdata file"); + goto error; + } + + header_index_offset = gint32_from_be (*((gint32_be*) (tzdata + 12))); + header_data_offset = gint32_from_be (*((gint32_be*) (tzdata + 16))); + + if (header_index_offset < 0 || header_data_offset < 0 || header_data_offset < index_entry_size) + { + g_warning ("Invalid tzdata content"); + goto error; + } + + entry_count = (header_data_offset - header_index_offset) / index_entry_size; + if (entry_count < 1) + { + g_warning ("No index entry found"); + goto error; + } + + current_index = 0; + while (current_index < entry_count) + { + if (!g_uint_checked_mul (&entry_name_start, current_index, index_entry_size) || + !g_uint_checked_add (&entry_name_start, entry_name_start, header_index_offset) || + !g_uint_checked_add (&entry_name_end, entry_name_start, 40)) + { + g_warning ("Overflow when computing entry name offset"); + goto error; + } + + entry_name = tzdata + entry_name_start; + + /* The name should be null terminated within the 40 chars. */ + if (memchr (entry_name, 0, 40) == NULL) + { + g_warning ("Invalid index entry"); + goto error; + } + + if (strcmp (entry_name, identifier) == 0) + { + entry_offset = gint32_from_be (*(gint32_be*) (entry_name + 40)); + entry_length = gint32_from_be (*(gint32_be*) (entry_name + 44)); + if (entry_length == 0 || entry_length > 65536) + { + /* Use a reasonable but arbitrary max length of an entry. */ + g_warning ("Invalid zoneinfo entry length"); + goto error; + } + + if (!g_uint_checked_add (&zoneinfo_start, header_data_offset, entry_offset) || + !g_uint_checked_add (&zoneinfo_end, zoneinfo_start, entry_length) || + zoneinfo_end > tzdata_length) + { + g_warning ("Too large zoneinfo entry length"); + goto error; + } + + zoneinfo = g_bytes_new_with_free_func (tzdata + zoneinfo_start, + entry_length, + (GDestroyNotify)g_mapped_file_unref, + g_mapped_file_ref (file)); + g_mapped_file_unref (file); + + if (out_identifier != NULL) + *out_identifier = g_strdup (identifier); + + return zoneinfo; + } + current_index++; + } + +error: + g_mapped_file_unref (file); + return NULL; +} + + + static GBytes* zone_info_unix (const gchar *identifier, const gchar *resolved_identifier) @@ -1773,7 +1906,7 @@ if (tz->t_info == NULL) { #ifdef G_OS_UNIX - GBytes *zoneinfo = zone_info_unix (identifier, resolved_identifier); + GBytes *zoneinfo = zone_info_android(identifier, &resolved_identifier); if (zoneinfo != NULL) { init_zone_from_iana_info (tz, zoneinfo, g_steal_pointer (&resolved_identifier)); ================================================ FILE: packages/glib/glib-gtypes.h.patch ================================================ --- a/glib/gtypes.h +++ b/glib/gtypes.h @@ -429,6 +429,10 @@ #endif #endif +#if defined __clang__ && defined __arm__ +#undef _GLIB_HAVE_BUILTIN_OVERFLOW_CHECKS +#endif + #ifdef _GLIB_HAVE_BUILTIN_OVERFLOW_CHECKS #define g_uint_checked_add(dest, a, b) \ ================================================ FILE: packages/glib/glib-gutils.c.patch ================================================ --- ./glib/gutils.c.orig 2021-12-11 13:35:15.354088542 +0530 +++ ./glib/gutils.c 2021-12-11 13:36:59.724088502 +0530 @@ -369,7 +369,7 @@ * what to search if PATH is unset. POSIX may, dunno. */ - path = "/bin:/usr/bin:."; + path = "/data/data/com.micewine.emu/files/usr/bin:."; } #else n = GetModuleFileNameW (NULL, wfilename, MAXPATHLEN); @@ -949,7 +949,7 @@ if (tmp == NULL || *tmp == '\0') { g_free (tmp); - tmp = g_strdup ("/tmp"); + tmp = g_strdup ("/data/data/com.micewine.emu/files/usr/tmp"); } #endif /* !G_OS_WIN32 */ @@ -1526,7 +1526,7 @@ else return NULL; #elif defined (G_OS_UNIX) - const gchar * const os_release_files[] = { "/etc/os-release", "/usr/lib/os-release" }; + const gchar * const os_release_files[] = { "/data/data/com.micewine.emu/files/usr/etc/os-release", "/data/data/com.micewine.emu/files/usr/lib/os-release" }; gsize i; gchar *buffer = NULL; gchar *result = NULL; @@ -2465,7 +2465,7 @@ */ #ifndef G_OS_WIN32 if (!data_dirs || !data_dirs[0]) - data_dirs = "/usr/local/share/:/usr/share/"; + data_dirs = "/data/data/com.micewine.emu/files/usr/local/share/:/data/data/com.micewine.emu/files/usr/share/"; data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0); #else ================================================ FILE: packages/glib/glib-no-ovverride-host-binary.patch ================================================ +++ ./girepository/compiler/meson.build @@ -26,7 +26,7 @@ # Only override the user-installed compiler if we need to generate the GIRs # GLib, Gio, and GObject... -if enable_gir +if enable_gir and meson.can_run_host_binaries() # Replace the default g-ir-compiler target with the version we # just built. meson.override_find_program('g-ir-compiler', gicompilerepository) ================================================ FILE: packages/glib/glib-tests-meson.build.patch ================================================ --- a/glib/tests/meson.build +++ b/glib/tests/meson.build @@ -232,7 +232,7 @@ 'include' : {}, 'unix' : {}, } - if have_rtld_next and glib_build_shared + if false getpwuid_preload = shared_library('getpwuid-preload', 'getpwuid-preload.c', name_prefix : '', ================================================ FILE: packages/glib/meson.build.patch ================================================ --- glib-2.82.4/meson.build 2024-12-11 19:21:22.000000000 -0300 +++ glib-2.82.4-fix/meson.build 2025-04-16 22:20:15.974787910 -0300 @@ -569,7 +569,6 @@ '-Wno-format-zero-length', # We explicitly require variadic macros '-Wno-variadic-macros', - '-Werror=format=2', '-Werror=init-self', '-Werror=missing-include-dirs', '-Werror=pointer-arith', @@ -695,7 +694,6 @@ 'getresuid', 'getvfsstat', 'gmtime_r', - 'hasmntopt', 'inotify_init1', 'issetugid', 'kevent', @@ -1002,7 +1000,7 @@ int main (int argc, char ** argv) { syscall (__NR_futex, NULL, FUTEX_WAKE, FUTEX_WAIT); return 0; - }''', name : 'futex(2) system call') + }''', name : 'futex(2) system call') and host_system != 'android' glib_conf.set('HAVE_FUTEX', 1) endif if cc.compiles('''#include @@ -1011,7 +1009,7 @@ int main (int argc, char ** argv) { syscall (__NR_futex_time64, NULL, FUTEX_WAKE, FUTEX_WAIT); return 0; - }''', name : 'futex_time64(2) system call') + }''', name : 'futex_time64(2) system call') and host_system != 'android' glib_conf.set('HAVE_FUTEX_TIME64', 1) endif @@ -1048,7 +1046,7 @@ syscall (SYS_pidfd_open, 0, 0); waitid (P_PIDFD, 0, &child_info, WEXITED | WNOHANG); return 0; - }''', name : 'pidfd_open(2) system call') + }''', name : 'pidfd_open(2) system call') and host_system != 'android' glib_conf.set('HAVE_PIDFD', 1) endif @@ -2602,11 +2600,7 @@ # introspection gir_scanner = find_program('g-ir-scanner', required: get_option('introspection')) -enable_gir = get_option('introspection').allowed() and gir_scanner.found() and meson.can_run_host_binaries() - -if get_option('introspection').enabled() and not meson.can_run_host_binaries() - error('Running binaries on the build host needs to be supported to build with -Dintrospection=enabled') -endif +enable_gir = get_option('introspection').allowed() and gir_scanner.found() gir_args = [ '--quiet', ================================================ FILE: packages/gst-plugins-bad/build.sh ================================================ PKG_VER=1.24.11 SRC_URL=https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-$PKG_VER.tar.xz MESON_ARGS="-Dandroidmedia=disabled -Dexamples=disabled -Drtmp=disabled -Dshm=disabled -Dtests=disabled -Dzbar=disabled -Dwebp=disabled -Dvulkan=disabled -Dhls-crypto=openssl" LDFLAGS="-lm" DEPENDENCIES="glib gstreamer gst-plugins-base opus libsndfile libX11 libxml2 openssl" ================================================ FILE: packages/gst-plugins-bad/fix-build.patch ================================================ diff -uNr gst-plugins-bad/sys/kms/gstkmssink.c gst-plugins-bad.mod/sys/kms/gstkmssink.c --- gst-plugins-bad/sys/kms/gstkmssink.c 2025-01-24 23:59:44.074586375 -0300 +++ gst-plugins-bad.mod/sys/kms/gstkmssink.c 2025-01-24 23:59:39.355599380 -0300 @@ -68,6 +68,10 @@ #include "gstkmsedid.h" #endif +#ifdef __ANDROID__ +#define ffs __builtin_ffs +#endif + #define GST_PLUGIN_NAME "kmssink" #define GST_PLUGIN_DESC "Video sink using the Linux kernel mode setting API" ================================================ FILE: packages/gst-plugins-base/build.sh ================================================ PKG_VER=1.24.11 SRC_URL=https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-$PKG_VER.tar.xz MESON_ARGS="-Dintrospection=disabled -Dtests=disabled -Dexamples=disabled -Dpango=disabled " MESON_ARGS+="-Dtools=disabled -Dglib-asserts=disabled -Dglib-checks=disabled" LDFLAGS="-L$PREFIX/lib -landroid-shmem" DEPENDENCIES="gstreamer glib android-shmem libogg opus libvorbis libX11 libxcb libXext libXi zlib" ================================================ FILE: packages/gst-plugins-good/build.sh ================================================ PKG_VER=1.24.11 SRC_URL=https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-$PKG_VER.tar.xz MESON_ARGS="-Dcairo=disabled -Dexamples=disabled -Dgdk-pixbuf=disabled -Doss=disabled " MESON_ARGS+="-Doss4=disabled -Dtests=disabled -Dv4l2=disabled -Daalib=disabled" LDFLAGS="-L$PREFIX/lib -landroid-shmem" DEPENDENCIES="glib gst-plugins-base android-shmem" ================================================ FILE: packages/gst-plugins-ugly/build.sh ================================================ PKG_VER=1.24.11 SRC_URL=https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-$PKG_VER.tar.xz MESON_ARGS="-Dtests=disabled" DEPENDENCIES="glib gst-plugins-base" ================================================ FILE: packages/gstreamer/build.sh ================================================ PKG_VER=1.24.11 SRC_URL=https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-$PKG_VER.tar.xz MESON_ARGS="-Dintrospection=disabled -Dcheck=disabled -Dtests=disabled -Dexamples=disabled " MESON_ARGS+="-Dbenchmarks=disabled -Dlibunwind=disabled -Dlibdw=disabled -Dnls=disabled" CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" DEPENDENCIES="glib" ================================================ FILE: packages/icoutils/build.sh ================================================ PKG_VER=1 GIT_URL=https://github.com/KreitinnSoftware/icoutils CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib -lpng16" DEPENDENCIES="libpng" ================================================ FILE: packages/libX11/build.sh ================================================ PKG_VER=1.8.9 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libX11-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-malloc0returnsnull" LDFLAGS="-L$PREFIX/lib -landroid-shmem" DEPENDENCIES="xorgproto libxcb xtrans xorg-utils-macros android-shmem" ================================================ FILE: packages/libX11/fix-pthread.patch ================================================ --- 13-libX11/configure 2024-03-02 19:00:43.598785000 -0300 +++ 13-libX11.mod/configure 2024-03-02 19:01:08.520521000 -0300 @@ -22175,7 +22175,7 @@ if test x$xthreads = xyes ; then case $host_os in linux*|gnu*|k*bsd*-gnu) - XTHREADLIB=-lpthread ;; + XTHREADLIB=-pthread ;; netbsd*) XTHREAD_CFLAGS="-D_POSIX_THREAD_SAFE_FUNCTIONS" XTHREADLIB="-lpthread" ;; ================================================ FILE: packages/libX11/src-CrGlCur.c.patch ================================================ diff -uNr libX11-1.6.7/src/CrGlCur.c libX11-1.6.7.mod/src/CrGlCur.c --- libX11-1.6.7/src/CrGlCur.c 2018-10-09 17:27:08.000000000 +0300 +++ libX11-1.6.7.mod/src/CrGlCur.c 2018-11-28 19:31:06.941489053 +0200 @@ -55,7 +55,7 @@ #endif #ifndef LIBXCURSOR -#define LIBXCURSOR "libXcursor.so.1" +#define LIBXCURSOR "libXcursor.so" #endif static char libraryName[] = LIBXCURSOR; ================================================ FILE: packages/libX11/src-XlibInt.c.patch ================================================ diff -uNr libX11-1.6.8/src/XlibInt.c libX11-1.6.8.mod/src/XlibInt.c --- libX11-1.6.8/src/XlibInt.c 2019-06-17 17:47:35.000000000 +0300 +++ libX11-1.6.8.mod/src/XlibInt.c 2019-06-29 22:13:06.054460413 +0300 @@ -1263,7 +1263,7 @@ WSASetLastError(last_error); #else last_error = errno; - ioctl(ConnectionNumber(dpy), FIONREAD, &bytes); + ioctl(ConnectionNumber(dpy), /* FIONREAD */ 0x541B, &bytes); errno = last_error; #endif return bytes; ================================================ FILE: packages/libXau/build.sh ================================================ PKG_VER=1.0.11 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libXau-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" DEPENDENCIES="xorgproto" ================================================ FILE: packages/libXau/libXau-1.0.8_AuLock.c.patch ================================================ diff -uNr libXau-1.0.8/AuLock.c libXau-1.0.8.mod/AuLock.c --- libXau-1.0.8/AuLock.c 2013-05-25 01:04:09.000000000 +0300 +++ libXau-1.0.8.mod/AuLock.c 2017-11-23 14:08:52.004479977 +0200 @@ -91,7 +91,7 @@ } else #endif { - if (link (creat_name, link_name) != -1) + if (symlink (creat_name, link_name) != -1) return LOCK_SUCCESS; if (errno == ENOENT) { creat_fd = -1; /* force re-creat next time around */ ================================================ FILE: packages/libXcomposite/build.sh ================================================ PKG_VER=0.4.6 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libXcomposite-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" DEPENDENCIES="xorgproto xorg-utils-macros libX11 libXfixes" ================================================ FILE: packages/libXcursor/build.sh ================================================ PKG_VER=1.2.2 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libXcursor-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-malloc0returnsnull" DEPENDENCIES="xorgproto xorg-utils-macros libX11 libXfixes libXrender" ================================================ FILE: packages/libXcursor/fix-paths.patch ================================================ --- 18-libXcursor/src/library.c 2022-04-03 14:00:22.000000000 -0300 +++ 18-libXcursor.mod/src/library.c 2024-03-02 18:30:38.118742000 -0300 @@ -25,11 +25,11 @@ #include #ifndef ICONDIR -#define ICONDIR "/usr/X11R6/lib/X11/icons" +#define ICONDIR "/data/data/com.micewine.emu/files/usr/X11R6/lib/X11/icons" #endif #ifndef XCURSORPATH -#define XCURSORPATH "~/.local/share/icons:~/.icons:/usr/share/icons:/usr/share/pixmaps:"ICONDIR +#define XCURSORPATH "~/.local/share/icons:~/.icons:/data/data/com.micewine.emu/files/usr/share/icons:/data/data/com.micewine.emu/files/usr/share/pixmaps:"ICONDIR #endif typedef struct XcursorInherit { ================================================ FILE: packages/libXdmcp/build.sh ================================================ PKG_VER=1.1.5 SRC_URL=https://xorg.freedesktop.org/archive/individual/lib/libXdmcp-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" DEPENDENCIES="xorgproto xorg-utils-macros" ================================================ FILE: packages/libXext/build.sh ================================================ PKG_VER=1.3.6 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libXext-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-malloc0returnsnull" DEPENDENCIES="xorgproto xorg-utils-macros libX11" ================================================ FILE: packages/libXfixes/build.sh ================================================ PKG_VER=6.0.1 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libXfixes-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" DEPENDENCIES="xorgproto xorg-utils-macros libX11" ================================================ FILE: packages/libXi/build.sh ================================================ PKG_VER=1.8.1 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libXi-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-malloc0returnsnull" DEPENDENCIES="xorgproto xorg-utils-macros libX11 libXfixes libXext" ================================================ FILE: packages/libXinerama/build.sh ================================================ PKG_VER=1.1.5 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libXinerama-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-malloc0returnsnull" DEPENDENCIES="xorgproto xorg-utils-macros libX11 libXext" ================================================ FILE: packages/libXrandr/build.sh ================================================ PKG_VER=1.5.4 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libXrandr-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-malloc0returnsnull" DEPENDENCIES="xorgproto xorg-utils-macros libX11 libXext libXrender" ================================================ FILE: packages/libXrender/build.sh ================================================ PKG_VER=0.9.11 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libXrender-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-malloc0returnsnull" DEPENDENCIES="xorgproto libX11" ================================================ FILE: packages/libXxf86vm/build.sh ================================================ PKG_VER=1.1.5 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libXxf86vm-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-malloc0returnsnull" DEPENDENCIES="xorgproto libX11 libXext" ================================================ FILE: packages/libadrenotools/01-fix-build.patch ================================================ diff -uNr libadrenotools/CMakeLists.txt libadrenotools-mod/CMakeLists.txt --- libadrenotools/CMakeLists.txt 2025-02-22 00:49:47.364769744 +0000 +++ libadrenotools-mod/CMakeLists.txt 2025-02-22 01:19:37.538558903 +0000 @@ -10,6 +10,8 @@ add_subdirectory(lib/linkernsbypass) +set_property(TARGET linkernsbypass PROPERTY POSITION_INDEPENDENT_CODE ON) + set(LIB_SOURCES src/bcenabler.cpp src/driver.cpp include/adrenotools/bcenabler.h ================================================ FILE: packages/libadrenotools/build.sh ================================================ PKG_VER=v1.0 GIT_URL=https://github.com/bylaws/libadrenotools GIT_COMMIT=8fae8ce254dfc1344527e05301e43f37dea2df80 CMAKE_ARGS=" " BLACKLIST_ARCH=x86_64 ================================================ FILE: packages/libadrenotools/custom-make-install.sh ================================================ mkdir -p $DESTDIR/$PREFIX/lib mkdir -p $DESTDIR/$PREFIX/include cp libadrenotools.a $DESTDIR/$PREFIX/lib cp lib/linkernsbypass/liblinkernsbypass.a $DESTDIR/$PREFIX/lib cp src/hook/*.so $DESTDIR/$PREFIX/lib cp -rf ../include/* $DESTDIR/$PREFIX/include cp ../lib/linkernsbypass/android_linker_ns.h $DESTDIR/$PREFIX/include ================================================ FILE: packages/libandroid-wordexp/Makefile ================================================ libandroid-wordexp.so: wordexp.c wordexp.h $(CC) $(CFLAGS) -shared wordexp.c -o libandroid-wordexp.so install: install -Dm600 libandroid-wordexp.so $(DESTDIR)/$(PREFIX)/lib/libandroid-wordexp.so install -Dm600 wordexp.h $(DESTDIR)/$(PREFIX)/include/wordexp.h ================================================ FILE: packages/libandroid-wordexp/build.sh ================================================ PKG_VER=1 BUILD_IN_SRC=1 ================================================ FILE: packages/libandroid-wordexp/wordexp.c ================================================ #include "wordexp.h" #include #include #include #include #include #include #include #include #include #include //##include #include extern int pipe2(int *, int); static void reap(pid_t pid) { int status; for (;;) { if (waitpid(pid, &status, 0) < 0) { if (errno != EINTR) return; } else { if (WIFEXITED(status)) return; } } } static char *getword(FILE *f) { char *s = 0; return getdelim(&s, (size_t [1]){0}, 0, f) < 0 ? 0 : s; } static int do_wordexp(const char *s, wordexp_t *we, int flags) { size_t i, l; int sq=0, dq=0; size_t np=0; char *w, **tmp; char *redir = (flags & WRDE_SHOWERR) ? "" : "2>/dev/null"; int err = 0; FILE *f; size_t wc = 0; char **wv = 0; int p[2]; pid_t pid; sigset_t set; sigset_t all_set; if (flags & WRDE_REUSE) wordfree(we); if (flags & WRDE_NOCMD) for (i=0; s[i]; i++) switch (s[i]) { case '\\': if (!sq) i++; break; case '\'': if (!dq) sq^=1; break; case '"': if (!sq) dq^=1; break; case '(': if (np) { np++; break; } case ')': if (np) { np--; break; } case '\n': case '|': case '&': case ';': case '<': case '>': case '{': case '}': if (!(sq|dq|np)) return WRDE_BADCHAR; break; case '$': if (sq) break; if (s[i+1]=='(' && s[i+2]=='(') { i += 2; np += 2; break; } else if (s[i+1] != '(') break; case '`': if (sq) break; return WRDE_CMDSUB; } if (flags & WRDE_APPEND) { wc = we->we_wordc; wv = we->we_wordv; } i = wc; if (flags & WRDE_DOOFFS) { if (we->we_offs > SIZE_MAX/sizeof(void *)/4) goto nospace; i += we->we_offs; } else { we->we_offs = 0; } if (pipe2(p, O_CLOEXEC) < 0) goto nospace; // sigfillset(&all_set); // sigprocmask(SIG_SETMASK, &all_set, &set); pid = fork(); // sigprocmask(SIG_SETMASK, &set, &all_set); if (pid < 0) { close(p[0]); close(p[1]); goto nospace; } if (!pid) { if (p[1] == 1) fcntl(1, F_SETFD, 0); else dup2(p[1], 1); execl("/system/bin/sh", "sh", "-c", "eval \"printf %s\\\\\\\\0 x $1 $2\"", "sh", s, redir, (char *)0); _exit(1); } close(p[1]); f = fdopen(p[0], "r"); if (!f) { close(p[0]); kill(pid, SIGKILL); reap(pid); goto nospace; } l = wv ? i+1 : 0; free(getword(f)); if (feof(f)) { fclose(f); reap(pid); return WRDE_SYNTAX; } while ((w = getword(f))) { if (i+1 >= l) { l += l/2+10; tmp = realloc(wv, l*sizeof(char *)); if (!tmp) break; wv = tmp; } wv[i++] = w; wv[i] = 0; } if (!feof(f)) err = WRDE_NOSPACE; fclose(f); reap(pid); if (!wv) wv = calloc(i+1, sizeof *wv); we->we_wordv = wv; we->we_wordc = i; if (flags & WRDE_DOOFFS) { if (wv) for (i=we->we_offs; i; i--) we->we_wordv[i-1] = 0; we->we_wordc -= we->we_offs; } return err; nospace: if (!(flags & WRDE_APPEND)) { we->we_wordc = 0; we->we_wordv = 0; } return WRDE_NOSPACE; } int wordexp(const char *restrict s, wordexp_t *restrict we, int flags) { int r, cs; //pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); r = do_wordexp(s, we, flags); //pthread_setcancelstate(cs, 0); return r; } void wordfree(wordexp_t *we) { size_t i; if (!we->we_wordv) return; for (i=0; iwe_wordc; i++) free(we->we_wordv[we->we_offs+i]); free(we->we_wordv); we->we_wordv = 0; we->we_wordc = 0; } ================================================ FILE: packages/libandroid-wordexp/wordexp.h ================================================ #ifndef _WORDEXP_H #define _WORDEXP_H #ifdef __cplusplus extern "C" { #endif #include #define __NEED_size_t //#include #define WRDE_DOOFFS 1 #define WRDE_APPEND 2 #define WRDE_NOCMD 4 #define WRDE_REUSE 8 #define WRDE_SHOWERR 16 #define WRDE_UNDEF 32 #include typedef struct { size_t we_wordc; char **we_wordv; size_t we_offs; } wordexp_t; #define WRDE_NOSYS -1 #define WRDE_NOSPACE 1 #define WRDE_BADCHAR 2 #define WRDE_BADVAL 3 #define WRDE_CMDSUB 4 #define WRDE_SYNTAX 5 int wordexp (const char *__restrict, wordexp_t *__restrict, int); void wordfree (wordexp_t *); #ifdef __cplusplus } #endif #endif ================================================ FILE: packages/libarchive/archive.h.patch ================================================ --- a/libarchive/archive.h +++ b/libarchive/archive.h @@ -96,11 +96,6 @@ # endif #endif -/* Large file support for Android */ -#if defined(__LIBARCHIVE_BUILD) && defined(__ANDROID__) -#include "android_lf.h" -#endif - /* * On Windows, define LIBARCHIVE_STATIC if you're building or using a * .lib. The default here assumes you're building a DLL. Only ================================================ FILE: packages/libarchive/archive_entry.h.patch ================================================ --- a/libarchive/archive_entry.h +++ b/libarchive/archive_entry.h @@ -98,11 +98,6 @@ # define __LA_MODE_T mode_t #endif -/* Large file support for Android */ -#if defined(__LIBARCHIVE_BUILD) && defined(__ANDROID__) -#include "android_lf.h" -#endif - /* * On Windows, define LIBARCHIVE_STATIC if you're building or using a * .lib. The default here assumes you're building a DLL. Only ================================================ FILE: packages/libarchive/archive_string.c.patch ================================================ diff -u -r ../libarchive-3.1.2/libarchive/archive_string.c ./libarchive/archive_string.c --- ../libarchive-3.1.2/libarchive/archive_string.c 2013-01-14 02:43:45.000000000 +0100 +++ ./libarchive/archive_string.c 2014-07-15 19:07:54.334848056 +0200 @@ -414,7 +414,9 @@ default_iconv_charset(const char *charset) { if (charset != NULL && charset[0] != '\0') return charset; -#if HAVE_LOCALE_CHARSET && !defined(__APPLE__) +#ifdef __ANDROID__ + return "UTF-8"; +#elif HAVE_LOCALE_CHARSET && !defined(__APPLE__) /* locale_charset() is broken on Mac OS */ return locale_charset(); #elif HAVE_NL_LANGINFO ================================================ FILE: packages/libarchive/archive_util.c.patch ================================================ diff -uNr libarchive-3.3.3/libarchive/archive_util.c libarchive-3.3.3.mod/libarchive/archive_util.c --- libarchive-3.3.3/libarchive/archive_util.c 2018-09-02 09:05:18.000000000 +0300 +++ libarchive-3.3.3.mod/libarchive/archive_util.c 2019-03-02 02:14:39.252942170 +0200 @@ -374,7 +374,7 @@ #ifdef _PATH_TMP tmp = _PATH_TMP; #else - tmp = "/tmp"; + tmp = "/data/data/com.micewine.emu/files/usr/tmp"; #endif archive_strcpy(temppath, tmp); if (temppath->s[temppath->length-1] != '/') ================================================ FILE: packages/libarchive/archive_write_disk_posix.c.patch ================================================ diff -u -r ../libarchive-3.3.1/libarchive/archive_write_disk_posix.c ./libarchive/archive_write_disk_posix.c --- ../libarchive-3.3.1/libarchive/archive_write_disk_posix.c 2017-02-25 18:37:08.000000000 +0100 +++ ./libarchive/archive_write_disk_posix.c 2017-03-27 02:35:07.446390387 +0200 @@ -2756,7 +2756,11 @@ alen = 0; mb = 0; complete = 1; +#ifdef __ANDROID__ + utf8 = 1; +#else utf8 = (strcmp(nl_langinfo(CODESET), "UTF-8") == 0)? 1: 0; +#endif for (p = path; *p != '\0'; p++) { ++alen; if (*p == '\\') { ================================================ FILE: packages/libarchive/archive_write_set_format_zip.c.patch ================================================ diff -u -r ../libarchive-3.2.0/libarchive/archive_write_set_format_zip.c ./libarchive/archive_write_set_format_zip.c --- ../libarchive-3.2.0/libarchive/archive_write_set_format_zip.c 2016-01-01 17:18:57.000000000 -0500 +++ ./libarchive/archive_write_set_format_zip.c 2016-05-02 20:09:52.331542213 -0400 @@ -651,10 +651,8 @@ if (strcmp(archive_string_conversion_charset_name( zip->opt_sconv), "UTF-8") == 0) zip->entry_flags |= ZIP_ENTRY_FLAG_UTF8_NAME; -#if HAVE_NL_LANGINFO - } else if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0) { + } else { zip->entry_flags |= ZIP_ENTRY_FLAG_UTF8_NAME; -#endif } } filename_length = path_length(zip->entry); ================================================ FILE: packages/libarchive/build.sh ================================================ PKG_VER=3.7.7 SRC_URL=https://github.com/libarchive/libarchive/releases/download/v$PKG_VER/libarchive-$PKG_VER.tar.gz CMAKE_ARGS="-DENABLE_BZip2=OFF -DENABLE_LZ4=OFF -DENABLE_LIBB2=OFF -DENABLE_ICONV=OFF -DENABLE_ZSTD=OFF -DENABLE_NETTLE=OFF -DENABLE_ACL=OFF -DENABLE_XATTR=OFF -DENABLE_LZMA=OFF -DENABLE_ZLIB=OFF" RUN_POST_BUILD="sed -i '/^Requires\.private:/s/ iconv//' $PREFIX/lib/pkgconfig/libarchive.pc" LDFLAGS="-L$PREFIX/lib -lz" DEPENDENCIES="zlib zstd openssl libxml2" ================================================ FILE: packages/libarchive/fix-cmake-minimum.patch ================================================ diff -uNr libarchive/CMakeLists.txt libarchive-fix/CMakeLists.txt --- libarchive/CMakeLists.txt 2024-10-13 05:11:23.000000000 -0300 +++ libarchive-fix/CMakeLists.txt 2025-04-16 21:44:09.420760045 -0300 @@ -1,5 +1,5 @@ # -CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR) +CMAKE_MINIMUM_REQUIRED(VERSION 3.12...3.21 FATAL_ERROR) if(APPLE AND CMAKE_VERSION VERSION_LESS "3.17.0") message(WARNING "CMake>=3.17.0 required to make the generated shared library have the same Mach-O headers as autotools") endif() ================================================ FILE: packages/libc++/Makefile ================================================ all: @echo ================================================ FILE: packages/libc++/build.sh ================================================ PKG_VER=1.0 PKG_PRETTY_NAME="Android C++ Library" PKG_CATEGORY=library BUILD_IN_SRC=1 ================================================ FILE: packages/libc++/custom-make-install.sh ================================================ mkdir -p $DESTDIR/$PREFIX/lib cp $INIT_DIR/cache/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/$ARCH-linux-android/libc++_shared.so $DESTDIR/$PREFIX/lib ================================================ FILE: packages/libdrm/build.sh ================================================ PKG_VER=2.4.124 SRC_URL=https://dri.freedesktop.org/libdrm/libdrm-$PKG_VER.tar.xz getDrmDrivers() { if [ "$ARCHITECTURE" == "aarch64" ]; then echo "-Dfreedreno=enabled -Dfreedreno-kgsl=true" elif [ "$ARCHITECTURE" == "x86_64" ]; then echo "-Dradeon=enabled -Damdgpu=enabled" fi } MESON_ARGS="-Dintel=disabled $(getDrmDrivers) -Dvmwgfx=disabled -Dtests=false" ================================================ FILE: packages/libevent/build.sh ================================================ PKG_VER=2.1.12 SRC_URL=https://github.com/libevent/libevent/archive/release-$PKG_VER-stable.tar.gz CMAKE_ARGS="-DEVENT__DISABLE_THREAD_SUPPORT=1 -DEVENT__DISABLE_TESTS=1" DEPENDENCIES="openssl zlib" ================================================ FILE: packages/libevent/cmake-minimum-fix.patch ================================================ diff -uNr libevent/CMakeLists.txt libevent-fix/CMakeLists.txt --- libevent/CMakeLists.txt 2020-07-05 09:02:46.000000000 -0300 +++ libevent-fix/CMakeLists.txt 2025-04-16 20:53:15.914324139 -0300 @@ -19,7 +19,7 @@ # start libevent.sln # -cmake_minimum_required(VERSION 3.1 FATAL_ERROR) +cmake_minimum_required(VERSION 3.12...3.21 FATAL_ERROR) if (POLICY CMP0054) cmake_policy(SET CMP0054 NEW) ================================================ FILE: packages/libevent/fix.patch ================================================ diff -uNr 49-libevent/evdns.c 49-libevent.mod/evdns.c --- 49-libevent/evdns.c 2020-07-05 09:02:46.000000000 -0300 +++ 49-libevent.mod/evdns.c 2024-03-25 20:14:08.375999228 -0300 @@ -52,6 +52,9 @@ #include "evconfig-private.h" #include +#ifdef __ANDROID__ +#include +#endif #ifndef _FORTIFY_SOURCE #define _FORTIFY_SOURCE 3 @@ -3655,7 +3658,7 @@ evutil_snprintf(path_out, len_out, "%s%s", path, hostfile); return path_out; #else - return mm_strdup("/etc/hosts"); + return mm_strdup("/data/data/com.micewine.emu/files/usr/etc/hosts"); #endif } @@ -4032,6 +4035,21 @@ #ifdef _WIN32 r = evdns_base_config_windows_nameservers(base); +#elif defined(__ANDROID__) + /** From: http://www.programering.com/a/MjMwcjMwATA.html */ + int add_servers = 0; + char buf[PROP_VALUE_MAX]; + r = __system_property_get("net.dns1", buf); + if (r >= 7) { + add_servers++; + evdns_base_nameserver_ip_add(base, buf); + } + r = __system_property_get("net.dns2", buf); + if (r >= 7) { + add_servers++; + evdns_base_nameserver_ip_add(base, buf); + } + if (add_servers == 0) evdns_base_nameserver_ip_add(base, "8.8.8.8"); #else r = evdns_base_resolv_conf_parse(base, opts, "/etc/resolv.conf"); #endif diff -uNr 49-libevent/evutil.c 49-libevent.mod/evutil.c --- 49-libevent/evutil.c 2020-07-05 09:02:46.000000000 -0300 +++ 49-libevent.mod/evutil.c 2024-03-25 20:08:52.615984829 -0300 @@ -49,6 +49,7 @@ #include #endif #ifdef EVENT__HAVE_UNISTD_H +#define __USE_GNU 1 /* For pipe2(). */ #include #endif #ifdef EVENT__HAVE_FCNTL_H ================================================ FILE: packages/libexpat/build.sh ================================================ PKG_VER=2.6.4 SRC_URL=https://github.com/libexpat/libexpat/releases/download/R_$(echo $PKG_VER | sed 's/\./_/g')/expat-$PKG_VER.tar.bz2 CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --without-xmlwf --without-docbook" RUN_POST_APPLY_PATCH="sed -i 's/^\(linux\*android\)\*)/\1-non-micewine)/' configure" ================================================ FILE: packages/libffi/build.sh ================================================ PKG_VER=3.4.6 SRC_URL=https://github.com/libffi/libffi/releases/download/v$PKG_VER/libffi-$PKG_VER.tar.gz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --disable-multi-os-directory" RUN_POST_CONFIGURE="echo \"#define FFI_MMAP_EXEC_WRIT 1\" >> fficonfig.h" ================================================ FILE: packages/libghttp/build.sh ================================================ PKG_VER=1.64.0 SRC_URL=https://github.com/nghttp2/nghttp2/releases/download/v$PKG_VER/nghttp2-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-lib-only" ================================================ FILE: packages/libglvnd/build.sh ================================================ PKG_VER=1.7.0 SRC_URL=https://github.com/NVIDIA/libglvnd/archive/refs/tags/v$PKG_VER.tar.gz MESON_ARGS="-Dtls=false -Degl=false -Dgles1=false -Dgles2=false" CFLAGS="-I$PREFIX_DIR/include" DEPENDENCIES="xorgproto libX11 libXext" ================================================ FILE: packages/libglvnd/egl-not-android.diff ================================================ --- a/EGL/eglplatform.h +++ b/EGL/eglplatform.h @@ -88,7 +88,7 @@ typedef struct gbm_bo *EGLNativePixmapType; typedef void *EGLNativeWindowType; -#elif defined(__ANDROID__) || defined(ANDROID) +#elif 0 struct ANativeWindow; struct egl_native_pixmap_t; ================================================ FILE: packages/libgmp/build.sh ================================================ PKG_VER=6.3.0 SRC_URL=https://mirrors.kernel.org/gnu/gmp/gmp-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" LDFLAGS="-L$PREFIX/lib" ================================================ FILE: packages/libgnutls/build.sh ================================================ PKG_VER=3.8.5 SRC_URL=https://www.gnupg.org/ftp/gcrypt/gnutls/v${PKG_VER%.*}/gnutls-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --disable-hardware-acceleration --with-default-trust-store-file=$PREFIX_DIR/etc/tls/cert.pem --with-system-priority-file=$PREFIX_DIR/etc/gnutls/default-priorities --with-unbound-root-key-file=$PREFIX_DIR/etc/unbound/root.key --with-included-libtasn1 --enable-local-libopts --without-p11-kit --disable-guile --disable-doc --without-zstd" LDFLAGS="-L$PREFIX/lib" CFLAGS="-I$PREFIX/include" DEPENDENCIES="brotli libgmp libidn2 libunistring libnettle zlib" ================================================ FILE: packages/libgnutls/gl-stdio-impl.h.patch ================================================ --- a/gl/stdio-impl.h +++ b/gl/stdio-impl.h @@ -68,8 +68,10 @@ # elif defined __ANDROID__ /* Android */ # ifdef __LP64__ # define _gl_flags_file_t int +# define _gl_struct_file_off_t int64_t # else # define _gl_flags_file_t short +# define _gl_struct_file_off_t __kernel_off_t # endif # ifdef __LP64__ # define _gl_file_offset_t int64_t @@ -102,7 +104,7 @@ unsigned char _nbuf[1]; \ struct { unsigned char *_base; size_t _size; } _lb; \ int _blksize; \ - _gl_file_offset_t _offset; \ + _gl_struct_file_off_t _offset; \ /* More fields, not relevant here. */ \ } *) fp) # else ================================================ FILE: packages/libgnutls/src-gl-stdio-impl.h.patch ================================================ --- a/src/gl/stdio-impl.h +++ b/src/gl/stdio-impl.h @@ -68,8 +68,10 @@ # elif defined __ANDROID__ /* Android */ # ifdef __LP64__ # define _gl_flags_file_t int +# define _gl_struct_file_off_t int64_t # else # define _gl_flags_file_t short +# define _gl_struct_file_off_t __kernel_off_t # endif # ifdef __LP64__ # define _gl_file_offset_t int64_t @@ -102,7 +104,7 @@ unsigned char _nbuf[1]; \ struct { unsigned char *_base; size_t _size; } _lb; \ int _blksize; \ - _gl_file_offset_t _offset; \ + _gl_struct_file_off_t _offset; \ /* More fields, not relevant here. */ \ } *) fp) # else ================================================ FILE: packages/libiconv/build.sh ================================================ PKG_VER=1.17 SRC_URL=https://ftp.gnu.org/pub/gnu/libiconv/libiconv-$PKG_VER.tar.gz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-extra-encodings --enable-static --enable-shared" ================================================ FILE: packages/libidn2/0000-disable-versioning-of-symbols.patch ================================================ --- a/configure 2024-03-26 19:57:45.298723256 -0300 +++ a/configure_mod 2024-03-26 19:58:12.058723097 -0300 @@ -32898,8 +32898,6 @@ if ac_fn_c_try_compile "$LINENO" then : -printf "%s\n" "#define HAVE_SYMVER_ALIAS_SUPPORT 1" >>confdefs.h - fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ================================================ FILE: packages/libidn2/build.sh ================================================ PKG_VER=2.3.7 SRC_URL=https://mirrors.kernel.org/gnu/libidn/libidn2-$PKG_VER.tar.gz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" DEPENDENCIES="libunistring" ================================================ FILE: packages/libnettle/build.sh ================================================ PKG_VER=3.10 SRC_URL=https://mirrors.kernel.org/gnu/nettle/nettle-$PKG_VER.tar.gz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" LDFLAGS="-L$PREFIX/lib" CFLAGS=-I$PREFIX/include DEPENDENCIES="libgmp" ================================================ FILE: packages/libnettle/configure.patch ================================================ diff -u -r ../nettle-3.3/configure ./configure --- ../nettle-3.3/configure 2016-10-01 09:28:38.000000000 +0200 +++ ./configure 2017-07-07 08:35:12.539208424 +0200 @@ -7091,6 +7091,7 @@ CFLAGS="$CFLAGS $CCPIC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include int main () ================================================ FILE: packages/libogg/build.sh ================================================ PKG_VER=1.3.5 SRC_URL=https://github.com/xiph/ogg/releases/download/v$PKG_VER/libogg-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" ================================================ FILE: packages/libpng/build.sh ================================================ PKG_VER=1.6.43 SRC_URL=https://download.sourceforge.net/libpng/libpng-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" DEPENDENCIES="zlib" ================================================ FILE: packages/libsndfile/build.sh ================================================ PKG_VER=1.2.2 SRC_URL=https://github.com/libsndfile/libsndfile/archive/refs/tags/$PKG_VER.tar.gz CMAKE_ARGS="-DBUILD_SHARED_LIBS=0 -DENABLE_EXTERNAL_LIBS=0 -DCMAKE_C_FLAGS=-fPIC -DENABLE_MPEG=0 -DBUILD_REGTEST=0 -DANDROID=1" ================================================ FILE: packages/libsndfile/fix-cmake-minimum.patch ================================================ diff -uNr libsndfile/CMakeLists.txt libsndfile-fix/CMakeLists.txt --- libsndfile/CMakeLists.txt 2025-04-16 12:22:49.528240419 -0300 +++ libsndfile-fix/CMakeLists.txt 2025-04-16 12:57:57.492746076 -0300 @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 3.1..3.18) +cmake_minimum_required (VERSION 3.12...3.18) # MSVC runtime library flags are selected by an abstraction, CMake >= 3.15 # This policy still need to be set even with cmake_minimum_required() command above. ================================================ FILE: packages/libsndfile/fix-tmpdir-and-alsa.patch ================================================ diff -uNr 31-libsndfile/CMakeLists.txt 31-libsndfile.mod/CMakeLists.txt --- 31-libsndfile/CMakeLists.txt 2023-08-13 05:53:51.000000000 -0300 +++ 31-libsndfile.mod/CMakeLists.txt 2024-03-09 22:17:44.945328163 -0300 @@ -83,6 +83,8 @@ option (ENABLE_PACKAGE_CONFIG "Generate and install package config file" ON) option (INSTALL_PKGCONFIG_MODULE "Generate and install pkg-config module" ON) +option (ANDROID "Android Build" OFF) + list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") if (CMAKE_VERSION VERSION_LESS 3.14) list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/sqlite") @@ -126,6 +128,11 @@ set (HAVE_EXTERNAL_XIPH_LIBS ${ENABLE_EXTERNAL_LIBS}) set (HAVE_SQLITE3 ${BUILD_REGTEST}) + +if (ANDROID) + set (ALSA_FOUND 0) +endif() + set (HAVE_ALSA_ASOUNDLIB_H ${ALSA_FOUND}) set (HAVE_SNDIO_H ${SNDIO_FOUND}) diff -uNr 31-libsndfile/src/common.c 31-libsndfile.mod/src/common.c --- 31-libsndfile/src/common.c 2023-08-13 05:53:51.000000000 -0300 +++ 31-libsndfile.mod/src/common.c 2024-03-09 22:16:14.488661282 -0300 @@ -1827,7 +1827,7 @@ tmpdir = getenv ("TEMP") ; else { tmpdir = getenv ("TMPDIR") ; - tmpdir = tmpdir == NULL ? "/tmp" : tmpdir ; + tmpdir = tmpdir == NULL ? "/data/data/com.micewine.emu/files/usr/tmp" : tmpdir ; } ; if (tmpdir && access (tmpdir, R_OK | W_OK | X_OK) == 0) ================================================ FILE: packages/libtool/build.sh ================================================ PKG_VER=2.5.4 SRC_URL=https://mirrors.kernel.org/gnu/libtool/libtool-$PKG_VER.tar.gz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" ================================================ FILE: packages/libunbound/build.sh ================================================ PKG_VER=1.22.0 SRC_URL=https://nlnetlabs.nl/downloads/unbound/unbound-$PKG_VER.tar.gz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE ac_cv_func_chown=no ac_cv_func_chroot=no ac_cv_func_getpwnam=no --enable-event-api --enable-ipsecmod --enable-linux-ip-local-port-range --enable-tfo-server --with-libevent=$PREFIX_DIR --with-libexpat=$PREFIX_DIR --without-libhiredis --without-libmnl --without-pyunbound --without-pythonmodule --with-libnghttp2=$PREFIX_DIR --with-ssl=$PREFIX_DIR --with-pidfile=$PREFIX_DIR/var/run/unbound.pid --with-username= --with-libunbound-only --enable-static=no" LDFLAGS="-L$PREFIX/lib -landroid-shmem" DEPENDENCIES="openssl libevent libghttp libexpat android-shmem" ================================================ FILE: packages/libunbound/libunbound-libunbound.c.patch ================================================ --- a/libunbound/libunbound.c +++ b/libunbound/libunbound.c @@ -1095,7 +1095,7 @@ if(fname == NULL) { #if !defined(UB_ON_WINDOWS) || !defined(HAVE_WINDOWS_H) - fname = "/etc/resolv.conf"; + fname = "/data/data/com.micewine.emu/files/usr/etc/resolv.conf"; #else FIXED_INFO *info; ULONG buflen = sizeof(*info); @@ -1204,7 +1204,7 @@ } return UB_READFILE; #else - fname = "/etc/hosts"; + fname = "/data/data/com.micewine.emu/files/usr/etc/hosts"; #endif /* WIN32 */ } in = fopen(fname, "r"); ================================================ FILE: packages/libunbound/smallapp-unbound-host.c.patch ================================================ --- a/smallapp/unbound-host.c +++ b/smallapp/unbound-host.c @@ -99,7 +99,7 @@ printf(" -C config use the specified unbound.conf (none read by default)\n"); printf(" pass as first argument if you want to override some\n"); printf(" options with further arguments\n"); - printf(" -r read forwarder information from /etc/resolv.conf\n"); + printf(" -r read forwarder information from /data/data/com.micewine.emu/files/usr/etc/resolv.conf\n"); printf(" breaks validation if the forwarder does not do DNSSEC.\n"); printf(" -v be more verbose, shows nodata and security.\n"); printf(" -d debug, traces the action, -d -d shows more.\n"); @@ -462,7 +462,7 @@ debuglevel = 2; /* at least VERB_DETAIL */ break; case 'r': - check_ub_res(ub_ctx_resolvconf(ctx, "/etc/resolv.conf")); + check_ub_res(ub_ctx_resolvconf(ctx, "/data/data/com.micewine.emu/files/usr/etc/resolv.conf")); break; case 't': qtype = optarg; ================================================ FILE: packages/libunistring/build.sh ================================================ PKG_VER=1.3 SRC_URL=https://mirrors.kernel.org/gnu/libunistring/libunistring-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE ac_cv_func_uselocale=no am_cv_langinfo_codeset=yes" ================================================ FILE: packages/libvorbis/build.sh ================================================ PKG_VER=1.3.7 SRC_URL=http://downloads.xiph.org/releases/vorbis/libvorbis-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" DEPENDENCIES="libogg" ================================================ FILE: packages/libxcb/build.sh ================================================ PKG_VER=1.17.0 SRC_URL=https://xorg.freedesktop.org/archive/individual/lib/libxcb-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" DEPENDENCIES="xorgproto libXau libXdmcp xcb-proto" ================================================ FILE: packages/libxcb/libxcb-1.12_src_xcb_util.c.patch ================================================ diff -uNr libxcb-1.12/src/xcb_util.c libxcb-1.12.mod/src/xcb_util.c --- libxcb-1.12/src/xcb_util.c 2016-05-09 19:10:55.000000000 +0300 +++ libxcb-1.12.mod/src/xcb_util.c 2017-11-22 00:13:51.337058457 +0200 @@ -229,7 +229,7 @@ #ifdef __hpux static const char unix_base[] = "/usr/spool/sockets/X11/"; #else - static const char unix_base[] = "/tmp/.X11-unix/X"; + static const char unix_base[] = "/data/data/com.micewine.emu/files/usr/tmp/.X11-unix/X"; #endif const char *base = unix_base; size_t filelen; ================================================ FILE: packages/libxml2/build.sh ================================================ PKG_VER=2.13.5 SRC_URL=https://download.gnome.org/sources/libxml2/${PKG_VER%.*}/libxml2-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --without-python --without-lzma" RUN_POST_APPLY_PATCH="sed -i 's/^\(linux\*android\)\*)/\1-notermux)/' configure" CFLAGS="-fPIC" DEPENDENCIES="zlib" ================================================ FILE: packages/libxshmfence/build.sh ================================================ PKG_VER=1.3.2 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/libxshmfence-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --disable-futex" DEPENDENCIES="xorgproto xorg-utils-macros" ================================================ FILE: packages/mangohud/01-fix-build.patch ================================================ diff -uNr ../mangohud/src/fps_metrics.h ./src/fps_metrics.h --- ../mangohud/src/fps_metrics.h 2025-03-05 06:56:10.000000000 -0300 +++ ./src/fps_metrics.h 2025-06-26 19:17:05.817373239 -0300 @@ -11,6 +11,7 @@ #include #include #include +#include struct metric_t { std::string name; @@ -165,4 +166,4 @@ } }; -extern std::unique_ptr fpsmetrics; \ No newline at end of file +extern std::unique_ptr fpsmetrics; diff -uNr ../mangohud/src/gpu_fdinfo.h ./src/gpu_fdinfo.h --- ../mangohud/src/gpu_fdinfo.h 2025-03-05 06:56:10.000000000 -0300 +++ ./src/gpu_fdinfo.h 2025-06-26 19:17:54.112818545 -0300 @@ -11,6 +11,7 @@ #include #include #include +#include #ifdef TEST_ONLY #include <../src/mesa/util/os_time.h> ================================================ FILE: packages/mangohud/02-fix-x11-lib-name.patch ================================================ diff --git a/src/loaders/loader_x11.cpp b/src/loaders/loader_x11.cpp index 214fd50..124610f 100644 --- a/src/loaders/loader_x11.cpp +++ b/src/loaders/loader_x11.cpp @@ -110,6 +110,6 @@ static std::shared_ptr loader; std::shared_ptr get_libx11() { if (!loader) - loader = std::make_shared("libX11.so.6"); + loader = std::make_shared("libX11.so"); return loader; } ================================================ FILE: packages/mangohud/03-not-search-gpu-on-sys-folder.patch ================================================ diff -uNr ../mangohud/src/gpu.cpp ./src/gpu.cpp --- ../mangohud/src/gpu.cpp 2025-03-05 06:56:10.000000000 -0300 +++ ./src/gpu.cpp 2025-06-26 19:20:46.145938572 -0300 @@ -20,6 +20,10 @@ namespace fs = ghc::filesystem; GPUS::GPUS(overlay_params* params) : params(params) { +#ifdef __ANDROID__ + return; +#endif + std::vector gpu_entries; for (const auto& entry : fs::directory_iterator("/sys/class/drm")) { ================================================ FILE: packages/mangohud/04-set-android-os-name.patch ================================================ diff --git a/src/overlay.cpp b/src/overlay.cpp index a1cfd25..fa326d4 100644 --- a/src/overlay.cpp +++ b/src/overlay.cpp @@ -765,7 +765,11 @@ void init_system_info(){ trim(cpu); kernel = exec("uname -r"); trim(kernel); + #ifdef __ANDROID__ + os = "Android"; + #else os = exec("sed -n 's/PRETTY_NAME=\\(.*\\)/\\1/p' /etc/*-release"); + #endif os.erase(remove(os.begin(), os.end(), '\"' ), os.end()); trim(os); cpusched = read_line("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"); ================================================ FILE: packages/mangohud/05-disable-cpu-info.patch ================================================ diff -uNr mangohud/src/cpu.cpp mangohud-mod/src/cpu.cpp --- mangohud/src/cpu.cpp 2025-02-16 11:41:44.227866045 -0300 +++ mangohud-mod/src/cpu.cpp 2025-02-16 11:43:38.085309923 -0300 @@ -109,6 +109,10 @@ bool CPUStats::Init() { +#ifdef __ANDROID__ + return false; +#endif + if (m_inited) return true; @@ -502,6 +506,10 @@ } bool CPUStats::GetCpuFile() { +#ifdef __ANDROID__ + return false; +#endif + if (m_cpuTempFile) return true; ================================================ FILE: packages/mangohud/build.sh ================================================ PKG_VER=0.8.1 SRC_URL=https://github.com/flightlessmango/MangoHud/releases/download/v$PKG_VER/MangoHud-v$PKG_VER-Source.tar.xz LDFLAGS="-Wl,--undefined-version" MESON_ARGS="-Dwith_xnvctrl=disabled -Dwith_wayland=disabled -Dwith_dbus=disabled -Dtests=disabled" DEPENDENCIES="libX11 libXrandr xkbcommon libglvnd Vulkan-Headers Vulkan-Loader" ================================================ FILE: packages/mesa-demos/0001-fix-KHR-define.patch ================================================ --- a/src/glad/include/KHR/khrplatform.h +++ b/src/glad/include/KHR/khrplatform.h @@ -101,7 +101,7 @@ # define KHRONOS_APICALL __declspec(dllimport) #elif defined (__SYMBIAN32__) # define KHRONOS_APICALL IMPORT_C -#elif defined(__ANDROID__) +#elif 0 # include # define KHRONOS_APICALL __attribute__((visibility("default"))) __NDK_FPABI__ #else ================================================ FILE: packages/mesa-demos/build.sh ================================================ PKG_VER=9.0.0 SRC_URL=https://mesa.freedesktop.org/archive/demos/mesa-demos-$PKG_VER.tar.xz MESON_ARGS="-Dlibdrm=disabled -Dvulkan=disabled -Dwayland=disabled -Dwith-system-data-files=true -Dglut=disabled -Degl=disabled" DEPENDENCIES="Vulkan-Headers Vulkan-Loader xkbcommon libdrm libglvnd FreeGLUT GLU libX11" ================================================ FILE: packages/mesa-demos/src-tests-texdown.c.patch ================================================ --- a/src/tests/texdown.c +++ b/src/tests/texdown.c @@ -175,7 +175,7 @@ #ifdef _WIN32 texImage = (GLubyte *) _aligned_malloc(bytes, ALIGN); #else - texImage = (GLubyte *) aligned_alloc(ALIGN, bytes); + texImage = (GLubyte *) memalign(ALIGN, bytes); #endif if (!texImage) { DownloadRate = 0.0; ================================================ FILE: packages/mesa-vulkan-freedreno-24.0.0/build.sh ================================================ PKG_VER=24.0.0 PKG_CATEGORY="VulkanDriver" PKG_PRETTY_NAME="Mesa Turnip Driver" PKG_DOWNLOADABLE=1 VK_DRIVER_LIB="libvulkan_freedreno.so" BLACKLIST_ARCH=x86_64 SRC_URL=https://archive.mesa3d.org/mesa-$PKG_VER.tar.xz LDFLAGS="-L$PREFIX/lib -landroid-shmem" CPPFLAGS="-D__USE_GNU" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=freedreno -Dfreedreno-kmds=msm,kgsl -Dglvnd=false -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm" ================================================ FILE: packages/mesa-vulkan-freedreno-24.0.0/disable-memfd-create-getrandom.patch ================================================ diff --git a/meson.build b/meson.build index 1c8667a8fce..1e9b4fd811d 100644 --- a/meson.build +++ b/meson.build @@ -1361,7 +1361,7 @@ if not ['linux'].contains(host_machine.system()) endif endif -foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', +foreach h : ['linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', 'cet.h', 'pthread_np.h', 'renderdoc_app.h', 'sys/inotify.h'] if cc.check_header(h) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) @@ -1371,11 +1371,9 @@ endforeach functions_to_detect = { 'strtof': '', 'mkostemp': '', - 'memfd_create': '', 'random_r': '', 'flock': '', 'strtok_r': '', - 'getrandom': '', 'qsort_s': '', 'posix_fallocate': '', 'secure_getenv': '', ================================================ FILE: packages/mesa-vulkan-freedreno-24.0.0/force-linux-like-build.patch ================================================ diff --git a/src/util/detect_os.h b/src/util/detect_os.h index 469b502bbd9..8a72b42aa08 100644 --- a/src/util/detect_os.h +++ b/src/util/detect_os.h @@ -25,7 +25,7 @@ * also be defined. */ #if defined(ANDROID) -#define DETECT_OS_ANDROID 1 +#define DETECT_OS_ANDROID 0 #endif #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) diff --git a/include/vulkan/vk_android_native_buffer.h b/include/vulkan/vk_android_native_buffer.h index 746103bc1f4..9a76a321ffc 100644 --- a/include/vulkan/vk_android_native_buffer.h +++ b/include/vulkan/vk_android_native_buffer.h @@ -18,7 +18,7 @@ #define __VK_ANDROID_NATIVE_BUFFER_H__ /* MESA: A hack to avoid #ifdefs in driver code. */ -#ifdef ANDROID +#if 0 #include #include ================================================ FILE: packages/mesa-vulkan-freedreno-24.0.0/install-drivers-without-hardlinks.patch ================================================ diff --git a/bin/install_megadrivers.py b/bin/install_megadrivers.py index 60ee4576c60..1e7108035cd 100644 --- a/bin/install_megadrivers.py +++ b/bin/install_megadrivers.py @@ -24,7 +24,16 @@ import argparse import os +import shutil +def link(src, dest): + shutil.copyfile(src, dest) + +def unlink(src): + os.remove(src) + +os.link = link +os.unlink = unlink def main(): parser = argparse.ArgumentParser() ================================================ FILE: packages/mesa-vulkan-freedreno-24.0.0/tu_kgsl_export_dmabuf.patch ================================================ diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc index f892fcedcb3..0a5c4dd7a49 100644 --- a/src/freedreno/vulkan/tu_device.cc +++ b/src/freedreno/vulkan/tu_device.cc @@ -2624,6 +2624,14 @@ tu_AllocateMemory(VkDevice _device, uint64_t client_address = 0; BITMASK_ENUM(tu_bo_alloc_flags) alloc_flags = TU_BO_ALLOC_NO_FLAGS; + const VkExportMemoryAllocateInfo *export_info = vk_find_struct_const( + pAllocateInfo->pNext, EXPORT_MEMORY_ALLOCATE_INFO); + if (export_info && (export_info->handleTypes & + (VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT | + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT))) { + alloc_flags |= TU_BO_ALLOC_SHAREABLE; + } + const VkMemoryOpaqueCaptureAddressAllocateInfo *replay_info = vk_find_struct_const(pAllocateInfo->pNext, MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO); diff --git a/src/freedreno/vulkan/tu_knl.h b/src/freedreno/vulkan/tu_knl.h index 78cb442dc93..264000c5ea8 100644 --- a/src/freedreno/vulkan/tu_knl.h +++ b/src/freedreno/vulkan/tu_knl.h @@ -21,6 +21,7 @@ enum tu_bo_alloc_flags TU_BO_ALLOC_ALLOW_DUMP = 1 << 0, TU_BO_ALLOC_GPU_READ_ONLY = 1 << 1, TU_BO_ALLOC_REPLAYABLE = 1 << 2, + TU_BO_ALLOC_SHAREABLE = 1 << 3, }; /* Define tu_timeline_sync type based on drm syncobj for a point type @@ -53,6 +54,7 @@ struct tu_bo { uint32_t bo_list_idx; bool implicit_sync : 1; + int dmabuf_fd; }; struct tu_knl { diff --git a/src/freedreno/vulkan/tu_knl_kgsl.cc b/src/freedreno/vulkan/tu_knl_kgsl.cc index 0c2f16c496c..6a484d83a47 100644 --- a/src/freedreno/vulkan/tu_knl_kgsl.cc +++ b/src/freedreno/vulkan/tu_knl_kgsl.cc @@ -11,6 +11,7 @@ #include #include #include +#include #include "msm_kgsl.h" #include "vk_util.h" @@ -18,6 +19,7 @@ #include "util/u_debug.h" #include "util/u_vector.h" #include "util/libsync.h" +#include "util/os_file.h" #include "util/timespec.h" #include "tu_cmd_buffer.h" @@ -67,6 +69,57 @@ kgsl_submitqueue_close(struct tu_device *dev, uint32_t queue_id) safe_ioctl(dev->physical_device->local_fd, IOCTL_KGSL_DRAWCTXT_DESTROY, &req); } +static int +dmabuf_alloc(uint64_t size) +{ + int ret; + int dma_heap = open("/dev/dma_heap/system", O_RDONLY); + + if (dma_heap < 0) { + int ion_heap = open("/dev/ion", O_RDONLY); + + if (ion_heap < 0) + return -1; + + struct ion_allocation_data { + __u64 len; + __u32 heap_id_mask; + __u32 flags; + __u32 fd; + __u32 unused; + } alloc_data = { + .len = size, + /* ION_HEAP_SYSTEM | ION_SYSTEM_HEAP_ID */ + .heap_id_mask = (1U << 0) | (1U << 25), + .flags = 0, /* uncached */ + }; + + ret = safe_ioctl(ion_heap, _IOWR('I', 0, struct ion_allocation_data), + &alloc_data); + + close(ion_heap); + + if (ret) + return -1; + + return alloc_data.fd; + } else { + struct dma_heap_allocation_data alloc_data = { + .len = size, + .fd_flags = O_RDWR | O_CLOEXEC, + }; + + ret = safe_ioctl(dma_heap, DMA_HEAP_IOCTL_ALLOC, &alloc_data); + + close(dma_heap); + + if (ret) + return -1; + + return alloc_data.fd; + } +} + static VkResult kgsl_bo_init(struct tu_device *dev, struct tu_bo **out_bo, @@ -78,6 +131,21 @@ kgsl_bo_init(struct tu_device *dev, { assert(client_iova == 0); + if (flags & TU_BO_ALLOC_SHAREABLE) { + int fd = dmabuf_alloc(size); + + if (fd < 0) { + return vk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, + "DMABUF_ALLOC failed (%s)", strerror(errno)); + } + + VkResult res = tu_bo_init_dmabuf(dev, out_bo, size, fd); + + close(fd); + + return res; + } + struct kgsl_gpumem_alloc_id req = { .size = size, }; @@ -113,6 +181,7 @@ kgsl_bo_init(struct tu_device *dev, .iova = req.gpuaddr, .name = tu_debug_bos_add(dev, req.mmapsize, name), .refcnt = 1, + .dmabuf_fd = -1, }; *out_bo = bo; @@ -162,6 +231,7 @@ kgsl_bo_init_dmabuf(struct tu_device *dev, .iova = info_req.gpuaddr, .name = tu_debug_bos_add(dev, info_req.size, "dmabuf"), .refcnt = 1, + .dmabuf_fd = os_dupfd_cloexec(fd), }; *out_bo = bo; @@ -172,9 +242,7 @@ kgsl_bo_init_dmabuf(struct tu_device *dev, static int kgsl_bo_export_dmabuf(struct tu_device *dev, struct tu_bo *bo) { - tu_stub(); - - return -1; + return os_dupfd_cloexec(bo->dmabuf_fd); } static VkResult @@ -183,6 +251,15 @@ kgsl_bo_map(struct tu_device *dev, struct tu_bo *bo) if (bo->map) return VK_SUCCESS; + if (bo->dmabuf_fd != -1) { + void *map = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, bo->dmabuf_fd, 0); + + if (map != MAP_FAILED) { + bo->map = map; + return VK_SUCCESS; + } + } + uint64_t offset = bo->gem_handle << 12; void *map = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, dev->physical_device->local_fd, offset); @@ -210,6 +287,9 @@ kgsl_bo_finish(struct tu_device *dev, struct tu_bo *bo) if (bo->map) munmap(bo->map, bo->size); + if (bo->dmabuf_fd != -1) + close(bo->dmabuf_fd); + struct kgsl_gpumem_free_id req = { .id = bo->gem_handle }; ================================================ FILE: packages/mesa-vulkan-freedreno-24.0.0/wsi-common-no-pthread-cancel.patch ================================================ diff -uNr mesa-24.0.0/src/vulkan/wsi/wsi_common_display.c mesa-24.0.0-mod/src/vulkan/wsi/wsi_common_display.c --- mesa-24.0.0/src/vulkan/wsi/wsi_common_display.c 2024-01-31 20:29:42.000000000 -0300 +++ mesa-24.0.0-mod/src/vulkan/wsi/wsi_common_display.c 2025-06-26 23:10:56.455202991 -0300 @@ -175,6 +175,12 @@ static uint64_t fence_sequence; +#ifdef __ANDROID__ +static void thread_signal_handler (int signum) { + pthread_exit (0); +} +#endif + ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_mode, VkDisplayModeKHR) ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_connector, VkDisplayKHR) @@ -1339,8 +1345,9 @@ .fd = wsi->fd, .events = POLLIN }; - +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { int ret = poll(&pollfd, 1, -1); if (ret > 0) { @@ -1370,7 +1377,11 @@ { pthread_mutex_lock(&wsi->wait_mutex); if (wsi->wait_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->wait_thread); +#else + pthread_kill(wsi->wait_thread, SIGUSR2); +#endif pthread_join(wsi->wait_thread, NULL); wsi->wait_thread = 0; } @@ -2214,7 +2225,9 @@ int udev_fd = udev_monitor_get_fd(mon); +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { nfds_t nfds = 1; @@ -2337,6 +2350,15 @@ struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + if (wsi) { wsi_for_each_connector(connector, wsi) { wsi_for_each_display_mode(mode, connector) { @@ -2348,7 +2370,11 @@ wsi_display_stop_wait_thread(wsi); if (wsi->hotplug_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->hotplug_thread); +#else + pthread_kill(wsi->hotplug_thread, SIGUSR2); +#endif pthread_join(wsi->hotplug_thread, NULL); } ================================================ FILE: packages/mesa-vulkan-freedreno-24.3.0/build.sh ================================================ PKG_VER=24.3.0 PKG_CATEGORY="VulkanDriver" PKG_PRETTY_NAME="Mesa Turnip Driver" PKG_DOWNLOADABLE=1 VK_DRIVER_LIB="libvulkan_freedreno.so" BLACKLIST_ARCH=x86_64 SRC_URL=https://archive.mesa3d.org/mesa-$PKG_VER.tar.xz LDFLAGS="-L$PREFIX/lib -landroid-shmem" CPPFLAGS="-D__USE_GNU" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=freedreno -Dfreedreno-kmds=msm,kgsl -Dglvnd=disabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm" ================================================ FILE: packages/mesa-vulkan-freedreno-24.3.0/disable-memfd-create-getrandom.patch ================================================ diff --git a/meson.build b/meson.build index 66e14c211d2..7e73daf221a 100644 --- a/meson.build +++ b/meson.build @@ -1354,7 +1354,7 @@ if not ['linux'].contains(host_machine.system()) endif endif -foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', +foreach h : ['linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', 'cet.h', 'pthread_np.h', 'sys/inotify.h', 'linux/udmabuf.h'] if cc.check_header(h) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) @@ -1364,11 +1364,9 @@ endforeach functions_to_detect = { 'strtof': '', 'mkostemp': '', - 'memfd_create': '', 'random_r': '', 'flock': '', 'strtok_r': '', - 'getrandom': '', 'qsort_s': '', 'posix_fallocate': '', 'secure_getenv': '', ================================================ FILE: packages/mesa-vulkan-freedreno-24.3.0/experimental-ad710-support.patch ================================================ diff -uNr mesa-vulkan-freedreno-25.0.3/src/freedreno/common/freedreno_devices.py mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/common/freedreno_devices.py --- mesa-vulkan-freedreno-25.0.3/src/freedreno/common/freedreno_devices.py 2025-04-02 13:35:11.000000000 -0300 +++ mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/common/freedreno_devices.py 2025-04-21 20:40:27.570841169 -0300 @@ -1057,6 +1057,24 @@ )) add_gpus([ + GPUId(chip_id=0x07010000, name="FD710"), # KGSL, no speedbin data + GPUId(chip_id=0xffff07010000, name="FD710"), # Default no-speedbin fallback + ], A6xxGPUInfo( + CHIP.A7XX, + [a7xx_base, a7xx_gen1], + num_ccu = 4, + tile_align_w = 64, + tile_align_h = 32, + num_vsc_pipes = 32, + cs_shared_mem_size = 32 * 1024, + wave_granularity = 2, + fibers_per_sp = 128 * 2 * 16, + highest_bank_bit = 16, + magic_regs = a730_magic_regs, + raw_magic_regs = a730_raw_magic_regs, + )) + +add_gpus([ GPUId(chip_id=0x07030001, name="FD730"), # KGSL, no speedbin data GPUId(chip_id=0xffff07030001, name="FD730"), # Default no-speedbin fallback ], A6xxGPUInfo( diff -uNr mesa-vulkan-freedreno-25.0.3/src/freedreno/drm-shim/freedreno_noop.c mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/drm-shim/freedreno_noop.c --- mesa-vulkan-freedreno-25.0.3/src/freedreno/drm-shim/freedreno_noop.c 2025-04-02 13:35:11.000000000 -0300 +++ mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/drm-shim/freedreno_noop.c 2025-04-21 20:40:28.371145184 -0300 @@ -235,6 +235,11 @@ .gmem_size = 1024 * 1024 + 512 * 1024, }, { + .gpu_id = 710 + .chip_id = 0x07010000, + .gmem_size = 2 * 1024 * 1024, + }, + { .gpu_id = 730, .chip_id = 0x07030001, .gmem_size = 2 * 1024 * 1024, ================================================ FILE: packages/mesa-vulkan-freedreno-24.3.0/force-linux-like-build.patch ================================================ diff --git a/include/vulkan/vk_android_native_buffer.h b/include/vulkan/vk_android_native_buffer.h index 21f82ef57a2..5c67746ca44 100644 --- a/include/vulkan/vk_android_native_buffer.h +++ b/include/vulkan/vk_android_native_buffer.h @@ -17,7 +17,7 @@ * system rather the build target. */ -#if defined(__ANDROID__) || defined(ANDROID) +#if 0 #include #if ANDROID_API_LEVEL < 28 diff --git a/src/util/detect_os.h b/src/util/detect_os.h index 86286dfbe70..49195b3398c 100644 --- a/src/util/detect_os.h +++ b/src/util/detect_os.h @@ -25,7 +25,7 @@ * also be defined. */ #if defined(__ANDROID__) -#define DETECT_OS_ANDROID 1 +#define DETECT_OS_ANDROID 0 #endif #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ================================================ FILE: packages/mesa-vulkan-freedreno-24.3.0/install-drivers-without-hardlinks.patch ================================================ diff --git a/bin/install_megadrivers.py b/bin/install_megadrivers.py index 216f6999feb..c79e95d1afd 100644 --- a/bin/install_megadrivers.py +++ b/bin/install_megadrivers.py @@ -24,7 +24,16 @@ import argparse import os +import shutil + +def link(src, dest): + shutil.copyfile(src, dest) +def unlink(src): + os.remove(src) + +os.link = link +os.unlink = unlink def resolve_libdir(libdir): if os.path.isabs(libdir): ================================================ FILE: packages/mesa-vulkan-freedreno-24.3.0/wsi-common-no-pthread-cancel.patch ================================================ diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index ff57a259046..4703500f374 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -176,6 +176,12 @@ struct wsi_display_sync { static uint64_t fence_sequence; +#ifdef __ANDROID__ +static void thread_signal_handler (int signum) { + pthread_exit (0); +} +#endif + ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_mode, VkDisplayModeKHR) ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_connector, VkDisplayKHR) @@ -1341,7 +1347,9 @@ wsi_display_wait_thread(void *data) .events = POLLIN }; +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { int ret = poll(&pollfd, 1, -1); if (ret > 0) { @@ -1369,9 +1377,22 @@ wsi_display_start_wait_thread(struct wsi_display *wsi) static void wsi_display_stop_wait_thread(struct wsi_display *wsi) { +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + mtx_lock(&wsi->wait_mutex); if (wsi->wait_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->wait_thread); +#else + pthread_kill(wsi->wait_thread, SIGUSR2); +#endif pthread_join(wsi->wait_thread, NULL); wsi->wait_thread = 0; } @@ -2215,7 +2236,9 @@ udev_event_listener_thread(void *data) int udev_fd = udev_monitor_get_fd(mon); +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { nfds_t nfds = 1; @@ -2340,6 +2363,15 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + if (wsi) { wsi_for_each_connector(connector, wsi) { wsi_for_each_display_mode(mode, connector) { @@ -2351,7 +2383,11 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, wsi_display_stop_wait_thread(wsi); if (wsi->hotplug_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->hotplug_thread); +#else + pthread_kill(wsi->hotplug_thread, SIGUSR2); +#endif pthread_join(wsi->hotplug_thread, NULL); } ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.0/build.sh ================================================ PKG_VER=25.0.0 PKG_CATEGORY="VulkanDriver" PKG_PRETTY_NAME="Mesa Turnip Driver" PKG_DOWNLOADABLE=1 VK_DRIVER_LIB="libvulkan_freedreno.so" BLACKLIST_ARCH=x86_64 SRC_URL=https://archive.mesa3d.org/mesa-$PKG_VER.tar.xz LDFLAGS="-L$PREFIX/lib -landroid-shmem" CPPFLAGS="-D__USE_GNU" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=freedreno -Dfreedreno-kmds=msm,kgsl -Dglvnd=disabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm" ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.0/disable-memfd-create-getrandom.patch ================================================ diff --git a/meson.build b/meson.build index 66e14c211d2..7e73daf221a 100644 --- a/meson.build +++ b/meson.build @@ -1354,7 +1354,7 @@ if not ['linux'].contains(host_machine.system()) endif endif -foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', +foreach h : ['linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', 'cet.h', 'pthread_np.h', 'sys/inotify.h', 'linux/udmabuf.h'] if cc.check_header(h) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) @@ -1364,11 +1364,9 @@ endforeach functions_to_detect = { 'strtof': '', 'mkostemp': '', - 'memfd_create': '', 'random_r': '', 'flock': '', 'strtok_r': '', - 'getrandom': '', 'qsort_s': '', 'posix_fallocate': '', 'secure_getenv': '', ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.0/experimental-ad710-support.patch ================================================ diff -uNr mesa-vulkan-freedreno-25.0.3/src/freedreno/common/freedreno_devices.py mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/common/freedreno_devices.py --- mesa-vulkan-freedreno-25.0.3/src/freedreno/common/freedreno_devices.py 2025-04-02 13:35:11.000000000 -0300 +++ mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/common/freedreno_devices.py 2025-04-21 20:40:27.570841169 -0300 @@ -1057,6 +1057,24 @@ )) add_gpus([ + GPUId(chip_id=0x07010000, name="FD710"), # KGSL, no speedbin data + GPUId(chip_id=0xffff07010000, name="FD710"), # Default no-speedbin fallback + ], A6xxGPUInfo( + CHIP.A7XX, + [a7xx_base, a7xx_gen1], + num_ccu = 4, + tile_align_w = 64, + tile_align_h = 32, + num_vsc_pipes = 32, + cs_shared_mem_size = 32 * 1024, + wave_granularity = 2, + fibers_per_sp = 128 * 2 * 16, + highest_bank_bit = 16, + magic_regs = a730_magic_regs, + raw_magic_regs = a730_raw_magic_regs, + )) + +add_gpus([ GPUId(chip_id=0x07030001, name="FD730"), # KGSL, no speedbin data GPUId(chip_id=0xffff07030001, name="FD730"), # Default no-speedbin fallback ], A6xxGPUInfo( diff -uNr mesa-vulkan-freedreno-25.0.3/src/freedreno/drm-shim/freedreno_noop.c mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/drm-shim/freedreno_noop.c --- mesa-vulkan-freedreno-25.0.3/src/freedreno/drm-shim/freedreno_noop.c 2025-04-02 13:35:11.000000000 -0300 +++ mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/drm-shim/freedreno_noop.c 2025-04-21 20:40:28.371145184 -0300 @@ -235,6 +235,11 @@ .gmem_size = 1024 * 1024 + 512 * 1024, }, { + .gpu_id = 710 + .chip_id = 0x07010000, + .gmem_size = 2 * 1024 * 1024, + }, + { .gpu_id = 730, .chip_id = 0x07030001, .gmem_size = 2 * 1024 * 1024, ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.0/force-linux-like-build.patch ================================================ diff --git a/include/vulkan/vk_android_native_buffer.h b/include/vulkan/vk_android_native_buffer.h index 21f82ef57a2..5c67746ca44 100644 --- a/include/vulkan/vk_android_native_buffer.h +++ b/include/vulkan/vk_android_native_buffer.h @@ -17,7 +17,7 @@ * system rather the build target. */ -#if defined(__ANDROID__) || defined(ANDROID) +#if 0 #include #if ANDROID_API_LEVEL < 28 diff --git a/src/util/detect_os.h b/src/util/detect_os.h index 86286dfbe70..49195b3398c 100644 --- a/src/util/detect_os.h +++ b/src/util/detect_os.h @@ -25,7 +25,7 @@ * also be defined. */ #if defined(__ANDROID__) -#define DETECT_OS_ANDROID 1 +#define DETECT_OS_ANDROID 0 #endif #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.0/install-drivers-without-hardlinks.patch ================================================ diff --git a/bin/install_megadrivers.py b/bin/install_megadrivers.py index 216f6999feb..c79e95d1afd 100644 --- a/bin/install_megadrivers.py +++ b/bin/install_megadrivers.py @@ -24,7 +24,16 @@ import argparse import os +import shutil + +def link(src, dest): + shutil.copyfile(src, dest) +def unlink(src): + os.remove(src) + +os.link = link +os.unlink = unlink def resolve_libdir(libdir): if os.path.isabs(libdir): ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.0/wsi-common-no-pthread-cancel.patch ================================================ diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index ff57a259046..4703500f374 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -176,6 +176,12 @@ struct wsi_display_sync { static uint64_t fence_sequence; +#ifdef __ANDROID__ +static void thread_signal_handler (int signum) { + pthread_exit (0); +} +#endif + ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_mode, VkDisplayModeKHR) ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_connector, VkDisplayKHR) @@ -1341,7 +1347,9 @@ wsi_display_wait_thread(void *data) .events = POLLIN }; +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { int ret = poll(&pollfd, 1, -1); if (ret > 0) { @@ -1369,9 +1377,22 @@ wsi_display_start_wait_thread(struct wsi_display *wsi) static void wsi_display_stop_wait_thread(struct wsi_display *wsi) { +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + mtx_lock(&wsi->wait_mutex); if (wsi->wait_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->wait_thread); +#else + pthread_kill(wsi->wait_thread, SIGUSR2); +#endif pthread_join(wsi->wait_thread, NULL); wsi->wait_thread = 0; } @@ -2215,7 +2236,9 @@ udev_event_listener_thread(void *data) int udev_fd = udev_monitor_get_fd(mon); +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { nfds_t nfds = 1; @@ -2340,6 +2363,15 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + if (wsi) { wsi_for_each_connector(connector, wsi) { wsi_for_each_display_mode(mode, connector) { @@ -2351,7 +2383,11 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, wsi_display_stop_wait_thread(wsi); if (wsi->hotplug_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->hotplug_thread); +#else + pthread_kill(wsi->hotplug_thread, SIGUSR2); +#endif pthread_join(wsi->hotplug_thread, NULL); } ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.3/build.sh ================================================ PKG_VER=25.0.3 PKG_CATEGORY="VulkanDriver" PKG_PRETTY_NAME="Mesa Turnip Driver" PKG_DOWNLOADABLE=1 VK_DRIVER_LIB="libvulkan_freedreno.so" BLACKLIST_ARCH=x86_64 SRC_URL=https://archive.mesa3d.org/mesa-$PKG_VER.tar.xz LDFLAGS="-L$PREFIX/lib -landroid-shmem" CPPFLAGS="-D__USE_GNU" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=freedreno -Dfreedreno-kmds=msm,kgsl -Dglvnd=disabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm" ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.3/disable-memfd-create-getrandom.patch ================================================ diff --git a/meson.build b/meson.build index 66e14c211d2..7e73daf221a 100644 --- a/meson.build +++ b/meson.build @@ -1354,7 +1354,7 @@ if not ['linux'].contains(host_machine.system()) endif endif -foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', +foreach h : ['linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', 'cet.h', 'pthread_np.h', 'sys/inotify.h', 'linux/udmabuf.h'] if cc.check_header(h) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) @@ -1364,11 +1364,9 @@ endforeach functions_to_detect = { 'strtof': '', 'mkostemp': '', - 'memfd_create': '', 'random_r': '', 'flock': '', 'strtok_r': '', - 'getrandom': '', 'qsort_s': '', 'posix_fallocate': '', 'secure_getenv': '', ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.3/experimental-ad710-support.patch ================================================ diff -uNr mesa-vulkan-freedreno-25.0.3/src/freedreno/common/freedreno_devices.py mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/common/freedreno_devices.py --- mesa-vulkan-freedreno-25.0.3/src/freedreno/common/freedreno_devices.py 2025-04-02 13:35:11.000000000 -0300 +++ mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/common/freedreno_devices.py 2025-04-21 20:40:27.570841169 -0300 @@ -1057,6 +1057,24 @@ )) add_gpus([ + GPUId(chip_id=0x07010000, name="FD710"), # KGSL, no speedbin data + GPUId(chip_id=0xffff07010000, name="FD710"), # Default no-speedbin fallback + ], A6xxGPUInfo( + CHIP.A7XX, + [a7xx_base, a7xx_gen1], + num_ccu = 4, + tile_align_w = 64, + tile_align_h = 32, + num_vsc_pipes = 32, + cs_shared_mem_size = 32 * 1024, + wave_granularity = 2, + fibers_per_sp = 128 * 2 * 16, + highest_bank_bit = 16, + magic_regs = a730_magic_regs, + raw_magic_regs = a730_raw_magic_regs, + )) + +add_gpus([ GPUId(chip_id=0x07030001, name="FD730"), # KGSL, no speedbin data GPUId(chip_id=0xffff07030001, name="FD730"), # Default no-speedbin fallback ], A6xxGPUInfo( diff -uNr mesa-vulkan-freedreno-25.0.3/src/freedreno/drm-shim/freedreno_noop.c mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/drm-shim/freedreno_noop.c --- mesa-vulkan-freedreno-25.0.3/src/freedreno/drm-shim/freedreno_noop.c 2025-04-02 13:35:11.000000000 -0300 +++ mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/drm-shim/freedreno_noop.c 2025-04-21 20:40:28.371145184 -0300 @@ -235,6 +235,11 @@ .gmem_size = 1024 * 1024 + 512 * 1024, }, { + .gpu_id = 710 + .chip_id = 0x07010000, + .gmem_size = 2 * 1024 * 1024, + }, + { .gpu_id = 730, .chip_id = 0x07030001, .gmem_size = 2 * 1024 * 1024, ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.3/force-linux-like-build.patch ================================================ diff --git a/include/vulkan/vk_android_native_buffer.h b/include/vulkan/vk_android_native_buffer.h index 21f82ef57a2..5c67746ca44 100644 --- a/include/vulkan/vk_android_native_buffer.h +++ b/include/vulkan/vk_android_native_buffer.h @@ -17,7 +17,7 @@ * system rather the build target. */ -#if defined(__ANDROID__) || defined(ANDROID) +#if 0 #include #if ANDROID_API_LEVEL < 28 diff --git a/src/util/detect_os.h b/src/util/detect_os.h index 86286dfbe70..49195b3398c 100644 --- a/src/util/detect_os.h +++ b/src/util/detect_os.h @@ -25,7 +25,7 @@ * also be defined. */ #if defined(__ANDROID__) -#define DETECT_OS_ANDROID 1 +#define DETECT_OS_ANDROID 0 #endif #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.3/install-drivers-without-hardlinks.patch ================================================ diff --git a/bin/install_megadrivers.py b/bin/install_megadrivers.py index 216f6999feb..c79e95d1afd 100644 --- a/bin/install_megadrivers.py +++ b/bin/install_megadrivers.py @@ -24,7 +24,16 @@ import argparse import os +import shutil + +def link(src, dest): + shutil.copyfile(src, dest) +def unlink(src): + os.remove(src) + +os.link = link +os.unlink = unlink def resolve_libdir(libdir): if os.path.isabs(libdir): ================================================ FILE: packages/mesa-vulkan-freedreno-25.0.3/wsi-common-no-pthread-cancel.patch ================================================ diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index ff57a259046..4703500f374 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -176,6 +176,12 @@ struct wsi_display_sync { static uint64_t fence_sequence; +#ifdef __ANDROID__ +static void thread_signal_handler (int signum) { + pthread_exit (0); +} +#endif + ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_mode, VkDisplayModeKHR) ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_connector, VkDisplayKHR) @@ -1341,7 +1347,9 @@ wsi_display_wait_thread(void *data) .events = POLLIN }; +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { int ret = poll(&pollfd, 1, -1); if (ret > 0) { @@ -1369,9 +1377,22 @@ wsi_display_start_wait_thread(struct wsi_display *wsi) static void wsi_display_stop_wait_thread(struct wsi_display *wsi) { +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + mtx_lock(&wsi->wait_mutex); if (wsi->wait_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->wait_thread); +#else + pthread_kill(wsi->wait_thread, SIGUSR2); +#endif pthread_join(wsi->wait_thread, NULL); wsi->wait_thread = 0; } @@ -2215,7 +2236,9 @@ udev_event_listener_thread(void *data) int udev_fd = udev_monitor_get_fd(mon); +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { nfds_t nfds = 1; @@ -2340,6 +2363,15 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + if (wsi) { wsi_for_each_connector(connector, wsi) { wsi_for_each_display_mode(mode, connector) { @@ -2351,7 +2383,11 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, wsi_display_stop_wait_thread(wsi); if (wsi->hotplug_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->hotplug_thread); +#else + pthread_kill(wsi->hotplug_thread, SIGUSR2); +#endif pthread_join(wsi->hotplug_thread, NULL); } ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.0/build.sh ================================================ PKG_VER=25.1.0 PKG_CATEGORY="VulkanDriver" PKG_PRETTY_NAME="Mesa Turnip Driver" PKG_DOWNLOADABLE=1 VK_DRIVER_LIB="libvulkan_freedreno.so" BLACKLIST_ARCH=x86_64 SRC_URL=https://archive.mesa3d.org/mesa-$PKG_VER.tar.xz LDFLAGS="-L$PREFIX/lib -landroid-shmem" CPPFLAGS="-D__USE_GNU" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=freedreno -Dfreedreno-kmds=msm,kgsl -Dglvnd=disabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm" ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.0/disable-memfd-create-getrandom.patch ================================================ diff --git a/meson.build b/meson.build index 66e14c211d2..7e73daf221a 100644 --- a/meson.build +++ b/meson.build @@ -1354,7 +1354,7 @@ if not ['linux'].contains(host_machine.system()) endif endif -foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', +foreach h : ['linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', 'cet.h', 'pthread_np.h', 'sys/inotify.h', 'linux/udmabuf.h'] if cc.check_header(h) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) @@ -1364,11 +1364,9 @@ endforeach functions_to_detect = { 'strtof': '', 'mkostemp': '', - 'memfd_create': '', 'random_r': '', 'flock': '', 'strtok_r': '', - 'getrandom': '', 'qsort_s': '', 'posix_fallocate': '', 'secure_getenv': '', ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.0/experimental-ad710-support.patch ================================================ diff -uNr mesa-vulkan-freedreno-25.0.3/src/freedreno/common/freedreno_devices.py mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/common/freedreno_devices.py --- mesa-vulkan-freedreno-25.0.3/src/freedreno/common/freedreno_devices.py 2025-04-02 13:35:11.000000000 -0300 +++ mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/common/freedreno_devices.py 2025-04-21 20:40:27.570841169 -0300 @@ -1057,6 +1057,24 @@ )) add_gpus([ + GPUId(chip_id=0x07010000, name="FD710"), # KGSL, no speedbin data + GPUId(chip_id=0xffff07010000, name="FD710"), # Default no-speedbin fallback + ], A6xxGPUInfo( + CHIP.A7XX, + [a7xx_base, a7xx_gen1], + num_ccu = 4, + tile_align_w = 64, + tile_align_h = 32, + num_vsc_pipes = 32, + cs_shared_mem_size = 32 * 1024, + wave_granularity = 2, + fibers_per_sp = 128 * 2 * 16, + highest_bank_bit = 16, + magic_regs = a730_magic_regs, + raw_magic_regs = a730_raw_magic_regs, + )) + +add_gpus([ GPUId(chip_id=0x07030001, name="FD730"), # KGSL, no speedbin data GPUId(chip_id=0xffff07030001, name="FD730"), # Default no-speedbin fallback ], A6xxGPUInfo( diff -uNr mesa-vulkan-freedreno-25.0.3/src/freedreno/drm-shim/freedreno_noop.c mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/drm-shim/freedreno_noop.c --- mesa-vulkan-freedreno-25.0.3/src/freedreno/drm-shim/freedreno_noop.c 2025-04-02 13:35:11.000000000 -0300 +++ mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/drm-shim/freedreno_noop.c 2025-04-21 20:40:28.371145184 -0300 @@ -235,6 +235,11 @@ .gmem_size = 1024 * 1024 + 512 * 1024, }, { + .gpu_id = 710 + .chip_id = 0x07010000, + .gmem_size = 2 * 1024 * 1024, + }, + { .gpu_id = 730, .chip_id = 0x07030001, .gmem_size = 2 * 1024 * 1024, ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.0/force-linux-like-build.patch ================================================ diff --git a/include/vulkan/vk_android_native_buffer.h b/include/vulkan/vk_android_native_buffer.h index 21f82ef57a2..5c67746ca44 100644 --- a/include/vulkan/vk_android_native_buffer.h +++ b/include/vulkan/vk_android_native_buffer.h @@ -17,7 +17,7 @@ * system rather the build target. */ -#if defined(__ANDROID__) || defined(ANDROID) +#if 0 #include #if ANDROID_API_LEVEL < 28 diff --git a/src/util/detect_os.h b/src/util/detect_os.h index 86286dfbe70..49195b3398c 100644 --- a/src/util/detect_os.h +++ b/src/util/detect_os.h @@ -25,7 +25,7 @@ * also be defined. */ #if defined(__ANDROID__) -#define DETECT_OS_ANDROID 1 +#define DETECT_OS_ANDROID 0 #endif #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.0/install-drivers-without-hardlinks.patch ================================================ diff --git a/bin/install_megadrivers.py b/bin/install_megadrivers.py index 216f6999feb..c79e95d1afd 100644 --- a/bin/install_megadrivers.py +++ b/bin/install_megadrivers.py @@ -24,7 +24,16 @@ import argparse import os +import shutil + +def link(src, dest): + shutil.copyfile(src, dest) +def unlink(src): + os.remove(src) + +os.link = link +os.unlink = unlink def resolve_libdir(libdir): if os.path.isabs(libdir): ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.0/wsi-common-no-pthread-cancel.patch ================================================ diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index ff57a259046..4703500f374 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -176,6 +176,12 @@ struct wsi_display_sync { static uint64_t fence_sequence; +#ifdef __ANDROID__ +static void thread_signal_handler (int signum) { + pthread_exit (0); +} +#endif + ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_mode, VkDisplayModeKHR) ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_connector, VkDisplayKHR) @@ -1341,7 +1347,9 @@ wsi_display_wait_thread(void *data) .events = POLLIN }; +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { int ret = poll(&pollfd, 1, -1); if (ret > 0) { @@ -1369,9 +1377,22 @@ wsi_display_start_wait_thread(struct wsi_display *wsi) static void wsi_display_stop_wait_thread(struct wsi_display *wsi) { +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + mtx_lock(&wsi->wait_mutex); if (wsi->wait_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->wait_thread); +#else + pthread_kill(wsi->wait_thread, SIGUSR2); +#endif pthread_join(wsi->wait_thread, NULL); wsi->wait_thread = 0; } @@ -2215,7 +2236,9 @@ udev_event_listener_thread(void *data) int udev_fd = udev_monitor_get_fd(mon); +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { nfds_t nfds = 1; @@ -2340,6 +2363,15 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + if (wsi) { wsi_for_each_connector(connector, wsi) { wsi_for_each_display_mode(mode, connector) { @@ -2351,7 +2383,11 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, wsi_display_stop_wait_thread(wsi); if (wsi->hotplug_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->hotplug_thread); +#else + pthread_kill(wsi->hotplug_thread, SIGUSR2); +#endif pthread_join(wsi->hotplug_thread, NULL); } ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.4/build.sh ================================================ PKG_VER=25.1.4 PKG_CATEGORY="VulkanDriver" PKG_PRETTY_NAME="Mesa Turnip Driver" PKG_DOWNLOADABLE=1 VK_DRIVER_LIB="libvulkan_freedreno.so" BLACKLIST_ARCH=x86_64 SRC_URL=https://archive.mesa3d.org/mesa-$PKG_VER.tar.xz LDFLAGS="-L$PREFIX/lib -landroid-shmem" CPPFLAGS="-D__USE_GNU" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=freedreno -Dfreedreno-kmds=msm,kgsl -Dglvnd=disabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm" ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.4/disable-memfd-create-getrandom.patch ================================================ diff --git a/meson.build b/meson.build index 66e14c211d2..7e73daf221a 100644 --- a/meson.build +++ b/meson.build @@ -1354,7 +1354,7 @@ if not ['linux'].contains(host_machine.system()) endif endif -foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', +foreach h : ['linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', 'cet.h', 'pthread_np.h', 'sys/inotify.h', 'linux/udmabuf.h'] if cc.check_header(h) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) @@ -1364,11 +1364,9 @@ endforeach functions_to_detect = { 'strtof': '', 'mkostemp': '', - 'memfd_create': '', 'random_r': '', 'flock': '', 'strtok_r': '', - 'getrandom': '', 'qsort_s': '', 'posix_fallocate': '', 'secure_getenv': '', ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.4/experimental-ad710-support.patch ================================================ diff -uNr mesa-vulkan-freedreno-25.0.3/src/freedreno/common/freedreno_devices.py mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/common/freedreno_devices.py --- mesa-vulkan-freedreno-25.0.3/src/freedreno/common/freedreno_devices.py 2025-04-02 13:35:11.000000000 -0300 +++ mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/common/freedreno_devices.py 2025-04-21 20:40:27.570841169 -0300 @@ -1057,6 +1057,24 @@ )) add_gpus([ + GPUId(chip_id=0x07010000, name="FD710"), # KGSL, no speedbin data + GPUId(chip_id=0xffff07010000, name="FD710"), # Default no-speedbin fallback + ], A6xxGPUInfo( + CHIP.A7XX, + [a7xx_base, a7xx_gen1], + num_ccu = 4, + tile_align_w = 64, + tile_align_h = 32, + num_vsc_pipes = 32, + cs_shared_mem_size = 32 * 1024, + wave_granularity = 2, + fibers_per_sp = 128 * 2 * 16, + highest_bank_bit = 16, + magic_regs = a730_magic_regs, + raw_magic_regs = a730_raw_magic_regs, + )) + +add_gpus([ GPUId(chip_id=0x07030001, name="FD730"), # KGSL, no speedbin data GPUId(chip_id=0xffff07030001, name="FD730"), # Default no-speedbin fallback ], A6xxGPUInfo( diff -uNr mesa-vulkan-freedreno-25.0.3/src/freedreno/drm-shim/freedreno_noop.c mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/drm-shim/freedreno_noop.c --- mesa-vulkan-freedreno-25.0.3/src/freedreno/drm-shim/freedreno_noop.c 2025-04-02 13:35:11.000000000 -0300 +++ mesa-vulkan-freedreno-25.0.3-exp710/src/freedreno/drm-shim/freedreno_noop.c 2025-04-21 20:40:28.371145184 -0300 @@ -235,6 +235,11 @@ .gmem_size = 1024 * 1024 + 512 * 1024, }, { + .gpu_id = 710 + .chip_id = 0x07010000, + .gmem_size = 2 * 1024 * 1024, + }, + { .gpu_id = 730, .chip_id = 0x07030001, .gmem_size = 2 * 1024 * 1024, ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.4/force-linux-like-build.patch ================================================ diff --git a/include/vulkan/vk_android_native_buffer.h b/include/vulkan/vk_android_native_buffer.h index 21f82ef57a2..5c67746ca44 100644 --- a/include/vulkan/vk_android_native_buffer.h +++ b/include/vulkan/vk_android_native_buffer.h @@ -17,7 +17,7 @@ * system rather the build target. */ -#if defined(__ANDROID__) || defined(ANDROID) +#if 0 #include #if ANDROID_API_LEVEL < 28 diff --git a/src/util/detect_os.h b/src/util/detect_os.h index 86286dfbe70..49195b3398c 100644 --- a/src/util/detect_os.h +++ b/src/util/detect_os.h @@ -25,7 +25,7 @@ * also be defined. */ #if defined(__ANDROID__) -#define DETECT_OS_ANDROID 1 +#define DETECT_OS_ANDROID 0 #endif #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.4/install-drivers-without-hardlinks.patch ================================================ diff --git a/bin/install_megadrivers.py b/bin/install_megadrivers.py index 216f6999feb..c79e95d1afd 100644 --- a/bin/install_megadrivers.py +++ b/bin/install_megadrivers.py @@ -24,7 +24,16 @@ import argparse import os +import shutil + +def link(src, dest): + shutil.copyfile(src, dest) +def unlink(src): + os.remove(src) + +os.link = link +os.unlink = unlink def resolve_libdir(libdir): if os.path.isabs(libdir): ================================================ FILE: packages/mesa-vulkan-freedreno-25.1.4/wsi-common-no-pthread-cancel.patch ================================================ diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index ff57a259046..4703500f374 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -176,6 +176,12 @@ struct wsi_display_sync { static uint64_t fence_sequence; +#ifdef __ANDROID__ +static void thread_signal_handler (int signum) { + pthread_exit (0); +} +#endif + ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_mode, VkDisplayModeKHR) ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_connector, VkDisplayKHR) @@ -1341,7 +1347,9 @@ wsi_display_wait_thread(void *data) .events = POLLIN }; +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { int ret = poll(&pollfd, 1, -1); if (ret > 0) { @@ -1369,9 +1377,22 @@ wsi_display_start_wait_thread(struct wsi_display *wsi) static void wsi_display_stop_wait_thread(struct wsi_display *wsi) { +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + mtx_lock(&wsi->wait_mutex); if (wsi->wait_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->wait_thread); +#else + pthread_kill(wsi->wait_thread, SIGUSR2); +#endif pthread_join(wsi->wait_thread, NULL); wsi->wait_thread = 0; } @@ -2215,7 +2236,9 @@ udev_event_listener_thread(void *data) int udev_fd = udev_monitor_get_fd(mon); +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { nfds_t nfds = 1; @@ -2340,6 +2363,15 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + if (wsi) { wsi_for_each_connector(connector, wsi) { wsi_for_each_display_mode(mode, connector) { @@ -2351,7 +2383,11 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, wsi_display_stop_wait_thread(wsi); if (wsi->hotplug_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->hotplug_thread); +#else + pthread_kill(wsi->hotplug_thread, SIGUSR2); +#endif pthread_join(wsi->hotplug_thread, NULL); } ================================================ FILE: packages/mesa-vulkan-radeon/build.sh ================================================ PKG_VER=25.0.0 PKG_CATEGORY="VulkanDriver" PKG_PRETTY_NAME="Mesa Radeon Driver" PKG_DOWNLOADABLE=1 VK_DRIVER_LIB="libvulkan_radeon.so" BLACKLIST_ARCH=aarch64 SRC_URL=https://archive.mesa3d.org/mesa-$PKG_VER.tar.xz LDFLAGS="-L$PREFIX/lib -landroid-shmem" CPPFLAGS="-D__USE_GNU" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=amd -Dglvnd=disabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm" ================================================ FILE: packages/mesa-vulkan-radeon/disable-memfd-create-getrandom.patch ================================================ diff --git a/meson.build b/meson.build index 66e14c211d2..7e73daf221a 100644 --- a/meson.build +++ b/meson.build @@ -1354,7 +1354,7 @@ if not ['linux'].contains(host_machine.system()) endif endif -foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', +foreach h : ['linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', 'cet.h', 'pthread_np.h', 'sys/inotify.h', 'linux/udmabuf.h'] if cc.check_header(h) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) @@ -1364,11 +1364,9 @@ endforeach functions_to_detect = { 'strtof': '', 'mkostemp': '', - 'memfd_create': '', 'random_r': '', 'flock': '', 'strtok_r': '', - 'getrandom': '', 'qsort_s': '', 'posix_fallocate': '', 'secure_getenv': '', ================================================ FILE: packages/mesa-vulkan-radeon/force-linux-like-build.patch ================================================ diff --git a/include/vulkan/vk_android_native_buffer.h b/include/vulkan/vk_android_native_buffer.h index 21f82ef57a2..5c67746ca44 100644 --- a/include/vulkan/vk_android_native_buffer.h +++ b/include/vulkan/vk_android_native_buffer.h @@ -17,7 +17,7 @@ * system rather the build target. */ -#if defined(__ANDROID__) || defined(ANDROID) +#if 0 #include #if ANDROID_API_LEVEL < 28 diff --git a/src/util/detect_os.h b/src/util/detect_os.h index 86286dfbe70..49195b3398c 100644 --- a/src/util/detect_os.h +++ b/src/util/detect_os.h @@ -25,7 +25,7 @@ * also be defined. */ #if defined(__ANDROID__) -#define DETECT_OS_ANDROID 1 +#define DETECT_OS_ANDROID 0 #endif #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ================================================ FILE: packages/mesa-vulkan-radeon/install-drivers-without-hardlinks.patch ================================================ diff --git a/bin/install_megadrivers.py b/bin/install_megadrivers.py index 216f6999feb..c79e95d1afd 100644 --- a/bin/install_megadrivers.py +++ b/bin/install_megadrivers.py @@ -24,7 +24,16 @@ import argparse import os +import shutil + +def link(src, dest): + shutil.copyfile(src, dest) +def unlink(src): + os.remove(src) + +os.link = link +os.unlink = unlink def resolve_libdir(libdir): if os.path.isabs(libdir): ================================================ FILE: packages/mesa-vulkan-radeon/wsi-common-no-pthread-cancel.patch ================================================ diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index ff57a259046..4703500f374 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -176,6 +176,12 @@ struct wsi_display_sync { static uint64_t fence_sequence; +#ifdef __ANDROID__ +static void thread_signal_handler (int signum) { + pthread_exit (0); +} +#endif + ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_mode, VkDisplayModeKHR) ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_connector, VkDisplayKHR) @@ -1341,7 +1347,9 @@ wsi_display_wait_thread(void *data) .events = POLLIN }; +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { int ret = poll(&pollfd, 1, -1); if (ret > 0) { @@ -1369,9 +1377,22 @@ wsi_display_start_wait_thread(struct wsi_display *wsi) static void wsi_display_stop_wait_thread(struct wsi_display *wsi) { +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + mtx_lock(&wsi->wait_mutex); if (wsi->wait_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->wait_thread); +#else + pthread_kill(wsi->wait_thread, SIGUSR2); +#endif pthread_join(wsi->wait_thread, NULL); wsi->wait_thread = 0; } @@ -2215,7 +2236,9 @@ udev_event_listener_thread(void *data) int udev_fd = udev_monitor_get_fd(mon); +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { nfds_t nfds = 1; @@ -2340,6 +2363,15 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + if (wsi) { wsi_for_each_connector(connector, wsi) { wsi_for_each_display_mode(mode, connector) { @@ -2351,7 +2383,11 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, wsi_display_stop_wait_thread(wsi); if (wsi->hotplug_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->hotplug_thread); +#else + pthread_kill(wsi->hotplug_thread, SIGUSR2); +#endif pthread_join(wsi->hotplug_thread, NULL); } ================================================ FILE: packages/mesa-vulkan-wrapper/build.sh ================================================ PKG_VER=25.1.4-[gss] PKG_CATEGORY="VulkanDriver" PKG_PRETTY_NAME="Mesa Android Wrapper" PKG_DOWNLOADABLE=1 VK_DRIVER_LIB="libvulkan_wrapper.so" GIT_URL=https://github.com/KreitinnSoftware/mesa GIT_COMMIT=7227cf46526196d54b22bd9ee53a265824f37420 LDFLAGS="-L$PREFIX/lib -landroid-shmem" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=wrapper -Dglvnd=disabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm" ================================================ FILE: packages/mesa-vulkan-wrapper-adrenotools/01-implement-adrenotools.patch ================================================ diff -uNr mesa-vulkan-wrapper/src/vulkan/wrapper/wrapper_instance.c mesa-vulkan-wrapper-adreno-tools/src/vulkan/wrapper/wrapper_instance.c --- mesa-vulkan-wrapper/src/vulkan/wrapper/wrapper_instance.c 2025-02-22 00:17:54.436045057 +0000 +++ mesa-vulkan-wrapper-adreno-tools/src/vulkan/wrapper/wrapper_instance.c 2025-02-22 00:22:51.479558550 +0000 @@ -4,6 +4,7 @@ #include "vk_common_entrypoints.h" #include "vk_dispatch_table.h" #include "vk_extensions.h" +#include "adrenotools/driver.h" const struct vk_instance_extension_table wrapper_instance_extensions = { .KHR_get_surface_capabilities2 = true, @@ -53,9 +54,43 @@ if (vulkan_library_handle) return true; - const char *env = getenv("WRAPPER_VULKAN_PATH"); - vulkan_library_handle = dlopen(env ? env : DEFAULT_VULKAN_PATH, - RTLD_LOCAL | RTLD_NOW); + char *hook_lib_dir = getenv("ADRENOTOOLS_HOOK_LIB_DIR"); + char *custom_driver_dir = getenv("ADRENOTOOLS_CUSTOM_DRIVER_DIR"); + char *custom_driver_name = getenv("ADRENOTOOLS_CUSTOM_DRIVER_NAME"); + char *file_redirect_dir = getenv("ADRENOTOOLS_FILE_REDIRECT_DIR"); + + if (hook_lib_dir == NULL) { + hook_lib_dir = "/data/data/com.micewine.emu/files/usr/lib/"; + } + + if (custom_driver_dir == NULL) { + custom_driver_dir = "/data/data/com.micewine.emu/files/home/hook/"; + } + + char *use_adrenotools = getenv("USE_ADRENOTOOLS"); + + if (use_adrenotools && strcmp(use_adrenotools, "1") == 0) { + int adrenotools_flags = ADRENOTOOLS_DRIVER_GPU_MAPPING_IMPORT; + + void *adrenotools_mapping_handle = NULL; + + if (file_redirect_dir) { + adrenotools_flags |= ADRENOTOOLS_DRIVER_FILE_REDIRECT; + } + + if (custom_driver_dir) { + adrenotools_flags |= ADRENOTOOLS_DRIVER_CUSTOM; + } + + vulkan_library_handle = adrenotools_open_libvulkan(RTLD_NOW, adrenotools_flags, NULL, hook_lib_dir, + custom_driver_dir, custom_driver_name, + file_redirect_dir, &adrenotools_mapping_handle); + + } else { + const char *env = getenv("WRAPPER_VULKAN_PATH"); + vulkan_library_handle = dlopen(env ? env : DEFAULT_VULKAN_PATH, + RTLD_LOCAL | RTLD_NOW); + } if (vulkan_library_handle) { create_instance = dlsym(vulkan_library_handle, "vkCreateInstance"); ================================================ FILE: packages/mesa-vulkan-wrapper-adrenotools/build.sh ================================================ PKG_VER=25.1.4-[gss]-adrenotools PKG_CATEGORY="AdrenoTools" PKG_PRETTY_NAME="Mesa Android Wrapper" VK_DRIVER_LIB="libvulkan_wrapper.so" BLACKLIST_ARCH=x86_64 GIT_URL=https://github.com/KreitinnSoftware/mesa GIT_COMMIT=7227cf46526196d54b22bd9ee53a265824f37420 LDFLAGS="-L$PREFIX/lib -landroid-shmem -ladrenotools -llinkernsbypass" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=wrapper -Dglvnd=disabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libXxf86vm libadrenotools" ================================================ FILE: packages/mesa-vulkan-wrapper-rev8/01-install-drivers-without-hardlinks.patch ================================================ diff --git a/bin/install_megadrivers.py b/bin/install_megadrivers.py index 216f6999feb..c79e95d1afd 100644 --- a/bin/install_megadrivers.py +++ b/bin/install_megadrivers.py @@ -24,7 +24,16 @@ import argparse import os +import shutil + +def link(src, dest): + shutil.copyfile(src, dest) +def unlink(src): + os.remove(src) + +os.link = link +os.unlink = unlink def resolve_libdir(libdir): if os.path.isabs(libdir): ================================================ FILE: packages/mesa-vulkan-wrapper-rev8/02-disable-memfd-create-getrandom.patch ================================================ diff --git a/meson.build b/meson.build index 66e14c211d2..7e73daf221a 100644 --- a/meson.build +++ b/meson.build @@ -1354,7 +1354,7 @@ if not ['linux'].contains(host_machine.system()) endif endif -foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', +foreach h : ['linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', 'cet.h', 'pthread_np.h', 'sys/inotify.h', 'linux/udmabuf.h'] if cc.check_header(h) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) @@ -1364,11 +1364,9 @@ endforeach functions_to_detect = { 'strtof': '', 'mkostemp': '', - 'memfd_create': '', 'random_r': '', 'flock': '', 'strtok_r': '', - 'getrandom': '', 'qsort_s': '', 'posix_fallocate': '', 'secure_getenv': '', ================================================ FILE: packages/mesa-vulkan-wrapper-rev8/03-wsi-common-no-pthread-cancel.patch ================================================ diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index ff57a259046..4703500f374 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -176,6 +176,12 @@ struct wsi_display_sync { static uint64_t fence_sequence; +#ifdef __ANDROID__ +static void thread_signal_handler (int signum) { + pthread_exit (0); +} +#endif + ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_mode, VkDisplayModeKHR) ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_connector, VkDisplayKHR) @@ -1341,7 +1347,9 @@ wsi_display_wait_thread(void *data) .events = POLLIN }; +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { int ret = poll(&pollfd, 1, -1); if (ret > 0) { @@ -1369,9 +1377,22 @@ wsi_display_start_wait_thread(struct wsi_display *wsi) static void wsi_display_stop_wait_thread(struct wsi_display *wsi) { +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + mtx_lock(&wsi->wait_mutex); if (wsi->wait_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->wait_thread); +#else + pthread_kill(wsi->wait_thread, SIGUSR2); +#endif pthread_join(wsi->wait_thread, NULL); wsi->wait_thread = 0; } @@ -2215,7 +2236,9 @@ udev_event_listener_thread(void *data) int udev_fd = udev_monitor_get_fd(mon); +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { nfds_t nfds = 1; @@ -2340,6 +2363,15 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + if (wsi) { wsi_for_each_connector(connector, wsi) { wsi_for_each_display_mode(mode, connector) { @@ -2351,7 +2383,11 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, wsi_display_stop_wait_thread(wsi); if (wsi->hotplug_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->hotplug_thread); +#else + pthread_kill(wsi->hotplug_thread, SIGUSR2); +#endif pthread_join(wsi->hotplug_thread, NULL); } ================================================ FILE: packages/mesa-vulkan-wrapper-rev8/04-Android-Vulkan-wrapper.patch ================================================ From 6c9c359bbf864458eeaf46caccd21e6f25fb7753 Mon Sep 17 00:00:00 2001 From: xMeM Date: Sat, 26 Oct 2024 19:19:39 +0800 Subject: [PATCH 1/2] Android Vulkan wrapper Wrap the Android Vulkan loader into ICD, using common WSI to provide X11 platform surface support. Signed-off-by: xMeM --- meson.build | 5 +- meson_options.txt | 2 +- src/android_stub/nativewindow_stub.cpp | 7 + src/vulkan/meson.build | 5 +- src/vulkan/wrapper/meson.build | 93 ++++ src/vulkan/wrapper/vk_entrypoints.py | 1 + src/vulkan/wrapper/vk_extensions.py | 1 + src/vulkan/wrapper/vk_wrapper_features_gen.py | 298 +++++++++++++ .../wrapper/vk_wrapper_trampolines_gen.py | 222 ++++++++++ src/vulkan/wrapper/wrapper_device.c | 404 ++++++++++++++++++ src/vulkan/wrapper/wrapper_device_memory.c | 246 +++++++++++ src/vulkan/wrapper/wrapper_instance.c | 297 +++++++++++++ src/vulkan/wrapper/wrapper_physical_device.c | 195 +++++++++ src/vulkan/wrapper/wrapper_private.h | 85 ++++ src/vulkan/wsi/wsi_common.c | 26 +- src/vulkan/wsi/wsi_common.h | 2 + 16 files changed, 1881 insertions(+), 8 deletions(-) create mode 100644 src/vulkan/wrapper/meson.build create mode 120000 src/vulkan/wrapper/vk_entrypoints.py create mode 120000 src/vulkan/wrapper/vk_extensions.py create mode 100644 src/vulkan/wrapper/vk_wrapper_features_gen.py create mode 100644 src/vulkan/wrapper/vk_wrapper_trampolines_gen.py create mode 100644 src/vulkan/wrapper/wrapper_device.c create mode 100644 src/vulkan/wrapper/wrapper_device_memory.c create mode 100644 src/vulkan/wrapper/wrapper_instance.c create mode 100644 src/vulkan/wrapper/wrapper_physical_device.c create mode 100644 src/vulkan/wrapper/wrapper_private.h diff --git a/meson.build b/meson.build index 9fb4160cf54..f232f7be3ef 100644 --- a/meson.build +++ b/meson.build @@ -243,6 +243,7 @@ elif _vulkan_drivers.contains('all') 'nouveau'] endif +with_wrapper_vk = _vulkan_drivers.contains('wrapper') with_intel_vk = _vulkan_drivers.contains('intel') with_intel_hasvk = _vulkan_drivers.contains('intel_hasvk') with_amd_vk = _vulkan_drivers.contains('amd') @@ -896,8 +897,8 @@ endif pre_args += '-DGLAPI_EXPORT_PROTO_ENTRY_POINTS=@0@'.format(with_glapi_export_proto_entry_points.to_int()) with_android_stub = get_option('android-stub') -if with_android_stub and not with_platform_android - error('`-D android-stub=true` makes no sense without `-D platforms=android`') +if with_wrapper_vk + with_android_stub = true endif with_libbacktrace = get_option('android-libbacktrace') \ diff --git a/meson_options.txt b/meson_options.txt index 382393e5097..325219090bd 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -236,7 +236,7 @@ option( value : ['auto'], choices : ['auto', 'amd', 'broadcom', 'freedreno', 'intel', 'intel_hasvk', 'panfrost', 'swrast', 'virtio', 'imagination-experimental', - 'microsoft-experimental', 'nouveau', 'all'], + 'microsoft-experimental', 'nouveau', 'wrapper', 'all'], description : 'List of vulkan drivers to build. If this is set to auto ' + 'all drivers applicable to the target OS/architecture ' + 'will be built' diff --git a/src/android_stub/nativewindow_stub.cpp b/src/android_stub/nativewindow_stub.cpp index 9276a9c3d2e..4bd0cfe25ab 100644 --- a/src/android_stub/nativewindow_stub.cpp +++ b/src/android_stub/nativewindow_stub.cpp @@ -43,6 +43,13 @@ AHardwareBuffer_getNativeHandle(const AHardwareBuffer *buffer) return NULL; } +int +AHardwareBuffer_sendHandleToUnixSocket(const AHardwareBuffer* buffer, + int socketFd) +{ + return 0; +} + void ANativeWindow_acquire(ANativeWindow *window) { diff --git a/src/vulkan/meson.build b/src/vulkan/meson.build index 56f35fc90fe..f54b6b444ff 100644 --- a/src/vulkan/meson.build +++ b/src/vulkan/meson.build @@ -62,7 +62,7 @@ if with_xlib_lease vulkan_wsi_deps += [dep_xlib_xrandr] vulkan_wsi_list += '-DVK_USE_PLATFORM_XLIB_XRANDR_EXT' endif -if with_platform_android +if with_platform_android or with_wrapper_vk vulkan_wsi_list += '-DVK_USE_PLATFORM_ANDROID_KHR' endif if with_platform_windows @@ -88,3 +88,6 @@ endif if with_vulkan_device_select_layer subdir('device-select-layer') endif +if with_wrapper_vk + subdir('wrapper') +endif diff --git a/src/vulkan/wrapper/meson.build b/src/vulkan/wrapper/meson.build new file mode 100644 index 00000000000..8960fb62493 --- /dev/null +++ b/src/vulkan/wrapper/meson.build @@ -0,0 +1,93 @@ +wrapper_icd = custom_target( + 'wrapper_icd', + input: [vk_icd_gen, vk_api_xml], + output: 'wrapper_icd.@0@.json'.format(host_machine.cpu()), + command: [ + prog_python, + '@INPUT0@', + '--api-version', '1.3', + '--xml', '@INPUT1@', + '--lib-path', join_paths(get_option('prefix'), get_option('libdir'), 'libvulkan_wrapper.so'), + '--out', '@OUTPUT@', + ], + build_by_default: true, + install_dir: with_vulkan_icd_dir, + install: true, +) + +wrapper_entrypoints = custom_target( + 'wrapper_entrypoints', + input: [vk_entrypoints_gen, vk_api_xml], + output: ['wrapper_entrypoints.h', 'wrapper_entrypoints.c'], + command: [ + prog_python, + '@INPUT0@', + '--xml', '@INPUT1@', + '--proto', + '--weak', + '--beta', with_vulkan_beta.to_string(), + '--out-h', '@OUTPUT0@', + '--out-c', '@OUTPUT1@', + '--prefix', 'wrapper', + ], + depend_files: vk_entrypoints_gen_depend_files, +) + +wrapper_trampolines_gen = files('vk_wrapper_trampolines_gen.py') + +wrapper_trampolines = custom_target( + 'wrapper_trampolines', + input: [wrapper_trampolines_gen, vk_api_xml], + output: ['wrapper_trampolines.c', 'wrapper_trampolines.h'], + command: [ + prog_python, + '@INPUT0@', + '--xml', '@INPUT1@', + '--out-c', '@OUTPUT0@', + '--out-h', '@OUTPUT1@', + '--beta', with_vulkan_beta.to_string(), + ], + depend_files: vk_dispatch_trampolines_gen_depend_files, +) + +wrapper_features_gen = files('vk_wrapper_features_gen.py') + +wrapper_features = custom_target( + 'vk_wrapper_features', + input: [wrapper_features_gen, vk_api_xml], + output: ['wrapper_features.c'], + command: [ + prog_python, + '@INPUT0@', + '--xml', '@INPUT1@', + '--out-c', '@OUTPUT0@', + '--beta', with_vulkan_beta.to_string(), + ], + depend_files: vk_physical_device_features_gen_depend_files, +) + +wrapper_files = files( + 'wrapper_device.c', + 'wrapper_device_memory.c', + 'wrapper_instance.c', + 'wrapper_physical_device.c', +) + +wrapper_deps = [ + idep_vulkan_runtime, + idep_vulkan_util, + idep_vulkan_wsi, + dep_android, +] + +libvulkan_wrapper = shared_library( + 'vulkan_wrapper', + [wrapper_entrypoints, wrapper_trampolines, wrapper_features, wrapper_files], + include_directories: [ + inc_include, + inc_src, + ], + dependencies: [wrapper_deps, vulkan_wsi_deps], + gnu_symbol_visibility: 'hidden', + install: true, +) diff --git a/src/vulkan/wrapper/vk_entrypoints.py b/src/vulkan/wrapper/vk_entrypoints.py new file mode 120000 index 00000000000..bbc9deb820f --- /dev/null +++ b/src/vulkan/wrapper/vk_entrypoints.py @@ -0,0 +1 @@ +../util/vk_entrypoints.py \ No newline at end of file diff --git a/src/vulkan/wrapper/vk_extensions.py b/src/vulkan/wrapper/vk_extensions.py new file mode 120000 index 00000000000..4407eca87b3 --- /dev/null +++ b/src/vulkan/wrapper/vk_extensions.py @@ -0,0 +1 @@ +../util/vk_extensions.py \ No newline at end of file diff --git a/src/vulkan/wrapper/vk_wrapper_features_gen.py b/src/vulkan/wrapper/vk_wrapper_features_gen.py new file mode 100644 index 00000000000..eef8d4bf85b --- /dev/null +++ b/src/vulkan/wrapper/vk_wrapper_features_gen.py @@ -0,0 +1,298 @@ +COPYRIGHT=u""" +/* Copyright © 2021 Intel Corporation + * + * 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 (including the next + * paragraph) 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. + */ +""" + +import argparse +from collections import OrderedDict +from dataclasses import dataclass +import os +import sys +import typing +import xml.etree.ElementTree as et + +import mako +from mako.template import Template +from vk_extensions import Requirements, get_all_required, filter_api + +def str_removeprefix(s, prefix): + if s.startswith(prefix): + return s[len(prefix):] + return s + +RENAMED_FEATURES = { + # See https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17272#note_1446477 for details + ('BufferDeviceAddressFeaturesEXT', 'bufferDeviceAddressCaptureReplay'): 'bufferDeviceAddressCaptureReplayEXT', + + ('MeshShaderFeaturesNV', 'taskShader'): 'taskShaderNV', + ('MeshShaderFeaturesNV', 'meshShader'): 'meshShaderNV', + + ('CooperativeMatrixFeaturesNV', 'cooperativeMatrix'): 'cooperativeMatrixNV', + ('CooperativeMatrixFeaturesNV', 'cooperativeMatrixRobustBufferAccess'): 'cooperativeMatrixRobustBufferAccessNV', + + ('DeviceGeneratedCommandsFeaturesNV', 'deviceGeneratedCommands'): 'deviceGeneratedCommandsNV', +} + +KNOWN_ALIASES = [ + (['Vulkan11Features', '16BitStorageFeatures'], ['storageBuffer16BitAccess', 'uniformAndStorageBuffer16BitAccess', 'storagePushConstant16', 'storageInputOutput16']), + (['Vulkan11Features', 'MultiviewFeatures'], ['multiview', 'multiviewGeometryShader', 'multiviewTessellationShader']), + (['Vulkan11Features', 'VariablePointersFeatures'], ['variablePointersStorageBuffer', 'variablePointers']), + (['Vulkan11Features', 'ProtectedMemoryFeatures'], ['protectedMemory']), + (['Vulkan11Features', 'SamplerYcbcrConversionFeatures'], ['samplerYcbcrConversion']), + (['Vulkan11Features', 'ShaderDrawParametersFeatures'], ['shaderDrawParameters']), + + (['Vulkan12Features', '8BitStorageFeatures'], ['storageBuffer8BitAccess', 'uniformAndStorageBuffer8BitAccess', 'storagePushConstant8']), + (['Vulkan12Features', 'ShaderAtomicInt64Features'], ['shaderBufferInt64Atomics', 'shaderSharedInt64Atomics']), + (['Vulkan12Features', 'ShaderFloat16Int8Features'], ['shaderFloat16', 'shaderInt8']), + ( + ['Vulkan12Features', 'DescriptorIndexingFeatures'], + [ + 'shaderInputAttachmentArrayDynamicIndexing', + 'shaderUniformTexelBufferArrayDynamicIndexing', + 'shaderStorageTexelBufferArrayDynamicIndexing', + 'shaderUniformBufferArrayNonUniformIndexing', + 'shaderSampledImageArrayNonUniformIndexing', + 'shaderStorageBufferArrayNonUniformIndexing', + 'shaderStorageImageArrayNonUniformIndexing', + 'shaderInputAttachmentArrayNonUniformIndexing', + 'shaderUniformTexelBufferArrayNonUniformIndexing', + 'shaderStorageTexelBufferArrayNonUniformIndexing', + 'descriptorBindingUniformBufferUpdateAfterBind', + 'descriptorBindingSampledImageUpdateAfterBind', + 'descriptorBindingStorageImageUpdateAfterBind', + 'descriptorBindingStorageBufferUpdateAfterBind', + 'descriptorBindingUniformTexelBufferUpdateAfterBind', + 'descriptorBindingStorageTexelBufferUpdateAfterBind', + 'descriptorBindingUpdateUnusedWhilePending', + 'descriptorBindingPartiallyBound', + 'descriptorBindingVariableDescriptorCount', + 'runtimeDescriptorArray', + ], + ), + (['Vulkan12Features', 'ScalarBlockLayoutFeatures'], ['scalarBlockLayout']), + (['Vulkan12Features', 'ImagelessFramebufferFeatures'], ['imagelessFramebuffer']), + (['Vulkan12Features', 'UniformBufferStandardLayoutFeatures'], ['uniformBufferStandardLayout']), + (['Vulkan12Features', 'ShaderSubgroupExtendedTypesFeatures'], ['shaderSubgroupExtendedTypes']), + (['Vulkan12Features', 'SeparateDepthStencilLayoutsFeatures'], ['separateDepthStencilLayouts']), + (['Vulkan12Features', 'HostQueryResetFeatures'], ['hostQueryReset']), + (['Vulkan12Features', 'TimelineSemaphoreFeatures'], ['timelineSemaphore']), + (['Vulkan12Features', 'BufferDeviceAddressFeatures', 'BufferDeviceAddressFeaturesEXT'], ['bufferDeviceAddress', 'bufferDeviceAddressMultiDevice']), + (['Vulkan12Features', 'BufferDeviceAddressFeatures'], ['bufferDeviceAddressCaptureReplay']), + (['Vulkan12Features', 'VulkanMemoryModelFeatures'], ['vulkanMemoryModel', 'vulkanMemoryModelDeviceScope', 'vulkanMemoryModelAvailabilityVisibilityChains']), + + (['Vulkan13Features', 'ImageRobustnessFeatures'], ['robustImageAccess']), + (['Vulkan13Features', 'InlineUniformBlockFeatures'], ['inlineUniformBlock', 'descriptorBindingInlineUniformBlockUpdateAfterBind']), + (['Vulkan13Features', 'PipelineCreationCacheControlFeatures'], ['pipelineCreationCacheControl']), + (['Vulkan13Features', 'PrivateDataFeatures'], ['privateData']), + (['Vulkan13Features', 'ShaderDemoteToHelperInvocationFeatures'], ['shaderDemoteToHelperInvocation']), + (['Vulkan13Features', 'ShaderTerminateInvocationFeatures'], ['shaderTerminateInvocation']), + (['Vulkan13Features', 'SubgroupSizeControlFeatures'], ['subgroupSizeControl', 'computeFullSubgroups']), + (['Vulkan13Features', 'Synchronization2Features'], ['synchronization2']), + (['Vulkan13Features', 'TextureCompressionASTCHDRFeatures'], ['textureCompressionASTC_HDR']), + (['Vulkan13Features', 'ZeroInitializeWorkgroupMemoryFeatures'], ['shaderZeroInitializeWorkgroupMemory']), + (['Vulkan13Features', 'DynamicRenderingFeatures'], ['dynamicRendering']), + (['Vulkan13Features', 'ShaderIntegerDotProductFeatures'], ['shaderIntegerDotProduct']), + (['Vulkan13Features', 'Maintenance4Features'], ['maintenance4']), +] + +for (feature_structs, features) in KNOWN_ALIASES: + for flag in features: + for f in feature_structs: + rename = (f, flag) + assert rename not in RENAMED_FEATURES, f"{rename} already exists in RENAMED_FEATURES" + RENAMED_FEATURES[rename] = flag + +def get_renamed_feature(c_type, feature): + return RENAMED_FEATURES.get((str_removeprefix(c_type, 'VkPhysicalDevice'), feature), feature) + +@dataclass +class FeatureStruct: + reqs: Requirements + c_type: str + s_type: str + features: typing.List[str] + +TEMPLATE_C = Template(COPYRIGHT + """ +/* This file generated from ${filename}, don't edit directly. */ + +#include "wrapper_private.h" +#include "vk_physical_device_features.h" +#include "vk_util.h" + +void +wrapper_setup_device_features(struct wrapper_physical_device *physical_device) +{ + VkPhysicalDevice vk_physical_device = physical_device->dispatch_handle; + + /* Query the device what kind of features are supported. */ + VkPhysicalDeviceFeatures2 supported_features2 = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, + }; + +% for f in feature_structs: + ${f.c_type} supported_${f.c_type} = { + .sType = ${f.s_type}, + .pNext = NULL, + }; + __vk_append_struct(&supported_features2, &supported_${f.c_type}); +% endfor + + physical_device->dispatch_table.GetPhysicalDeviceFeatures2( + vk_physical_device, &supported_features2); + + vk_set_physical_device_features(&physical_device->vk.supported_features, + &supported_features2); +} +""") + +def get_pdev_features(doc): + _type = doc.find(".types/type[@name='VkPhysicalDeviceFeatures']") + if _type is not None: + flags = [] + for p in _type.findall('./member'): + assert p.find('./type').text == 'VkBool32' + flags.append(p.find('./name').text) + return flags + return None + +def filter_api(elem, api): + if 'api' not in elem.attrib: + return True + + return api in elem.attrib['api'].split(',') + +def get_feature_structs(doc, api, beta): + feature_structs = OrderedDict() + + required = get_all_required(doc, 'type', api, beta) + + # parse all struct types where structextends VkPhysicalDeviceFeatures2 + for _type in doc.findall('./types/type[@category="struct"]'): + if _type.attrib.get('structextends') != 'VkPhysicalDeviceFeatures2,VkDeviceCreateInfo': + continue + if _type.attrib['name'] not in required: + continue + + reqs = required[_type.attrib['name']] + # Skip extensions with a define for now + guard = reqs.guard + if guard is not None and (guard != "VK_ENABLE_BETA_EXTENSIONS" or beta != "true"): + continue + + # find Vulkan structure type + for elem in _type: + if "STRUCTURE_TYPE" in str(elem.attrib): + s_type = elem.attrib.get('values') + + # collect a list of feature flags + flags = [] + + for p in _type.findall('./member'): + if not filter_api(p, api): + continue + + m_name = p.find('./name').text + if m_name == 'pNext': + pass + elif m_name == 'sType': + s_type = p.attrib.get('values') + else: + assert p.find('./type').text == 'VkBool32' + flags.append(m_name) + + feature_struct = FeatureStruct(reqs=reqs, c_type=_type.attrib.get('name'), s_type=s_type, features=flags) + feature_structs[feature_struct.c_type] = feature_struct + + return feature_structs.values() + +def get_feature_structs_from_xml(xml_files, beta, api='vulkan'): + diagnostics = [] + + pdev_features = None + feature_structs = [] + + for filename in xml_files: + doc = et.parse(filename) + feature_structs += get_feature_structs(doc, api, beta) + if not pdev_features: + pdev_features = get_pdev_features(doc) + + unused_renames = {**RENAMED_FEATURES} + + features = OrderedDict() + + for flag in pdev_features: + features[flag] = 'VkPhysicalDeviceFeatures' + + for f in feature_structs: + for flag in f.features: + renamed_flag = get_renamed_feature(f.c_type, flag) + if renamed_flag not in features: + features[renamed_flag] = f.c_type + else: + a = str_removeprefix(features[renamed_flag], 'VkPhysicalDevice') + b = str_removeprefix(f.c_type, 'VkPhysicalDevice') + if (a, flag) not in RENAMED_FEATURES or (b, flag) not in RENAMED_FEATURES: + diagnostics.append(f'{a} and {b} both define {flag}') + + unused_renames.pop((str_removeprefix(f.c_type, 'VkPhysicalDevice'), flag), None) + + for rename in unused_renames: + diagnostics.append(f'unused rename {rename}') + + assert len(diagnostics) == 0, '\n'.join(diagnostics) + + return pdev_features, feature_structs, features + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--out-c', required=True, help='Output C file.') + parser.add_argument('--beta', required=True, help='Enable beta extensions.') + parser.add_argument('--xml', + help='Vulkan API XML file.', + required=True, action='append', dest='xml_files') + args = parser.parse_args() + + pdev_features, feature_structs, all_flags = get_feature_structs_from_xml(args.xml_files, args.beta) + + environment = { + 'filename': os.path.basename(__file__), + 'pdev_features': pdev_features, + 'feature_structs': feature_structs, + 'all_flags': all_flags, + 'get_renamed_feature': get_renamed_feature, + } + + try: + with open(args.out_c, 'w', encoding='utf-8') as f: + f.write(TEMPLATE_C.render(**environment)) + except Exception: + # In the event there's an error, this uses some helpers from mako + # to print a useful stack trace and prints it, then exits with + # status 1, if python is run with debug; otherwise it just raises + # the exception + print(mako.exceptions.text_error_template().render(), file=sys.stderr) + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/src/vulkan/wrapper/vk_wrapper_trampolines_gen.py b/src/vulkan/wrapper/vk_wrapper_trampolines_gen.py new file mode 100644 index 00000000000..f20fde16034 --- /dev/null +++ b/src/vulkan/wrapper/vk_wrapper_trampolines_gen.py @@ -0,0 +1,222 @@ +# coding=utf-8 +COPYRIGHT = """\ +/* + * Copyright 2020 Intel Corporation + * + * 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, sub license, 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 (including the + * next paragraph) 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 NON-INFRINGEMENT. + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS 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. + */ +""" + +import argparse +import os + +from mako.template import Template + +# Mesa-local imports must be declared in meson variable +# '{file_without_suffix}_depend_files'. +from vk_entrypoints import get_entrypoints_from_xml + +TEMPLATE_H = Template(COPYRIGHT + """\ +/* This file generated from ${filename}, don't edit directly. */ + +#ifndef WRAPPER_TRAMPOLINES_H +#define WRAPPER_TRAMPOLINES_H + +#include "vk_dispatch_table.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern struct vk_physical_device_entrypoint_table wrapper_physical_device_trampolines; +extern struct vk_device_entrypoint_table wrapper_device_trampolines; + +#ifdef __cplusplus +} +#endif + +#endif /* WRAPPER_TRAMPOLINES_H */ +""") + +TEMPLATE_C = Template(COPYRIGHT + """\ +/* This file generated from ${filename}, don't edit directly. */ + +#include "wrapper_private.h" +#include "wrapper_trampolines.h" + +% for e in entrypoints: + % if not e.is_physical_device_entrypoint() or e.alias: + <% continue %> + % endif + % if e.guard is not None: +#ifdef ${e.guard} + % endif +static VKAPI_ATTR ${e.return_type} VKAPI_CALL +${e.prefixed_name('wrapper_tramp')}(${e.decl_params()}) +{ + <% assert e.params[0].type == 'VkPhysicalDevice' %> + VK_FROM_HANDLE(wrapper_physical_device, vk_physical_device, ${e.params[0].name}); + % if e.return_type == 'void': + vk_physical_device->dispatch_table.${e.name}(vk_physical_device->dispatch_handle, ${e.call_params(1)}); + % else: + return vk_physical_device->dispatch_table.${e.name}(vk_physical_device->dispatch_handle, ${e.call_params(1)}); + % endif +} + % if e.guard is not None: +#endif + % endif +% endfor + +struct vk_physical_device_entrypoint_table wrapper_physical_device_trampolines = { +% for e in entrypoints: + % if not e.is_physical_device_entrypoint() or e.alias: + <% continue %> + % endif + % if e.guard is not None: +#ifdef ${e.guard} + % endif + .${e.name} = ${e.prefixed_name('wrapper_tramp')}, + % if e.guard is not None: +#endif + % endif +% endfor +}; + +% for e in entrypoints: + % if not e.is_device_entrypoint() or e.alias: + <% continue %> + % endif + % if e.guard is not None: +#ifdef ${e.guard} + % endif +static VKAPI_ATTR ${e.return_type} VKAPI_CALL +${e.prefixed_name('wrapper_tramp')}(${e.decl_params()}) +{ + % if e.params[0].type == 'VkDevice': + VK_FROM_HANDLE(wrapper_device, vk_device, ${e.params[0].name}); + % if e.return_type == 'void': + % if len(e.params) > 1: + vk_device->dispatch_table.${e.name}(vk_device->dispatch_handle, ${e.call_params(1)}); + % else: + vk_device->dispatch_table.${e.name}(vk_device->dispatch_handle); + % endif + % else: + % if len(e.params) > 1: + return vk_device->dispatch_table.${e.name}(vk_device->dispatch_handle, ${e.call_params(1)}); + % else: + return vk_device->dispatch_table.${e.name}(vk_device->dispatch_handle); + % endif + % endif + % elif e.params[0].type == 'VkCommandBuffer': + VK_FROM_HANDLE(wrapper_command_buffer, wcb, ${e.params[0].name}); + % if e.return_type == 'void': + % if len(e.params) > 1: + wcb->device->dispatch_table.${e.name}(wcb->dispatch_handle, ${e.call_params(1)}); + % else: + wcb->device->dispatch_table.${e.name}(wcb->dispatch_handle); + % endif + % else: + % if len(e.params) > 1: + return wcb->device->dispatch_table.${e.name}(wcb->dispatch_handle, ${e.call_params(1)}); + % else: + return wcb->device->dispatch_table.${e.name}(wcb->dispatch_handle); + % endif + % endif + % elif e.params[0].type == 'VkQueue': + VK_FROM_HANDLE(wrapper_queue, wqueue, ${e.params[0].name}); + % if e.return_type == 'void': + % if len(e.params) > 1: + wqueue->device->dispatch_table.${e.name}(wqueue->dispatch_handle, ${e.call_params(1)}); + % else: + wqueue->device->dispatch_table.${e.name}(wqueue->dispatch_handle); + % endif + % else: + % if len(e.params) > 1: + return wqueue->device->dispatch_table.${e.name}(wqueue->dispatch_handle, ${e.call_params(1)}); + % else: + return wqueue->device->dispatch_table.${e.name}(wqueue->dispatch_handle); + % endif + % endif + % else: + assert(!"Unhandled device child trampoline case: ${e.params[0].type}"); + % endif +} + % if e.guard is not None: +#endif + % endif +% endfor + +struct vk_device_entrypoint_table wrapper_device_trampolines = { +% for e in entrypoints: + % if not e.is_device_entrypoint() or e.alias: + <% continue %> + % endif + % if e.guard is not None: +#ifdef ${e.guard} + % endif + .${e.name} = ${e.prefixed_name('wrapper_tramp')}, + % if e.guard is not None: +#endif + % endif +% endfor +}; +""") + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--out-c', help='Output C file.') + parser.add_argument('--out-h', help='Output H file.') + parser.add_argument('--beta', required=True, help='Enable beta extensions.') + parser.add_argument('--xml', + help='Vulkan API XML file.', + required=True, + action='append', + dest='xml_files') + args = parser.parse_args() + + entrypoints = get_entrypoints_from_xml(args.xml_files, args.beta) + + # For outputting entrypoints.h we generate a anv_EntryPoint() prototype + # per entry point. + try: + if args.out_h: + with open(args.out_h, 'w', encoding='utf-8') as f: + f.write(TEMPLATE_H.render(entrypoints=entrypoints, + filename=os.path.basename(__file__))) + if args.out_c: + with open(args.out_c, 'w', encoding='utf-8') as f: + f.write(TEMPLATE_C.render(entrypoints=entrypoints, + filename=os.path.basename(__file__))) + except Exception: + # In the event there's an error, this imports some helpers from mako + # to print a useful stack trace and prints it, then exits with + # status 1, if python is run with debug; otherwise it just raises + # the exception + if __debug__: + import sys + from mako import exceptions + sys.stderr.write(exceptions.text_error_template().render() + '\n') + sys.exit(1) + raise + + +if __name__ == '__main__': + main() diff --git a/src/vulkan/wrapper/wrapper_device.c b/src/vulkan/wrapper/wrapper_device.c new file mode 100644 index 00000000000..25ca9480164 --- /dev/null +++ b/src/vulkan/wrapper/wrapper_device.c @@ -0,0 +1,404 @@ +#include "wrapper_private.h" +#include "wrapper_entrypoints.h" +#include "wrapper_trampolines.h" +#include "vk_alloc.h" +#include "vk_common_entrypoints.h" +#include "vk_device.h" +#include "vk_dispatch_table.h" +#include "vk_extensions.h" +#include "vk_queue.h" +#include "vk_util.h" +#include "util/list.h" + +const struct vk_device_extension_table wrapper_device_extensions = +{ + .KHR_swapchain = true, + .EXT_swapchain_maintenance1 = true, + .KHR_swapchain_mutable_format = true, +#ifdef VK_USE_PLATFORM_DISPLAY_KHR + .EXT_display_control = true, +#endif + .KHR_present_id = true, + .KHR_present_wait = true, + .KHR_incremental_present = true, + .KHR_map_memory2 = true, + .EXT_map_memory_placed = true, +}; + +const struct vk_device_extension_table wrapper_filter_extensions = +{ + .EXT_hdr_metadata = true, + .GOOGLE_display_timing = true, + .KHR_shared_presentable_image = true, + .EXT_image_compression_control_swapchain = true, +}; + +static void +wrapper_filter_enabled_extensions(const struct vk_device *device, + uint32_t *enable_extension_count, + const char **enable_extensions) +{ + for (int idx = 0; idx < VK_DEVICE_EXTENSION_COUNT; idx++) { + if (!device->enabled_extensions.extensions[idx]) + continue; + + if (wrapper_device_extensions.extensions[idx]) + continue; + + if (wrapper_filter_extensions.extensions[idx]) + continue; + + enable_extensions[(*enable_extension_count)++] = + vk_device_extensions[idx].extensionName; + } +} + +static inline void +wrapper_append_required_extensions(const struct vk_device *device, + uint32_t *count, + const char **exts) { +#define REQUIRED_EXTENSION(name) \ + if (!device->enabled_extensions.name && \ + device->physical->supported_extensions.name) { \ + exts[(*count)++] = "VK_" #name; \ + } + REQUIRED_EXTENSION(KHR_external_fence); + REQUIRED_EXTENSION(KHR_external_semaphore); + REQUIRED_EXTENSION(KHR_external_memory); + REQUIRED_EXTENSION(KHR_external_fence_fd); + REQUIRED_EXTENSION(KHR_external_semaphore_fd); + REQUIRED_EXTENSION(KHR_external_memory_fd); + REQUIRED_EXTENSION(KHR_dedicated_allocation); + REQUIRED_EXTENSION(EXT_queue_family_foreign); + REQUIRED_EXTENSION(KHR_maintenance1) + REQUIRED_EXTENSION(KHR_maintenance2) + REQUIRED_EXTENSION(KHR_image_format_list) + REQUIRED_EXTENSION(KHR_timeline_semaphore); + REQUIRED_EXTENSION(EXT_external_memory_host); + REQUIRED_EXTENSION(EXT_external_memory_dma_buf); + REQUIRED_EXTENSION(EXT_image_drm_format_modifier); + REQUIRED_EXTENSION(ANDROID_external_memory_android_hardware_buffer); +#undef REQUIRED_EXTENSION +} + +static VkResult +wrapper_create_device_queue(struct wrapper_device *device, + const VkDeviceCreateInfo* pCreateInfo) +{ + const VkDeviceQueueCreateInfo *create_info; + struct wrapper_queue *queue; + VkResult result; + + for (int i = 0; i < pCreateInfo->queueCreateInfoCount; i++) { + create_info = &pCreateInfo->pQueueCreateInfos[i]; + for (int j = 0; j < create_info->queueCount; j++) { + queue = vk_zalloc(&device->vk.alloc, sizeof(*queue), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!queue) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + device->dispatch_table.GetDeviceQueue(device->dispatch_handle, + create_info->queueFamilyIndex, + j, &queue->dispatch_handle);; + queue->device = device; + + result = vk_queue_init(&queue->vk, &device->vk, create_info, j); + if (result != VK_SUCCESS) { + vk_free(&device->vk.alloc, queue); + return result; + } + } + } + + return VK_SUCCESS; +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_CreateDevice(VkPhysicalDevice physicalDevice, + const VkDeviceCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDevice* pDevice) +{ + VK_FROM_HANDLE(wrapper_physical_device, physical_device, physicalDevice); + const char *wrapper_enable_extensions[VK_DEVICE_EXTENSION_COUNT]; + uint32_t wrapper_enable_extension_count = 0; + VkDeviceCreateInfo wrapper_create_info = *pCreateInfo; + struct vk_device_dispatch_table dispatch_table; + struct wrapper_device *device; + VkPhysicalDeviceFeatures2 *pdf2; + VkPhysicalDeviceFeatures *pdf; + VkResult result; + + device = vk_zalloc2(&physical_device->instance->vk.alloc, pAllocator, + sizeof(*device), 8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); + if (!device) + return vk_error(physical_device, VK_ERROR_OUT_OF_HOST_MEMORY); + + list_inithead(&device->command_buffers); + device->physical = physical_device; + device->memorys = _mesa_hash_table_create(NULL, + _mesa_hash_pointer, + _mesa_key_pointer_equal); + if (!device->memorys) { + vk_free2(&physical_device->instance->vk.alloc, pAllocator, + device); + return vk_error(physical_device, VK_ERROR_OUT_OF_HOST_MEMORY); + } + + vk_device_dispatch_table_from_entrypoints( + &dispatch_table, &wrapper_device_entrypoints, true); + vk_device_dispatch_table_from_entrypoints( + &dispatch_table, &wsi_device_entrypoints, false); + vk_device_dispatch_table_from_entrypoints( + &dispatch_table, &wrapper_device_trampolines, false); + + result = vk_device_init(&device->vk, &physical_device->vk, + &dispatch_table, pCreateInfo, pAllocator); + + if (result != VK_SUCCESS) { + vk_free2(&physical_device->instance->vk.alloc, pAllocator, + device); + return vk_error(physical_device, result); + } + + wrapper_filter_enabled_extensions(&device->vk, + &wrapper_enable_extension_count, + wrapper_enable_extensions); + wrapper_append_required_extensions(&device->vk, + &wrapper_enable_extension_count, + wrapper_enable_extensions); + + wrapper_create_info.enabledExtensionCount = wrapper_enable_extension_count; + wrapper_create_info.ppEnabledExtensionNames = wrapper_enable_extensions; + + pdf = (void *)pCreateInfo->pEnabledFeatures; + if (pdf && pdf->textureCompressionBC) { + pdf->textureCompressionBC &= + physical_device->backup_supported_features.textureCompressionBC; + } + pdf2 = __vk_find_struct((void *)pCreateInfo->pNext, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2); + if (pdf2 && pdf2->features.textureCompressionBC) { + pdf2->features.textureCompressionBC &= + physical_device->backup_supported_features.textureCompressionBC; + } + + result = physical_device->dispatch_table.CreateDevice( + physical_device->dispatch_handle, &wrapper_create_info, + pAllocator, &device->dispatch_handle); + + if (result != VK_SUCCESS) { + vk_device_finish(&device->vk); + vk_free(&device->vk.alloc, device); + return vk_error(physical_device, result); + } + + void *gdpa = physical_device->instance->dispatch_table.GetInstanceProcAddr( + physical_device->instance->dispatch_handle, "vkGetDeviceProcAddr"); + vk_device_dispatch_table_load(&device->dispatch_table, gdpa, + device->dispatch_handle); + + result = wrapper_create_device_queue(device, pCreateInfo); + if (result != VK_SUCCESS) { + wrapper_DestroyDevice(wrapper_device_to_handle(device), + &device->vk.alloc); + return vk_error(physical_device, result); + } + + *pDevice = wrapper_device_to_handle(device); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, + uint32_t queueIndex, VkQueue* pQueue) { + vk_common_GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_GetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2* pQueueInfo, + VkQueue* pQueue) { + vk_common_GetDeviceQueue2(device, pQueueInfo, pQueue); +} + +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +wrapper_GetDeviceProcAddr(VkDevice _device, const char* pName) { + VK_FROM_HANDLE(wrapper_device, device, _device); + return vk_device_get_proc_addr(&device->vk, pName); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_QueueSubmit(VkQueue _queue, uint32_t submitCount, + const VkSubmitInfo* pSubmits, VkFence fence) +{ + VK_FROM_HANDLE(wrapper_queue, queue, _queue); + VkCommandBuffer wrapper_command_buffers[submitCount][32]; + VkSubmitInfo wrapper_submits[submitCount]; + + for (int i = 0; i < submitCount; i++) { + const VkSubmitInfo *submit_info = &pSubmits[i]; + for (int j = 0; j < submit_info->commandBufferCount; j++) { + VK_FROM_HANDLE(wrapper_command_buffer, wcb, + submit_info->pCommandBuffers[j]); + wrapper_command_buffers[i][j] = wcb->dispatch_handle; + } + wrapper_submits[i] = pSubmits[i]; + wrapper_submits[i].pCommandBuffers = wrapper_command_buffers[i]; + } + return queue->device->dispatch_table.QueueSubmit(queue->dispatch_handle, + submitCount, + wrapper_submits, + fence); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_QueueSubmit2(VkQueue _queue, uint32_t submitCount, + const VkSubmitInfo2* pSubmits, VkFence fence) +{ + VK_FROM_HANDLE(wrapper_queue, queue, _queue); + VkCommandBufferSubmitInfo wrapper_command_buffers[submitCount][32]; + VkSubmitInfo2 wrapper_submits[submitCount]; + + for (int i = 0; i < submitCount; i++) { + const VkSubmitInfo2 *submit_info = &pSubmits[i]; + for (int j = 0; j < submit_info->commandBufferInfoCount; j++) { + VK_FROM_HANDLE(wrapper_command_buffer, wcb, + submit_info->pCommandBufferInfos[j].commandBuffer); + wrapper_command_buffers[i][j] = pSubmits[i].pCommandBufferInfos[j]; + wrapper_command_buffers[i][j].commandBuffer = wcb->dispatch_handle; + } + wrapper_submits[i] = pSubmits[i]; + wrapper_submits[i].pCommandBufferInfos = wrapper_command_buffers[i]; + } + return queue->device->dispatch_table.QueueSubmit2(queue->dispatch_handle, + submitCount, + wrapper_submits, + fence); +} + +static VkResult +wrapper_command_buffer_create(struct wrapper_device *device, + VkCommandPool pool, + VkCommandBuffer dispatch_handle, + VkCommandBuffer *pCommandBuffers) { + struct wrapper_command_buffer *wrapper_command_buffer; + wrapper_command_buffer = vk_object_zalloc(&device->vk, &device->vk.alloc, + sizeof(struct wrapper_command_buffer), + VK_OBJECT_TYPE_COMMAND_BUFFER); + if (!wrapper_command_buffer) + return vk_error(&device->vk, VK_ERROR_OUT_OF_HOST_MEMORY); + + wrapper_command_buffer->device = device; + wrapper_command_buffer->pool = pool; + wrapper_command_buffer->dispatch_handle = dispatch_handle; + list_add(&wrapper_command_buffer->link, &device->command_buffers); + + *pCommandBuffers = wrapper_command_buffer_to_handle(wrapper_command_buffer); + + return VK_SUCCESS; +} + +static void +wrapper_command_buffer_destroy(struct wrapper_device *device, + struct wrapper_command_buffer *wcb) { + list_del(&wcb->link); + vk_object_free(&device->vk, NULL, wcb); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_AllocateCommandBuffers(VkDevice _device, + const VkCommandBufferAllocateInfo* pAllocateInfo, + VkCommandBuffer* pCommandBuffers) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + VkCommandBuffer dispatch_handles[pAllocateInfo->commandBufferCount]; + VkResult result; + uint32_t i; + + result = device->dispatch_table.AllocateCommandBuffers(device->dispatch_handle, + pAllocateInfo, + dispatch_handles); + if (result != VK_SUCCESS) + return result; + + for (i = 0; i < pAllocateInfo->commandBufferCount; i++) { + result = wrapper_command_buffer_create(device, + pAllocateInfo->commandPool, + dispatch_handles[i], + &pCommandBuffers[i]); + if (result != VK_SUCCESS) + break; + } + + if (result != VK_SUCCESS) { + device->dispatch_table.FreeCommandBuffers(device->dispatch_handle, + pAllocateInfo->commandPool, + pAllocateInfo->commandBufferCount, + dispatch_handles); + for (int q = 0; q < i; q++) { + VK_FROM_HANDLE(wrapper_command_buffer, wcb, pCommandBuffers[q]); + wrapper_command_buffer_destroy(device, wcb); + } + + for (i = 0; i < pAllocateInfo->commandBufferCount; i++) + pCommandBuffers[i] = VK_NULL_HANDLE; + + return result; + } + + return VK_SUCCESS; +} + + +VKAPI_ATTR void VKAPI_CALL +wrapper_FreeCommandBuffers(VkDevice _device, + VkCommandPool commandPool, + uint32_t commandBufferCount, + const VkCommandBuffer* pCommandBuffers) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + VkCommandBuffer dispatch_handles[commandBufferCount]; + + for (int i = 0; i < commandBufferCount; i++) { + VK_FROM_HANDLE(wrapper_command_buffer, wcb, pCommandBuffers[i]); + dispatch_handles[i] = wcb->dispatch_handle; + wrapper_command_buffer_destroy(device, wcb); + } + device->dispatch_table.FreeCommandBuffers(device->dispatch_handle, + commandPool, commandBufferCount, + dispatch_handles); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_DestroyCommandPool(VkDevice _device, VkCommandPool commandPool, + const VkAllocationCallbacks* pAllocator) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + list_for_each_entry_safe(struct wrapper_command_buffer, wcb, + &device->command_buffers, link) { + if (wcb->pool == commandPool) { + wrapper_command_buffer_destroy(device, wcb); + } + } + device->dispatch_table.DestroyCommandPool(device->dispatch_handle, + commandPool, pAllocator); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_DestroyDevice(VkDevice _device, const VkAllocationCallbacks* pAllocator) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + list_for_each_entry_safe(struct wrapper_command_buffer, wcb, + &device->command_buffers, link) { + wrapper_command_buffer_destroy(device, wcb); + } + list_for_each_entry_safe(struct vk_queue, queue, &device->vk.queues, link) { + vk_queue_finish(queue); + vk_free2(&device->vk.alloc, pAllocator, queue); + } + device->dispatch_table.DestroyDevice(device->dispatch_handle, pAllocator); + vk_device_finish(&device->vk); + vk_free2(&device->vk.alloc, pAllocator, device); +} + diff --git a/src/vulkan/wrapper/wrapper_device_memory.c b/src/vulkan/wrapper/wrapper_device_memory.c new file mode 100644 index 00000000000..e2e40e5a977 --- /dev/null +++ b/src/vulkan/wrapper/wrapper_device_memory.c @@ -0,0 +1,246 @@ +#define native_handle_t __native_handle_t +#define buffer_handle_t __buffer_handle_t +#include "wrapper_private.h" +#include "wrapper_entrypoints.h" +#include "vk_common_entrypoints.h" +#undef native_handle_t +#undef buffer_handle_t +#include "util/hash_table.h" +#include "vk_util.h" + +#include +#include +#include + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_AllocateMemory(VkDevice _device, + const VkMemoryAllocateInfo* pAllocateInfo, + const VkAllocationCallbacks* pAllocator, + VkDeviceMemory* pMemory) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + const VkImportAndroidHardwareBufferInfoANDROID *import_info; + const VkExportMemoryAllocateInfo *export_info; + VkExportMemoryAllocateInfo local_export_info; + VkMemoryAllocateInfo wrapper_allocate_info; + struct wrapper_device_memory *memory; + VkMemoryPropertyFlags mem_flags; + bool can_get_ahardware_buffer; + VkResult result; + + mem_flags = device->physical->memory_properties.memoryTypes + [pAllocateInfo->memoryTypeIndex].propertyFlags; + + if (!device->vk.enabled_extensions.EXT_map_memory_placed || + !(mem_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)) { + return device->dispatch_table.AllocateMemory(device->dispatch_handle, + pAllocateInfo, + pAllocator, + pMemory); + } + + memory = vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*memory), + 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!memory) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + wrapper_allocate_info = *pAllocateInfo; + + import_info = vk_find_struct_const(pAllocateInfo, + IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID); + export_info = vk_find_struct_const(pAllocateInfo, + EXPORT_MEMORY_ALLOCATE_INFO); + + if (import_info) { + memory->ahardware_buffer = import_info->buffer; + AHardwareBuffer_acquire(memory->ahardware_buffer); + } else if (!export_info) { + local_export_info = (VkExportMemoryAllocateInfo) { + .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, + .pNext = wrapper_allocate_info.pNext, + .handleTypes = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, + }; + wrapper_allocate_info.pNext = &local_export_info; + export_info = &local_export_info; + } + + result = device->dispatch_table.AllocateMemory(device->dispatch_handle, + &wrapper_allocate_info, + pAllocator, + pMemory); + if (result != VK_SUCCESS) { + if (memory->ahardware_buffer) + AHardwareBuffer_release(memory->ahardware_buffer); + vk_free2(&device->vk.alloc, pAllocator, memory); + return vk_error(device, result); + } + + can_get_ahardware_buffer = (export_info && export_info->handleTypes == + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID); + + if (can_get_ahardware_buffer) { + const VkMemoryGetAndroidHardwareBufferInfoANDROID get_ahb_info = { + .sType = + VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, + .memory = *pMemory, + }; + device->dispatch_table.GetMemoryAndroidHardwareBufferANDROID( + device->dispatch_handle, &get_ahb_info, &memory->ahardware_buffer); + } + + memory->alloc_size = pAllocateInfo->allocationSize; + _mesa_hash_table_insert(device->memorys, (void *)(*pMemory), memory); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_FreeMemory(VkDevice _device, VkDeviceMemory _memory, + const VkAllocationCallbacks* pAllocator) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + struct hash_entry *entry = NULL; + + if (_memory != VK_NULL_HANDLE) + entry = _mesa_hash_table_search(device->memorys, (void *)_memory); + + if (entry) { + struct wrapper_device_memory *memory = entry->data; + if (memory->map_address && memory->map_size) { + munmap(memory->map_address, memory->map_size); + } + if (memory->ahardware_buffer) { + AHardwareBuffer_release(memory->ahardware_buffer); + } + vk_free2(&device->vk.alloc, pAllocator, memory); + _mesa_hash_table_remove(device->memorys, entry); + } + + device->dispatch_table.FreeMemory(device->dispatch_handle, + _memory, + pAllocator); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_MapMemory2KHR(VkDevice _device, + const VkMemoryMapInfoKHR* pMemoryMapInfo, + void** ppData) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + struct wrapper_device_memory *memory; + const VkMemoryMapPlacedInfoEXT *placed_info; + const struct hash_entry *entry = NULL; + const native_handle_t *handle; + const int *handle_fds; + + placed_info = vk_find_struct_const(pMemoryMapInfo->pNext, + MEMORY_MAP_PLACED_INFO_EXT); + if (pMemoryMapInfo->memory != VK_NULL_HANDLE) + entry = _mesa_hash_table_search(device->memorys, + (void *)pMemoryMapInfo->memory); + if (!placed_info || !entry) { + return device->dispatch_table.MapMemory(device->dispatch_handle, + pMemoryMapInfo->memory, + pMemoryMapInfo->offset, + pMemoryMapInfo->size, + 0, + ppData); + } + memory = entry->data; + + if (memory->map_address) { + if (placed_info->pPlacedAddress != memory->map_address) { + return VK_ERROR_MEMORY_MAP_FAILED; + } else { + *ppData = (char *)memory->map_address + pMemoryMapInfo->offset; + return VK_SUCCESS; + } + } + + if (!memory->ahardware_buffer) { + fprintf(stderr, "Can't get AHardwareBuffer, mapping memory will fail"); + return vk_error(device, VK_ERROR_MEMORY_MAP_FAILED); + } + + handle = AHardwareBuffer_getNativeHandle(memory->ahardware_buffer); + handle_fds = &handle->data[0]; + + int idx; + for (idx = 0; idx < handle->numFds; idx++) { + size_t size = lseek(handle_fds[idx], 0, SEEK_END); + if (size < memory->alloc_size) + continue; + + if (pMemoryMapInfo->size == VK_WHOLE_SIZE) + { + memory->map_size = size; + break; + } else if (size >= pMemoryMapInfo->size) { + memory->map_size = pMemoryMapInfo->size; + break; + } + } + assert(idx < handle->numFds); + + memory->map_address = mmap(placed_info->pPlacedAddress, + memory->map_size, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_FIXED, + handle_fds[idx], 0); + + if (memory->map_address == MAP_FAILED) { + memory->map_address = NULL; + memory->map_size = 0; + fprintf(stderr, "%s: mmap failed\n", __func__); + return vk_error(device, VK_ERROR_MEMORY_MAP_FAILED); + } + + *ppData = (char *)memory->map_address + pMemoryMapInfo->offset; + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_UnmapMemory(VkDevice _device, VkDeviceMemory _memory) { + vk_common_UnmapMemory(_device, _memory); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_UnmapMemory2KHR(VkDevice _device, + const VkMemoryUnmapInfoKHR* pMemoryUnmapInfo) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + struct wrapper_device_memory *memory; + const struct hash_entry *entry = NULL; + + if (pMemoryUnmapInfo->memory != VK_NULL_HANDLE) + entry = _mesa_hash_table_search(device->memorys, + (void *)pMemoryUnmapInfo->memory); + if (!entry) { + device->dispatch_table.UnmapMemory(device->dispatch_handle, + pMemoryUnmapInfo->memory); + return VK_SUCCESS; + } + + memory = entry->data; + + if (!memory->map_address) + return VK_SUCCESS; + + if (pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT) { + memory->map_address = mmap(memory->map_address, memory->map_size, + PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + if (memory->map_address == MAP_FAILED) { + fprintf(stderr, "Failed to replace mapping with reserved memory"); + return vk_error(device, VK_ERROR_MEMORY_MAP_FAILED); + } + } else { + munmap(memory->map_address, memory->map_size); + } + + memory->map_size = 0; + memory->map_address = 0; + + return VK_SUCCESS; +} diff --git a/src/vulkan/wrapper/wrapper_instance.c b/src/vulkan/wrapper/wrapper_instance.c new file mode 100644 index 00000000000..3b083ec40d8 --- /dev/null +++ b/src/vulkan/wrapper/wrapper_instance.c @@ -0,0 +1,297 @@ +#include "wrapper_private.h" +#include "wrapper_entrypoints.h" +#include "vk_alloc.h" +#include "vk_common_entrypoints.h" +#include "vk_dispatch_table.h" +#include "vk_extensions.h" + +const struct vk_instance_extension_table wrapper_instance_extensions = { + .KHR_get_surface_capabilities2 = true, + .EXT_surface_maintenance1 = true, + .KHR_surface_protected_capabilities = true, + .KHR_surface = true, + .EXT_swapchain_colorspace = true, +#ifdef VK_USE_PLATFORM_ANDROID_KHR + .KHR_android_surface = true, +#endif +#ifdef VK_USE_PLATFORM_XCB_KHR + .KHR_xcb_surface = true, +#endif +#ifdef VK_USE_PLATFORM_XLIB_KHR + .KHR_xlib_surface = true, +#endif +#ifdef VK_USE_PLATFORM_WAYLAND_KHR + .KHR_wayland_surface = true, +#endif +#ifdef VK_USE_PLATFORM_DISPLAY_KHR + .KHR_display = true, + .KHR_get_display_properties2 = true, + .EXT_display_surface_counter = true, + .EXT_acquire_drm_display = true, + .EXT_direct_mode_display = true, +#endif + .EXT_headless_surface = true, + .EXT_debug_utils = true, + .EXT_debug_report = true, +}; + +static void *vulkan_library_handle; +static PFN_vkCreateInstance create_instance; +static PFN_vkGetInstanceProcAddr get_instance_proc_addr; +static PFN_vkEnumerateInstanceVersion enumerate_instance_version; +static PFN_vkEnumerateInstanceExtensionProperties enumerate_instance_extension_properties; +static struct vk_instance_extension_table *supported_instance_extensions; + +#ifdef __LP64__ +#define DEFAULT_VULKAN_PATH "/system/lib64/libvulkan.so" +#else +#define DEFAULT_VULKAN_PATH "/system/lib/libvulkan.so" +#endif + +#include + +static bool vulkan_library_init() +{ + if (vulkan_library_handle) + return true; + + const char *env = getenv("WRAPPER_VULKAN_PATH"); + vulkan_library_handle = dlopen(env ? env : DEFAULT_VULKAN_PATH, + RTLD_LOCAL | RTLD_NOW); + + if (vulkan_library_handle) { + create_instance = dlsym(vulkan_library_handle, "vkCreateInstance"); + get_instance_proc_addr = dlsym(vulkan_library_handle, + "vkGetInstanceProcAddr"); + enumerate_instance_version = dlsym(vulkan_library_handle, + "vkEnumerateInstanceVersion"); + enumerate_instance_extension_properties = + dlsym(vulkan_library_handle, "vkEnumerateInstanceExtensionProperties"); + } + else { + fprintf(stderr, "%s", dlerror()); + } + + return vulkan_library_handle ? true : false; +} + +static VkResult wrapper_vulkan_init() +{ + VkExtensionProperties props[VK_INSTANCE_EXTENSION_COUNT]; + uint32_t prop_count = VK_INSTANCE_EXTENSION_COUNT; + VkResult result; + + if (supported_instance_extensions) + return VK_SUCCESS; + + if (!vulkan_library_init()) + return VK_ERROR_INCOMPATIBLE_DRIVER; + + result = enumerate_instance_extension_properties(NULL, &prop_count, props); + if (result != VK_SUCCESS) + return result; + + supported_instance_extensions = malloc(sizeof(*supported_instance_extensions)); + if (!supported_instance_extensions) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + *supported_instance_extensions = wrapper_instance_extensions; + + for(int i = 0; i < prop_count; i++) { + int idx; + for (idx = 0; idx < VK_INSTANCE_EXTENSION_COUNT; idx++) { + if (strcmp(vk_instance_extensions[idx].extensionName, + props[i].extensionName) == 0) + break; + } + + if (idx >= VK_INSTANCE_EXTENSION_COUNT) + continue; + + supported_instance_extensions->extensions[idx] = true; + } + + return VK_SUCCESS; +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_EnumerateInstanceVersion(uint32_t* pApiVersion) +{ + + if (!vulkan_library_init()) + return vk_error(NULL, VK_ERROR_INCOMPATIBLE_DRIVER); + + return enumerate_instance_version(pApiVersion); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_EnumerateInstanceExtensionProperties(const char* pLayerName, + uint32_t* pPropertyCount, + VkExtensionProperties* pProperties) +{ + VkResult result; + + result = wrapper_vulkan_init(); + if (result != VK_SUCCESS) + return vk_error(NULL, result); + + return vk_enumerate_instance_extension_properties(supported_instance_extensions, + pPropertyCount, + pProperties); +} + +static inline void +set_wrapper_required_extensions(const struct vk_instance *instance, + uint32_t *enable_extension_count, + const char **enable_extensions) +{ + uint32_t count = *enable_extension_count; +#define REQUIRED_EXTENSION(name) \ + assert (count < VK_INSTANCE_EXTENSION_COUNT); \ + if (!instance->enabled_extensions.name && \ + supported_instance_extensions->name) { \ + enable_extensions[count++] = "VK_" #name; \ + } + REQUIRED_EXTENSION(KHR_get_physical_device_properties2); + REQUIRED_EXTENSION(KHR_external_fence_capabilities); + REQUIRED_EXTENSION(KHR_external_memory_capabilities); + REQUIRED_EXTENSION(KHR_external_semaphore_capabilities); +#undef REQUIRED_EXTENSION + *enable_extension_count = count; +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkInstance *pInstance) +{ + const char *wrapper_enable_extensions[VK_INSTANCE_EXTENSION_COUNT]; + uint32_t wrapper_enable_extension_count = 0; + VkInstanceCreateInfo wrapper_create_info = *pCreateInfo; + struct vk_instance_dispatch_table dispatch_table; + struct wrapper_instance *instance; + VkResult result; + + result = wrapper_vulkan_init(); + if (result != VK_SUCCESS) + return vk_error(NULL, result); + + instance = vk_zalloc2(vk_default_allocator(), pAllocator, sizeof(*instance), + 8, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); + if (!instance) + return vk_error(NULL, VK_ERROR_OUT_OF_HOST_MEMORY); + + vk_instance_dispatch_table_from_entrypoints( + &dispatch_table, &wrapper_instance_entrypoints, true); + vk_instance_dispatch_table_from_entrypoints( + &dispatch_table, &wsi_instance_entrypoints, false); + + result = vk_instance_init(&instance->vk, supported_instance_extensions, + &dispatch_table, pCreateInfo, + pAllocator ? pAllocator : vk_default_allocator()); + + if (result != VK_SUCCESS) { + vk_free2(vk_default_allocator(), pAllocator, instance); + return vk_error(NULL, result); + } + + instance->vk.physical_devices.enumerate = enumerate_physical_device; + instance->vk.physical_devices.destroy = destroy_physical_device; + + for (int idx = 0; idx < pCreateInfo->enabledExtensionCount; idx++) { + if (wrapper_instance_extensions.extensions[idx]) + continue; + + if (!instance->vk.enabled_extensions.extensions[idx]) + continue; + + wrapper_enable_extensions[wrapper_enable_extension_count++] = + vk_instance_extensions[idx].extensionName; + } + + set_wrapper_required_extensions(&instance->vk, + &wrapper_enable_extension_count, + wrapper_enable_extensions); + + wrapper_create_info.enabledExtensionCount = wrapper_enable_extension_count; + wrapper_create_info.ppEnabledExtensionNames = wrapper_enable_extensions; + + result = create_instance(&wrapper_create_info, pAllocator, + &instance->dispatch_handle); + if (result != VK_SUCCESS) { + vk_instance_finish(&instance->vk); + vk_free2(vk_default_allocator(), pAllocator, instance); + return vk_error(NULL, result); + } + vk_instance_dispatch_table_load(&instance->dispatch_table, + get_instance_proc_addr, + instance->dispatch_handle); + + *pInstance = wrapper_instance_to_handle(instance); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_DestroyInstance(VkInstance _instance, + const VkAllocationCallbacks *pAllocator) +{ + VK_FROM_HANDLE(wrapper_instance, instance, _instance); + instance->dispatch_table.DestroyInstance(instance->dispatch_handle, + pAllocator); + vk_instance_finish(&instance->vk); + vk_free2(&instance->vk.alloc, pAllocator, instance); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_DebugReportMessageEXT(VkInstance _instance, + VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT objectType, + uint64_t object, + size_t location, + int32_t messageCode, + const char* pLayerPrefix, + const char* pMessage) +{ + VK_FROM_HANDLE(wrapper_instance, instance, _instance); + + switch (objectType) { + case VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT: + break; + default: + object = (uint64_t)VK_NULL_HANDLE; + } + + vk_common_DebugReportMessageEXT(instance->dispatch_handle, flags, + objectType, object, location, messageCode, + pLayerPrefix, pMessage); +} + +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +wrapper_GetInstanceProcAddr(VkInstance _instance, + const char *pName) +{ + VK_FROM_HANDLE(wrapper_instance, instance, _instance); + return vk_instance_get_proc_addr(&instance->vk, + &wrapper_instance_entrypoints, + pName); +} + +PUBLIC VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +vk_icdGetInstanceProcAddr(VkInstance instance, + const char *pName); + + +PUBLIC VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +vk_icdGetInstanceProcAddr(VkInstance instance, + const char *pName) +{ + return wrapper_GetInstanceProcAddr(instance, pName); +} diff --git a/src/vulkan/wrapper/wrapper_physical_device.c b/src/vulkan/wrapper/wrapper_physical_device.c new file mode 100644 index 00000000000..2f0880dfb5b --- /dev/null +++ b/src/vulkan/wrapper/wrapper_physical_device.c @@ -0,0 +1,195 @@ +#include "wrapper_private.h" +#include "wrapper_entrypoints.h" +#include "wrapper_trampolines.h" +#include "vk_alloc.h" +#include "vk_common_entrypoints.h" +#include "vk_dispatch_table.h" +#include "vk_extensions.h" +#include "vk_physical_device.h" +#include "vk_util.h" +#include "wsi_common.h" +#include "util/os_misc.h" + +static VkResult +wrapper_setup_device_extensions(struct wrapper_physical_device *pdevice) { + struct vk_device_extension_table *exts = &pdevice->vk.supported_extensions; + VkExtensionProperties pdevice_extensions[VK_DEVICE_EXTENSION_COUNT]; + uint32_t pdevice_extension_count = VK_DEVICE_EXTENSION_COUNT; + VkResult result; + + result = pdevice->dispatch_table.EnumerateDeviceExtensionProperties( + pdevice->dispatch_handle, NULL, &pdevice_extension_count, pdevice_extensions); + + if (result != VK_SUCCESS) + return result; + + *exts = wrapper_device_extensions; + + for (int i = 0; i < pdevice_extension_count; i++) { + int idx; + for (idx = 0; idx < VK_DEVICE_EXTENSION_COUNT; idx++) { + if (strcmp(vk_device_extensions[idx].extensionName, + pdevice_extensions[i].extensionName) == 0) + break; + } + + if (idx >= VK_DEVICE_EXTENSION_COUNT) + continue; + + if (wrapper_filter_extensions.extensions[idx]) + continue; + + exts->extensions[idx] = true; + } + + exts->KHR_present_wait = exts->KHR_timeline_semaphore; + + return VK_SUCCESS; +} + +static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +wrapper_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName) +{ + VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice); + return vk_instance_get_proc_addr_unchecked(pdevice->instance, pName); +} + +VkResult enumerate_physical_device(struct vk_instance *_instance) +{ + struct wrapper_instance *instance = (struct wrapper_instance *)_instance; + VkPhysicalDevice physical_devices[16]; + uint32_t physical_device_count = 16; + VkResult result; + + result = instance->dispatch_table.EnumeratePhysicalDevices( + instance->dispatch_handle, &physical_device_count, physical_devices); + + if (result != VK_SUCCESS) + return result; + + for (int i = 0; i < physical_device_count; i++) { + PFN_vkGetInstanceProcAddr get_instance_proc_addr; + struct wrapper_physical_device *pdevice; + + pdevice = vk_zalloc(&_instance->alloc, sizeof(*pdevice), 8, + VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); + if (!pdevice) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + struct vk_physical_device_dispatch_table dispatch_table; + vk_physical_device_dispatch_table_from_entrypoints( + &dispatch_table, &wrapper_physical_device_entrypoints, true); + vk_physical_device_dispatch_table_from_entrypoints( + &dispatch_table, &wsi_physical_device_entrypoints, false); + vk_physical_device_dispatch_table_from_entrypoints( + &dispatch_table, &wrapper_physical_device_trampolines, false); + + result = vk_physical_device_init(&pdevice->vk, + &instance->vk, + NULL, NULL, NULL, + &dispatch_table); + if (result != VK_SUCCESS) { + vk_free(&_instance->alloc, pdevice); + return result; + } + + pdevice->instance = instance; + pdevice->dispatch_handle = physical_devices[i]; + get_instance_proc_addr = instance->dispatch_table.GetInstanceProcAddr; + + vk_physical_device_dispatch_table_load(&pdevice->dispatch_table, + get_instance_proc_addr, + instance->dispatch_handle); + + wrapper_setup_device_extensions(pdevice); + wrapper_setup_device_features(pdevice); + + struct vk_features *supported_features = &pdevice->vk.supported_features; + pdevice->backup_supported_features = *supported_features; + supported_features->presentId = true; + supported_features->presentWait = supported_features->timelineSemaphore; + supported_features->swapchainMaintenance1 = true; + supported_features->imageCompressionControlSwapchain = false; + supported_features->memoryMapPlaced = true; + supported_features->memoryUnmapReserve = true; + supported_features->textureCompressionBC = true; + + result = wsi_device_init(&pdevice->wsi_device, + wrapper_physical_device_to_handle(pdevice), + wrapper_wsi_proc_addr, &_instance->alloc, -1, + NULL, &(struct wsi_device_options){}); + if (result != VK_SUCCESS) { + vk_physical_device_finish(&pdevice->vk); + vk_free(&_instance->alloc, pdevice); + return result; + } + pdevice->vk.wsi_device = &pdevice->wsi_device; + pdevice->wsi_device.force_bgra8_unorm_first = true; +#ifdef __ANDROID__ + pdevice->wsi_device.wants_ahardware_buffer = true; +#endif + + pdevice->dispatch_table.GetPhysicalDeviceMemoryProperties( + pdevice->dispatch_handle, &pdevice->memory_properties); + + list_addtail(&pdevice->vk.link, &_instance->physical_devices.list); + } + + return VK_SUCCESS; +} + +void destroy_physical_device(struct vk_physical_device *pdevice) { + wsi_device_finish(pdevice->wsi_device, &pdevice->instance->alloc); + vk_physical_device_finish(pdevice); + vk_free(&pdevice->instance->alloc, pdevice); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, + const char* pLayerName, + uint32_t* pPropertyCount, + VkExtensionProperties* pProperties) +{ + return vk_common_EnumerateDeviceExtensionProperties(physicalDevice, + pLayerName, + pPropertyCount, + pProperties); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, + VkPhysicalDeviceFeatures* pFeatures) +{ + return vk_common_GetPhysicalDeviceFeatures(physicalDevice, pFeatures); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, + VkPhysicalDeviceFeatures2* pFeatures) { + vk_common_GetPhysicalDeviceFeatures2(physicalDevice, pFeatures); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, + VkPhysicalDeviceProperties2* pProperties) +{ + VK_FROM_HANDLE(wrapper_physical_device, pdevice, physicalDevice); + pdevice->dispatch_table.GetPhysicalDeviceProperties2( + pdevice->dispatch_handle, pProperties); + + vk_foreach_struct(prop, pProperties->pNext) { + switch (prop->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT: + { + VkPhysicalDeviceMapMemoryPlacedPropertiesEXT *placed_prop = + (VkPhysicalDeviceMapMemoryPlacedPropertiesEXT *)prop; + uint64_t os_page_size; + os_get_page_size(&os_page_size); + placed_prop->minPlacedMemoryMapAlignment = os_page_size; + break; + } + default: + break; + } + } +} diff --git a/src/vulkan/wrapper/wrapper_private.h b/src/vulkan/wrapper/wrapper_private.h new file mode 100644 index 00000000000..696cd937d2c --- /dev/null +++ b/src/vulkan/wrapper/wrapper_private.h @@ -0,0 +1,85 @@ +#include "vulkan/runtime/vk_instance.h" +#include "vulkan/runtime/vk_physical_device.h" +#include "vulkan/runtime/vk_device.h" +#include "vulkan/runtime/vk_queue.h" +#include "vulkan/runtime/vk_command_buffer.h" +#include "vulkan/runtime/vk_log.h" +#include "vulkan/util/vk_dispatch_table.h" +#include "vulkan/wsi/wsi_common.h" +#include "util/hash_table.h" + +extern const struct vk_instance_extension_table wrapper_instance_extensions; +extern const struct vk_device_extension_table wrapper_device_extensions; +extern const struct vk_device_extension_table wrapper_filter_extensions; + +struct wrapper_instance { + struct vk_instance vk; + + VkInstance dispatch_handle; + struct vk_instance_dispatch_table dispatch_table; +}; + +VK_DEFINE_HANDLE_CASTS(wrapper_instance, vk.base, VkInstance, + VK_OBJECT_TYPE_INSTANCE) + +struct wrapper_physical_device { + struct vk_physical_device vk; + + VkPhysicalDevice dispatch_handle; + VkPhysicalDeviceMemoryProperties memory_properties; + struct wsi_device wsi_device; + struct wrapper_instance *instance; + struct vk_features backup_supported_features; + struct vk_physical_device_dispatch_table dispatch_table; +}; + +VK_DEFINE_HANDLE_CASTS(wrapper_physical_device, vk.base, VkPhysicalDevice, + VK_OBJECT_TYPE_PHYSICAL_DEVICE) + +struct wrapper_queue { + struct vk_queue vk; + + struct wrapper_device *device; + VkQueue dispatch_handle; +}; + +VK_DEFINE_HANDLE_CASTS(wrapper_queue, vk.base, VkQueue, + VK_OBJECT_TYPE_QUEUE) + +struct wrapper_device { + struct vk_device vk; + + VkDevice dispatch_handle; + struct list_head command_buffers; + struct hash_table *memorys; + struct wrapper_physical_device *physical; + struct vk_device_dispatch_table dispatch_table; +}; + +VK_DEFINE_HANDLE_CASTS(wrapper_device, vk.base, VkDevice, + VK_OBJECT_TYPE_DEVICE) + +struct wrapper_command_buffer { + struct vk_command_buffer vk; + + struct wrapper_device *device; + struct list_head link; + VkCommandPool pool; + VkCommandBuffer dispatch_handle; +}; + +VK_DEFINE_HANDLE_CASTS(wrapper_command_buffer, vk.base, VkCommandBuffer, + VK_OBJECT_TYPE_COMMAND_BUFFER) + +struct wrapper_device_memory { + struct AHardwareBuffer *ahardware_buffer; + void *map_address; + size_t map_size; + size_t alloc_size; +}; + +VkResult enumerate_physical_device(struct vk_instance *_instance); +void destroy_physical_device(struct vk_physical_device *pdevice); + +void +wrapper_setup_device_features(struct wrapper_physical_device *physical_device); diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 898bdd7bcdb..a11b6bd64bc 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -201,6 +201,8 @@ wsi_device_init(struct wsi_device *wsi, WSI_GET_CB(GetPhysicalDeviceFormatProperties2); WSI_GET_CB(GetPhysicalDeviceImageFormatProperties2); WSI_GET_CB(GetSemaphoreFdKHR); + WSI_GET_CB(ImportSemaphoreFdKHR); + WSI_GET_CB(ImportFenceFdKHR); WSI_GET_CB(ResetFences); WSI_GET_CB(QueueSubmit); WSI_GET_CB(WaitForFences); @@ -1167,8 +1169,16 @@ wsi_signal_semaphore_for_image(struct vk_device *device, const struct wsi_image *image, VkSemaphore _semaphore) { - if (device->physical->supported_sync_types == NULL) - return VK_SUCCESS; + if (device->physical->supported_sync_types == NULL) { + const VkImportSemaphoreFdInfoKHR import_fd_info = { + .sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR, + .semaphore = _semaphore, + .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, + .fd = -1, + .flags = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT, + }; + return chain->wsi->ImportSemaphoreFdKHR(chain->device, &import_fd_info); + } VK_FROM_HANDLE(vk_semaphore, semaphore, _semaphore); @@ -1203,8 +1213,16 @@ wsi_signal_fence_for_image(struct vk_device *device, const struct wsi_image *image, VkFence _fence) { - if (device->physical->supported_sync_types == NULL) - return VK_SUCCESS; + if (device->physical->supported_sync_types == NULL) { + const VkImportFenceFdInfoKHR import_fd_info = { + .sType = VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR, + .fence = _fence, + .handleType = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, + .fd = -1, + .flags = VK_FENCE_IMPORT_TEMPORARY_BIT, + }; + return chain->wsi->ImportFenceFdKHR(chain->device, &import_fd_info); + } VK_FROM_HANDLE(vk_fence, fence, _fence); diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 014cb718b17..2316d3156d0 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -263,6 +263,8 @@ struct wsi_device { WSI_CB(GetPhysicalDeviceFormatProperties2); WSI_CB(GetPhysicalDeviceImageFormatProperties2); WSI_CB(GetSemaphoreFdKHR); + WSI_CB(ImportSemaphoreFdKHR); + WSI_CB(ImportFenceFdKHR); WSI_CB(ResetFences); WSI_CB(QueueSubmit); WSI_CB(WaitForFences); -- 2.47.0 ================================================ FILE: packages/mesa-vulkan-wrapper-rev8/05-vulkan-x11-termux-x11-support.patch ================================================ From 7c2187cfd58354f937cb7de4727ef7040d1acb9f Mon Sep 17 00:00:00 2001 From: xMeM Date: Fri, 8 Nov 2024 17:21:21 +0800 Subject: [PATCH 2/2] vulkan/x11: termux-x11 support Signed-off-by: xMeM --- src/vulkan/wsi/wsi_common.c | 314 +++++++++++++++++++++++++++- src/vulkan/wsi/wsi_common.h | 7 + src/vulkan/wsi/wsi_common_private.h | 8 + src/vulkan/wsi/wsi_common_x11.c | 92 ++++---- 4 files changed, 377 insertions(+), 44 deletions(-) diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index a11b6bd64bc..77755e96b93 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -47,6 +47,10 @@ #include #endif +#ifdef __ANDROID__ +#include +#endif + uint64_t WSI_DEBUG; static const struct debug_control debug_control[] = { @@ -55,6 +59,7 @@ static const struct debug_control debug_control[] = { { "noshm", WSI_DEBUG_NOSHM }, { "linear", WSI_DEBUG_LINEAR }, { "dxgi", WSI_DEBUG_DXGI }, + { "blit", WSI_DEBUG_BLIT }, { NULL, }, }; @@ -86,6 +91,7 @@ wsi_device_init(struct wsi_device *wsi, wsi->sw = device_options->sw_device || (WSI_DEBUG & WSI_DEBUG_SW); wsi->wants_linear = (WSI_DEBUG & WSI_DEBUG_LINEAR) != 0; wsi->x11.extra_xwayland_image = device_options->extra_xwayland_image; + wsi->needs_blit = (WSI_DEBUG & WSI_DEBUG_BLIT) != 0; #define WSI_GET_CB(func) \ PFN_vk##func func = (PFN_vk##func)proc_addr(pdevice, "vk" #func) WSI_GET_CB(GetPhysicalDeviceExternalSemaphoreProperties); @@ -99,12 +105,19 @@ wsi_device_init(struct wsi_device *wsi, wsi->pci_bus_info.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT; wsi->pci_bus_info.pNext = &wsi->drm_info; + VkPhysicalDeviceDriverProperties pddp = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, + .pNext = &wsi->pci_bus_info, + }; VkPhysicalDeviceProperties2 pdp2 = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, - .pNext = &wsi->pci_bus_info, + .pNext = &pddp, }; GetPhysicalDeviceProperties2(pdevice, &pdp2); + if (pddp.driverID == VK_DRIVER_ID_ARM_PROPRIETARY) + wsi->needs_blit = true; + wsi->maxImageDimension2D = pdp2.properties.limits.maxImageDimension2D; assert(pdp2.properties.limits.optimalBufferCopyRowPitchAlignment <= UINT32_MAX); wsi->optimalBufferCopyRowPitchAlignment = @@ -210,6 +223,10 @@ wsi_device_init(struct wsi_device *wsi, WSI_GET_CB(UnmapMemory); if (wsi->khr_present_wait) WSI_GET_CB(WaitSemaphores); +#ifdef __ANDROID__ + WSI_GET_CB(GetMemoryAndroidHardwareBufferANDROID); + WSI_GET_CB(GetAndroidHardwareBufferPropertiesANDROID); +#endif #undef WSI_GET_CB #ifdef VK_USE_PLATFORM_XCB_KHR @@ -366,6 +383,12 @@ get_blit_type(const struct wsi_device *wsi, return wsi_cpu_image_needs_buffer_blit(wsi, cpu_params) ? WSI_SWAPCHAIN_BUFFER_BLIT : WSI_SWAPCHAIN_NO_BLIT; } +#ifdef __ANDROID__ + case WSI_IMAGE_TYPE_AHB: { + return wsi->needs_blit ? WSI_SWAPCHAIN_IMAGE_BLIT : + WSI_SWAPCHAIN_NO_BLIT; + } +#endif #ifdef HAVE_LIBDRM case WSI_IMAGE_TYPE_DRM: { const struct wsi_drm_image_params *drm_params = @@ -386,6 +409,14 @@ get_blit_type(const struct wsi_device *wsi, } } +#ifdef __ANDROID__ +static VkResult +wsi_configure_ahb_image(const struct wsi_swapchain *chain, + const VkSwapchainCreateInfoKHR *pCreateInfo, + const struct wsi_base_image_params *params, + struct wsi_image_info *info); +#endif + static VkResult configure_image(const struct wsi_swapchain *chain, const VkSwapchainCreateInfoKHR *pCreateInfo, @@ -399,6 +430,11 @@ configure_image(const struct wsi_swapchain *chain, container_of(params, const struct wsi_cpu_image_params, base); return wsi_configure_cpu_image(chain, pCreateInfo, cpu_params, info); } +#ifdef __ANDROID__ + case WSI_IMAGE_TYPE_AHB: { + return wsi_configure_ahb_image(chain, pCreateInfo, params, info); + } +#endif #ifdef HAVE_LIBDRM case WSI_IMAGE_TYPE_DRM: { const struct wsi_drm_image_params *drm_params = @@ -698,6 +734,12 @@ wsi_destroy_image_info(const struct wsi_swapchain *chain, vk_free(&chain->alloc, info->modifier_props); info->modifier_props = NULL; } +#ifdef __ANDROID__ + if (info->ahb_desc != NULL) { + vk_free(&chain->alloc, info->ahb_desc); + info->ahb_desc = NULL; + } +#endif } VkResult @@ -760,6 +802,11 @@ wsi_destroy_image(const struct wsi_swapchain *chain, { const struct wsi_device *wsi = chain->wsi; +#ifdef __ANDROID__ + if (image->ahb) + AHardwareBuffer_release(image->ahb); +#endif + #ifndef _WIN32 if (image->dma_buf_fd >= 0) close(image->dma_buf_fd); @@ -2161,6 +2208,162 @@ wsi_create_cpu_linear_image_mem(const struct wsi_swapchain *chain, return VK_SUCCESS; } +#ifdef __ANDROID__ +static VkResult +wsi_create_ahb_image_mem(const struct wsi_swapchain *chain, + const struct wsi_image_info *info, + struct wsi_image *image) +{ + const struct wsi_device *wsi = chain->wsi; + VkAndroidHardwareBufferPropertiesANDROID ahb_props; + VkResult result; + + if (AHardwareBuffer_allocate(info->ahb_desc, &image->ahb)) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + ahb_props = (VkAndroidHardwareBufferPropertiesANDROID) { + .sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID, + }; + + result = wsi->GetAndroidHardwareBufferPropertiesANDROID( + chain->device, image->ahb, &ahb_props); + if (result != VK_SUCCESS) + return result; + + const VkMemoryDedicatedAllocateInfo memory_dedicated_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, + .image = image->image, + .buffer = VK_NULL_HANDLE, + }; + VkImportAndroidHardwareBufferInfoANDROID impory_memory_info = { + .sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, + .pNext = &memory_dedicated_info, + .buffer = image->ahb, + }; + VkMemoryAllocateInfo memory_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .pNext = &impory_memory_info, + .allocationSize = ahb_props.allocationSize, + .memoryTypeIndex = + wsi_select_device_memory_type(wsi, ahb_props.memoryTypeBits), + }; + + result = wsi->AllocateMemory(chain->device, &memory_info, + &chain->alloc, &image->memory); + if (result != VK_SUCCESS) + return result; + + image->num_planes = 1; + image->drm_modifier = 0; + + return VK_SUCCESS; +} + +static VkResult +wsi_create_ahb_blit_context(const struct wsi_swapchain *chain, + const struct wsi_image_info *info, + struct wsi_image *image) +{ + assert(chain->blit.type == WSI_SWAPCHAIN_IMAGE_BLIT); + + const VkExternalMemoryHandleTypeFlags handle_types = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID; + + const struct wsi_device *wsi = chain->wsi; + VkResult result; + + const VkExternalMemoryImageCreateInfo image_external_info = { + .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, + .handleTypes = handle_types, + }; + const VkImageCreateInfo image_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .pNext = &image_external_info, + .flags = 0u, + .extent = info->create.extent, + .format = VK_FORMAT_R8G8B8A8_UNORM, + .imageType = VK_IMAGE_TYPE_2D, + .mipLevels = 1, + .arrayLayers = 1, + .samples = VK_SAMPLE_COUNT_1_BIT, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + .queueFamilyIndexCount = info->create.queueFamilyIndexCount, + .pQueueFamilyIndices = info->create.pQueueFamilyIndices, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + }; + result = wsi->CreateImage(chain->device, &image_info, + &chain->alloc, &image->blit.image); + if (result != VK_SUCCESS) + return result; + + VkMemoryDedicatedAllocateInfo img_mem_dedicated_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, + .pNext = NULL, + .image = image->blit.image, + .buffer = VK_NULL_HANDLE, + }; + VkExportMemoryAllocateInfo export_info = { + .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, + .pNext = &img_mem_dedicated_info, + .handleTypes = handle_types, + }; + VkMemoryAllocateInfo buf_mem_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .pNext = &export_info, + .allocationSize = 0, + .memoryTypeIndex = 0, + }; + + result = wsi->AllocateMemory(chain->device, &buf_mem_info, + &chain->alloc, &image->blit.memory); + if (result != VK_SUCCESS) + return result; + + result = wsi->BindImageMemory(chain->device, image->blit.image, + image->blit.memory, 0); + if (result != VK_SUCCESS) + return result; + + VkMemoryGetAndroidHardwareBufferInfoANDROID get_ahb_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, + .pNext = NULL, + .memory = image->blit.memory, + }; + + result = wsi->GetMemoryAndroidHardwareBufferANDROID( + chain->device, &get_ahb_info, &image->ahb); + if (result != VK_SUCCESS) + return result; + + VkMemoryRequirements reqs; + wsi->GetImageMemoryRequirements(chain->device, image->image, &reqs); + + const VkMemoryDedicatedAllocateInfo memory_dedicated_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, + .image = image->image, + }; + const VkMemoryAllocateInfo memory_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .pNext = &memory_dedicated_info, + .allocationSize = reqs.size, + .memoryTypeIndex = + wsi_select_device_memory_type(wsi, reqs.memoryTypeBits), + }; + + result = wsi->AllocateMemory(chain->device, &memory_info, + &chain->alloc, &image->memory); + if (result != VK_SUCCESS) + return result; + + image->num_planes = 1; + + return VK_SUCCESS; +} + +#endif + static VkResult wsi_create_cpu_buffer_image_mem(const struct wsi_swapchain *chain, const struct wsi_image_info *info, @@ -2233,6 +2436,115 @@ wsi_configure_cpu_image(const struct wsi_swapchain *chain, return VK_SUCCESS; } +#ifdef __ANDROID__ +inline static uint32_t +vk_format_to_ahb_format(VkFormat format) { + switch (format) { + case VK_FORMAT_B8G8R8A8_SRGB: + case VK_FORMAT_B8G8R8A8_UNORM: + return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; + case VK_FORMAT_R5G6B5_UNORM_PACK16: + return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM; + case VK_FORMAT_A2R10G10B10_UNORM_PACK32: + return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM; + default: + unreachable("unsupported format"); + } +} +#endif + +#ifdef __ANDROID__ +static VkResult +wsi_configure_ahb_image(const struct wsi_swapchain *chain, + const VkSwapchainCreateInfoKHR *pCreateInfo, + const struct wsi_base_image_params *params, + struct wsi_image_info *info) +{ + assert(params->image_type == WSI_IMAGE_TYPE_AHB); + assert(chain->blit.type == WSI_SWAPCHAIN_NO_BLIT || + chain->blit.type == WSI_SWAPCHAIN_IMAGE_BLIT); + + VkResult result; + + if (chain->blit.type == WSI_SWAPCHAIN_IMAGE_BLIT) { + result = wsi_configure_image(chain, pCreateInfo, 0, info); + if (result != VK_SUCCESS) + return result; + + wsi_configure_image_blit_image(chain, info); + info->create_mem = wsi_create_ahb_blit_context; + return VK_SUCCESS; + } + + VkExternalMemoryHandleTypeFlags handle_types = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID; + + VkPhysicalDeviceImageFormatInfo2 format_info = { + .sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, + .format = pCreateInfo->imageFormat, + .type = VK_IMAGE_TYPE_2D, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = pCreateInfo->imageUsage, + .flags = info->create.flags, + }; + VkPhysicalDeviceExternalImageFormatInfo external_format_info = + { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO, + .pNext = NULL, + .handleType = handle_types, + }; + __vk_append_struct(&format_info, &external_format_info); + + VkImageFormatProperties2 format_props = { + .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2, + }; + VkExternalImageFormatProperties external_format_props = { + .sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES, + .pNext = NULL, + }; + __vk_append_struct(&format_props, &external_format_props); + + result = chain->wsi->GetPhysicalDeviceImageFormatProperties2( + chain->wsi->pdevice, &format_info, &format_props); + if (result != VK_SUCCESS) + return result; + + assert(pCreateInfo->imageExtent.width <= format_props.imageFormatProperties.maxExtent.width && + pCreateInfo->imageExtent.height <= format_props.imageFormatProperties.maxExtent.height); + assert(external_format_props.externalMemoryProperties.externalMemoryFeatures & + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT); + + result = wsi_configure_image(chain, pCreateInfo, handle_types, + info); + if (result != VK_SUCCESS) + return result; + + info->ahb_desc = vk_alloc(&chain->alloc, + sizeof(AHardwareBuffer_Desc), + 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!info->ahb_desc) { + wsi_destroy_image_info(chain, info); + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + + *info->ahb_desc = (AHardwareBuffer_Desc) { + .width = info->create.extent.width, + .height = info->create.extent.height, + .format = vk_format_to_ahb_format(info->create.format), + .layers = info->create.arrayLayers, + .usage = AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT | + AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | + AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, + }; + info->create.format = VK_FORMAT_UNDEFINED; + info->create_mem = wsi_create_ahb_image_mem; + + return VK_SUCCESS; +} +#endif + VKAPI_ATTR VkResult VKAPI_CALL wsi_WaitForPresentKHR(VkDevice device, VkSwapchainKHR _swapchain, uint64_t presentId, uint64_t timeout) diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 2316d3156d0..ffa3a94e74c 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -179,6 +179,9 @@ struct wsi_device { bool sw; + bool wants_ahardware_buffer; + bool needs_blit; + /* Set to true if the implementation is ok with linear WSI images. */ bool wants_linear; @@ -271,6 +274,10 @@ struct wsi_device { WSI_CB(MapMemory); WSI_CB(UnmapMemory); WSI_CB(WaitSemaphores); +#ifdef __ANDROID__ + WSI_CB(GetMemoryAndroidHardwareBufferANDROID); + WSI_CB(GetAndroidHardwareBufferPropertiesANDROID); +#endif #undef WSI_CB struct wsi_interface * wsi[VK_ICD_WSI_PLATFORM_MAX]; diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h index b89e962c3ff..c205c4f62c3 100644 --- a/src/vulkan/wsi/wsi_common_private.h +++ b/src/vulkan/wsi/wsi_common_private.h @@ -40,6 +40,7 @@ struct wsi_swapchain; #define WSI_DEBUG_NOSHM (1ull << 2) #define WSI_DEBUG_LINEAR (1ull << 3) #define WSI_DEBUG_DXGI (1ull << 4) +#define WSI_DEBUG_BLIT (1ull << 8) extern uint64_t WSI_DEBUG; @@ -47,6 +48,7 @@ enum wsi_image_type { WSI_IMAGE_TYPE_CPU, WSI_IMAGE_TYPE_DRM, WSI_IMAGE_TYPE_DXGI, + WSI_IMAGE_TYPE_AHB, }; struct wsi_base_image_params { @@ -84,6 +86,9 @@ struct wsi_image_info { VkExternalMemoryImageCreateInfo ext_mem; VkImageFormatListCreateInfo format_list; VkImageDrmFormatModifierListCreateInfoEXT drm_mod_list; +#ifdef __ANDROID__ + struct AHardwareBuffer_Desc *ahb_desc; +#endif enum wsi_image_type image_type; bool explicit_sync; @@ -165,6 +170,9 @@ struct wsi_image { int dma_buf_fd; #endif void *cpu_map; +#ifdef __ANDROID__ + struct AHardwareBuffer *ahb; +#endif }; struct wsi_swapchain { diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 0c0c489d893..7911e54eae6 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -22,7 +22,6 @@ */ #include -#include #define XK_MISCELLANY #define XK_LATIN1 #include @@ -69,6 +68,11 @@ #include #endif +#ifdef __ANDROID__ +#include +#include +#endif + #ifndef XCB_PRESENT_OPTION_ASYNC_MAY_TEAR #define XCB_PRESENT_OPTION_ASYNC_MAY_TEAR 16 #endif @@ -1057,7 +1061,6 @@ struct x11_image { xcb_pixmap_t pixmap; xcb_xfixes_region_t update_region; /* long lived XID */ xcb_xfixes_region_t update_area; /* the above or None */ - struct xshmfence * shm_fence; uint32_t sync_fence; xcb_shm_seg_t shmseg; int shmid; @@ -1402,8 +1405,6 @@ x11_present_to_x11_dri3(struct x11_swapchain *chain, uint32_t image_index, options |= XCB_PRESENT_OPTION_SUBOPTIMAL; #endif - xshmfence_reset(image->shm_fence); - if (!chain->base.image_info.explicit_sync) { ++chain->sent_image_count; assert(chain->sent_image_count <= chain->base.image_count); @@ -1771,9 +1772,6 @@ x11_acquire_next_image(struct wsi_swapchain *anv_chain, return result; assert(*image_index < chain->base.image_count); - if (chain->images[*image_index].shm_fence && - !chain->base.image_info.explicit_sync) - xshmfence_await(chain->images[*image_index].shm_fence); return result; } @@ -2098,6 +2096,17 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, /* If the image has a modifier, we must have DRI3 v1.2. */ assert(chain->has_dri3_modifiers); +#ifdef __ANDROID__ + int sock_fds[2] = { -1, -1 }; + if (image->base.ahb) { + if (socketpair(AF_UNIX, SOCK_STREAM, 0, sock_fds) < 0) { + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + AHardwareBuffer_sendHandleToUnixSocket(image->base.ahb, sock_fds[0]); + image->base.dma_buf_fd = sock_fds[1]; + image->base.drm_modifier = 1255; + } +#endif /* XCB requires an array of file descriptors but we only have one */ int fds[4] = { -1, -1, -1, -1 }; for (int i = 0; i < image->base.num_planes; i++) { @@ -2128,6 +2137,16 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, chain->depth, bpp, image->base.drm_modifier, fds); +#ifdef __ANDROID__ + if (image->base.ahb) { + xcb_flush(chain->conn); + read(sock_fds[0], &image->base.dma_buf_fd, 1); + for (int i = 0; i < ARRAY_SIZE(sock_fds); i++) { + close(sock_fds[i]); + } + image->base.dma_buf_fd = -1; + } +#endif } else #endif { @@ -2140,14 +2159,23 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, return VK_ERROR_OUT_OF_HOST_MEMORY; cookie = - xcb_dri3_pixmap_from_buffer_checked(chain->conn, - image->pixmap, - chain->window, - image->base.sizes[0], - pCreateInfo->imageExtent.width, - pCreateInfo->imageExtent.height, - image->base.row_pitches[0], - chain->depth, bpp, fd); + xcb_dri3_pixmap_from_buffers_checked(chain->conn, + image->pixmap, + chain->window, + image->base.num_planes, + pCreateInfo->imageExtent.width, + pCreateInfo->imageExtent.height, + image->base.row_pitches[0], + image->base.offsets[0], + image->base.row_pitches[1], + image->base.offsets[1], + image->base.row_pitches[2], + image->base.offsets[2], + image->base.row_pitches[3], + image->base.offsets[3], + chain->depth, bpp, + 1274, + &fd); } error = xcb_request_check(chain->conn, cookie); @@ -2178,32 +2206,8 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, #endif out_fence: - fence_fd = xshmfence_alloc_shm(); - if (fence_fd < 0) - goto fail_pixmap; - - image->shm_fence = xshmfence_map_shm(fence_fd); - if (image->shm_fence == NULL) - goto fail_shmfence_alloc; - - image->sync_fence = xcb_generate_id(chain->conn); - xcb_dri3_fence_from_fd(chain->conn, - image->pixmap, - image->sync_fence, - false, - fence_fd); - - xshmfence_trigger(image->shm_fence); - return VK_SUCCESS; -fail_shmfence_alloc: - close(fence_fd); - -fail_pixmap: - cookie = xcb_free_pixmap(chain->conn, image->pixmap); - xcb_discard_reply(chain->conn, cookie.sequence); - fail_image: wsi_destroy_image(&chain->base, &image->base); @@ -2218,10 +2222,6 @@ x11_image_finish(struct x11_swapchain *chain, xcb_void_cookie_t cookie; if (!chain->base.wsi->sw || chain->has_mit_shm) { - cookie = xcb_sync_destroy_fence(chain->conn, image->sync_fence); - xcb_discard_reply(chain->conn, cookie.sequence); - xshmfence_unmap_shm(image->shm_fence); - cookie = xcb_free_pixmap(chain->conn, image->pixmap); xcb_discard_reply(chain->conn, cookie.sequence); @@ -2618,6 +2618,12 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, .alloc_shm = wsi_conn->has_mit_shm ? &alloc_shm : NULL, }; image_params = &cpu_image_params.base; +#ifdef __ANDROID__ + } else if (wsi_device->wants_ahardware_buffer) { + image_params = &(struct wsi_base_image_params){ + .image_type = WSI_IMAGE_TYPE_AHB, + }; +#endif } else { drm_image_params = (struct wsi_drm_image_params) { .base.image_type = WSI_IMAGE_TYPE_DRM, -- 2.47.0 ================================================ FILE: packages/mesa-vulkan-wrapper-rev8/06-wrapper-map-dmabuf_fd.patch ================================================ diff --git a/src/vulkan/wrapper/wrapper_device_memory.c b/src/vulkan/wrapper/wrapper_device_memory.c index e2e40e5a977..2fc0b04b494 100644 --- a/src/vulkan/wrapper/wrapper_device_memory.c +++ b/src/vulkan/wrapper/wrapper_device_memory.c @@ -6,6 +6,7 @@ #undef native_handle_t #undef buffer_handle_t #include "util/hash_table.h" +#include "util/os_file.h" #include "vk_util.h" #include @@ -19,20 +20,23 @@ wrapper_AllocateMemory(VkDevice _device, VkDeviceMemory* pMemory) { VK_FROM_HANDLE(wrapper_device, device, _device); - const VkImportAndroidHardwareBufferInfoANDROID *import_info; + const VkImportAndroidHardwareBufferInfoANDROID *import_ahb_info; + const VkImportMemoryFdInfoKHR *import_fd_info; const VkExportMemoryAllocateInfo *export_info; VkExportMemoryAllocateInfo local_export_info; VkMemoryAllocateInfo wrapper_allocate_info; struct wrapper_device_memory *memory; VkMemoryPropertyFlags mem_flags; bool can_get_ahardware_buffer; + bool can_get_dmabuf_fd; VkResult result; mem_flags = device->physical->memory_properties.memoryTypes [pAllocateInfo->memoryTypeIndex].propertyFlags; if (!device->vk.enabled_extensions.EXT_map_memory_placed || - !(mem_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)) { + (mem_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0) + { return device->dispatch_table.AllocateMemory(device->dispatch_handle, pAllocateInfo, pAllocator, @@ -44,21 +48,29 @@ wrapper_AllocateMemory(VkDevice _device, if (!memory) return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + memory->alloc_size = pAllocateInfo->allocationSize; + memory->dmabuf_fd = -1; + memory->ahardware_buffer = NULL; wrapper_allocate_info = *pAllocateInfo; - import_info = vk_find_struct_const(pAllocateInfo, - IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID); + import_ahb_info = vk_find_struct_const(pAllocateInfo, + IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID); + import_fd_info = vk_find_struct_const(pAllocateInfo, + IMPORT_MEMORY_FD_INFO_KHR); export_info = vk_find_struct_const(pAllocateInfo, - EXPORT_MEMORY_ALLOCATE_INFO); + EXPORT_MEMORY_ALLOCATE_INFO); - if (import_info) { - memory->ahardware_buffer = import_info->buffer; + if (import_ahb_info) { + memory->ahardware_buffer = import_ahb_info->buffer; AHardwareBuffer_acquire(memory->ahardware_buffer); - } else if (!export_info) { + } else if (import_fd_info) { + memory->dmabuf_fd = os_dupfd_cloexec(import_fd_info->fd); + } else if (export_info == NULL) { local_export_info = (VkExportMemoryAllocateInfo) { .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, .pNext = wrapper_allocate_info.pNext, - .handleTypes = + .handleTypes = device->physical->vk.supported_extensions. + EXT_external_memory_dma_buf ? VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT : VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, }; wrapper_allocate_info.pNext = &local_export_info; @@ -72,24 +84,35 @@ wrapper_AllocateMemory(VkDevice _device, if (result != VK_SUCCESS) { if (memory->ahardware_buffer) AHardwareBuffer_release(memory->ahardware_buffer); + if (memory->dmabuf_fd != -1) + close(memory->dmabuf_fd); vk_free2(&device->vk.alloc, pAllocator, memory); return vk_error(device, result); } + can_get_dmabuf_fd = (export_info && export_info->handleTypes == + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT); can_get_ahardware_buffer = (export_info && export_info->handleTypes == VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID); - if (can_get_ahardware_buffer) { + if (can_get_dmabuf_fd) { + const VkMemoryGetFdInfoKHR get_fd_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, + .memory = *pMemory, + .handleType = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, + }; + device->dispatch_table.GetMemoryFdKHR(device->dispatch_handle, + &get_fd_info, &memory->dmabuf_fd); + } else if (can_get_ahardware_buffer) { const VkMemoryGetAndroidHardwareBufferInfoANDROID get_ahb_info = { - .sType = - VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, + .sType = VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, .memory = *pMemory, }; device->dispatch_table.GetMemoryAndroidHardwareBufferANDROID( device->dispatch_handle, &get_ahb_info, &memory->ahardware_buffer); } - memory->alloc_size = pAllocateInfo->allocationSize; _mesa_hash_table_insert(device->memorys, (void *)(*pMemory), memory); return VK_SUCCESS; @@ -107,12 +130,12 @@ wrapper_FreeMemory(VkDevice _device, VkDeviceMemory _memory, if (entry) { struct wrapper_device_memory *memory = entry->data; - if (memory->map_address && memory->map_size) { + if (memory->map_address && memory->map_size) munmap(memory->map_address, memory->map_size); - } - if (memory->ahardware_buffer) { + if (memory->ahardware_buffer) AHardwareBuffer_release(memory->ahardware_buffer); - } + if (memory->dmabuf_fd != -1) + close(memory->dmabuf_fd); vk_free2(&device->vk.alloc, pAllocator, memory); _mesa_hash_table_remove(device->memorys, entry); } @@ -131,8 +154,7 @@ wrapper_MapMemory2KHR(VkDevice _device, struct wrapper_device_memory *memory; const VkMemoryMapPlacedInfoEXT *placed_info; const struct hash_entry *entry = NULL; - const native_handle_t *handle; - const int *handle_fds; + int fd; placed_info = vk_find_struct_const(pMemoryMapInfo->pNext, MEMORY_MAP_PLACED_INFO_EXT); @@ -157,38 +179,39 @@ wrapper_MapMemory2KHR(VkDevice _device, return VK_SUCCESS; } } + assert(memory->dmabuf_fd >= 0 || memory->ahardware_buffer != NULL); - if (!memory->ahardware_buffer) { - fprintf(stderr, "Can't get AHardwareBuffer, mapping memory will fail"); - return vk_error(device, VK_ERROR_MEMORY_MAP_FAILED); - } + if (memory->ahardware_buffer) { + const native_handle_t *handle; + const int *handle_fds; - handle = AHardwareBuffer_getNativeHandle(memory->ahardware_buffer); - handle_fds = &handle->data[0]; - - int idx; - for (idx = 0; idx < handle->numFds; idx++) { - size_t size = lseek(handle_fds[idx], 0, SEEK_END); - if (size < memory->alloc_size) - continue; - - if (pMemoryMapInfo->size == VK_WHOLE_SIZE) - { - memory->map_size = size; - break; - } else if (size >= pMemoryMapInfo->size) { - memory->map_size = pMemoryMapInfo->size; - break; + handle = AHardwareBuffer_getNativeHandle(memory->ahardware_buffer); + handle_fds = &handle->data[0]; + + int idx; + for (idx = 0; idx < handle->numFds; idx++) { + size_t size = lseek(handle_fds[idx], 0, SEEK_END); + if (size >= memory->alloc_size) { + break; + } } + assert(idx < handle->numFds); + fd = handle_fds[idx]; + } else { + fd = memory->dmabuf_fd; } - assert(idx < handle->numFds); + + if (pMemoryMapInfo->size == VK_WHOLE_SIZE) + memory->map_size = memory->alloc_size > 0 ? + memory->alloc_size : lseek(fd, 0, SEEK_END); + else + memory->map_size = pMemoryMapInfo->size; memory->map_address = mmap(placed_info->pPlacedAddress, memory->map_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, - handle_fds[idx], 0); - + fd, 0); if (memory->map_address == MAP_FAILED) { memory->map_address = NULL; memory->map_size = 0; @@ -211,36 +234,29 @@ wrapper_UnmapMemory2KHR(VkDevice _device, const VkMemoryUnmapInfoKHR* pMemoryUnmapInfo) { VK_FROM_HANDLE(wrapper_device, device, _device); - struct wrapper_device_memory *memory; const struct hash_entry *entry = NULL; if (pMemoryUnmapInfo->memory != VK_NULL_HANDLE) entry = _mesa_hash_table_search(device->memorys, (void *)pMemoryUnmapInfo->memory); - if (!entry) { - device->dispatch_table.UnmapMemory(device->dispatch_handle, - pMemoryUnmapInfo->memory); - return VK_SUCCESS; - } - - memory = entry->data; - - if (!memory->map_address) - return VK_SUCCESS; - - if (pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT) { - memory->map_address = mmap(memory->map_address, memory->map_size, - PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); - if (memory->map_address == MAP_FAILED) { - fprintf(stderr, "Failed to replace mapping with reserved memory"); - return vk_error(device, VK_ERROR_MEMORY_MAP_FAILED); + if (entry) { + struct wrapper_device_memory *memory = entry->data; + if (pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT) { + memory->map_address = mmap(memory->map_address, memory->map_size, + PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + if (memory->map_address == MAP_FAILED) { + fprintf(stderr, "Failed to replace mapping with reserved memory"); + return vk_error(device, VK_ERROR_MEMORY_MAP_FAILED); + } + } else { + munmap(memory->map_address, memory->map_size); } - } else { - munmap(memory->map_address, memory->map_size); + + memory->map_size = 0; + memory->map_address = NULL; } - memory->map_size = 0; - memory->map_address = 0; - + device->dispatch_table.UnmapMemory(device->dispatch_handle, + pMemoryUnmapInfo->memory); return VK_SUCCESS; } diff --git a/src/vulkan/wrapper/wrapper_private.h b/src/vulkan/wrapper/wrapper_private.h index 696cd937d2c..63194251247 100644 --- a/src/vulkan/wrapper/wrapper_private.h +++ b/src/vulkan/wrapper/wrapper_private.h @@ -73,6 +73,7 @@ VK_DEFINE_HANDLE_CASTS(wrapper_command_buffer, vk.base, VkCommandBuffer, struct wrapper_device_memory { struct AHardwareBuffer *ahardware_buffer; + int dmabuf_fd; void *map_address; size_t map_size; size_t alloc_size; ================================================ FILE: packages/mesa-vulkan-wrapper-rev8/07-fix-build.patch ================================================ diff --git a/include/android_stub/vndk/hardware_buffer.h b/include/android_stub/vndk/hardware_buffer.h index 12f8691..91d2251 100644 --- a/include/android_stub/vndk/hardware_buffer.h +++ b/include/android_stub/vndk/hardware_buffer.h @@ -24,7 +24,7 @@ __BEGIN_DECLS -const native_handle_t* AHardwareBuffer_getNativeHandle(const AHardwareBuffer* buffer); +const __native_handle_t* AHardwareBuffer_getNativeHandle(const AHardwareBuffer* buffer); enum CreateFromHandleMethod { // enum values chosen to match internal GraphicBuffer::HandleWrapMethod @@ -46,7 +46,7 @@ enum CreateFromHandleMethod { * clone registered. The AHardwareBuffer will own the cloned handle but not the original. */ int AHardwareBuffer_createFromHandle(const AHardwareBuffer_Desc* desc, - const native_handle_t* handle, int32_t method, + const __native_handle_t* handle, int32_t method, AHardwareBuffer** outBuffer); /** diff --git a/src/vulkan/wrapper/wrapper_device_memory.c b/src/vulkan/wrapper/wrapper_device_memory.c index 2fc0b04..a1e0ea0 100644 --- a/src/vulkan/wrapper/wrapper_device_memory.c +++ b/src/vulkan/wrapper/wrapper_device_memory.c @@ -182,7 +182,7 @@ wrapper_MapMemory2KHR(VkDevice _device, assert(memory->dmabuf_fd >= 0 || memory->ahardware_buffer != NULL); if (memory->ahardware_buffer) { - const native_handle_t *handle; + const __native_handle_t *handle; const int *handle_fds; handle = AHardwareBuffer_getNativeHandle(memory->ahardware_buffer); ================================================ FILE: packages/mesa-vulkan-wrapper-rev8/build.sh ================================================ PKG_VER=24.2.5 PKG_CATEGORY="VulkanDriver" PKG_PRETTY_NAME="Mesa Android Wrapper (Rev 8)" PKG_DOWNLOADABLE=1 VK_DRIVER_LIB="libvulkan_wrapper.so" SRC_URL=https://archive.mesa3d.org/mesa-$PKG_VER.tar.xz LDFLAGS="-L$PREFIX/lib -landroid-shmem" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=wrapper -Dglvnd=disabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm" ================================================ FILE: packages/mesa-vulkan-wrapper-rev9/01-install-drivers-without-hardlinks.patch ================================================ diff --git a/bin/install_megadrivers.py b/bin/install_megadrivers.py index 216f6999feb..c79e95d1afd 100644 --- a/bin/install_megadrivers.py +++ b/bin/install_megadrivers.py @@ -24,7 +24,16 @@ import argparse import os +import shutil + +def link(src, dest): + shutil.copyfile(src, dest) +def unlink(src): + os.remove(src) + +os.link = link +os.unlink = unlink def resolve_libdir(libdir): if os.path.isabs(libdir): ================================================ FILE: packages/mesa-vulkan-wrapper-rev9/02-disable-memfd-create-getrandom.patch ================================================ diff --git a/meson.build b/meson.build index 66e14c211d2..7e73daf221a 100644 --- a/meson.build +++ b/meson.build @@ -1354,7 +1354,7 @@ if not ['linux'].contains(host_machine.system()) endif endif -foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', +foreach h : ['linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', 'cet.h', 'pthread_np.h', 'sys/inotify.h', 'linux/udmabuf.h'] if cc.check_header(h) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) @@ -1364,11 +1364,9 @@ endforeach functions_to_detect = { 'strtof': '', 'mkostemp': '', - 'memfd_create': '', 'random_r': '', 'flock': '', 'strtok_r': '', - 'getrandom': '', 'qsort_s': '', 'posix_fallocate': '', 'secure_getenv': '', ================================================ FILE: packages/mesa-vulkan-wrapper-rev9/03-Android-Vulkan-wrapper.patch ================================================ From 875196978f484b3bb9278d079b83d3417b86bcc5 Mon Sep 17 00:00:00 2001 From: xMeM Date: Sat, 26 Oct 2024 19:19:39 +0800 Subject: [PATCH 1/2] Android Vulkan wrapper Wrap the Android Vulkan loader into ICD, using common WSI to provide X11 platform surface support. Signed-off-by: xMeM --- meson.build | 5 +- meson_options.txt | 2 +- src/android_stub/nativewindow_stub.cpp | 7 + src/vulkan/meson.build | 5 +- src/vulkan/wrapper/meson.build | 93 ++++ src/vulkan/wrapper/vk_entrypoints.py | 1 + src/vulkan/wrapper/vk_extensions.py | 1 + src/vulkan/wrapper/vk_wrapper_features_gen.py | 298 +++++++++++++ .../wrapper/vk_wrapper_trampolines_gen.py | 222 ++++++++++ src/vulkan/wrapper/wrapper_device.c | 411 ++++++++++++++++++ src/vulkan/wrapper/wrapper_device_memory.c | 398 +++++++++++++++++ src/vulkan/wrapper/wrapper_instance.c | 297 +++++++++++++ src/vulkan/wrapper/wrapper_physical_device.c | 215 +++++++++ src/vulkan/wrapper/wrapper_private.h | 94 ++++ src/vulkan/wsi/wsi_common.c | 26 +- src/vulkan/wsi/wsi_common.h | 2 + 16 files changed, 2069 insertions(+), 8 deletions(-) create mode 100644 src/vulkan/wrapper/meson.build create mode 120000 src/vulkan/wrapper/vk_entrypoints.py create mode 120000 src/vulkan/wrapper/vk_extensions.py create mode 100644 src/vulkan/wrapper/vk_wrapper_features_gen.py create mode 100644 src/vulkan/wrapper/vk_wrapper_trampolines_gen.py create mode 100644 src/vulkan/wrapper/wrapper_device.c create mode 100644 src/vulkan/wrapper/wrapper_device_memory.c create mode 100644 src/vulkan/wrapper/wrapper_instance.c create mode 100644 src/vulkan/wrapper/wrapper_physical_device.c create mode 100644 src/vulkan/wrapper/wrapper_private.h diff --git a/meson.build b/meson.build index 9fb4160cf54..f232f7be3ef 100644 --- a/meson.build +++ b/meson.build @@ -243,6 +243,7 @@ elif _vulkan_drivers.contains('all') 'nouveau'] endif +with_wrapper_vk = _vulkan_drivers.contains('wrapper') with_intel_vk = _vulkan_drivers.contains('intel') with_intel_hasvk = _vulkan_drivers.contains('intel_hasvk') with_amd_vk = _vulkan_drivers.contains('amd') @@ -896,8 +897,8 @@ endif pre_args += '-DGLAPI_EXPORT_PROTO_ENTRY_POINTS=@0@'.format(with_glapi_export_proto_entry_points.to_int()) with_android_stub = get_option('android-stub') -if with_android_stub and not with_platform_android - error('`-D android-stub=true` makes no sense without `-D platforms=android`') +if with_wrapper_vk + with_android_stub = true endif with_libbacktrace = get_option('android-libbacktrace') \ diff --git a/meson_options.txt b/meson_options.txt index 382393e5097..325219090bd 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -236,7 +236,7 @@ option( value : ['auto'], choices : ['auto', 'amd', 'broadcom', 'freedreno', 'intel', 'intel_hasvk', 'panfrost', 'swrast', 'virtio', 'imagination-experimental', - 'microsoft-experimental', 'nouveau', 'all'], + 'microsoft-experimental', 'nouveau', 'wrapper', 'all'], description : 'List of vulkan drivers to build. If this is set to auto ' + 'all drivers applicable to the target OS/architecture ' + 'will be built' diff --git a/src/android_stub/nativewindow_stub.cpp b/src/android_stub/nativewindow_stub.cpp index 9276a9c3d2e..4bd0cfe25ab 100644 --- a/src/android_stub/nativewindow_stub.cpp +++ b/src/android_stub/nativewindow_stub.cpp @@ -43,6 +43,13 @@ AHardwareBuffer_getNativeHandle(const AHardwareBuffer *buffer) return NULL; } +int +AHardwareBuffer_sendHandleToUnixSocket(const AHardwareBuffer* buffer, + int socketFd) +{ + return 0; +} + void ANativeWindow_acquire(ANativeWindow *window) { diff --git a/src/vulkan/meson.build b/src/vulkan/meson.build index 56f35fc90fe..f54b6b444ff 100644 --- a/src/vulkan/meson.build +++ b/src/vulkan/meson.build @@ -62,7 +62,7 @@ if with_xlib_lease vulkan_wsi_deps += [dep_xlib_xrandr] vulkan_wsi_list += '-DVK_USE_PLATFORM_XLIB_XRANDR_EXT' endif -if with_platform_android +if with_platform_android or with_wrapper_vk vulkan_wsi_list += '-DVK_USE_PLATFORM_ANDROID_KHR' endif if with_platform_windows @@ -88,3 +88,6 @@ endif if with_vulkan_device_select_layer subdir('device-select-layer') endif +if with_wrapper_vk + subdir('wrapper') +endif diff --git a/src/vulkan/wrapper/meson.build b/src/vulkan/wrapper/meson.build new file mode 100644 index 00000000000..8960fb62493 --- /dev/null +++ b/src/vulkan/wrapper/meson.build @@ -0,0 +1,93 @@ +wrapper_icd = custom_target( + 'wrapper_icd', + input: [vk_icd_gen, vk_api_xml], + output: 'wrapper_icd.@0@.json'.format(host_machine.cpu()), + command: [ + prog_python, + '@INPUT0@', + '--api-version', '1.3', + '--xml', '@INPUT1@', + '--lib-path', join_paths(get_option('prefix'), get_option('libdir'), 'libvulkan_wrapper.so'), + '--out', '@OUTPUT@', + ], + build_by_default: true, + install_dir: with_vulkan_icd_dir, + install: true, +) + +wrapper_entrypoints = custom_target( + 'wrapper_entrypoints', + input: [vk_entrypoints_gen, vk_api_xml], + output: ['wrapper_entrypoints.h', 'wrapper_entrypoints.c'], + command: [ + prog_python, + '@INPUT0@', + '--xml', '@INPUT1@', + '--proto', + '--weak', + '--beta', with_vulkan_beta.to_string(), + '--out-h', '@OUTPUT0@', + '--out-c', '@OUTPUT1@', + '--prefix', 'wrapper', + ], + depend_files: vk_entrypoints_gen_depend_files, +) + +wrapper_trampolines_gen = files('vk_wrapper_trampolines_gen.py') + +wrapper_trampolines = custom_target( + 'wrapper_trampolines', + input: [wrapper_trampolines_gen, vk_api_xml], + output: ['wrapper_trampolines.c', 'wrapper_trampolines.h'], + command: [ + prog_python, + '@INPUT0@', + '--xml', '@INPUT1@', + '--out-c', '@OUTPUT0@', + '--out-h', '@OUTPUT1@', + '--beta', with_vulkan_beta.to_string(), + ], + depend_files: vk_dispatch_trampolines_gen_depend_files, +) + +wrapper_features_gen = files('vk_wrapper_features_gen.py') + +wrapper_features = custom_target( + 'vk_wrapper_features', + input: [wrapper_features_gen, vk_api_xml], + output: ['wrapper_features.c'], + command: [ + prog_python, + '@INPUT0@', + '--xml', '@INPUT1@', + '--out-c', '@OUTPUT0@', + '--beta', with_vulkan_beta.to_string(), + ], + depend_files: vk_physical_device_features_gen_depend_files, +) + +wrapper_files = files( + 'wrapper_device.c', + 'wrapper_device_memory.c', + 'wrapper_instance.c', + 'wrapper_physical_device.c', +) + +wrapper_deps = [ + idep_vulkan_runtime, + idep_vulkan_util, + idep_vulkan_wsi, + dep_android, +] + +libvulkan_wrapper = shared_library( + 'vulkan_wrapper', + [wrapper_entrypoints, wrapper_trampolines, wrapper_features, wrapper_files], + include_directories: [ + inc_include, + inc_src, + ], + dependencies: [wrapper_deps, vulkan_wsi_deps], + gnu_symbol_visibility: 'hidden', + install: true, +) diff --git a/src/vulkan/wrapper/vk_entrypoints.py b/src/vulkan/wrapper/vk_entrypoints.py new file mode 120000 index 00000000000..bbc9deb820f --- /dev/null +++ b/src/vulkan/wrapper/vk_entrypoints.py @@ -0,0 +1 @@ +../util/vk_entrypoints.py \ No newline at end of file diff --git a/src/vulkan/wrapper/vk_extensions.py b/src/vulkan/wrapper/vk_extensions.py new file mode 120000 index 00000000000..4407eca87b3 --- /dev/null +++ b/src/vulkan/wrapper/vk_extensions.py @@ -0,0 +1 @@ +../util/vk_extensions.py \ No newline at end of file diff --git a/src/vulkan/wrapper/vk_wrapper_features_gen.py b/src/vulkan/wrapper/vk_wrapper_features_gen.py new file mode 100644 index 00000000000..eef8d4bf85b --- /dev/null +++ b/src/vulkan/wrapper/vk_wrapper_features_gen.py @@ -0,0 +1,298 @@ +COPYRIGHT=u""" +/* Copyright © 2021 Intel Corporation + * + * 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 (including the next + * paragraph) 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. + */ +""" + +import argparse +from collections import OrderedDict +from dataclasses import dataclass +import os +import sys +import typing +import xml.etree.ElementTree as et + +import mako +from mako.template import Template +from vk_extensions import Requirements, get_all_required, filter_api + +def str_removeprefix(s, prefix): + if s.startswith(prefix): + return s[len(prefix):] + return s + +RENAMED_FEATURES = { + # See https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17272#note_1446477 for details + ('BufferDeviceAddressFeaturesEXT', 'bufferDeviceAddressCaptureReplay'): 'bufferDeviceAddressCaptureReplayEXT', + + ('MeshShaderFeaturesNV', 'taskShader'): 'taskShaderNV', + ('MeshShaderFeaturesNV', 'meshShader'): 'meshShaderNV', + + ('CooperativeMatrixFeaturesNV', 'cooperativeMatrix'): 'cooperativeMatrixNV', + ('CooperativeMatrixFeaturesNV', 'cooperativeMatrixRobustBufferAccess'): 'cooperativeMatrixRobustBufferAccessNV', + + ('DeviceGeneratedCommandsFeaturesNV', 'deviceGeneratedCommands'): 'deviceGeneratedCommandsNV', +} + +KNOWN_ALIASES = [ + (['Vulkan11Features', '16BitStorageFeatures'], ['storageBuffer16BitAccess', 'uniformAndStorageBuffer16BitAccess', 'storagePushConstant16', 'storageInputOutput16']), + (['Vulkan11Features', 'MultiviewFeatures'], ['multiview', 'multiviewGeometryShader', 'multiviewTessellationShader']), + (['Vulkan11Features', 'VariablePointersFeatures'], ['variablePointersStorageBuffer', 'variablePointers']), + (['Vulkan11Features', 'ProtectedMemoryFeatures'], ['protectedMemory']), + (['Vulkan11Features', 'SamplerYcbcrConversionFeatures'], ['samplerYcbcrConversion']), + (['Vulkan11Features', 'ShaderDrawParametersFeatures'], ['shaderDrawParameters']), + + (['Vulkan12Features', '8BitStorageFeatures'], ['storageBuffer8BitAccess', 'uniformAndStorageBuffer8BitAccess', 'storagePushConstant8']), + (['Vulkan12Features', 'ShaderAtomicInt64Features'], ['shaderBufferInt64Atomics', 'shaderSharedInt64Atomics']), + (['Vulkan12Features', 'ShaderFloat16Int8Features'], ['shaderFloat16', 'shaderInt8']), + ( + ['Vulkan12Features', 'DescriptorIndexingFeatures'], + [ + 'shaderInputAttachmentArrayDynamicIndexing', + 'shaderUniformTexelBufferArrayDynamicIndexing', + 'shaderStorageTexelBufferArrayDynamicIndexing', + 'shaderUniformBufferArrayNonUniformIndexing', + 'shaderSampledImageArrayNonUniformIndexing', + 'shaderStorageBufferArrayNonUniformIndexing', + 'shaderStorageImageArrayNonUniformIndexing', + 'shaderInputAttachmentArrayNonUniformIndexing', + 'shaderUniformTexelBufferArrayNonUniformIndexing', + 'shaderStorageTexelBufferArrayNonUniformIndexing', + 'descriptorBindingUniformBufferUpdateAfterBind', + 'descriptorBindingSampledImageUpdateAfterBind', + 'descriptorBindingStorageImageUpdateAfterBind', + 'descriptorBindingStorageBufferUpdateAfterBind', + 'descriptorBindingUniformTexelBufferUpdateAfterBind', + 'descriptorBindingStorageTexelBufferUpdateAfterBind', + 'descriptorBindingUpdateUnusedWhilePending', + 'descriptorBindingPartiallyBound', + 'descriptorBindingVariableDescriptorCount', + 'runtimeDescriptorArray', + ], + ), + (['Vulkan12Features', 'ScalarBlockLayoutFeatures'], ['scalarBlockLayout']), + (['Vulkan12Features', 'ImagelessFramebufferFeatures'], ['imagelessFramebuffer']), + (['Vulkan12Features', 'UniformBufferStandardLayoutFeatures'], ['uniformBufferStandardLayout']), + (['Vulkan12Features', 'ShaderSubgroupExtendedTypesFeatures'], ['shaderSubgroupExtendedTypes']), + (['Vulkan12Features', 'SeparateDepthStencilLayoutsFeatures'], ['separateDepthStencilLayouts']), + (['Vulkan12Features', 'HostQueryResetFeatures'], ['hostQueryReset']), + (['Vulkan12Features', 'TimelineSemaphoreFeatures'], ['timelineSemaphore']), + (['Vulkan12Features', 'BufferDeviceAddressFeatures', 'BufferDeviceAddressFeaturesEXT'], ['bufferDeviceAddress', 'bufferDeviceAddressMultiDevice']), + (['Vulkan12Features', 'BufferDeviceAddressFeatures'], ['bufferDeviceAddressCaptureReplay']), + (['Vulkan12Features', 'VulkanMemoryModelFeatures'], ['vulkanMemoryModel', 'vulkanMemoryModelDeviceScope', 'vulkanMemoryModelAvailabilityVisibilityChains']), + + (['Vulkan13Features', 'ImageRobustnessFeatures'], ['robustImageAccess']), + (['Vulkan13Features', 'InlineUniformBlockFeatures'], ['inlineUniformBlock', 'descriptorBindingInlineUniformBlockUpdateAfterBind']), + (['Vulkan13Features', 'PipelineCreationCacheControlFeatures'], ['pipelineCreationCacheControl']), + (['Vulkan13Features', 'PrivateDataFeatures'], ['privateData']), + (['Vulkan13Features', 'ShaderDemoteToHelperInvocationFeatures'], ['shaderDemoteToHelperInvocation']), + (['Vulkan13Features', 'ShaderTerminateInvocationFeatures'], ['shaderTerminateInvocation']), + (['Vulkan13Features', 'SubgroupSizeControlFeatures'], ['subgroupSizeControl', 'computeFullSubgroups']), + (['Vulkan13Features', 'Synchronization2Features'], ['synchronization2']), + (['Vulkan13Features', 'TextureCompressionASTCHDRFeatures'], ['textureCompressionASTC_HDR']), + (['Vulkan13Features', 'ZeroInitializeWorkgroupMemoryFeatures'], ['shaderZeroInitializeWorkgroupMemory']), + (['Vulkan13Features', 'DynamicRenderingFeatures'], ['dynamicRendering']), + (['Vulkan13Features', 'ShaderIntegerDotProductFeatures'], ['shaderIntegerDotProduct']), + (['Vulkan13Features', 'Maintenance4Features'], ['maintenance4']), +] + +for (feature_structs, features) in KNOWN_ALIASES: + for flag in features: + for f in feature_structs: + rename = (f, flag) + assert rename not in RENAMED_FEATURES, f"{rename} already exists in RENAMED_FEATURES" + RENAMED_FEATURES[rename] = flag + +def get_renamed_feature(c_type, feature): + return RENAMED_FEATURES.get((str_removeprefix(c_type, 'VkPhysicalDevice'), feature), feature) + +@dataclass +class FeatureStruct: + reqs: Requirements + c_type: str + s_type: str + features: typing.List[str] + +TEMPLATE_C = Template(COPYRIGHT + """ +/* This file generated from ${filename}, don't edit directly. */ + +#include "wrapper_private.h" +#include "vk_physical_device_features.h" +#include "vk_util.h" + +void +wrapper_setup_device_features(struct wrapper_physical_device *physical_device) +{ + VkPhysicalDevice vk_physical_device = physical_device->dispatch_handle; + + /* Query the device what kind of features are supported. */ + VkPhysicalDeviceFeatures2 supported_features2 = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, + }; + +% for f in feature_structs: + ${f.c_type} supported_${f.c_type} = { + .sType = ${f.s_type}, + .pNext = NULL, + }; + __vk_append_struct(&supported_features2, &supported_${f.c_type}); +% endfor + + physical_device->dispatch_table.GetPhysicalDeviceFeatures2( + vk_physical_device, &supported_features2); + + vk_set_physical_device_features(&physical_device->vk.supported_features, + &supported_features2); +} +""") + +def get_pdev_features(doc): + _type = doc.find(".types/type[@name='VkPhysicalDeviceFeatures']") + if _type is not None: + flags = [] + for p in _type.findall('./member'): + assert p.find('./type').text == 'VkBool32' + flags.append(p.find('./name').text) + return flags + return None + +def filter_api(elem, api): + if 'api' not in elem.attrib: + return True + + return api in elem.attrib['api'].split(',') + +def get_feature_structs(doc, api, beta): + feature_structs = OrderedDict() + + required = get_all_required(doc, 'type', api, beta) + + # parse all struct types where structextends VkPhysicalDeviceFeatures2 + for _type in doc.findall('./types/type[@category="struct"]'): + if _type.attrib.get('structextends') != 'VkPhysicalDeviceFeatures2,VkDeviceCreateInfo': + continue + if _type.attrib['name'] not in required: + continue + + reqs = required[_type.attrib['name']] + # Skip extensions with a define for now + guard = reqs.guard + if guard is not None and (guard != "VK_ENABLE_BETA_EXTENSIONS" or beta != "true"): + continue + + # find Vulkan structure type + for elem in _type: + if "STRUCTURE_TYPE" in str(elem.attrib): + s_type = elem.attrib.get('values') + + # collect a list of feature flags + flags = [] + + for p in _type.findall('./member'): + if not filter_api(p, api): + continue + + m_name = p.find('./name').text + if m_name == 'pNext': + pass + elif m_name == 'sType': + s_type = p.attrib.get('values') + else: + assert p.find('./type').text == 'VkBool32' + flags.append(m_name) + + feature_struct = FeatureStruct(reqs=reqs, c_type=_type.attrib.get('name'), s_type=s_type, features=flags) + feature_structs[feature_struct.c_type] = feature_struct + + return feature_structs.values() + +def get_feature_structs_from_xml(xml_files, beta, api='vulkan'): + diagnostics = [] + + pdev_features = None + feature_structs = [] + + for filename in xml_files: + doc = et.parse(filename) + feature_structs += get_feature_structs(doc, api, beta) + if not pdev_features: + pdev_features = get_pdev_features(doc) + + unused_renames = {**RENAMED_FEATURES} + + features = OrderedDict() + + for flag in pdev_features: + features[flag] = 'VkPhysicalDeviceFeatures' + + for f in feature_structs: + for flag in f.features: + renamed_flag = get_renamed_feature(f.c_type, flag) + if renamed_flag not in features: + features[renamed_flag] = f.c_type + else: + a = str_removeprefix(features[renamed_flag], 'VkPhysicalDevice') + b = str_removeprefix(f.c_type, 'VkPhysicalDevice') + if (a, flag) not in RENAMED_FEATURES or (b, flag) not in RENAMED_FEATURES: + diagnostics.append(f'{a} and {b} both define {flag}') + + unused_renames.pop((str_removeprefix(f.c_type, 'VkPhysicalDevice'), flag), None) + + for rename in unused_renames: + diagnostics.append(f'unused rename {rename}') + + assert len(diagnostics) == 0, '\n'.join(diagnostics) + + return pdev_features, feature_structs, features + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--out-c', required=True, help='Output C file.') + parser.add_argument('--beta', required=True, help='Enable beta extensions.') + parser.add_argument('--xml', + help='Vulkan API XML file.', + required=True, action='append', dest='xml_files') + args = parser.parse_args() + + pdev_features, feature_structs, all_flags = get_feature_structs_from_xml(args.xml_files, args.beta) + + environment = { + 'filename': os.path.basename(__file__), + 'pdev_features': pdev_features, + 'feature_structs': feature_structs, + 'all_flags': all_flags, + 'get_renamed_feature': get_renamed_feature, + } + + try: + with open(args.out_c, 'w', encoding='utf-8') as f: + f.write(TEMPLATE_C.render(**environment)) + except Exception: + # In the event there's an error, this uses some helpers from mako + # to print a useful stack trace and prints it, then exits with + # status 1, if python is run with debug; otherwise it just raises + # the exception + print(mako.exceptions.text_error_template().render(), file=sys.stderr) + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/src/vulkan/wrapper/vk_wrapper_trampolines_gen.py b/src/vulkan/wrapper/vk_wrapper_trampolines_gen.py new file mode 100644 index 00000000000..f20fde16034 --- /dev/null +++ b/src/vulkan/wrapper/vk_wrapper_trampolines_gen.py @@ -0,0 +1,222 @@ +# coding=utf-8 +COPYRIGHT = """\ +/* + * Copyright 2020 Intel Corporation + * + * 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, sub license, 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 (including the + * next paragraph) 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 NON-INFRINGEMENT. + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS 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. + */ +""" + +import argparse +import os + +from mako.template import Template + +# Mesa-local imports must be declared in meson variable +# '{file_without_suffix}_depend_files'. +from vk_entrypoints import get_entrypoints_from_xml + +TEMPLATE_H = Template(COPYRIGHT + """\ +/* This file generated from ${filename}, don't edit directly. */ + +#ifndef WRAPPER_TRAMPOLINES_H +#define WRAPPER_TRAMPOLINES_H + +#include "vk_dispatch_table.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern struct vk_physical_device_entrypoint_table wrapper_physical_device_trampolines; +extern struct vk_device_entrypoint_table wrapper_device_trampolines; + +#ifdef __cplusplus +} +#endif + +#endif /* WRAPPER_TRAMPOLINES_H */ +""") + +TEMPLATE_C = Template(COPYRIGHT + """\ +/* This file generated from ${filename}, don't edit directly. */ + +#include "wrapper_private.h" +#include "wrapper_trampolines.h" + +% for e in entrypoints: + % if not e.is_physical_device_entrypoint() or e.alias: + <% continue %> + % endif + % if e.guard is not None: +#ifdef ${e.guard} + % endif +static VKAPI_ATTR ${e.return_type} VKAPI_CALL +${e.prefixed_name('wrapper_tramp')}(${e.decl_params()}) +{ + <% assert e.params[0].type == 'VkPhysicalDevice' %> + VK_FROM_HANDLE(wrapper_physical_device, vk_physical_device, ${e.params[0].name}); + % if e.return_type == 'void': + vk_physical_device->dispatch_table.${e.name}(vk_physical_device->dispatch_handle, ${e.call_params(1)}); + % else: + return vk_physical_device->dispatch_table.${e.name}(vk_physical_device->dispatch_handle, ${e.call_params(1)}); + % endif +} + % if e.guard is not None: +#endif + % endif +% endfor + +struct vk_physical_device_entrypoint_table wrapper_physical_device_trampolines = { +% for e in entrypoints: + % if not e.is_physical_device_entrypoint() or e.alias: + <% continue %> + % endif + % if e.guard is not None: +#ifdef ${e.guard} + % endif + .${e.name} = ${e.prefixed_name('wrapper_tramp')}, + % if e.guard is not None: +#endif + % endif +% endfor +}; + +% for e in entrypoints: + % if not e.is_device_entrypoint() or e.alias: + <% continue %> + % endif + % if e.guard is not None: +#ifdef ${e.guard} + % endif +static VKAPI_ATTR ${e.return_type} VKAPI_CALL +${e.prefixed_name('wrapper_tramp')}(${e.decl_params()}) +{ + % if e.params[0].type == 'VkDevice': + VK_FROM_HANDLE(wrapper_device, vk_device, ${e.params[0].name}); + % if e.return_type == 'void': + % if len(e.params) > 1: + vk_device->dispatch_table.${e.name}(vk_device->dispatch_handle, ${e.call_params(1)}); + % else: + vk_device->dispatch_table.${e.name}(vk_device->dispatch_handle); + % endif + % else: + % if len(e.params) > 1: + return vk_device->dispatch_table.${e.name}(vk_device->dispatch_handle, ${e.call_params(1)}); + % else: + return vk_device->dispatch_table.${e.name}(vk_device->dispatch_handle); + % endif + % endif + % elif e.params[0].type == 'VkCommandBuffer': + VK_FROM_HANDLE(wrapper_command_buffer, wcb, ${e.params[0].name}); + % if e.return_type == 'void': + % if len(e.params) > 1: + wcb->device->dispatch_table.${e.name}(wcb->dispatch_handle, ${e.call_params(1)}); + % else: + wcb->device->dispatch_table.${e.name}(wcb->dispatch_handle); + % endif + % else: + % if len(e.params) > 1: + return wcb->device->dispatch_table.${e.name}(wcb->dispatch_handle, ${e.call_params(1)}); + % else: + return wcb->device->dispatch_table.${e.name}(wcb->dispatch_handle); + % endif + % endif + % elif e.params[0].type == 'VkQueue': + VK_FROM_HANDLE(wrapper_queue, wqueue, ${e.params[0].name}); + % if e.return_type == 'void': + % if len(e.params) > 1: + wqueue->device->dispatch_table.${e.name}(wqueue->dispatch_handle, ${e.call_params(1)}); + % else: + wqueue->device->dispatch_table.${e.name}(wqueue->dispatch_handle); + % endif + % else: + % if len(e.params) > 1: + return wqueue->device->dispatch_table.${e.name}(wqueue->dispatch_handle, ${e.call_params(1)}); + % else: + return wqueue->device->dispatch_table.${e.name}(wqueue->dispatch_handle); + % endif + % endif + % else: + assert(!"Unhandled device child trampoline case: ${e.params[0].type}"); + % endif +} + % if e.guard is not None: +#endif + % endif +% endfor + +struct vk_device_entrypoint_table wrapper_device_trampolines = { +% for e in entrypoints: + % if not e.is_device_entrypoint() or e.alias: + <% continue %> + % endif + % if e.guard is not None: +#ifdef ${e.guard} + % endif + .${e.name} = ${e.prefixed_name('wrapper_tramp')}, + % if e.guard is not None: +#endif + % endif +% endfor +}; +""") + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--out-c', help='Output C file.') + parser.add_argument('--out-h', help='Output H file.') + parser.add_argument('--beta', required=True, help='Enable beta extensions.') + parser.add_argument('--xml', + help='Vulkan API XML file.', + required=True, + action='append', + dest='xml_files') + args = parser.parse_args() + + entrypoints = get_entrypoints_from_xml(args.xml_files, args.beta) + + # For outputting entrypoints.h we generate a anv_EntryPoint() prototype + # per entry point. + try: + if args.out_h: + with open(args.out_h, 'w', encoding='utf-8') as f: + f.write(TEMPLATE_H.render(entrypoints=entrypoints, + filename=os.path.basename(__file__))) + if args.out_c: + with open(args.out_c, 'w', encoding='utf-8') as f: + f.write(TEMPLATE_C.render(entrypoints=entrypoints, + filename=os.path.basename(__file__))) + except Exception: + # In the event there's an error, this imports some helpers from mako + # to print a useful stack trace and prints it, then exits with + # status 1, if python is run with debug; otherwise it just raises + # the exception + if __debug__: + import sys + from mako import exceptions + sys.stderr.write(exceptions.text_error_template().render() + '\n') + sys.exit(1) + raise + + +if __name__ == '__main__': + main() diff --git a/src/vulkan/wrapper/wrapper_device.c b/src/vulkan/wrapper/wrapper_device.c new file mode 100644 index 00000000000..1fde56970d0 --- /dev/null +++ b/src/vulkan/wrapper/wrapper_device.c @@ -0,0 +1,411 @@ +#include "wrapper_private.h" +#include "wrapper_entrypoints.h" +#include "wrapper_trampolines.h" +#include "vk_alloc.h" +#include "vk_common_entrypoints.h" +#include "vk_device.h" +#include "vk_dispatch_table.h" +#include "vk_extensions.h" +#include "vk_queue.h" +#include "vk_util.h" +#include "util/list.h" + +const struct vk_device_extension_table wrapper_device_extensions = +{ + .KHR_swapchain = true, + .EXT_swapchain_maintenance1 = true, + .KHR_swapchain_mutable_format = true, +#ifdef VK_USE_PLATFORM_DISPLAY_KHR + .EXT_display_control = true, +#endif + .KHR_present_id = true, + .KHR_present_wait = true, + .KHR_incremental_present = true, + .KHR_map_memory2 = true, + .EXT_map_memory_placed = true, +}; + +const struct vk_device_extension_table wrapper_filter_extensions = +{ + .EXT_hdr_metadata = true, + .GOOGLE_display_timing = true, + .KHR_shared_presentable_image = true, + .EXT_image_compression_control_swapchain = true, +}; + +static void +wrapper_filter_enabled_extensions(const struct vk_device *device, + uint32_t *enable_extension_count, + const char **enable_extensions) +{ + for (int idx = 0; idx < VK_DEVICE_EXTENSION_COUNT; idx++) { + if (!device->enabled_extensions.extensions[idx]) + continue; + + if (wrapper_device_extensions.extensions[idx]) + continue; + + if (wrapper_filter_extensions.extensions[idx]) + continue; + + enable_extensions[(*enable_extension_count)++] = + vk_device_extensions[idx].extensionName; + } +} + +static inline void +wrapper_append_required_extensions(const struct vk_device *device, + uint32_t *count, + const char **exts) { +#define REQUIRED_EXTENSION(name) \ + if (!device->enabled_extensions.name && \ + device->physical->supported_extensions.name) { \ + exts[(*count)++] = "VK_" #name; \ + } + REQUIRED_EXTENSION(KHR_external_fence); + REQUIRED_EXTENSION(KHR_external_semaphore); + REQUIRED_EXTENSION(KHR_external_memory); + REQUIRED_EXTENSION(KHR_external_fence_fd); + REQUIRED_EXTENSION(KHR_external_semaphore_fd); + REQUIRED_EXTENSION(KHR_external_memory_fd); + REQUIRED_EXTENSION(KHR_dedicated_allocation); + REQUIRED_EXTENSION(EXT_queue_family_foreign); + REQUIRED_EXTENSION(KHR_maintenance1) + REQUIRED_EXTENSION(KHR_maintenance2) + REQUIRED_EXTENSION(KHR_image_format_list) + REQUIRED_EXTENSION(KHR_timeline_semaphore); + REQUIRED_EXTENSION(EXT_external_memory_host); + REQUIRED_EXTENSION(EXT_external_memory_dma_buf); + REQUIRED_EXTENSION(EXT_image_drm_format_modifier); + REQUIRED_EXTENSION(ANDROID_external_memory_android_hardware_buffer); +#undef REQUIRED_EXTENSION +} + +static VkResult +wrapper_create_device_queue(struct wrapper_device *device, + const VkDeviceCreateInfo* pCreateInfo) +{ + const VkDeviceQueueCreateInfo *create_info; + struct wrapper_queue *queue; + VkResult result; + + for (int i = 0; i < pCreateInfo->queueCreateInfoCount; i++) { + create_info = &pCreateInfo->pQueueCreateInfos[i]; + for (int j = 0; j < create_info->queueCount; j++) { + queue = vk_zalloc(&device->vk.alloc, sizeof(*queue), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!queue) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + device->dispatch_table.GetDeviceQueue(device->dispatch_handle, + create_info->queueFamilyIndex, + j, &queue->dispatch_handle);; + queue->device = device; + + result = vk_queue_init(&queue->vk, &device->vk, create_info, j); + if (result != VK_SUCCESS) { + vk_free(&device->vk.alloc, queue); + return result; + } + } + } + + return VK_SUCCESS; +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_CreateDevice(VkPhysicalDevice physicalDevice, + const VkDeviceCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDevice* pDevice) +{ + VK_FROM_HANDLE(wrapper_physical_device, physical_device, physicalDevice); + const char *wrapper_enable_extensions[VK_DEVICE_EXTENSION_COUNT]; + uint32_t wrapper_enable_extension_count = 0; + VkDeviceCreateInfo wrapper_create_info = *pCreateInfo; + struct vk_device_dispatch_table dispatch_table; + struct wrapper_device *device; + VkPhysicalDeviceFeatures2 *pdf2; + VkPhysicalDeviceFeatures *pdf; + VkResult result; + + device = vk_zalloc2(&physical_device->instance->vk.alloc, pAllocator, + sizeof(*device), 8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); + if (!device) + return vk_error(physical_device, VK_ERROR_OUT_OF_HOST_MEMORY); + + list_inithead(&device->command_buffers); + device->physical = physical_device; + device->memorys = _mesa_hash_table_create(NULL, + _mesa_hash_pointer, + _mesa_key_pointer_equal); + if (!device->memorys) { + vk_free2(&physical_device->instance->vk.alloc, pAllocator, + device); + return vk_error(physical_device, VK_ERROR_OUT_OF_HOST_MEMORY); + } + + vk_device_dispatch_table_from_entrypoints( + &dispatch_table, &wrapper_device_entrypoints, true); + vk_device_dispatch_table_from_entrypoints( + &dispatch_table, &wsi_device_entrypoints, false); + vk_device_dispatch_table_from_entrypoints( + &dispatch_table, &wrapper_device_trampolines, false); + + result = vk_device_init(&device->vk, &physical_device->vk, + &dispatch_table, pCreateInfo, pAllocator); + + if (result != VK_SUCCESS) { + _mesa_hash_table_destroy(device->memorys, NULL); + vk_free2(&physical_device->instance->vk.alloc, pAllocator, + device); + return vk_error(physical_device, result); + } + + wrapper_filter_enabled_extensions(&device->vk, + &wrapper_enable_extension_count, + wrapper_enable_extensions); + wrapper_append_required_extensions(&device->vk, + &wrapper_enable_extension_count, + wrapper_enable_extensions); + + wrapper_create_info.enabledExtensionCount = wrapper_enable_extension_count; + wrapper_create_info.ppEnabledExtensionNames = wrapper_enable_extensions; + + pdf = (void *)pCreateInfo->pEnabledFeatures; + if (pdf && pdf->textureCompressionBC) { + pdf->textureCompressionBC &= + physical_device->backup_supported_features.textureCompressionBC; + } + pdf2 = __vk_find_struct((void *)pCreateInfo->pNext, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2); + if (pdf2 && pdf2->features.textureCompressionBC) { + pdf2->features.textureCompressionBC &= + physical_device->backup_supported_features.textureCompressionBC; + } + + result = physical_device->dispatch_table.CreateDevice( + physical_device->dispatch_handle, &wrapper_create_info, + pAllocator, &device->dispatch_handle); + + if (result != VK_SUCCESS) { + wrapper_DestroyDevice(wrapper_device_to_handle(device), + &device->vk.alloc); + return vk_error(physical_device, result); + } + + void *gdpa = physical_device->instance->dispatch_table.GetInstanceProcAddr( + physical_device->instance->dispatch_handle, "vkGetDeviceProcAddr"); + vk_device_dispatch_table_load(&device->dispatch_table, gdpa, + device->dispatch_handle); + + result = wrapper_create_device_queue(device, pCreateInfo); + if (result != VK_SUCCESS) { + wrapper_DestroyDevice(wrapper_device_to_handle(device), + &device->vk.alloc); + return vk_error(physical_device, result); + } + + device->import_dmabuf = wrapper_try_import_dmabuf(device); + + *pDevice = wrapper_device_to_handle(device); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, + uint32_t queueIndex, VkQueue* pQueue) { + vk_common_GetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_GetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2* pQueueInfo, + VkQueue* pQueue) { + vk_common_GetDeviceQueue2(device, pQueueInfo, pQueue); +} + +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +wrapper_GetDeviceProcAddr(VkDevice _device, const char* pName) { + VK_FROM_HANDLE(wrapper_device, device, _device); + return vk_device_get_proc_addr(&device->vk, pName); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_QueueSubmit(VkQueue _queue, uint32_t submitCount, + const VkSubmitInfo* pSubmits, VkFence fence) +{ + VK_FROM_HANDLE(wrapper_queue, queue, _queue); + VkCommandBuffer wrapper_command_buffers[submitCount][32]; + VkSubmitInfo wrapper_submits[submitCount]; + + for (int i = 0; i < submitCount; i++) { + const VkSubmitInfo *submit_info = &pSubmits[i]; + for (int j = 0; j < submit_info->commandBufferCount; j++) { + VK_FROM_HANDLE(wrapper_command_buffer, wcb, + submit_info->pCommandBuffers[j]); + wrapper_command_buffers[i][j] = wcb->dispatch_handle; + } + wrapper_submits[i] = pSubmits[i]; + wrapper_submits[i].pCommandBuffers = wrapper_command_buffers[i]; + } + return queue->device->dispatch_table.QueueSubmit(queue->dispatch_handle, + submitCount, + wrapper_submits, + fence); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_QueueSubmit2(VkQueue _queue, uint32_t submitCount, + const VkSubmitInfo2* pSubmits, VkFence fence) +{ + VK_FROM_HANDLE(wrapper_queue, queue, _queue); + VkCommandBufferSubmitInfo wrapper_command_buffers[submitCount][32]; + VkSubmitInfo2 wrapper_submits[submitCount]; + + for (int i = 0; i < submitCount; i++) { + const VkSubmitInfo2 *submit_info = &pSubmits[i]; + for (int j = 0; j < submit_info->commandBufferInfoCount; j++) { + VK_FROM_HANDLE(wrapper_command_buffer, wcb, + submit_info->pCommandBufferInfos[j].commandBuffer); + wrapper_command_buffers[i][j] = pSubmits[i].pCommandBufferInfos[j]; + wrapper_command_buffers[i][j].commandBuffer = wcb->dispatch_handle; + } + wrapper_submits[i] = pSubmits[i]; + wrapper_submits[i].pCommandBufferInfos = wrapper_command_buffers[i]; + } + return queue->device->dispatch_table.QueueSubmit2(queue->dispatch_handle, + submitCount, + wrapper_submits, + fence); +} + +static VkResult +wrapper_command_buffer_create(struct wrapper_device *device, + VkCommandPool pool, + VkCommandBuffer dispatch_handle, + VkCommandBuffer *pCommandBuffers) { + struct wrapper_command_buffer *wrapper_command_buffer; + wrapper_command_buffer = vk_object_zalloc(&device->vk, &device->vk.alloc, + sizeof(struct wrapper_command_buffer), + VK_OBJECT_TYPE_COMMAND_BUFFER); + if (!wrapper_command_buffer) + return vk_error(&device->vk, VK_ERROR_OUT_OF_HOST_MEMORY); + + wrapper_command_buffer->device = device; + wrapper_command_buffer->pool = pool; + wrapper_command_buffer->dispatch_handle = dispatch_handle; + list_add(&wrapper_command_buffer->link, &device->command_buffers); + + *pCommandBuffers = wrapper_command_buffer_to_handle(wrapper_command_buffer); + + return VK_SUCCESS; +} + +static void +wrapper_command_buffer_destroy(struct wrapper_device *device, + struct wrapper_command_buffer *wcb) { + list_del(&wcb->link); + vk_object_free(&device->vk, NULL, wcb); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_AllocateCommandBuffers(VkDevice _device, + const VkCommandBufferAllocateInfo* pAllocateInfo, + VkCommandBuffer* pCommandBuffers) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + VkCommandBuffer dispatch_handles[pAllocateInfo->commandBufferCount]; + VkResult result; + uint32_t i; + + result = device->dispatch_table.AllocateCommandBuffers(device->dispatch_handle, + pAllocateInfo, + dispatch_handles); + if (result != VK_SUCCESS) + return result; + + for (i = 0; i < pAllocateInfo->commandBufferCount; i++) { + result = wrapper_command_buffer_create(device, + pAllocateInfo->commandPool, + dispatch_handles[i], + &pCommandBuffers[i]); + if (result != VK_SUCCESS) + break; + } + + if (result != VK_SUCCESS) { + device->dispatch_table.FreeCommandBuffers(device->dispatch_handle, + pAllocateInfo->commandPool, + pAllocateInfo->commandBufferCount, + dispatch_handles); + for (int q = 0; q < i; q++) { + VK_FROM_HANDLE(wrapper_command_buffer, wcb, pCommandBuffers[q]); + wrapper_command_buffer_destroy(device, wcb); + } + + for (i = 0; i < pAllocateInfo->commandBufferCount; i++) + pCommandBuffers[i] = VK_NULL_HANDLE; + + return result; + } + + return VK_SUCCESS; +} + + +VKAPI_ATTR void VKAPI_CALL +wrapper_FreeCommandBuffers(VkDevice _device, + VkCommandPool commandPool, + uint32_t commandBufferCount, + const VkCommandBuffer* pCommandBuffers) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + VkCommandBuffer dispatch_handles[commandBufferCount]; + + for (int i = 0; i < commandBufferCount; i++) { + VK_FROM_HANDLE(wrapper_command_buffer, wcb, pCommandBuffers[i]); + dispatch_handles[i] = wcb->dispatch_handle; + wrapper_command_buffer_destroy(device, wcb); + } + device->dispatch_table.FreeCommandBuffers(device->dispatch_handle, + commandPool, commandBufferCount, + dispatch_handles); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_DestroyCommandPool(VkDevice _device, VkCommandPool commandPool, + const VkAllocationCallbacks* pAllocator) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + list_for_each_entry_safe(struct wrapper_command_buffer, wcb, + &device->command_buffers, link) { + if (wcb->pool == commandPool) { + wrapper_command_buffer_destroy(device, wcb); + } + } + device->dispatch_table.DestroyCommandPool(device->dispatch_handle, + commandPool, pAllocator); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_DestroyDevice(VkDevice _device, const VkAllocationCallbacks* pAllocator) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + list_for_each_entry_safe(struct wrapper_command_buffer, wcb, + &device->command_buffers, link) { + wrapper_command_buffer_destroy(device, wcb); + } + list_for_each_entry_safe(struct vk_queue, queue, &device->vk.queues, link) { + vk_queue_finish(queue); + vk_free2(&device->vk.alloc, pAllocator, queue); + } + if (device->dispatch_handle != VK_NULL_HANDLE) { + device->dispatch_table.DestroyDevice(device-> + dispatch_handle, pAllocator); + } + _mesa_hash_table_destroy(device->memorys, NULL); + vk_device_finish(&device->vk); + vk_free2(&device->vk.alloc, pAllocator, device); +} + diff --git a/src/vulkan/wrapper/wrapper_device_memory.c b/src/vulkan/wrapper/wrapper_device_memory.c new file mode 100644 index 00000000000..46b663d011d --- /dev/null +++ b/src/vulkan/wrapper/wrapper_device_memory.c @@ -0,0 +1,398 @@ +#define native_handle_t __native_handle_t +#define buffer_handle_t __buffer_handle_t +#include "wrapper_private.h" +#include "wrapper_entrypoints.h" +#include "vk_common_entrypoints.h" +#undef native_handle_t +#undef buffer_handle_t +#include "util/hash_table.h" +#include "util/os_file.h" +#include "vk_util.h" + +#include +#include +#include +#include +#include + +static int +safe_ioctl(int fd, unsigned long request, void *arg) +{ + int ret; + + do { + ret = ioctl(fd, request, arg); + } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); + + return ret; +} + +static int +dma_heap_alloc(int heap_fd, size_t size) { + struct dma_heap_allocation_data alloc_data = { + .len = size, + .fd_flags = O_RDWR | O_CLOEXEC, + }; + if (safe_ioctl(heap_fd, DMA_HEAP_IOCTL_ALLOC, &alloc_data) < 0) + return -1; + + return alloc_data.fd; +} + +static int +ion_heap_alloc(int heap_fd, size_t size) { + struct ion_allocation_data { + __u64 len; + __u32 heap_id_mask; + __u32 flags; + __u32 fd; + __u32 unused; + } alloc_data = { + .len = size, + /* ION_HEAP_SYSTEM | ION_SYSTEM_HEAP_ID */ + .heap_id_mask = (1U << 0) | (1U << 25), + .flags = 0, /* uncached */ + }; + + if (safe_ioctl(heap_fd, _IOWR('I', 0, struct ion_allocation_data), + &alloc_data) < 0) + return -1; + + return alloc_data.fd; +} + +static int +wrapper_dmabuf_alloc(struct wrapper_device *device, size_t size) +{ + int fd; + + fd = dma_heap_alloc(device->physical->dma_heap_fd, size); + + if (fd < 0) + fd = ion_heap_alloc(device->physical->dma_heap_fd, size); + + return fd; +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_AllocateMemory(VkDevice _device, + const VkMemoryAllocateInfo* pAllocateInfo, + const VkAllocationCallbacks* pAllocator, + VkDeviceMemory* pMemory) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + const VkImportAndroidHardwareBufferInfoANDROID *import_ahb_info; + const VkImportMemoryFdInfoKHR *import_fd_info; + const VkExportMemoryAllocateInfo *export_info; + VkImportMemoryFdInfoKHR local_import_info = { .fd = -1 }; + VkExportMemoryAllocateInfo local_export_info; + VkMemoryAllocateInfo wrapper_allocate_info; + struct wrapper_device_memory *memory; + VkMemoryPropertyFlags mem_flags; + bool can_get_ahardware_buffer; + bool can_get_dmabuf_fd; + VkResult result; + + mem_flags = device->physical->memory_properties.memoryTypes + [pAllocateInfo->memoryTypeIndex].propertyFlags; + + if (!device->vk.enabled_extensions.EXT_map_memory_placed + || !device->vk.enabled_features.memoryMapPlaced + || !(mem_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)) { + return device->dispatch_table.AllocateMemory( + device->dispatch_handle, + pAllocateInfo, + pAllocator, + pMemory); + } + + memory = vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*memory), + 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!memory) + return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + + memory->alloc_size = pAllocateInfo->allocationSize; + memory->dmabuf_fd = -1; + memory->ahardware_buffer = NULL; + wrapper_allocate_info = *pAllocateInfo; + + import_ahb_info = vk_find_struct_const(pAllocateInfo, + IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID); + import_fd_info = vk_find_struct_const(pAllocateInfo, + IMPORT_MEMORY_FD_INFO_KHR); + export_info = vk_find_struct_const(pAllocateInfo, + EXPORT_MEMORY_ALLOCATE_INFO); + + if (import_ahb_info) { + memory->ahardware_buffer = import_ahb_info->buffer; + AHardwareBuffer_acquire(memory->ahardware_buffer); + } else if (import_fd_info) { + memory->dmabuf_fd = os_dupfd_cloexec(import_fd_info->fd); + } else if (export_info == NULL) { + if (device->import_dmabuf) { + int import_dmabuf_fd = wrapper_dmabuf_alloc(device, + pAllocateInfo->allocationSize); + if (import_dmabuf_fd < 0) + goto fallback; + + local_import_info = (VkImportMemoryFdInfoKHR) { + .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, + .pNext = wrapper_allocate_info.pNext, + .fd = import_dmabuf_fd, + .handleType = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, + }; + wrapper_allocate_info.pNext = &local_import_info; + memory->dmabuf_fd = os_dupfd_cloexec(import_dmabuf_fd); + } else { + fallback: + local_export_info = (VkExportMemoryAllocateInfo) { + .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, + .pNext = wrapper_allocate_info.pNext, + .handleTypes = + device->physical->vk.supported_extensions.EXT_external_memory_dma_buf + ? VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT + : VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, + }; + wrapper_allocate_info.pNext = &local_export_info; + export_info = &local_export_info; + } + } + + result = device->dispatch_table.AllocateMemory(device->dispatch_handle, + &wrapper_allocate_info, + pAllocator, + pMemory); + if (result != VK_SUCCESS) { + if (memory->ahardware_buffer) + AHardwareBuffer_release(memory->ahardware_buffer); + if (local_import_info.fd != -1) + close(local_import_info.fd); + if (memory->dmabuf_fd != -1) + close(memory->dmabuf_fd); + vk_free2(&device->vk.alloc, pAllocator, memory); + return vk_error(device, result); + } + + can_get_dmabuf_fd = (export_info && export_info->handleTypes == + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT); + can_get_ahardware_buffer = (export_info && export_info->handleTypes == + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID); + + if (can_get_dmabuf_fd) { + const VkMemoryGetFdInfoKHR get_fd_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, + .memory = *pMemory, + .handleType = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, + }; + device->dispatch_table.GetMemoryFdKHR(device->dispatch_handle, + &get_fd_info, &memory->dmabuf_fd); + } else if (can_get_ahardware_buffer) { + const VkMemoryGetAndroidHardwareBufferInfoANDROID get_ahb_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, + .memory = *pMemory, + }; + device->dispatch_table.GetMemoryAndroidHardwareBufferANDROID( + device->dispatch_handle, &get_ahb_info, &memory->ahardware_buffer); + } + + _mesa_hash_table_insert(device->memorys, (void *)(*pMemory), memory); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_FreeMemory(VkDevice _device, VkDeviceMemory _memory, + const VkAllocationCallbacks* pAllocator) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + struct hash_entry *entry = NULL; + + if (_memory != VK_NULL_HANDLE) + entry = _mesa_hash_table_search(device->memorys, (void *)_memory); + + if (entry) { + struct wrapper_device_memory *memory = entry->data; + if (memory->map_address && memory->map_size) + munmap(memory->map_address, memory->map_size); + if (memory->ahardware_buffer) + AHardwareBuffer_release(memory->ahardware_buffer); + if (memory->dmabuf_fd != -1) + close(memory->dmabuf_fd); + vk_free2(&device->vk.alloc, pAllocator, memory); + _mesa_hash_table_remove(device->memorys, entry); + } + + device->dispatch_table.FreeMemory(device->dispatch_handle, + _memory, + pAllocator); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_MapMemory2KHR(VkDevice _device, + const VkMemoryMapInfoKHR* pMemoryMapInfo, + void** ppData) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + struct wrapper_device_memory *memory; + const VkMemoryMapPlacedInfoEXT *placed_info = NULL; + const struct hash_entry *entry = NULL; + int fd; + + if (pMemoryMapInfo->flags & VK_MEMORY_MAP_PLACED_BIT_EXT) + placed_info = vk_find_struct_const(pMemoryMapInfo->pNext, + MEMORY_MAP_PLACED_INFO_EXT); + + if (pMemoryMapInfo->memory != VK_NULL_HANDLE) + entry = _mesa_hash_table_search(device->memorys, + (void *)pMemoryMapInfo->memory); + + if (placed_info == NULL || entry == NULL) { + return device->dispatch_table.MapMemory( + device->dispatch_handle, + pMemoryMapInfo->memory, + pMemoryMapInfo->offset, + pMemoryMapInfo->size, + 0, + ppData); + } + memory = entry->data; + + if (memory->map_address) { + if (placed_info->pPlacedAddress != memory->map_address) { + return VK_ERROR_MEMORY_MAP_FAILED; + } else { + *ppData = (char *)memory->map_address + + pMemoryMapInfo->offset; + return VK_SUCCESS; + } + } + assert(memory->dmabuf_fd >= 0 || memory->ahardware_buffer != NULL); + + if (memory->ahardware_buffer) { + const native_handle_t *handle; + const int *handle_fds; + + handle = AHardwareBuffer_getNativeHandle(memory->ahardware_buffer); + handle_fds = &handle->data[0]; + + int idx; + for (idx = 0; idx < handle->numFds; idx++) { + size_t size = lseek(handle_fds[idx], 0, SEEK_END); + if (size >= memory->alloc_size) { + break; + } + } + assert(idx < handle->numFds); + fd = handle_fds[idx]; + } else { + fd = memory->dmabuf_fd; + } + + if (pMemoryMapInfo->size == VK_WHOLE_SIZE) + memory->map_size = memory->alloc_size > 0 ? + memory->alloc_size : lseek(fd, 0, SEEK_END); + else + memory->map_size = pMemoryMapInfo->size; + + memory->map_address = mmap(placed_info->pPlacedAddress, + memory->map_size, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_FIXED, + fd, 0); + if (memory->map_address == MAP_FAILED) { + memory->map_address = NULL; + memory->map_size = 0; + fprintf(stderr, "%s: mmap failed\n", __func__); + return vk_error(device, VK_ERROR_MEMORY_MAP_FAILED); + } + + *ppData = (char *)memory->map_address + pMemoryMapInfo->offset; + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_UnmapMemory(VkDevice _device, VkDeviceMemory _memory) { + vk_common_UnmapMemory(_device, _memory); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_UnmapMemory2KHR(VkDevice _device, + const VkMemoryUnmapInfoKHR* pMemoryUnmapInfo) +{ + VK_FROM_HANDLE(wrapper_device, device, _device); + const struct hash_entry *entry = NULL; + + if (pMemoryUnmapInfo->memory != VK_NULL_HANDLE) + entry = _mesa_hash_table_search(device->memorys, + (void *)pMemoryUnmapInfo->memory); + if (entry) { + struct wrapper_device_memory *memory = entry->data; + if (pMemoryUnmapInfo->flags & VK_MEMORY_UNMAP_RESERVE_BIT_EXT) { + memory->map_address = mmap(memory->map_address, memory->map_size, + PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + if (memory->map_address == MAP_FAILED) { + fprintf(stderr, "Failed to replace mapping with reserved memory"); + return vk_error(device, VK_ERROR_MEMORY_MAP_FAILED); + } + } else { + munmap(memory->map_address, memory->map_size); + } + + memory->map_size = 0; + memory->map_address = NULL; + } + + device->dispatch_table.UnmapMemory(device->dispatch_handle, + pMemoryUnmapInfo->memory); + return VK_SUCCESS; +} + +bool wrapper_try_import_dmabuf(struct wrapper_device *device) { + VkMemoryFdPropertiesKHR fd_props; + VkMemoryAllocateInfo alloc_info; + VkDeviceMemory memory; + VkResult result; + int fd; + + if (device->physical->dma_heap_fd < 0) + return false; + + fd = wrapper_dmabuf_alloc(device, 0x1000); + if (fd < 0) + return false; + + fd_props = (VkMemoryFdPropertiesKHR) { + .sType = VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR, + }; + result = device->dispatch_table.GetMemoryFdPropertiesKHR( + device->dispatch_handle, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, + fd, &fd_props); + if (result != VK_SUCCESS) { + close(fd); + return false; + } + + alloc_info = (VkMemoryAllocateInfo) { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .allocationSize = 0x1000, + .memoryTypeIndex = wrapper_select_memory_type( + device->physical->memory_properties, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | + fd_props.memoryTypeBits), + }; + result = device->dispatch_table.AllocateMemory( + device->dispatch_handle, &alloc_info, NULL, &memory); + if (result != VK_SUCCESS) { + close(fd); + return false; + } + + device->dispatch_table.FreeMemory(device->dispatch_handle, + memory, NULL); + return true; +} + diff --git a/src/vulkan/wrapper/wrapper_instance.c b/src/vulkan/wrapper/wrapper_instance.c new file mode 100644 index 00000000000..3b083ec40d8 --- /dev/null +++ b/src/vulkan/wrapper/wrapper_instance.c @@ -0,0 +1,297 @@ +#include "wrapper_private.h" +#include "wrapper_entrypoints.h" +#include "vk_alloc.h" +#include "vk_common_entrypoints.h" +#include "vk_dispatch_table.h" +#include "vk_extensions.h" + +const struct vk_instance_extension_table wrapper_instance_extensions = { + .KHR_get_surface_capabilities2 = true, + .EXT_surface_maintenance1 = true, + .KHR_surface_protected_capabilities = true, + .KHR_surface = true, + .EXT_swapchain_colorspace = true, +#ifdef VK_USE_PLATFORM_ANDROID_KHR + .KHR_android_surface = true, +#endif +#ifdef VK_USE_PLATFORM_XCB_KHR + .KHR_xcb_surface = true, +#endif +#ifdef VK_USE_PLATFORM_XLIB_KHR + .KHR_xlib_surface = true, +#endif +#ifdef VK_USE_PLATFORM_WAYLAND_KHR + .KHR_wayland_surface = true, +#endif +#ifdef VK_USE_PLATFORM_DISPLAY_KHR + .KHR_display = true, + .KHR_get_display_properties2 = true, + .EXT_display_surface_counter = true, + .EXT_acquire_drm_display = true, + .EXT_direct_mode_display = true, +#endif + .EXT_headless_surface = true, + .EXT_debug_utils = true, + .EXT_debug_report = true, +}; + +static void *vulkan_library_handle; +static PFN_vkCreateInstance create_instance; +static PFN_vkGetInstanceProcAddr get_instance_proc_addr; +static PFN_vkEnumerateInstanceVersion enumerate_instance_version; +static PFN_vkEnumerateInstanceExtensionProperties enumerate_instance_extension_properties; +static struct vk_instance_extension_table *supported_instance_extensions; + +#ifdef __LP64__ +#define DEFAULT_VULKAN_PATH "/system/lib64/libvulkan.so" +#else +#define DEFAULT_VULKAN_PATH "/system/lib/libvulkan.so" +#endif + +#include + +static bool vulkan_library_init() +{ + if (vulkan_library_handle) + return true; + + const char *env = getenv("WRAPPER_VULKAN_PATH"); + vulkan_library_handle = dlopen(env ? env : DEFAULT_VULKAN_PATH, + RTLD_LOCAL | RTLD_NOW); + + if (vulkan_library_handle) { + create_instance = dlsym(vulkan_library_handle, "vkCreateInstance"); + get_instance_proc_addr = dlsym(vulkan_library_handle, + "vkGetInstanceProcAddr"); + enumerate_instance_version = dlsym(vulkan_library_handle, + "vkEnumerateInstanceVersion"); + enumerate_instance_extension_properties = + dlsym(vulkan_library_handle, "vkEnumerateInstanceExtensionProperties"); + } + else { + fprintf(stderr, "%s", dlerror()); + } + + return vulkan_library_handle ? true : false; +} + +static VkResult wrapper_vulkan_init() +{ + VkExtensionProperties props[VK_INSTANCE_EXTENSION_COUNT]; + uint32_t prop_count = VK_INSTANCE_EXTENSION_COUNT; + VkResult result; + + if (supported_instance_extensions) + return VK_SUCCESS; + + if (!vulkan_library_init()) + return VK_ERROR_INCOMPATIBLE_DRIVER; + + result = enumerate_instance_extension_properties(NULL, &prop_count, props); + if (result != VK_SUCCESS) + return result; + + supported_instance_extensions = malloc(sizeof(*supported_instance_extensions)); + if (!supported_instance_extensions) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + *supported_instance_extensions = wrapper_instance_extensions; + + for(int i = 0; i < prop_count; i++) { + int idx; + for (idx = 0; idx < VK_INSTANCE_EXTENSION_COUNT; idx++) { + if (strcmp(vk_instance_extensions[idx].extensionName, + props[i].extensionName) == 0) + break; + } + + if (idx >= VK_INSTANCE_EXTENSION_COUNT) + continue; + + supported_instance_extensions->extensions[idx] = true; + } + + return VK_SUCCESS; +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_EnumerateInstanceVersion(uint32_t* pApiVersion) +{ + + if (!vulkan_library_init()) + return vk_error(NULL, VK_ERROR_INCOMPATIBLE_DRIVER); + + return enumerate_instance_version(pApiVersion); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_EnumerateInstanceExtensionProperties(const char* pLayerName, + uint32_t* pPropertyCount, + VkExtensionProperties* pProperties) +{ + VkResult result; + + result = wrapper_vulkan_init(); + if (result != VK_SUCCESS) + return vk_error(NULL, result); + + return vk_enumerate_instance_extension_properties(supported_instance_extensions, + pPropertyCount, + pProperties); +} + +static inline void +set_wrapper_required_extensions(const struct vk_instance *instance, + uint32_t *enable_extension_count, + const char **enable_extensions) +{ + uint32_t count = *enable_extension_count; +#define REQUIRED_EXTENSION(name) \ + assert (count < VK_INSTANCE_EXTENSION_COUNT); \ + if (!instance->enabled_extensions.name && \ + supported_instance_extensions->name) { \ + enable_extensions[count++] = "VK_" #name; \ + } + REQUIRED_EXTENSION(KHR_get_physical_device_properties2); + REQUIRED_EXTENSION(KHR_external_fence_capabilities); + REQUIRED_EXTENSION(KHR_external_memory_capabilities); + REQUIRED_EXTENSION(KHR_external_semaphore_capabilities); +#undef REQUIRED_EXTENSION + *enable_extension_count = count; +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkInstance *pInstance) +{ + const char *wrapper_enable_extensions[VK_INSTANCE_EXTENSION_COUNT]; + uint32_t wrapper_enable_extension_count = 0; + VkInstanceCreateInfo wrapper_create_info = *pCreateInfo; + struct vk_instance_dispatch_table dispatch_table; + struct wrapper_instance *instance; + VkResult result; + + result = wrapper_vulkan_init(); + if (result != VK_SUCCESS) + return vk_error(NULL, result); + + instance = vk_zalloc2(vk_default_allocator(), pAllocator, sizeof(*instance), + 8, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); + if (!instance) + return vk_error(NULL, VK_ERROR_OUT_OF_HOST_MEMORY); + + vk_instance_dispatch_table_from_entrypoints( + &dispatch_table, &wrapper_instance_entrypoints, true); + vk_instance_dispatch_table_from_entrypoints( + &dispatch_table, &wsi_instance_entrypoints, false); + + result = vk_instance_init(&instance->vk, supported_instance_extensions, + &dispatch_table, pCreateInfo, + pAllocator ? pAllocator : vk_default_allocator()); + + if (result != VK_SUCCESS) { + vk_free2(vk_default_allocator(), pAllocator, instance); + return vk_error(NULL, result); + } + + instance->vk.physical_devices.enumerate = enumerate_physical_device; + instance->vk.physical_devices.destroy = destroy_physical_device; + + for (int idx = 0; idx < pCreateInfo->enabledExtensionCount; idx++) { + if (wrapper_instance_extensions.extensions[idx]) + continue; + + if (!instance->vk.enabled_extensions.extensions[idx]) + continue; + + wrapper_enable_extensions[wrapper_enable_extension_count++] = + vk_instance_extensions[idx].extensionName; + } + + set_wrapper_required_extensions(&instance->vk, + &wrapper_enable_extension_count, + wrapper_enable_extensions); + + wrapper_create_info.enabledExtensionCount = wrapper_enable_extension_count; + wrapper_create_info.ppEnabledExtensionNames = wrapper_enable_extensions; + + result = create_instance(&wrapper_create_info, pAllocator, + &instance->dispatch_handle); + if (result != VK_SUCCESS) { + vk_instance_finish(&instance->vk); + vk_free2(vk_default_allocator(), pAllocator, instance); + return vk_error(NULL, result); + } + vk_instance_dispatch_table_load(&instance->dispatch_table, + get_instance_proc_addr, + instance->dispatch_handle); + + *pInstance = wrapper_instance_to_handle(instance); + + return VK_SUCCESS; +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_DestroyInstance(VkInstance _instance, + const VkAllocationCallbacks *pAllocator) +{ + VK_FROM_HANDLE(wrapper_instance, instance, _instance); + instance->dispatch_table.DestroyInstance(instance->dispatch_handle, + pAllocator); + vk_instance_finish(&instance->vk); + vk_free2(&instance->vk.alloc, pAllocator, instance); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_DebugReportMessageEXT(VkInstance _instance, + VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT objectType, + uint64_t object, + size_t location, + int32_t messageCode, + const char* pLayerPrefix, + const char* pMessage) +{ + VK_FROM_HANDLE(wrapper_instance, instance, _instance); + + switch (objectType) { + case VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT: + case VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT: + break; + default: + object = (uint64_t)VK_NULL_HANDLE; + } + + vk_common_DebugReportMessageEXT(instance->dispatch_handle, flags, + objectType, object, location, messageCode, + pLayerPrefix, pMessage); +} + +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +wrapper_GetInstanceProcAddr(VkInstance _instance, + const char *pName) +{ + VK_FROM_HANDLE(wrapper_instance, instance, _instance); + return vk_instance_get_proc_addr(&instance->vk, + &wrapper_instance_entrypoints, + pName); +} + +PUBLIC VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +vk_icdGetInstanceProcAddr(VkInstance instance, + const char *pName); + + +PUBLIC VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +vk_icdGetInstanceProcAddr(VkInstance instance, + const char *pName) +{ + return wrapper_GetInstanceProcAddr(instance, pName); +} diff --git a/src/vulkan/wrapper/wrapper_physical_device.c b/src/vulkan/wrapper/wrapper_physical_device.c new file mode 100644 index 00000000000..196dfea81b7 --- /dev/null +++ b/src/vulkan/wrapper/wrapper_physical_device.c @@ -0,0 +1,215 @@ +#include "wrapper_private.h" +#include "wrapper_entrypoints.h" +#include "wrapper_trampolines.h" +#include "vk_alloc.h" +#include "vk_common_entrypoints.h" +#include "vk_dispatch_table.h" +#include "vk_extensions.h" +#include "vk_physical_device.h" +#include "vk_util.h" +#include "wsi_common.h" +#include "util/os_misc.h" + +static VkResult +wrapper_setup_device_extensions(struct wrapper_physical_device *pdevice) { + struct vk_device_extension_table *exts = &pdevice->vk.supported_extensions; + VkExtensionProperties pdevice_extensions[VK_DEVICE_EXTENSION_COUNT]; + uint32_t pdevice_extension_count = VK_DEVICE_EXTENSION_COUNT; + VkResult result; + + result = pdevice->dispatch_table.EnumerateDeviceExtensionProperties( + pdevice->dispatch_handle, NULL, &pdevice_extension_count, pdevice_extensions); + + if (result != VK_SUCCESS) + return result; + + *exts = wrapper_device_extensions; + + for (int i = 0; i < pdevice_extension_count; i++) { + int idx; + for (idx = 0; idx < VK_DEVICE_EXTENSION_COUNT; idx++) { + if (strcmp(vk_device_extensions[idx].extensionName, + pdevice_extensions[i].extensionName) == 0) + break; + } + + if (idx >= VK_DEVICE_EXTENSION_COUNT) + continue; + + if (wrapper_filter_extensions.extensions[idx]) + continue; + + exts->extensions[idx] = true; + } + + exts->KHR_present_wait = exts->KHR_timeline_semaphore; + + return VK_SUCCESS; +} + +static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +wrapper_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName) +{ + VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice); + return vk_instance_get_proc_addr_unchecked(pdevice->instance, pName); +} + +VkResult enumerate_physical_device(struct vk_instance *_instance) +{ + struct wrapper_instance *instance = (struct wrapper_instance *)_instance; + VkPhysicalDevice physical_devices[16]; + uint32_t physical_device_count = 16; + VkResult result; + + result = instance->dispatch_table.EnumeratePhysicalDevices( + instance->dispatch_handle, &physical_device_count, physical_devices); + + if (result != VK_SUCCESS) + return result; + + for (int i = 0; i < physical_device_count; i++) { + PFN_vkGetInstanceProcAddr get_instance_proc_addr; + struct wrapper_physical_device *pdevice; + + pdevice = vk_zalloc(&_instance->alloc, sizeof(*pdevice), 8, + VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); + if (!pdevice) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + struct vk_physical_device_dispatch_table dispatch_table; + vk_physical_device_dispatch_table_from_entrypoints( + &dispatch_table, &wrapper_physical_device_entrypoints, true); + vk_physical_device_dispatch_table_from_entrypoints( + &dispatch_table, &wsi_physical_device_entrypoints, false); + vk_physical_device_dispatch_table_from_entrypoints( + &dispatch_table, &wrapper_physical_device_trampolines, false); + + result = vk_physical_device_init(&pdevice->vk, + &instance->vk, + NULL, NULL, NULL, + &dispatch_table); + if (result != VK_SUCCESS) { + vk_free(&_instance->alloc, pdevice); + return result; + } + + pdevice->instance = instance; + pdevice->dispatch_handle = physical_devices[i]; + get_instance_proc_addr = instance->dispatch_table.GetInstanceProcAddr; + + vk_physical_device_dispatch_table_load(&pdevice->dispatch_table, + get_instance_proc_addr, + instance->dispatch_handle); + + wrapper_setup_device_extensions(pdevice); + wrapper_setup_device_features(pdevice); + + struct vk_features *supported_features = &pdevice->vk.supported_features; + pdevice->backup_supported_features = *supported_features; + supported_features->presentId = true; + supported_features->presentWait = supported_features->timelineSemaphore; + supported_features->swapchainMaintenance1 = true; + supported_features->imageCompressionControlSwapchain = false; + supported_features->memoryMapPlaced = true; + supported_features->memoryUnmapReserve = true; + supported_features->textureCompressionBC = true; + + result = wsi_device_init(&pdevice->wsi_device, + wrapper_physical_device_to_handle(pdevice), + wrapper_wsi_proc_addr, &_instance->alloc, -1, + NULL, &(struct wsi_device_options){}); + if (result != VK_SUCCESS) { + vk_physical_device_finish(&pdevice->vk); + vk_free(&_instance->alloc, pdevice); + return result; + } + pdevice->vk.wsi_device = &pdevice->wsi_device; + pdevice->wsi_device.force_bgra8_unorm_first = true; +#ifdef __ANDROID__ + pdevice->wsi_device.wants_ahardware_buffer = true; +#endif + + pdevice->dispatch_table.GetPhysicalDeviceMemoryProperties( + pdevice->dispatch_handle, &pdevice->memory_properties); + + pdevice->dma_heap_fd = open("/dev/dma_heap/system", O_RDONLY); + if (pdevice->dma_heap_fd < 0) + pdevice->dma_heap_fd = open("/dev/ion", O_RDONLY); + + list_addtail(&pdevice->vk.link, &_instance->physical_devices.list); + } + + return VK_SUCCESS; +} + +void destroy_physical_device(struct vk_physical_device *pdevice) { + VK_FROM_HANDLE(wrapper_physical_device, wpdevice, + vk_physical_device_to_handle(pdevice)); + if (wpdevice->dma_heap_fd != -1) + close(wpdevice->dma_heap_fd); + wsi_device_finish(pdevice->wsi_device, &pdevice->instance->alloc); + vk_physical_device_finish(pdevice); + vk_free(&pdevice->instance->alloc, pdevice); +} + +VKAPI_ATTR VkResult VKAPI_CALL +wrapper_EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, + const char* pLayerName, + uint32_t* pPropertyCount, + VkExtensionProperties* pProperties) +{ + return vk_common_EnumerateDeviceExtensionProperties(physicalDevice, + pLayerName, + pPropertyCount, + pProperties); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, + VkPhysicalDeviceFeatures* pFeatures) +{ + return vk_common_GetPhysicalDeviceFeatures(physicalDevice, pFeatures); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, + VkPhysicalDeviceFeatures2* pFeatures) { + vk_common_GetPhysicalDeviceFeatures2(physicalDevice, pFeatures); +} + +VKAPI_ATTR void VKAPI_CALL +wrapper_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, + VkPhysicalDeviceProperties2* pProperties) +{ + VK_FROM_HANDLE(wrapper_physical_device, pdevice, physicalDevice); + pdevice->dispatch_table.GetPhysicalDeviceProperties2( + pdevice->dispatch_handle, pProperties); + + vk_foreach_struct(prop, pProperties->pNext) { + switch (prop->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT: + { + VkPhysicalDeviceMapMemoryPlacedPropertiesEXT *placed_prop = + (VkPhysicalDeviceMapMemoryPlacedPropertiesEXT *)prop; + uint64_t os_page_size; + os_get_page_size(&os_page_size); + placed_prop->minPlacedMemoryMapAlignment = os_page_size; + break; + } + default: + break; + } + } +} + +uint32_t +wrapper_select_memory_type(VkPhysicalDeviceMemoryProperties props, + VkMemoryPropertyFlags flags) { + int idx; + for (idx = 0; idx < props.memoryTypeCount; idx ++) { + if (props.memoryTypes[idx].propertyFlags & flags) { + break; + } + } + return idx < props.memoryTypeCount ? idx : 0; +} diff --git a/src/vulkan/wrapper/wrapper_private.h b/src/vulkan/wrapper/wrapper_private.h new file mode 100644 index 00000000000..0809d00d90d --- /dev/null +++ b/src/vulkan/wrapper/wrapper_private.h @@ -0,0 +1,94 @@ +#include "vulkan/runtime/vk_instance.h" +#include "vulkan/runtime/vk_physical_device.h" +#include "vulkan/runtime/vk_device.h" +#include "vulkan/runtime/vk_queue.h" +#include "vulkan/runtime/vk_command_buffer.h" +#include "vulkan/runtime/vk_log.h" +#include "vulkan/util/vk_dispatch_table.h" +#include "vulkan/wsi/wsi_common.h" +#include "util/hash_table.h" + +extern const struct vk_instance_extension_table wrapper_instance_extensions; +extern const struct vk_device_extension_table wrapper_device_extensions; +extern const struct vk_device_extension_table wrapper_filter_extensions; + +struct wrapper_instance { + struct vk_instance vk; + + VkInstance dispatch_handle; + struct vk_instance_dispatch_table dispatch_table; +}; + +VK_DEFINE_HANDLE_CASTS(wrapper_instance, vk.base, VkInstance, + VK_OBJECT_TYPE_INSTANCE) + +struct wrapper_physical_device { + struct vk_physical_device vk; + + int dma_heap_fd; + VkPhysicalDevice dispatch_handle; + VkPhysicalDeviceMemoryProperties memory_properties; + struct wsi_device wsi_device; + struct wrapper_instance *instance; + struct vk_features backup_supported_features; + struct vk_physical_device_dispatch_table dispatch_table; +}; + +VK_DEFINE_HANDLE_CASTS(wrapper_physical_device, vk.base, VkPhysicalDevice, + VK_OBJECT_TYPE_PHYSICAL_DEVICE) + +struct wrapper_queue { + struct vk_queue vk; + + struct wrapper_device *device; + VkQueue dispatch_handle; +}; + +VK_DEFINE_HANDLE_CASTS(wrapper_queue, vk.base, VkQueue, + VK_OBJECT_TYPE_QUEUE) + +struct wrapper_device { + struct vk_device vk; + + bool import_dmabuf; + VkDevice dispatch_handle; + struct list_head command_buffers; + struct hash_table *memorys; + struct wrapper_physical_device *physical; + struct vk_device_dispatch_table dispatch_table; +}; + +VK_DEFINE_HANDLE_CASTS(wrapper_device, vk.base, VkDevice, + VK_OBJECT_TYPE_DEVICE) + +struct wrapper_command_buffer { + struct vk_command_buffer vk; + + struct wrapper_device *device; + struct list_head link; + VkCommandPool pool; + VkCommandBuffer dispatch_handle; +}; + +VK_DEFINE_HANDLE_CASTS(wrapper_command_buffer, vk.base, VkCommandBuffer, + VK_OBJECT_TYPE_COMMAND_BUFFER) + +struct wrapper_device_memory { + struct AHardwareBuffer *ahardware_buffer; + int dmabuf_fd; + void *map_address; + size_t map_size; + size_t alloc_size; +}; + +VkResult enumerate_physical_device(struct vk_instance *_instance); +void destroy_physical_device(struct vk_physical_device *pdevice); + +void +wrapper_setup_device_features(struct wrapper_physical_device *physical_device); + +uint32_t +wrapper_select_memory_type(VkPhysicalDeviceMemoryProperties props, + VkMemoryPropertyFlags flags); + +bool wrapper_try_import_dmabuf(struct wrapper_device *device); diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 898bdd7bcdb..a11b6bd64bc 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -201,6 +201,8 @@ wsi_device_init(struct wsi_device *wsi, WSI_GET_CB(GetPhysicalDeviceFormatProperties2); WSI_GET_CB(GetPhysicalDeviceImageFormatProperties2); WSI_GET_CB(GetSemaphoreFdKHR); + WSI_GET_CB(ImportSemaphoreFdKHR); + WSI_GET_CB(ImportFenceFdKHR); WSI_GET_CB(ResetFences); WSI_GET_CB(QueueSubmit); WSI_GET_CB(WaitForFences); @@ -1167,8 +1169,16 @@ wsi_signal_semaphore_for_image(struct vk_device *device, const struct wsi_image *image, VkSemaphore _semaphore) { - if (device->physical->supported_sync_types == NULL) - return VK_SUCCESS; + if (device->physical->supported_sync_types == NULL) { + const VkImportSemaphoreFdInfoKHR import_fd_info = { + .sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR, + .semaphore = _semaphore, + .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, + .fd = -1, + .flags = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT, + }; + return chain->wsi->ImportSemaphoreFdKHR(chain->device, &import_fd_info); + } VK_FROM_HANDLE(vk_semaphore, semaphore, _semaphore); @@ -1203,8 +1213,16 @@ wsi_signal_fence_for_image(struct vk_device *device, const struct wsi_image *image, VkFence _fence) { - if (device->physical->supported_sync_types == NULL) - return VK_SUCCESS; + if (device->physical->supported_sync_types == NULL) { + const VkImportFenceFdInfoKHR import_fd_info = { + .sType = VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR, + .fence = _fence, + .handleType = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, + .fd = -1, + .flags = VK_FENCE_IMPORT_TEMPORARY_BIT, + }; + return chain->wsi->ImportFenceFdKHR(chain->device, &import_fd_info); + } VK_FROM_HANDLE(vk_fence, fence, _fence); diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 014cb718b17..2316d3156d0 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -263,6 +263,8 @@ struct wsi_device { WSI_CB(GetPhysicalDeviceFormatProperties2); WSI_CB(GetPhysicalDeviceImageFormatProperties2); WSI_CB(GetSemaphoreFdKHR); + WSI_CB(ImportSemaphoreFdKHR); + WSI_CB(ImportFenceFdKHR); WSI_CB(ResetFences); WSI_CB(QueueSubmit); WSI_CB(WaitForFences); -- 2.47.0 ================================================ FILE: packages/mesa-vulkan-wrapper-rev9/03-wsi-common-no-pthread-cancel.patch ================================================ diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index ff57a259046..4703500f374 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -176,6 +176,12 @@ struct wsi_display_sync { static uint64_t fence_sequence; +#ifdef __ANDROID__ +static void thread_signal_handler (int signum) { + pthread_exit (0); +} +#endif + ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_mode, VkDisplayModeKHR) ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_connector, VkDisplayKHR) @@ -1341,7 +1347,9 @@ wsi_display_wait_thread(void *data) .events = POLLIN }; +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { int ret = poll(&pollfd, 1, -1); if (ret > 0) { @@ -1369,9 +1377,22 @@ wsi_display_start_wait_thread(struct wsi_display *wsi) static void wsi_display_stop_wait_thread(struct wsi_display *wsi) { +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + mtx_lock(&wsi->wait_mutex); if (wsi->wait_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->wait_thread); +#else + pthread_kill(wsi->wait_thread, SIGUSR2); +#endif pthread_join(wsi->wait_thread, NULL); wsi->wait_thread = 0; } @@ -2215,7 +2236,9 @@ udev_event_listener_thread(void *data) int udev_fd = udev_monitor_get_fd(mon); +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { nfds_t nfds = 1; @@ -2340,6 +2363,15 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + if (wsi) { wsi_for_each_connector(connector, wsi) { wsi_for_each_display_mode(mode, connector) { @@ -2351,7 +2383,11 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, wsi_display_stop_wait_thread(wsi); if (wsi->hotplug_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->hotplug_thread); +#else + pthread_kill(wsi->hotplug_thread, SIGUSR2); +#endif pthread_join(wsi->hotplug_thread, NULL); } ================================================ FILE: packages/mesa-vulkan-wrapper-rev9/04-vulkan-x11-termux-x11-support.patch ================================================ From 71435ecce42a2438096d6c24b3730fd3686a99ee Mon Sep 17 00:00:00 2001 From: xMeM Date: Thu, 14 Nov 2024 15:27:49 +0800 Subject: [PATCH 2/2] vulkan/x11: termux-x11 support Signed-off-by: xMeM --- src/vulkan/wsi/wsi_common.c | 314 +++++++++++++++++++++++++++- src/vulkan/wsi/wsi_common.h | 7 + src/vulkan/wsi/wsi_common_private.h | 8 + src/vulkan/wsi/wsi_common_x11.c | 99 +++++---- 4 files changed, 390 insertions(+), 38 deletions(-) diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index a11b6bd64bc..77755e96b93 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -47,6 +47,10 @@ #include #endif +#ifdef __ANDROID__ +#include +#endif + uint64_t WSI_DEBUG; static const struct debug_control debug_control[] = { @@ -55,6 +59,7 @@ static const struct debug_control debug_control[] = { { "noshm", WSI_DEBUG_NOSHM }, { "linear", WSI_DEBUG_LINEAR }, { "dxgi", WSI_DEBUG_DXGI }, + { "blit", WSI_DEBUG_BLIT }, { NULL, }, }; @@ -86,6 +91,7 @@ wsi_device_init(struct wsi_device *wsi, wsi->sw = device_options->sw_device || (WSI_DEBUG & WSI_DEBUG_SW); wsi->wants_linear = (WSI_DEBUG & WSI_DEBUG_LINEAR) != 0; wsi->x11.extra_xwayland_image = device_options->extra_xwayland_image; + wsi->needs_blit = (WSI_DEBUG & WSI_DEBUG_BLIT) != 0; #define WSI_GET_CB(func) \ PFN_vk##func func = (PFN_vk##func)proc_addr(pdevice, "vk" #func) WSI_GET_CB(GetPhysicalDeviceExternalSemaphoreProperties); @@ -99,12 +105,19 @@ wsi_device_init(struct wsi_device *wsi, wsi->pci_bus_info.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT; wsi->pci_bus_info.pNext = &wsi->drm_info; + VkPhysicalDeviceDriverProperties pddp = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, + .pNext = &wsi->pci_bus_info, + }; VkPhysicalDeviceProperties2 pdp2 = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, - .pNext = &wsi->pci_bus_info, + .pNext = &pddp, }; GetPhysicalDeviceProperties2(pdevice, &pdp2); + if (pddp.driverID == VK_DRIVER_ID_ARM_PROPRIETARY) + wsi->needs_blit = true; + wsi->maxImageDimension2D = pdp2.properties.limits.maxImageDimension2D; assert(pdp2.properties.limits.optimalBufferCopyRowPitchAlignment <= UINT32_MAX); wsi->optimalBufferCopyRowPitchAlignment = @@ -210,6 +223,10 @@ wsi_device_init(struct wsi_device *wsi, WSI_GET_CB(UnmapMemory); if (wsi->khr_present_wait) WSI_GET_CB(WaitSemaphores); +#ifdef __ANDROID__ + WSI_GET_CB(GetMemoryAndroidHardwareBufferANDROID); + WSI_GET_CB(GetAndroidHardwareBufferPropertiesANDROID); +#endif #undef WSI_GET_CB #ifdef VK_USE_PLATFORM_XCB_KHR @@ -366,6 +383,12 @@ get_blit_type(const struct wsi_device *wsi, return wsi_cpu_image_needs_buffer_blit(wsi, cpu_params) ? WSI_SWAPCHAIN_BUFFER_BLIT : WSI_SWAPCHAIN_NO_BLIT; } +#ifdef __ANDROID__ + case WSI_IMAGE_TYPE_AHB: { + return wsi->needs_blit ? WSI_SWAPCHAIN_IMAGE_BLIT : + WSI_SWAPCHAIN_NO_BLIT; + } +#endif #ifdef HAVE_LIBDRM case WSI_IMAGE_TYPE_DRM: { const struct wsi_drm_image_params *drm_params = @@ -386,6 +409,14 @@ get_blit_type(const struct wsi_device *wsi, } } +#ifdef __ANDROID__ +static VkResult +wsi_configure_ahb_image(const struct wsi_swapchain *chain, + const VkSwapchainCreateInfoKHR *pCreateInfo, + const struct wsi_base_image_params *params, + struct wsi_image_info *info); +#endif + static VkResult configure_image(const struct wsi_swapchain *chain, const VkSwapchainCreateInfoKHR *pCreateInfo, @@ -399,6 +430,11 @@ configure_image(const struct wsi_swapchain *chain, container_of(params, const struct wsi_cpu_image_params, base); return wsi_configure_cpu_image(chain, pCreateInfo, cpu_params, info); } +#ifdef __ANDROID__ + case WSI_IMAGE_TYPE_AHB: { + return wsi_configure_ahb_image(chain, pCreateInfo, params, info); + } +#endif #ifdef HAVE_LIBDRM case WSI_IMAGE_TYPE_DRM: { const struct wsi_drm_image_params *drm_params = @@ -698,6 +734,12 @@ wsi_destroy_image_info(const struct wsi_swapchain *chain, vk_free(&chain->alloc, info->modifier_props); info->modifier_props = NULL; } +#ifdef __ANDROID__ + if (info->ahb_desc != NULL) { + vk_free(&chain->alloc, info->ahb_desc); + info->ahb_desc = NULL; + } +#endif } VkResult @@ -760,6 +802,11 @@ wsi_destroy_image(const struct wsi_swapchain *chain, { const struct wsi_device *wsi = chain->wsi; +#ifdef __ANDROID__ + if (image->ahb) + AHardwareBuffer_release(image->ahb); +#endif + #ifndef _WIN32 if (image->dma_buf_fd >= 0) close(image->dma_buf_fd); @@ -2161,6 +2208,162 @@ wsi_create_cpu_linear_image_mem(const struct wsi_swapchain *chain, return VK_SUCCESS; } +#ifdef __ANDROID__ +static VkResult +wsi_create_ahb_image_mem(const struct wsi_swapchain *chain, + const struct wsi_image_info *info, + struct wsi_image *image) +{ + const struct wsi_device *wsi = chain->wsi; + VkAndroidHardwareBufferPropertiesANDROID ahb_props; + VkResult result; + + if (AHardwareBuffer_allocate(info->ahb_desc, &image->ahb)) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + ahb_props = (VkAndroidHardwareBufferPropertiesANDROID) { + .sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID, + }; + + result = wsi->GetAndroidHardwareBufferPropertiesANDROID( + chain->device, image->ahb, &ahb_props); + if (result != VK_SUCCESS) + return result; + + const VkMemoryDedicatedAllocateInfo memory_dedicated_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, + .image = image->image, + .buffer = VK_NULL_HANDLE, + }; + VkImportAndroidHardwareBufferInfoANDROID impory_memory_info = { + .sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, + .pNext = &memory_dedicated_info, + .buffer = image->ahb, + }; + VkMemoryAllocateInfo memory_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .pNext = &impory_memory_info, + .allocationSize = ahb_props.allocationSize, + .memoryTypeIndex = + wsi_select_device_memory_type(wsi, ahb_props.memoryTypeBits), + }; + + result = wsi->AllocateMemory(chain->device, &memory_info, + &chain->alloc, &image->memory); + if (result != VK_SUCCESS) + return result; + + image->num_planes = 1; + image->drm_modifier = 0; + + return VK_SUCCESS; +} + +static VkResult +wsi_create_ahb_blit_context(const struct wsi_swapchain *chain, + const struct wsi_image_info *info, + struct wsi_image *image) +{ + assert(chain->blit.type == WSI_SWAPCHAIN_IMAGE_BLIT); + + const VkExternalMemoryHandleTypeFlags handle_types = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID; + + const struct wsi_device *wsi = chain->wsi; + VkResult result; + + const VkExternalMemoryImageCreateInfo image_external_info = { + .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, + .handleTypes = handle_types, + }; + const VkImageCreateInfo image_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .pNext = &image_external_info, + .flags = 0u, + .extent = info->create.extent, + .format = VK_FORMAT_R8G8B8A8_UNORM, + .imageType = VK_IMAGE_TYPE_2D, + .mipLevels = 1, + .arrayLayers = 1, + .samples = VK_SAMPLE_COUNT_1_BIT, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + .queueFamilyIndexCount = info->create.queueFamilyIndexCount, + .pQueueFamilyIndices = info->create.pQueueFamilyIndices, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + }; + result = wsi->CreateImage(chain->device, &image_info, + &chain->alloc, &image->blit.image); + if (result != VK_SUCCESS) + return result; + + VkMemoryDedicatedAllocateInfo img_mem_dedicated_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, + .pNext = NULL, + .image = image->blit.image, + .buffer = VK_NULL_HANDLE, + }; + VkExportMemoryAllocateInfo export_info = { + .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, + .pNext = &img_mem_dedicated_info, + .handleTypes = handle_types, + }; + VkMemoryAllocateInfo buf_mem_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .pNext = &export_info, + .allocationSize = 0, + .memoryTypeIndex = 0, + }; + + result = wsi->AllocateMemory(chain->device, &buf_mem_info, + &chain->alloc, &image->blit.memory); + if (result != VK_SUCCESS) + return result; + + result = wsi->BindImageMemory(chain->device, image->blit.image, + image->blit.memory, 0); + if (result != VK_SUCCESS) + return result; + + VkMemoryGetAndroidHardwareBufferInfoANDROID get_ahb_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, + .pNext = NULL, + .memory = image->blit.memory, + }; + + result = wsi->GetMemoryAndroidHardwareBufferANDROID( + chain->device, &get_ahb_info, &image->ahb); + if (result != VK_SUCCESS) + return result; + + VkMemoryRequirements reqs; + wsi->GetImageMemoryRequirements(chain->device, image->image, &reqs); + + const VkMemoryDedicatedAllocateInfo memory_dedicated_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, + .image = image->image, + }; + const VkMemoryAllocateInfo memory_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .pNext = &memory_dedicated_info, + .allocationSize = reqs.size, + .memoryTypeIndex = + wsi_select_device_memory_type(wsi, reqs.memoryTypeBits), + }; + + result = wsi->AllocateMemory(chain->device, &memory_info, + &chain->alloc, &image->memory); + if (result != VK_SUCCESS) + return result; + + image->num_planes = 1; + + return VK_SUCCESS; +} + +#endif + static VkResult wsi_create_cpu_buffer_image_mem(const struct wsi_swapchain *chain, const struct wsi_image_info *info, @@ -2233,6 +2436,115 @@ wsi_configure_cpu_image(const struct wsi_swapchain *chain, return VK_SUCCESS; } +#ifdef __ANDROID__ +inline static uint32_t +vk_format_to_ahb_format(VkFormat format) { + switch (format) { + case VK_FORMAT_B8G8R8A8_SRGB: + case VK_FORMAT_B8G8R8A8_UNORM: + return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; + case VK_FORMAT_R5G6B5_UNORM_PACK16: + return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM; + case VK_FORMAT_A2R10G10B10_UNORM_PACK32: + return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM; + default: + unreachable("unsupported format"); + } +} +#endif + +#ifdef __ANDROID__ +static VkResult +wsi_configure_ahb_image(const struct wsi_swapchain *chain, + const VkSwapchainCreateInfoKHR *pCreateInfo, + const struct wsi_base_image_params *params, + struct wsi_image_info *info) +{ + assert(params->image_type == WSI_IMAGE_TYPE_AHB); + assert(chain->blit.type == WSI_SWAPCHAIN_NO_BLIT || + chain->blit.type == WSI_SWAPCHAIN_IMAGE_BLIT); + + VkResult result; + + if (chain->blit.type == WSI_SWAPCHAIN_IMAGE_BLIT) { + result = wsi_configure_image(chain, pCreateInfo, 0, info); + if (result != VK_SUCCESS) + return result; + + wsi_configure_image_blit_image(chain, info); + info->create_mem = wsi_create_ahb_blit_context; + return VK_SUCCESS; + } + + VkExternalMemoryHandleTypeFlags handle_types = + VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID; + + VkPhysicalDeviceImageFormatInfo2 format_info = { + .sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, + .format = pCreateInfo->imageFormat, + .type = VK_IMAGE_TYPE_2D, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = pCreateInfo->imageUsage, + .flags = info->create.flags, + }; + VkPhysicalDeviceExternalImageFormatInfo external_format_info = + { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO, + .pNext = NULL, + .handleType = handle_types, + }; + __vk_append_struct(&format_info, &external_format_info); + + VkImageFormatProperties2 format_props = { + .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2, + }; + VkExternalImageFormatProperties external_format_props = { + .sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES, + .pNext = NULL, + }; + __vk_append_struct(&format_props, &external_format_props); + + result = chain->wsi->GetPhysicalDeviceImageFormatProperties2( + chain->wsi->pdevice, &format_info, &format_props); + if (result != VK_SUCCESS) + return result; + + assert(pCreateInfo->imageExtent.width <= format_props.imageFormatProperties.maxExtent.width && + pCreateInfo->imageExtent.height <= format_props.imageFormatProperties.maxExtent.height); + assert(external_format_props.externalMemoryProperties.externalMemoryFeatures & + VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT); + + result = wsi_configure_image(chain, pCreateInfo, handle_types, + info); + if (result != VK_SUCCESS) + return result; + + info->ahb_desc = vk_alloc(&chain->alloc, + sizeof(AHardwareBuffer_Desc), + 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (!info->ahb_desc) { + wsi_destroy_image_info(chain, info); + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + + *info->ahb_desc = (AHardwareBuffer_Desc) { + .width = info->create.extent.width, + .height = info->create.extent.height, + .format = vk_format_to_ahb_format(info->create.format), + .layers = info->create.arrayLayers, + .usage = AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT | + AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | + AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, + }; + info->create.format = VK_FORMAT_UNDEFINED; + info->create_mem = wsi_create_ahb_image_mem; + + return VK_SUCCESS; +} +#endif + VKAPI_ATTR VkResult VKAPI_CALL wsi_WaitForPresentKHR(VkDevice device, VkSwapchainKHR _swapchain, uint64_t presentId, uint64_t timeout) diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 2316d3156d0..ffa3a94e74c 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -179,6 +179,9 @@ struct wsi_device { bool sw; + bool wants_ahardware_buffer; + bool needs_blit; + /* Set to true if the implementation is ok with linear WSI images. */ bool wants_linear; @@ -271,6 +274,10 @@ struct wsi_device { WSI_CB(MapMemory); WSI_CB(UnmapMemory); WSI_CB(WaitSemaphores); +#ifdef __ANDROID__ + WSI_CB(GetMemoryAndroidHardwareBufferANDROID); + WSI_CB(GetAndroidHardwareBufferPropertiesANDROID); +#endif #undef WSI_CB struct wsi_interface * wsi[VK_ICD_WSI_PLATFORM_MAX]; diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h index b89e962c3ff..c205c4f62c3 100644 --- a/src/vulkan/wsi/wsi_common_private.h +++ b/src/vulkan/wsi/wsi_common_private.h @@ -40,6 +40,7 @@ struct wsi_swapchain; #define WSI_DEBUG_NOSHM (1ull << 2) #define WSI_DEBUG_LINEAR (1ull << 3) #define WSI_DEBUG_DXGI (1ull << 4) +#define WSI_DEBUG_BLIT (1ull << 8) extern uint64_t WSI_DEBUG; @@ -47,6 +48,7 @@ enum wsi_image_type { WSI_IMAGE_TYPE_CPU, WSI_IMAGE_TYPE_DRM, WSI_IMAGE_TYPE_DXGI, + WSI_IMAGE_TYPE_AHB, }; struct wsi_base_image_params { @@ -84,6 +86,9 @@ struct wsi_image_info { VkExternalMemoryImageCreateInfo ext_mem; VkImageFormatListCreateInfo format_list; VkImageDrmFormatModifierListCreateInfoEXT drm_mod_list; +#ifdef __ANDROID__ + struct AHardwareBuffer_Desc *ahb_desc; +#endif enum wsi_image_type image_type; bool explicit_sync; @@ -165,6 +170,9 @@ struct wsi_image { int dma_buf_fd; #endif void *cpu_map; +#ifdef __ANDROID__ + struct AHardwareBuffer *ahb; +#endif }; struct wsi_swapchain { diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 0c0c489d893..5ed5d42341e 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -22,7 +22,6 @@ */ #include -#include #define XK_MISCELLANY #define XK_LATIN1 #include @@ -69,6 +68,11 @@ #include #endif +#ifdef __ANDROID__ +#include +#include +#endif + #ifndef XCB_PRESENT_OPTION_ASYNC_MAY_TEAR #define XCB_PRESENT_OPTION_ASYNC_MAY_TEAR 16 #endif @@ -1057,7 +1061,6 @@ struct x11_image { xcb_pixmap_t pixmap; xcb_xfixes_region_t update_region; /* long lived XID */ xcb_xfixes_region_t update_area; /* the above or None */ - struct xshmfence * shm_fence; uint32_t sync_fence; xcb_shm_seg_t shmseg; int shmid; @@ -1402,7 +1405,9 @@ x11_present_to_x11_dri3(struct x11_swapchain *chain, uint32_t image_index, options |= XCB_PRESENT_OPTION_SUBOPTIMAL; #endif - xshmfence_reset(image->shm_fence); + xcb_void_cookie_t scookie = xcb_sync_reset_fence(chain->conn, + image->sync_fence); + xcb_discard_reply(chain->conn, scookie.sequence); if (!chain->base.image_info.explicit_sync) { ++chain->sent_image_count; @@ -1771,9 +1776,9 @@ x11_acquire_next_image(struct wsi_swapchain *anv_chain, return result; assert(*image_index < chain->base.image_count); - if (chain->images[*image_index].shm_fence && - !chain->base.image_info.explicit_sync) - xshmfence_await(chain->images[*image_index].shm_fence); + xcb_void_cookie_t cookie = xcb_sync_await_fence( + chain->conn, 1, &chain->images[*image_index].sync_fence); + xcb_discard_reply(chain->conn, cookie.sequence); return result; } @@ -2098,6 +2103,17 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, /* If the image has a modifier, we must have DRI3 v1.2. */ assert(chain->has_dri3_modifiers); +#ifdef __ANDROID__ + int sock_fds[2] = { -1, -1 }; + if (image->base.ahb) { + if (socketpair(AF_UNIX, SOCK_STREAM, 0, sock_fds) < 0) { + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + AHardwareBuffer_sendHandleToUnixSocket(image->base.ahb, sock_fds[0]); + image->base.dma_buf_fd = sock_fds[1]; + image->base.drm_modifier = 1255; + } +#endif /* XCB requires an array of file descriptors but we only have one */ int fds[4] = { -1, -1, -1, -1 }; for (int i = 0; i < image->base.num_planes; i++) { @@ -2128,6 +2144,16 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, chain->depth, bpp, image->base.drm_modifier, fds); +#ifdef __ANDROID__ + if (image->base.ahb) { + xcb_flush(chain->conn); + read(sock_fds[0], &image->base.dma_buf_fd, 1); + for (int i = 0; i < ARRAY_SIZE(sock_fds); i++) { + close(sock_fds[i]); + } + image->base.dma_buf_fd = -1; + } +#endif } else #endif { @@ -2140,14 +2166,23 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, return VK_ERROR_OUT_OF_HOST_MEMORY; cookie = - xcb_dri3_pixmap_from_buffer_checked(chain->conn, - image->pixmap, - chain->window, - image->base.sizes[0], - pCreateInfo->imageExtent.width, - pCreateInfo->imageExtent.height, - image->base.row_pitches[0], - chain->depth, bpp, fd); + xcb_dri3_pixmap_from_buffers_checked(chain->conn, + image->pixmap, + chain->window, + image->base.num_planes, + pCreateInfo->imageExtent.width, + pCreateInfo->imageExtent.height, + image->base.row_pitches[0], + image->base.offsets[0], + image->base.row_pitches[1], + image->base.offsets[1], + image->base.row_pitches[2], + image->base.offsets[2], + image->base.row_pitches[3], + image->base.offsets[3], + chain->depth, bpp, + 1274, + &fd); } error = xcb_request_check(chain->conn, cookie); @@ -2178,31 +2213,16 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, #endif out_fence: - fence_fd = xshmfence_alloc_shm(); - if (fence_fd < 0) - goto fail_pixmap; - - image->shm_fence = xshmfence_map_shm(fence_fd); - if (image->shm_fence == NULL) - goto fail_shmfence_alloc; - image->sync_fence = xcb_generate_id(chain->conn); - xcb_dri3_fence_from_fd(chain->conn, - image->pixmap, - image->sync_fence, - false, - fence_fd); - - xshmfence_trigger(image->shm_fence); - - return VK_SUCCESS; - -fail_shmfence_alloc: - close(fence_fd); + cookie = xcb_sync_create_fence(chain->conn, + image->pixmap, + image->sync_fence, + false); + xcb_discard_reply(chain->conn, cookie.sequence); -fail_pixmap: - cookie = xcb_free_pixmap(chain->conn, image->pixmap); + cookie = xcb_sync_trigger_fence(chain->conn, image->sync_fence); xcb_discard_reply(chain->conn, cookie.sequence); + return VK_SUCCESS; fail_image: wsi_destroy_image(&chain->base, &image->base); @@ -2220,7 +2240,6 @@ x11_image_finish(struct x11_swapchain *chain, if (!chain->base.wsi->sw || chain->has_mit_shm) { cookie = xcb_sync_destroy_fence(chain->conn, image->sync_fence); xcb_discard_reply(chain->conn, cookie.sequence); - xshmfence_unmap_shm(image->shm_fence); cookie = xcb_free_pixmap(chain->conn, image->pixmap); xcb_discard_reply(chain->conn, cookie.sequence); @@ -2618,6 +2637,12 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, .alloc_shm = wsi_conn->has_mit_shm ? &alloc_shm : NULL, }; image_params = &cpu_image_params.base; +#ifdef __ANDROID__ + } else if (wsi_device->wants_ahardware_buffer) { + image_params = &(struct wsi_base_image_params){ + .image_type = WSI_IMAGE_TYPE_AHB, + }; +#endif } else { drm_image_params = (struct wsi_drm_image_params) { .base.image_type = WSI_IMAGE_TYPE_DRM, -- 2.47.0 ================================================ FILE: packages/mesa-vulkan-wrapper-rev9/05-fix-build.patch ================================================ diff -uNr 70-mesa-vulkan-wrapper-new/include/android_stub/vndk/hardware_buffer.h 70-mesa-vulkan-wrapper-new.mod/include/android_stub/vndk/hardware_buffer.h --- 70-mesa-vulkan-wrapper-new/include/android_stub/vndk/hardware_buffer.h 2024-10-16 13:57:54.000000000 -0300 +++ 70-mesa-vulkan-wrapper-new.mod/include/android_stub/vndk/hardware_buffer.h 2024-12-30 18:05:05.746485985 -0300 @@ -24,7 +24,7 @@ __BEGIN_DECLS -const native_handle_t* AHardwareBuffer_getNativeHandle(const AHardwareBuffer* buffer); +const __native_handle_t* AHardwareBuffer_getNativeHandle(const AHardwareBuffer* buffer); enum CreateFromHandleMethod { // enum values chosen to match internal GraphicBuffer::HandleWrapMethod @@ -46,7 +46,7 @@ * clone registered. The AHardwareBuffer will own the cloned handle but not the original. */ int AHardwareBuffer_createFromHandle(const AHardwareBuffer_Desc* desc, - const native_handle_t* handle, int32_t method, + const __native_handle_t* handle, int32_t method, AHardwareBuffer** outBuffer); /** diff -uNr 70-mesa-vulkan-wrapper-new/src/vulkan/wrapper/wrapper_device_memory.c 70-mesa-vulkan-wrapper-new.mod/src/vulkan/wrapper/wrapper_device_memory.c --- 70-mesa-vulkan-wrapper-new/src/vulkan/wrapper/wrapper_device_memory.c 2024-12-30 18:00:22.163506877 -0300 +++ 70-mesa-vulkan-wrapper-new.mod/src/vulkan/wrapper/wrapper_device_memory.c 2024-12-30 18:03:52.594491374 -0300 @@ -14,6 +14,7 @@ #include #include #include +#include static int safe_ioctl(int fd, unsigned long request, void *arg) @@ -271,7 +272,7 @@ assert(memory->dmabuf_fd >= 0 || memory->ahardware_buffer != NULL); if (memory->ahardware_buffer) { - const native_handle_t *handle; + const __native_handle_t *handle; const int *handle_fds; handle = AHardwareBuffer_getNativeHandle(memory->ahardware_buffer); diff -uNr 70-mesa-vulkan-wrapper-new/src/vulkan/wrapper/wrapper_physical_device.c 70-mesa-vulkan-wrapper-new.mod/src/vulkan/wrapper/wrapper_physical_device.c --- 70-mesa-vulkan-wrapper-new/src/vulkan/wrapper/wrapper_physical_device.c 2024-12-30 18:00:22.163506877 -0300 +++ 70-mesa-vulkan-wrapper-new.mod/src/vulkan/wrapper/wrapper_physical_device.c 2024-12-30 18:03:08.098494652 -0300 @@ -9,6 +9,7 @@ #include "vk_util.h" #include "wsi_common.h" #include "util/os_misc.h" +#include static VkResult wrapper_setup_device_extensions(struct wrapper_physical_device *pdevice) { ================================================ FILE: packages/mesa-vulkan-wrapper-rev9/build.sh ================================================ PKG_VER=24.2.5 PKG_CATEGORY="VulkanDriver" PKG_PRETTY_NAME="Mesa Android Wrapper (Rev 9)" PKG_DOWNLOADABLE=1 VK_DRIVER_LIB="libvulkan_wrapper.so" SRC_URL=https://archive.mesa3d.org/mesa-$PKG_VER.tar.xz LDFLAGS="-L$PREFIX/lib -landroid-shmem" MESON_ARGS="-Dgallium-drivers= -Dvulkan-drivers=wrapper -Dglvnd=disabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=false -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm" ================================================ FILE: packages/mesa-zink/build.sh ================================================ PKG_VER=25.1.4 PKG_CATEGORY="OpenGLDriver" PKG_PRETTY_NAME="Mesa Zink Driver" SRC_URL=https://archive.mesa3d.org/mesa-$PKG_VER.tar.xz LDFLAGS="-L$PREFIX/lib -landroid-shmem -lxcb-xfixes" MESON_ARGS="-Dgallium-drivers=zink -Dvulkan-drivers= -Dglvnd=enabled -Dplatforms=x11 -Dxmlconfig=enabled -Dllvm=disabled -Dopengl=true -Degl=disabled -Dzstd=enabled" DEPENDENCIES="xorgproto libdrm libX11 libxcb libxshmfence Vulkan-Headers Vulkan-Loader zlib zstd libexpat libglvnd libpng libXext libXrandr libxshmfence libXxf86vm android-shmem" ================================================ FILE: packages/mesa-zink/disable-memfd-create-getrandom.patch ================================================ diff --git a/meson.build b/meson.build index 66e14c211d2..7e73daf221a 100644 --- a/meson.build +++ b/meson.build @@ -1354,7 +1354,7 @@ if not ['linux'].contains(host_machine.system()) endif endif -foreach h : ['xlocale.h', 'linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', +foreach h : ['linux/futex.h', 'endian.h', 'dlfcn.h', 'sys/shm.h', 'cet.h', 'pthread_np.h', 'sys/inotify.h', 'linux/udmabuf.h'] if cc.check_header(h) pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify()) @@ -1364,11 +1364,9 @@ endforeach functions_to_detect = { 'strtof': '', 'mkostemp': '', - 'memfd_create': '', 'random_r': '', 'flock': '', 'strtok_r': '', - 'getrandom': '', 'qsort_s': '', 'posix_fallocate': '', 'secure_getenv': '', ================================================ FILE: packages/mesa-zink/force-linux-like-build.patch ================================================ diff --git a/include/vulkan/vk_android_native_buffer.h b/include/vulkan/vk_android_native_buffer.h index 21f82ef57a2..5c67746ca44 100644 --- a/include/vulkan/vk_android_native_buffer.h +++ b/include/vulkan/vk_android_native_buffer.h @@ -17,7 +17,7 @@ * system rather the build target. */ -#if defined(__ANDROID__) || defined(ANDROID) +#if 0 #include #if ANDROID_API_LEVEL < 28 diff --git a/src/util/detect_os.h b/src/util/detect_os.h index 86286dfbe70..49195b3398c 100644 --- a/src/util/detect_os.h +++ b/src/util/detect_os.h @@ -25,7 +25,7 @@ * also be defined. */ #if defined(__ANDROID__) -#define DETECT_OS_ANDROID 1 +#define DETECT_OS_ANDROID 0 #endif #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) ================================================ FILE: packages/mesa-zink/install-drivers-without-hardlinks.patch ================================================ diff --git a/bin/install_megadrivers.py b/bin/install_megadrivers.py index 216f6999feb..c79e95d1afd 100644 --- a/bin/install_megadrivers.py +++ b/bin/install_megadrivers.py @@ -24,7 +24,16 @@ import argparse import os +import shutil + +def link(src, dest): + shutil.copyfile(src, dest) +def unlink(src): + os.remove(src) + +os.link = link +os.unlink = unlink def resolve_libdir(libdir): if os.path.isabs(libdir): ================================================ FILE: packages/mesa-zink/lld-undefined-version.patch ================================================ `_mesa_glapi_tls_Context` and `_mesa_glapi_tls_Dispatch` is declared as thread_local. Their symbol names will be `__emutls_v._mesa_glapi_tls_Context` and `__emutls_v._mesa_glapi_tls_Dispatch` as emulated TLS is enabled by NDK when `__ANDROID_API__` <= 28. --- a/src/gallium/targets/dri/dri.sym.in +++ b/src/gallium/targets/dri/dri.sym.in @@ -8,8 +8,8 @@ _mesa_glapi_get_proc_offset; _mesa_glapi_set_context; _mesa_glapi_set_dispatch; - _mesa_glapi_tls_Context; - _mesa_glapi_tls_Dispatch; + __emutls_v._mesa_glapi_tls_Context; + __emutls_v._mesa_glapi_tls_Dispatch; ddebug_screen_create; noop_screen_create; ================================================ FILE: packages/mesa-zink/wsi-common-no-pthread-cancel.patch ================================================ diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index ff57a259046..4703500f374 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -176,6 +176,12 @@ struct wsi_display_sync { static uint64_t fence_sequence; +#ifdef __ANDROID__ +static void thread_signal_handler (int signum) { + pthread_exit (0); +} +#endif + ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_mode, VkDisplayModeKHR) ICD_DEFINE_NONDISP_HANDLE_CASTS(wsi_display_connector, VkDisplayKHR) @@ -1341,7 +1347,9 @@ wsi_display_wait_thread(void *data) .events = POLLIN }; +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { int ret = poll(&pollfd, 1, -1); if (ret > 0) { @@ -1369,9 +1377,22 @@ wsi_display_start_wait_thread(struct wsi_display *wsi) static void wsi_display_stop_wait_thread(struct wsi_display *wsi) { +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + mtx_lock(&wsi->wait_mutex); if (wsi->wait_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->wait_thread); +#else + pthread_kill(wsi->wait_thread, SIGUSR2); +#endif pthread_join(wsi->wait_thread, NULL); wsi->wait_thread = 0; } @@ -2215,7 +2236,9 @@ udev_event_listener_thread(void *data) int udev_fd = udev_monitor_get_fd(mon); +#ifndef __ANDROID__ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif for (;;) { nfds_t nfds = 1; @@ -2340,6 +2363,15 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, struct wsi_display *wsi = (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; +#ifdef __ANDROID__ + struct sigaction actions; + memset (&actions, 0, sizeof (actions)); + sigemptyset (&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_signal_handler; + sigaction (SIGUSR2, &actions, NULL); +#endif + if (wsi) { wsi_for_each_connector(connector, wsi) { wsi_for_each_display_mode(mode, connector) { @@ -2351,7 +2383,11 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device, wsi_display_stop_wait_thread(wsi); if (wsi->hotplug_thread) { +#ifndef __ANDROID__ pthread_cancel(wsi->hotplug_thread); +#else + pthread_kill(wsi->hotplug_thread, SIGUSR2); +#endif pthread_join(wsi->hotplug_thread, NULL); } ================================================ FILE: packages/openssl/Configurations-15-android.conf.patch ================================================ --- a/Configurations/15-android.conf +++ b/Configurations/15-android.conf @@ -184,14 +184,14 @@ # systems are perfectly capable of executing binaries targeting # Froyo. Keep in mind that in the nutshell Android builds are # about JNI, i.e. shared libraries, not applications. - cflags => add(sub { android_ndk()->{cflags} }), - cppflags => add(sub { android_ndk()->{cppflags} }), - cxxflags => add(sub { android_ndk()->{cflags} }), - bn_ops => sub { android_ndk()->{bn_ops} }, + #cflags => add(sub { android_ndk()->{cflags} }), + #cppflags => add(sub { android_ndk()->{cppflags} }), + #cxxflags => add(sub { android_ndk()->{cflags} }), + #bn_ops => sub { android_ndk()->{bn_ops} }, bin_cflags => "-fPIE", bin_lflags => "-pie", enable => [ ], - shared_extension => ".so", + shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)", }, "android-arm" => { ################################################################ @@ -222,13 +222,13 @@ # Newer NDK versions reportedly require additional -latomic. # inherit_from => [ "android" ], - bn_ops => add("RC4_CHAR"), + bn_ops => "BN_LLONG RC4_CHAR", asm_arch => 'armv4', perlasm_scheme => "void", }, "android-arm64" => { inherit_from => [ "android" ], - bn_ops => add("RC4_CHAR"), + bn_ops => "SIXTY_FOUR_BIT_LONG RC4_CHAR", asm_arch => 'aarch64', perlasm_scheme => "linux64", }, @@ -258,14 +258,14 @@ "android-x86" => { inherit_from => [ "android" ], CFLAGS => add(picker(release => "-fomit-frame-pointer")), - bn_ops => add("RC4_INT"), + bn_ops => "BN_LLONG RC4_INT", asm_arch => 'x86', perlasm_scheme => "android", ex_libs => add(threads("-latomic")), }, "android-x86_64" => { inherit_from => [ "android" ], - bn_ops => add("RC4_INT"), + bn_ops => "SIXTY_FOUR_BIT_LONG RC4_INT", asm_arch => 'x86_64', perlasm_scheme => "elf", }, ================================================ FILE: packages/openssl/build.sh ================================================ PKG_VER=3.2.2 SRC_URL=https://github.com/openssl/openssl/releases/download/openssl-$PKG_VER/openssl-$PKG_VER.tar.gz CFLAGS="-DNO_SYSLOG" getOpenSSLArch() { if [ "$ARCH" == "aarch64" ]; then echo "arm64" elif [ "$ARCH" == "x86_64" ]; then echo "x86_64" fi } OPENSSL_FLAGS="android-$(getOpenSSLArch) --openssldir=$PREFIX/etc/tls shared zlib-dynamic no-ssl no-hw no-srp no-tests enable-tls1_3" ================================================ FILE: packages/openssl/include-crypto-rand.h.patch ================================================ --- ./include/crypto/rand.h.orig 2022-01-22 19:24:47.338975179 +0530 +++ ./include/crypto/rand.h 2022-01-22 19:25:38.608975159 +0530 @@ -78,7 +78,7 @@ * sockets will be tried in the order listed in case accessing the device * files listed in DEVRANDOM did not return enough randomness. */ -# define DEVRANDOM_EGD "/var/run/egd-pool", "/dev/egd-pool", "/etc/egd-pool", "/etc/entropy" +# define DEVRANDOM_EGD "/data/data/com.micewine.emu/files/usr/var/run/egd-pool", "/dev/egd-pool", "/data/data/com.micewine.emu/files/usr/etc/egd-pool", "/data/data/com.micewine.emu/files/usr/etc/entropy" #endif void ossl_rand_cleanup_int(void); ================================================ FILE: packages/opus/build.sh ================================================ PKG_VER=1.5.2 SRC_URL=https://github.com/xiph/opus/releases/download/v$PKG_VER/opus-$PKG_VER.tar.gz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --disable-extra-programs" ================================================ FILE: packages/pcre2/build.sh ================================================ PKG_VER=10.44 SRC_URL=https://github.com/PhilipHazel/pcre2/releases/download/pcre2-$PKG_VER/pcre2-$PKG_VER.tar.bz2 CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --enable-jit --enable-pcre2-16 --enable-pcre2-32" DEPENDENCIES="zlib" ================================================ FILE: packages/pulseaudio/01-pulseaudio-android.patch ================================================ diff -uNr 30-pulseaudio/meson.build 30-pulseaudio-mod/meson.build --- 30-pulseaudio/meson.build 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/meson.build 2024-12-15 20:43:42.843655547 -0300 @@ -12,9 +12,10 @@ # For tarballs, the first split will do nothing, but for builds in git, we # split out suffixes when there are commits since the last tag # (e.g.: v11.99.1-3-gad14bdb24 -> v11.99.1) +# for some reason when building for MiceWine meson returns nothing for version_str, then hardcode version version_split = pa_version_str.split('-')[0].split('.') -pa_version_major = version_split[0].split('v')[0] -pa_version_minor = version_split[1] +pa_version_major = '17' +pa_version_minor = '0' if version_split.length() > 2 pa_version_micro = version_split[2] else @@ -286,10 +287,6 @@ endif endif -if cc.has_header_symbol('pthread.h', 'PTHREAD_PRIO_INHERIT') - cdata.set('HAVE_PTHREAD_PRIO_INHERIT', 1) -endif - # Headers which are usable check_usable_headers = [ @@ -381,7 +378,7 @@ libintl_dep = cc.find_library('intl') endif else - libintl_dep = cc.find_library('intl') + libintl_dep = [] endif # Symbols @@ -448,6 +445,7 @@ # Core Dependencies libm_dep = cc.find_library('m', required : true) +sles_dep = cc.find_library('OpenSLES', required : true) thread_dep = dependency('threads') foreach f : [ diff -uNr 30-pulseaudio/src/daemon/caps.c 30-pulseaudio-mod/src/daemon/caps.c --- 30-pulseaudio/src/daemon/caps.c 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/daemon/caps.c 2024-12-15 20:43:42.843655547 -0300 @@ -36,64 +36,11 @@ #include "caps.h" -/* Glibc <= 2.2 has broken unistd.h */ -#if defined(__linux__) && (__GLIBC__ <= 2 && __GLIBC_MINOR__ <= 2) -int setresgid(gid_t r, gid_t e, gid_t s); -int setresuid(uid_t r, uid_t e, uid_t s); -#endif - -/* Drop root rights when called SUID root */ +/* Disable privilege dropping on Android. */ void pa_drop_root(void) { - -#ifdef HAVE_GETUID - uid_t uid; - gid_t gid; - - pa_log_debug("Cleaning up privileges."); - uid = getuid(); - gid = getgid(); - -#if defined(HAVE_SETRESUID) - pa_assert_se(setresuid(uid, uid, uid) >= 0); - pa_assert_se(setresgid(gid, gid, gid) >= 0); -#elif defined(HAVE_SETREUID) - pa_assert_se(setreuid(uid, uid) >= 0); - pa_assert_se(setregid(gid, gid) >= 0); -#else - pa_assert_se(setuid(uid) >= 0); - pa_assert_se(seteuid(uid) >= 0); - pa_assert_se(setgid(gid) >= 0); - pa_assert_se(setegid(gid) >= 0); -#endif - - pa_assert_se(getuid() == uid); - pa_assert_se(geteuid() == uid); - pa_assert_se(getgid() == gid); - pa_assert_se(getegid() == gid); - - if (uid != 0) - pa_drop_caps(); -#endif + return; } void pa_drop_caps(void) { -#ifdef HAVE_SYS_CAPABILITY_H -#if defined(__linux__) - cap_t caps; - pa_assert_se(caps = cap_init()); - pa_assert_se(cap_clear(caps) == 0); - pa_assert_se(cap_set_proc(caps) == 0); - pa_assert_se(cap_free(caps) == 0); -#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) - /* FreeBSD doesn't have this functionality, even though sys/capability.h is - * available. See https://bugs.freedesktop.org/show_bug.cgi?id=72580 */ - pa_log_warn("FreeBSD cannot drop extra capabilities, implementation needed."); -#else -#error "Don't know how to do capabilities on your system. Please send a patch." -#endif /* __linux__ */ -#else /* HAVE_SYS_CAPABILITY_H */ - pa_log_warn("Normally all extra capabilities would be dropped now, but " - "that's impossible because PulseAudio was built without " - "capabilities support."); -#endif + return; } diff -uNr 30-pulseaudio/src/daemon/main.c 30-pulseaudio-mod/src/daemon/main.c --- 30-pulseaudio/src/daemon/main.c 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/daemon/main.c 2024-12-15 20:43:42.844655547 -0300 @@ -163,206 +163,11 @@ } -#if defined(OS_IS_WIN32) - +// Disable privilege dropping on Android. static int change_user(void) { - pa_log_info("Overriding system runtime/config base dir to '%s'.", pa_win32_get_system_appdata()); - - /* On other platforms, these paths are compiled into PulseAudio. This isn't - * suitable on Windows. Firstly, Windows doesn't follow the FHS or use Unix - * paths and the build system can't handle Windows-style paths properly. - * Secondly, the idiomatic location for a service's state and shared data is - * ProgramData, and the location of special folders is dynamic on Windows. - * Also, this method of handling paths is consistent with how they are - * handled on Windows in other parts of PA. Note that this is only needed - * in system-wide mode since paths in user instances are already handled - * properly. - */ - - char *run_path = pa_sprintf_malloc("%s" PA_PATH_SEP "run", pa_win32_get_system_appdata()); - char *lib_path = pa_sprintf_malloc("%s" PA_PATH_SEP "lib", pa_win32_get_system_appdata()); - - /* https://docs.microsoft.com/en-us/windows/win32/secauthz/ace-strings */ - /* https://docs.microsoft.com/en-us/windows/win32/secauthz/modifying-the-acls-of-an-object-in-c-- */ - /* https://docs.microsoft.com/en-us/windows/win32/api/sddl/nf-sddl-convertstringsecuritydescriptortosecuritydescriptora */ - { - mkdir(run_path); - PSECURITY_DESCRIPTOR sd; - if (ConvertStringSecurityDescriptorToSecurityDescriptorA( - "D:PAI" /* DACL, disable inheritance from parent, enable propagation to children */ - "(A;OICI;FA;;;SY)" /* give system full access */ - "(A;OICI;FA;;;CO)" /* give owner full access */ - "(A;OICI;FA;;;BA)" /* give administrators full access */ - "(A;OICI;0x1200a9;;;WD)", /* give everyone read/write/execute access */ - SDDL_REVISION_1, &sd, NULL - )) { - PACL acl; - BOOL acl_present, acl_default; - if (GetSecurityDescriptorDacl(sd, &acl_present, &acl, &acl_default)) { - if (SetNamedSecurityInfo(run_path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, acl, NULL) != ERROR_SUCCESS) { - pa_log_warn("Failed to set DACL for runtime dir: failed to apply DACL: error %lu.", GetLastError()); - } - LocalFree(acl); - } else { - pa_log_warn("Failed to set DACL for runtime dir: failed to get security descriptor DACL: error %lu.", GetLastError()); - } - } else { - pa_log_warn("Failed to set DACL for runtime dir: failed to parse security descriptor: error %lu.", GetLastError()); - } - } - { - mkdir(lib_path); - PSECURITY_DESCRIPTOR sd; - if (ConvertStringSecurityDescriptorToSecurityDescriptorA( - "D:PAI" /* DACL, disable inheritance from parent, enable propagation to children */ - "(A;OICI;FA;;;SY)" /* give system full access */ - "(A;OICI;FA;;;CO)" /* give owner full access */ - "(A;OICI;FA;;;BA)", /* give administrators full access */ - SDDL_REVISION_1, &sd, NULL - )) { - PACL acl; - BOOL acl_present, acl_default; - if (GetSecurityDescriptorDacl(sd, &acl_present, &acl, &acl_default)) { - if (SetNamedSecurityInfo(lib_path, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, acl, NULL) != ERROR_SUCCESS) { - pa_log_warn("Failed to set DACL for lib dir: failed to apply DACL: error %lu.", GetLastError()); - } - LocalFree(acl); - } else { - pa_log_warn("Failed to set DACL for lib dir: failed to get security descriptor DACL: error %lu.", GetLastError()); - } - } else { - pa_log_warn("Failed to set DACL for lib dir: failed to parse security descriptor: error %lu.", GetLastError()); - } - } - - pa_set_env("HOME", run_path); - if (!getenv("PULSE_RUNTIME_PATH")) - pa_set_env("PULSE_RUNTIME_PATH", run_path); - if (!getenv("PULSE_CONFIG_PATH")) - pa_set_env("PULSE_CONFIG_PATH", lib_path); - if (!getenv("PULSE_STATE_PATH")) - pa_set_env("PULSE_STATE_PATH", lib_path); - - pa_xfree(run_path); - pa_xfree(lib_path); - - pa_log_info("Not changing user for system instance on Windows."); - return 0; -} - -#elif defined(HAVE_PWD_H) && defined(HAVE_GRP_H) - -static int change_user(void) { - struct passwd *pw; - struct group * gr; - int r; - - /* This function is called only in system-wide mode. It creates a - * runtime dir in /var/run/ with proper UID/GID and drops privs - * afterwards. */ - - if (!(pw = getpwnam(PA_SYSTEM_USER))) { - pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER); - return -1; - } - - if (!(gr = getgrnam(PA_SYSTEM_GROUP))) { - pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP); - return -1; - } - - pa_log_info("Found user '%s' (UID %lu) and group '%s' (GID %lu).", - PA_SYSTEM_USER, (unsigned long) pw->pw_uid, - PA_SYSTEM_GROUP, (unsigned long) gr->gr_gid); - - if (pw->pw_gid != gr->gr_gid) { - pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER, PA_SYSTEM_GROUP); - return -1; - } - - if (!pa_streq(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH)) - pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH); - - if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid, true) < 0) { - pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno)); - return -1; - } - - if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid, true) < 0) { - pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno)); - return -1; - } - - /* We don't create the config dir here, because we don't need to write to it */ - - if (initgroups(PA_SYSTEM_USER, gr->gr_gid) != 0) { - pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno)); - return -1; - } - -#if defined(HAVE_SETRESGID) - r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid); -#elif defined(HAVE_SETEGID) - if ((r = setgid(gr->gr_gid)) >= 0) - r = setegid(gr->gr_gid); -#elif defined(HAVE_SETREGID) - r = setregid(gr->gr_gid, gr->gr_gid); -#else -#error "No API to drop privileges" -#endif - - if (r < 0) { - pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno)); - return -1; - } - -#if defined(HAVE_SETRESUID) - r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid); -#elif defined(HAVE_SETEUID) - if ((r = setuid(pw->pw_uid)) >= 0) - r = seteuid(pw->pw_uid); -#elif defined(HAVE_SETREUID) - r = setreuid(pw->pw_uid, pw->pw_uid); -#else -#error "No API to drop privileges" -#endif - - if (r < 0) { - pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno)); - return -1; - } - - pa_drop_caps(); - - pa_set_env("USER", PA_SYSTEM_USER); - pa_set_env("USERNAME", PA_SYSTEM_USER); - pa_set_env("LOGNAME", PA_SYSTEM_USER); - pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH); - - /* Relevant for pa_runtime_path() */ - if (!getenv("PULSE_RUNTIME_PATH")) - pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH); - - if (!getenv("PULSE_CONFIG_PATH")) - pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH); - - if (!getenv("PULSE_STATE_PATH")) - pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH); - - pa_log_info("Successfully changed user to \"" PA_SYSTEM_USER "\"."); - return 0; } -#else /* HAVE_PWD_H && HAVE_GRP_H */ - -static int change_user(void) { - pa_log(_("System wide mode unsupported on this platform.")); - return -1; -} - -#endif /* HAVE_PWD_H && HAVE_GRP_H */ - #ifdef HAVE_SYS_RESOURCE_H static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) { diff -uNr 30-pulseaudio/src/modules/echo-cancel/module-echo-cancel.c 30-pulseaudio-mod/src/modules/echo-cancel/module-echo-cancel.c --- 30-pulseaudio/src/modules/echo-cancel/module-echo-cancel.c 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/modules/echo-cancel/module-echo-cancel.c 2024-12-15 20:43:42.844655547 -0300 @@ -2067,18 +2067,18 @@ } if (u->save_aec) { - pa_log("Creating AEC files in /tmp"); - u->captured_file = fopen("/tmp/aec_rec.sw", "wb"); + pa_log("Creating AEC files in /data/data/com.micewine.emu/files/usr/tmp"); + u->captured_file = fopen("/data/data/com.micewine.emu/files/usr/tmp/aec_rec.sw", "wb"); if (u->captured_file == NULL) perror ("fopen failed"); - u->played_file = fopen("/tmp/aec_play.sw", "wb"); + u->played_file = fopen("/data/data/com.micewine.emu/files/usr/tmp/aec_play.sw", "wb"); if (u->played_file == NULL) perror ("fopen failed"); - u->canceled_file = fopen("/tmp/aec_out.sw", "wb"); + u->canceled_file = fopen("/data/data/com.micewine.emu/files/usr/tmp/aec_out.sw", "wb"); if (u->canceled_file == NULL) perror ("fopen failed"); if (u->ec->params.drift_compensation) { - u->drift_file = fopen("/tmp/aec_drift.txt", "w"); + u->drift_file = fopen("/data/data/com.micewine.emu/files/usr/tmp/aec_drift.txt", "w"); if (u->drift_file == NULL) perror ("fopen failed"); } diff -uNr 30-pulseaudio/src/modules/meson.build 30-pulseaudio-mod/src/modules/meson.build --- 30-pulseaudio/src/modules/meson.build 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/modules/meson.build 2024-12-15 20:43:42.844655547 -0300 @@ -58,6 +58,8 @@ [ 'module-virtual-sink', 'module-virtual-sink.c' ], [ 'module-virtual-source', 'module-virtual-source.c' ], [ 'module-volume-restore', 'module-volume-restore.c' ], + [ 'module-sles-sink', 'sles/module-sles-sink.c', [], [], [sles_dep] ], + [ 'module-sles-source', 'sles/module-sles-source.c', [], [], [sles_dep] ], ] if host_machine.system() == 'windows' diff -uNr 30-pulseaudio/src/modules/module-pipe-source.c 30-pulseaudio-mod/src/modules/module-pipe-source.c --- 30-pulseaudio/src/modules/module-pipe-source.c 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/modules/module-pipe-source.c 2024-12-15 20:43:42.845655547 -0300 @@ -59,7 +59,7 @@ "channels= " "channel_map="); -#define DEFAULT_FILE_NAME "/tmp/music.input" +#define DEFAULT_FILE_NAME "/data/data/com.micewine.emu/files/usr/tmp/music.input" #define DEFAULT_SOURCE_NAME "fifo_input" struct userdata { diff -uNr 30-pulseaudio/src/modules/module-protocol-stub.c 30-pulseaudio-mod/src/modules/module-protocol-stub.c --- 30-pulseaudio/src/modules/module-protocol-stub.c 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/modules/module-protocol-stub.c 2024-12-15 20:43:42.845655547 -0300 @@ -303,13 +303,13 @@ /* Windows doesn't support getuid(), so we ignore the per-user Esound socket compile flag. * Moreover, Esound Unix sockets haven't been supported on Windows historically. */ # if defined(USE_PER_USER_ESOUND_SOCKET) && !defined(OS_IS_WIN32) - u->socket_path = pa_sprintf_malloc("/tmp/.esd-%lu/socket", (unsigned long) getuid()); + u->socket_path = pa_sprintf_malloc("/data/data/com.micewine.emu/files/usr/tmp/.esd-%lu/socket", (unsigned long) getuid()); # else - u->socket_path = pa_xstrdup("/tmp/.esd/socket"); + u->socket_path = pa_xstrdup("/data/data/com.micewine.emu/files/usr/tmp/.esd/socket"); # endif /* This socket doesn't reside in our own runtime dir but in - * /tmp/.esd/, hence we have to create the dir first */ + * /data/data/com.micewine.emu/files/usr/tmp/.esd/, hence we have to create the dir first */ if (pa_make_secure_parent_dir(u->socket_path, pa_in_system_mode() ? 0755U : 0700U, (uid_t)-1, (gid_t)-1, false) < 0) { pa_log("Failed to create socket directory '%s': %s\n", u->socket_path, pa_cstrerror(errno)); diff -uNr 30-pulseaudio/src/modules/sles/module-sles-sink.c 30-pulseaudio-mod/src/modules/sles/module-sles-sink.c --- 30-pulseaudio/src/modules/sles/module-sles-sink.c 1969-12-31 21:00:00.000000000 -0300 +++ 30-pulseaudio-mod/src/modules/sles/module-sles-sink.c 2024-12-15 20:43:59.221654341 -0300 @@ -0,0 +1,661 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +PA_MODULE_AUTHOR("Lennart Poettering, Nathan Martynov, Patrick Gaskin"); +PA_MODULE_DESCRIPTION("Android OpenSL ES sink"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_USAGE( + "sink_name= " + "sink_properties= " + "latency= " + "format= " + "channels= " + "rate= " + "channel_map= " +); + +#define DEFAULT_SINK_NAME "OpenSL ES sink" + +enum { SINK_MESSAGE_RENDER = PA_SINK_MESSAGE_MAX }; + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink *sink; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + pa_rtpoll_item *rtpoll_item; + pa_asyncmsgq *sles_msgq; + + pa_usec_t block_usec; + + pa_memchunk memchunk; + void *buf; + size_t nbytes; + + SLObjectItf EngineObject; + SLObjectItf OutputMixObject; + SLObjectItf PlayerObject; + + SLEngineItf EngineItf; + SLPlayItf PlayItf; + SLBufferQueueItf BufferQueueItf; +}; + +static const char* const valid_modargs[] = { + "sink_name", + "sink_properties", + "latency", + "format", + "channels", + "rate", + "channel_map", + NULL +}; + +static void process_render(void *userdata) { + struct userdata* u = userdata; + pa_assert(u); + + /* a render message could be queued after a set state message */ + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state)) + return; + + u->memchunk.length = u->nbytes; + pa_sink_render_into(u->sink, &u->memchunk); + (*u->BufferQueueItf)->Enqueue(u->BufferQueueItf, u->buf, u->memchunk.length); +} + +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *memchunk) { + switch (code) { + case SINK_MESSAGE_RENDER: + process_render(data); + return 0; + case PA_SINK_MESSAGE_GET_LATENCY: + code = PA_SINK_MESSAGE_GET_FIXED_LATENCY; // FIXME: is there a way to get the real latency? + break; + } + + return pa_sink_process_msg(o, code, data, offset, memchunk); +}; + +static void sles_callback(SLBufferQueueItf bqPlayerBufferQueue, void *userdata) { + struct userdata* u = userdata; + pa_assert(u); + pa_assert_se(pa_asyncmsgq_send(u->sles_msgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_RENDER, u, 0, NULL) == 0); +} + +// pa_channel_position_to_sl_speaker converts a PulseAudio channel position to +// the equivalent OpenSL ES speaker. If the channel does not have a OpenSL ES +// equivalent or is PA_CHANNEL_POSITION_INVALID, -1 is returned. +// +// https://freedesktop.org/software/pulseaudio/doxygen/channelmap_8h.html#af1cbe2738487c74f99e613779bd34bf2 +// https://www.khronos.org/files/opensl_es_1_0_provisional_specs.pdf#9.2.47 +static SLuint32 pa_channel_position_to_sl_speaker(enum pa_channel_position x) { + static const SLuint32 pa_channel_position_sl_speaker[] = { + // note: all SL_SPEAKER values != 0, and the empty array elements will be initialized to 0 + [PA_CHANNEL_POSITION_MONO] = SL_SPEAKER_FRONT_CENTER, + [PA_CHANNEL_POSITION_FRONT_LEFT] = SL_SPEAKER_FRONT_LEFT, + [PA_CHANNEL_POSITION_FRONT_RIGHT] = SL_SPEAKER_FRONT_RIGHT, + [PA_CHANNEL_POSITION_FRONT_CENTER] = SL_SPEAKER_FRONT_CENTER, + [PA_CHANNEL_POSITION_REAR_CENTER] = SL_SPEAKER_BACK_CENTER, + [PA_CHANNEL_POSITION_REAR_LEFT] = SL_SPEAKER_BACK_LEFT, + [PA_CHANNEL_POSITION_REAR_RIGHT] = SL_SPEAKER_BACK_RIGHT, + [PA_CHANNEL_POSITION_LFE] = SL_SPEAKER_LOW_FREQUENCY, + [PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER] = SL_SPEAKER_FRONT_LEFT_OF_CENTER, + [PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER] = SL_SPEAKER_FRONT_RIGHT_OF_CENTER, + [PA_CHANNEL_POSITION_SIDE_LEFT] = SL_SPEAKER_SIDE_LEFT, + [PA_CHANNEL_POSITION_SIDE_RIGHT] = SL_SPEAKER_SIDE_RIGHT, + [PA_CHANNEL_POSITION_TOP_CENTER] = SL_SPEAKER_TOP_CENTER, + [PA_CHANNEL_POSITION_TOP_FRONT_LEFT] = SL_SPEAKER_TOP_FRONT_LEFT, + [PA_CHANNEL_POSITION_TOP_FRONT_RIGHT] = SL_SPEAKER_TOP_FRONT_RIGHT, + [PA_CHANNEL_POSITION_TOP_FRONT_CENTER] = SL_SPEAKER_TOP_FRONT_CENTER, + [PA_CHANNEL_POSITION_TOP_REAR_LEFT] = SL_SPEAKER_TOP_BACK_LEFT, + [PA_CHANNEL_POSITION_TOP_REAR_RIGHT] = SL_SPEAKER_TOP_BACK_RIGHT, + [PA_CHANNEL_POSITION_TOP_REAR_CENTER] = SL_SPEAKER_TOP_BACK_CENTER, + }; + pa_assert(x < PA_CHANNEL_POSITION_MAX); + return pa_channel_position_sl_speaker[x] ?: (SLuint32)(-1); +} + +// sl_speaker_to_pa_channel_position converts an OpenSL ES speaker to the +// equivalent PulseAudio channel position. If the channel does not have a PA +// equivalent or is invalid, PA_CHANNEL_POSITION_INVALID is returned. Note that +// this function does not handle the edge case where (SL_SPEAKER_FRONT_CENTER && +// channels == 1) is PA_CHANNEL_POSITION_MONO. +// +// https://freedesktop.org/software/pulseaudio/doxygen/channelmap_8h.html#af1cbe2738487c74f99e613779bd34bf2 +// https://www.khronos.org/files/opensl_es_1_0_provisional_specs.pdf#9.2.47 +static enum pa_channel_position sl_speaker_to_pa_channel_position(SLuint32 x) { + for (enum pa_channel_position pa = 0; pa < PA_CHANNEL_POSITION_MAX; pa++) { + if (pa != PA_CHANNEL_POSITION_MONO && pa_channel_position_to_sl_speaker(pa) == x) { + return pa; + } + } + return -1; +} + +// pa_channel_map_to_sl_channel_mask converts a PulseAudio channel map to an +// OpenSL ES channel mask. If an unknown or unsupported channel position is +// found, -1 is returned. If map is NULL, 0 is returned. +// +// https://freedesktop.org/software/pulseaudio/doxygen/channelmap_8h.html#af1cbe2738487c74f99e613779bd34bf2 +// https://www.khronos.org/files/opensl_es_1_0_provisional_specs.pdf#9.1.8 +static SLuint32 pa_channel_map_to_sl_channel_mask(pa_channel_map *map) { + SLuint32 mask = 0, cur = 0, last = 0; + if (!map) + return 0; + for (int i = 0; i < map->channels; i++) { + if (map->map[i] == PA_CHANNEL_POSITION_INVALID) { + pa_log("Invalid channel found in channel map at position %d.", i); + return -1; + } + if ((cur = pa_channel_position_to_sl_speaker(map->map[i])) == -1) { + pa_log("No OpenSL ES equivalent for %s.", pa_channel_position_to_string(map->map[i]));; + return -1; + } + if (cur < last) + pa_log("Warning: Channel map does not match the OpenSL ES speaker order (%s should be before %s).", pa_channel_position_to_string(cur), pa_channel_position_to_string(last)); + mask |= last = cur; + } + return mask; +} + +// sl_channel_mask_to_pa_channel_map converts an OpenSL ES channel mask to a +// PulseAudio channel map by sorting the channels in order. On success, a 0 is +// returned. If an unknown channel is present or there are too many channels, -1 +// is returned and rmap is left untouched. +// +// https://www.khronos.org/files/opensl_es_1_0_provisional_specs.pdf#9.1.8 +static int sl_channel_mask_to_pa_channel_map(SLuint32 mask, pa_channel_map *rmap) { + static const SLuint32 speakers[] = { + SL_SPEAKER_FRONT_LEFT, SL_SPEAKER_FRONT_RIGHT, SL_SPEAKER_FRONT_CENTER, + SL_SPEAKER_LOW_FREQUENCY, SL_SPEAKER_BACK_LEFT, SL_SPEAKER_BACK_RIGHT, + SL_SPEAKER_FRONT_LEFT_OF_CENTER, SL_SPEAKER_FRONT_RIGHT_OF_CENTER, + SL_SPEAKER_BACK_CENTER, SL_SPEAKER_SIDE_LEFT, SL_SPEAKER_SIDE_RIGHT, + SL_SPEAKER_TOP_CENTER, SL_SPEAKER_TOP_FRONT_LEFT, + SL_SPEAKER_TOP_FRONT_CENTER, SL_SPEAKER_TOP_FRONT_RIGHT, + SL_SPEAKER_TOP_BACK_LEFT, SL_SPEAKER_TOP_BACK_CENTER, + SL_SPEAKER_TOP_BACK_RIGHT, + }; + pa_channel_map map = {0}; + pa_assert(rmap); + if (mask == SL_SPEAKER_FRONT_CENTER) { + rmap->channels = 1; + rmap->map[0] = PA_CHANNEL_POSITION_MONO; + return 0; + } + for (size_t i = 0; i < sizeof(speakers)/sizeof(*speakers); i++) { + pa_assert(i == 0 || speakers[i] > speakers[i-1]); + if (mask & speakers[i]) { + mask ^= speakers[i]; + pa_assert((map.map[map.channels] = sl_speaker_to_pa_channel_position(speakers[i])) != -1); + if (++map.channels == PA_CHANNELS_MAX) { + pa_log("Too many channels in sl mask"); + return -1; + } + } + } + if (mask) { + pa_log("Unknown channel in sl mask (left: %u)", mask); + return -1; + } + *rmap = map; + return 0; +} + +// sl_guess_channel_mask guesses the speakers used for a certain number of +// channels. It uses the same logic as Chromium and works correctly on most +// devices. If the number of channels is unsupported, -1 is returned. +// +// https://source.chromium.org/chromium/chromium/src/+/master:media/audio/android/opensles_util.cc;l=23-50;drc=6ae2127739229f68ed7cd466012db4c6e5e6bbcd +// https://github.com/google/oboe/blob/52e2163781c8f485f5e67b081c94043a6e8dff15/src/opensles/AudioOutputStreamOpenSLES.cpp#L69-L110 +// https://www2.iis.fraunhofer.de/AAC/multichannel.html (for testing) +// https://www.youtube.com/watch?v=MkVyFZi8ClE (also good for testing) +static SLuint32 sl_guess_channel_mask(int channels) { + #define SL_ANDROID_SPEAKER_QUAD (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT) + #define SL_ANDROID_SPEAKER_5DOT1 (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_FRONT_CENTER | SL_SPEAKER_LOW_FREQUENCY | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT) + #define SL_ANDROID_SPEAKER_7DOT1 (SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_SIDE_LEFT | SL_SPEAKER_SIDE_RIGHT) + if (channels > 2) + pa_log("Warning: Guessing channel layout for > 2 channels, order may be be incorrect."); + switch (channels) { + case 1: return SL_SPEAKER_FRONT_CENTER; + case 2: return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; + case 3: return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_FRONT_CENTER; + case 4: return SL_ANDROID_SPEAKER_QUAD; + case 5: return SL_ANDROID_SPEAKER_QUAD | SL_SPEAKER_FRONT_CENTER; + case 6: return SL_ANDROID_SPEAKER_5DOT1; + case 7: return SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_BACK_CENTER; + case 8: return SL_ANDROID_SPEAKER_7DOT1; + default: + pa_log("No guess for %d channels.", channels); + return -1; + } + #undef SL_ANDROID_SPEAKER_7DOT1 + #undef SL_ANDROID_SPEAKER_5DOT1 + #undef SL_ANDROID_SPEAKER_QUAD +} + +static int pa_sample_spec_to_sl_format(pa_sample_spec *ss, pa_channel_map *map, SLAndroidDataFormat_PCM_EX *sl) { + pa_assert(ss); + pa_assert(sl); + + *sl = (SLAndroidDataFormat_PCM_EX){0}; + + sl->sampleRate = ss->rate * 1000; // Hz to mHz + + switch (ss->format) { + case PA_SAMPLE_S16LE: // fallthrough + case PA_SAMPLE_S24LE: // fallthrough + case PA_SAMPLE_S32LE: // fallthrough + case PA_SAMPLE_S16BE: // fallthrough + case PA_SAMPLE_S24BE: // fallthrough + case PA_SAMPLE_S32BE: + sl->formatType = SL_DATAFORMAT_PCM; + sl->representation = SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT; + break; + case PA_SAMPLE_FLOAT32LE: // fallthrough + case PA_SAMPLE_FLOAT32BE: + sl->formatType = SL_ANDROID_DATAFORMAT_PCM_EX; + sl->representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT; + break; + default: + pa_log_error("Unsupported sample format: only s16/24/32 and f32 formats are supported."); + return 1; + } + sl->endianness = pa_sample_format_is_le(ss->format) + ? SL_BYTEORDER_LITTLEENDIAN + : SL_BYTEORDER_BIGENDIAN; + sl->bitsPerSample = sl->containerSize = pa_sample_size(ss) * 8; + sl->sampleRate = ss->rate * 1000; // Hz to mHz + + if (map) { + pa_assert((sl->numChannels = ss->channels) == map->channels); + if ((sl->channelMask = pa_channel_map_to_sl_channel_mask(map)) == (SLuint32)(-1)) { + pa_log_error("Unsupported sample format: no sl equivalent for channel map."); + return 1; + } + } else { + if ((sl->channelMask = sl_guess_channel_mask((sl->numChannels = ss->channels))) == (SLuint32)(-1)) { + pa_log_error("Unsupported sample format: could not guess channel mask for provided number of channels."); + return 1; + } + } + + return 0; +} + +// pa_channel_map_init_sles is pa_channel_map_init from PulseAudio, but modified +// to use sl_guess_channel_mask. +// +// https://github.com/pulseaudio/pulseaudio/blob/7f4d7fcf5f6407913e50604c6195d0d5356195b1/src/pulse/channelmap.c#L165-L395 +static pa_channel_map *pa_channel_map_init_sles(pa_channel_map *m, unsigned channels) { + pa_assert(m); + pa_assert(pa_channels_valid(channels)); + pa_channel_map_init(m); + SLuint32 mask = sl_guess_channel_mask(channels); + if (mask == (SLuint32)(-1)) + return NULL; + pa_assert(sl_channel_mask_to_pa_channel_map(mask, m) != -1); + pa_assert(m->channels == channels); + return m; +} + +// pa_channel_map_init_extend_sles is pa_channel_map_init_extend from +// PulseAudio, but modified to use pa_channel_map_init_sles. +// +// https://github.com/pulseaudio/pulseaudio/blob/7f4d7fcf5f6407913e50604c6195d0d5356195b1/src/pulse/channelmap.c#L397-L424 +static pa_channel_map* pa_channel_map_init_extend_sles(pa_channel_map *m, unsigned channels) { + unsigned c; + pa_assert(m); + pa_assert(pa_channels_valid(channels)); + pa_channel_map_init(m); + for (c = channels; c > 0; c--) { + if (pa_channel_map_init_sles(m, c)) { + unsigned i = 0; + for (; c < channels; c++) { + m->map[c] = PA_CHANNEL_POSITION_AUX0 + i; + i++; + } + m->channels = (uint8_t) channels; + return m; + } + } + return NULL; +} + +// pa_modargs_get_sample_spec_and_channel_map_sles is +// pa_modargs_get_sample_spec_and_channel_map from PulseAudio, but modified +// to use the previous two functions. +// +// https://github.com/pulseaudio/pulseaudio/blob/7f4d7fcf5f6407913e50604c6195d0d5356195b1/src/pulsecore/modargs.c#L479-L515 +static int pa_modargs_get_sample_spec_and_channel_map_sles(pa_modargs *ma, pa_sample_spec *rss, pa_channel_map *rmap) { + pa_sample_spec ss; + pa_channel_map map; + pa_assert(rss); + pa_assert(rmap); + ss = *rss; + if (pa_modargs_get_sample_spec(ma, &ss) < 0) + return -1; + map = *rmap; + if (ss.channels != map.channels) + pa_channel_map_init_extend_sles(&map, ss.channels); + if (pa_modargs_get_channel_map(ma, NULL, &map) < 0) + return -1; + if (map.channels != ss.channels) { + if (!pa_modargs_get_value(ma, "channels", NULL)) + ss.channels = map.channels; + else + return -1; + } + *rmap = map; + *rss = ss; + return 0; +} + +static int pa_init_sles_player(struct userdata *u, pa_sample_spec *ss, pa_channel_map *map) { + pa_assert(u); + + // check and convert the sample spec + SLAndroidDataFormat_PCM_EX pcm; + if (pa_sample_spec_to_sl_format(ss, map, &pcm)) + return 1; + + // common sles error handling + #define CHK(stmt) { \ + SLresult res = (stmt); \ + if (res != SL_RESULT_SUCCESS) { \ + pa_log_error("Failed to initialize OpenSL ES: error %d at %s:%d", \ + res, __FILE__, __LINE__); \ + return 1; \ + } \ + } + + // create the engine + CHK(slCreateEngine(&u->EngineObject, 0, NULL, 0, NULL, NULL)); + CHK((*u->EngineObject)->Realize(u->EngineObject, SL_BOOLEAN_FALSE)); + + // create the outputmix + CHK((*u->EngineObject)->GetInterface(u->EngineObject, SL_IID_ENGINE, &(u->EngineItf))); + CHK((*u->EngineItf)->CreateOutputMix(u->EngineItf, &u->OutputMixObject, 0, NULL, NULL)); + CHK((*u->OutputMixObject)->Realize(u->OutputMixObject, SL_BOOLEAN_FALSE)); + + // create the player + CHK(({ + SLresult r = (*u->EngineItf)->CreateAudioPlayer(u->EngineItf, + &u->PlayerObject, + &(SLDataSource){ + .pLocator = &(SLDataLocator_BufferQueue){ + .locatorType = SL_DATALOCATOR_BUFFERQUEUE, + .numBuffers = 8, + }, + .pFormat = &pcm, + }, + &(SLDataSink){ + .pLocator = &(SLDataLocator_OutputMix){ + .locatorType = SL_DATALOCATOR_OUTPUTMIX, + .outputMix = u->OutputMixObject, + }, + .pFormat = NULL, + }, + 1, + (SLInterfaceID[]){SL_IID_BUFFERQUEUE}, + (SLboolean[]){SL_BOOLEAN_TRUE} + ); + if (r == SL_RESULT_CONTENT_UNSUPPORTED) + pa_log( + "Failed to initialize OpenSL ES; try checking logcat and " + "searching for messages with 'libOpenSLES:'" + ); + r; + })); + + // realize the player + CHK((*u->PlayerObject)->Realize(u->PlayerObject, SL_BOOLEAN_FALSE)); + CHK((*u->PlayerObject)->GetInterface(u->PlayerObject, SL_IID_PLAY, &u->PlayItf)); + + // register the callback + CHK((*u->PlayerObject)->GetInterface(u->PlayerObject, SL_IID_BUFFERQUEUE, &u->BufferQueueItf)); + CHK((*u->BufferQueueItf)->RegisterCallback(u->BufferQueueItf, sles_callback, u)); + + // cleanup + #undef CHK + + return 0; +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + + if (PA_UNLIKELY(u->sink->thread_info.rewind_requested)) + pa_sink_process_rewind(u->sink, 0); + + if ((ret = pa_rtpoll_run(u->rtpoll)) < 0) + goto fail; + + if (ret == 0) + goto finish; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +static int state_func(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) { + struct userdata *u = s->userdata; + pa_assert(u); + + if (PA_SINK_IS_OPENED(s->state) && (state == PA_SINK_SUSPENDED || state == PA_SINK_UNLINKED)) + (*u->PlayItf)->SetPlayState(u->PlayItf, SL_PLAYSTATE_STOPPED); + else if ((s->state == PA_SINK_SUSPENDED || s->state == PA_SINK_INIT) && PA_SINK_IS_OPENED(state)) + (*u->PlayItf)->SetPlayState(u->PlayItf, SL_PLAYSTATE_PLAYING); + return 0; +} + +int pa__init(pa_module*m) { + struct userdata *u = NULL; + pa_modargs *ma = NULL; + pa_sink_new_data sink_data; + pa_sample_spec ss; + pa_channel_map map; + uint32_t latency = 0; + + pa_assert(m); + + m->userdata = u = pa_xnew0(struct userdata, 1); + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + u->core = m->core; + u->module = m; + + u->rtpoll = pa_rtpoll_new(); + if (pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll) < 0) { + pa_log("pa_thread_mq_init() failed."); + goto fail; + } + if (!(u->sles_msgq = pa_asyncmsgq_new(0))) { + pa_log("pa_asyncmsgq_new() failed."); + goto fail; + } + u->rtpoll_item = pa_rtpoll_item_new_asyncmsgq_read(u->rtpoll, PA_RTPOLL_EARLY-1, u->sles_msgq); + + pa_sink_new_data_init(&sink_data); + sink_data.driver = __FILE__; + sink_data.module = m; + + ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + if (pa_modargs_get_sample_spec_and_channel_map_sles(ma, &ss, &map) < 0) { + pa_log("Invalid sample format specification or channel map."); + goto fail; + } + + if (pa_init_sles_player(u, &ss, &map)) + goto fail; + + pa_sink_new_data_set_name(&sink_data, pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME)); + pa_sink_new_data_set_sample_spec(&sink_data, &ss); + pa_sink_new_data_set_channel_map(&sink_data, &map); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "OpenSL ES Output"); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "abstract"); + + if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties."); + pa_sink_new_data_done(&sink_data); + goto fail; + } + + if (!(u->sink = pa_sink_new(m->core, &sink_data, 0))) { + pa_log("Failed to create sink object."); + pa_sink_new_data_done(&sink_data); + goto fail; + } + pa_sink_new_data_done(&sink_data); + + u->sink->userdata = u; + u->sink->parent.process_msg = sink_process_msg; + u->sink->set_state_in_main_thread = state_func; + + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + + pa_modargs_get_value_u32(ma, "latency", &latency); + u->block_usec = latency + ? PA_USEC_PER_MSEC * latency + : PA_USEC_PER_MSEC * 125; + pa_sink_set_fixed_latency(u->sink, u->block_usec); + + u->nbytes = pa_usec_to_bytes(u->block_usec, &u->sink->sample_spec); + u->buf = calloc(1, u->nbytes); + u->memchunk.memblock = pa_memblock_new_fixed(m->core->mempool, u->buf, u->nbytes, false); + + if (!(u->thread = pa_thread_new("sles-sink", thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + pa_sink_put(u->sink); + sles_callback(u->BufferQueueItf, u); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink); +} + +void pa__done(pa_module *m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->PlayerObject) + (*u->PlayerObject)->Destroy(u->PlayerObject); + if (u->OutputMixObject) + (*u->OutputMixObject)->Destroy(u->OutputMixObject); + if (u->EngineObject) + (*u->EngineObject)->Destroy(u->EngineObject); + + if (u->memchunk.memblock) + pa_memblock_unref_fixed(u->memchunk.memblock); + free(u->buf); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + pa_thread_mq_done(&u->thread_mq); + + if (u->sink) + pa_sink_unref(u->sink); + if (u->rtpoll_item) + pa_rtpoll_item_free(u->rtpoll_item); + if (u->sles_msgq) + pa_asyncmsgq_unref(u->sles_msgq); + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + pa_xfree(u); +} diff -uNr 30-pulseaudio/src/modules/sles/module-sles-source.c 30-pulseaudio-mod/src/modules/sles/module-sles-source.c --- 30-pulseaudio/src/modules/sles/module-sles-source.c 1969-12-31 21:00:00.000000000 -0300 +++ 30-pulseaudio-mod/src/modules/sles/module-sles-source.c 2024-12-15 20:43:51.998654873 -0300 @@ -0,0 +1,435 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +PA_MODULE_AUTHOR("Lennart Poettering, Patrick Gaskin"); +PA_MODULE_DESCRIPTION("Android OpenSL ES source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_USAGE( + "source_name= " + "source_properties= " + "latency= " + "format= " + "channels= " + "rate= " + "channel_map= " +); + +#define DEFAULT_SOURCE_NAME "OpenSL ES source" + +enum { SOURCE_MESSAGE_RENDER = PA_SOURCE_MESSAGE_MAX }; + +struct userdata { + pa_core *core; + pa_module *module; + pa_source *source; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + pa_rtpoll_item *rtpoll_item; + pa_asyncmsgq *sles_msgq; + + pa_usec_t block_usec; + + pa_memchunk memchunk; + void *buf; + size_t nbytes; + + SLObjectItf EngineObject; + SLObjectItf RecorderObject; + SLEngineItf EngineItf; + SLRecordItf RecordItf; + SLAndroidConfigurationItf ConfigurationItf; + SLAndroidSimpleBufferQueueItf BufferQueueItf; +}; + +static const char *const valid_modargs[] = { + "source_name", + "source_properties", + "latency", + "format", + "channels", + "rate", + "channel_map", + NULL +}; + +static void process_render(void *userdata) { + struct userdata *u = userdata; + pa_assert(u); + + (*u->RecordItf)->SetRecordState(u->RecordItf, SL_RECORDSTATE_RECORDING); + if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state)) + return; + + u->memchunk.length = u->nbytes; + (*u->BufferQueueItf)->Enqueue(u->BufferQueueItf, u->buf, u->memchunk.length); + pa_source_post(u->source, &u->memchunk); +} + +static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *memchunk) { + switch (code) { + case SOURCE_MESSAGE_RENDER: + process_render(data); + return 0; + case PA_SINK_MESSAGE_GET_LATENCY: + code = PA_SINK_MESSAGE_GET_FIXED_LATENCY; // FIXME: is there a way to get the real latency? + break; + } + return pa_source_process_msg(o, code, data, offset, memchunk); +}; + +static void sles_callback(SLAndroidSimpleBufferQueueItf recBuffQueueItf, void *userdata) { + struct userdata *u = userdata; + pa_assert(u); + pa_assert_se(pa_asyncmsgq_send(u->sles_msgq, PA_MSGOBJECT(u->source), SOURCE_MESSAGE_RENDER, u, 0, NULL) == 0); +} + +static int pa_sample_spec_to_sl_format(pa_sample_spec *ss, SLAndroidDataFormat_PCM_EX *sl) { + pa_assert(ss); + pa_assert(sl); + + *sl = (SLAndroidDataFormat_PCM_EX){0}; + + switch ((sl->numChannels = ss->channels)) { + case 1: + sl->channelMask = SL_SPEAKER_FRONT_LEFT; + break; + case 2: + sl->channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; + break; + default: + pa_log_error("Unsupported sample format: only stereo or mono channels are supported."); + return 1; + } + sl->sampleRate = ss->rate * 1000; // Hz to mHz + + switch (ss->format) { + case PA_SAMPLE_S16LE: // fallthrough + case PA_SAMPLE_S24LE: // fallthrough + case PA_SAMPLE_S32LE: // fallthrough + case PA_SAMPLE_S16BE: // fallthrough + case PA_SAMPLE_S24BE: // fallthrough + case PA_SAMPLE_S32BE: + sl->formatType = SL_DATAFORMAT_PCM; + sl->representation = SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT; + break; + case PA_SAMPLE_FLOAT32LE: // fallthrough + case PA_SAMPLE_FLOAT32BE: + sl->formatType = SL_ANDROID_DATAFORMAT_PCM_EX; + sl->representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT; + break; + default: + pa_log_error("Unsupported sample format: only s16/24/32 and f32 formats are supported."); + return 1; + } + sl->endianness = pa_sample_format_is_le(ss->format) + ? SL_BYTEORDER_LITTLEENDIAN + : SL_BYTEORDER_BIGENDIAN; + sl->bitsPerSample = sl->containerSize = pa_sample_size(ss) * 8; + + return 0; +} + +static int pa_init_sles_record(struct userdata *u, pa_sample_spec *ss) { + pa_assert(u); + + // check and convert the sample spec + SLAndroidDataFormat_PCM_EX pcm; + if (pa_sample_spec_to_sl_format(ss, &pcm)) + return 1; + + // common sles error handling + #define CHK(stmt) { \ + SLresult res = (stmt); \ + if (res != SL_RESULT_SUCCESS) { \ + pa_log_error("Failed to initialize OpenSL ES: error %d at %s:%d", \ + res, __FILE__, __LINE__); \ + return 1; \ + } \ + } + + // create the engine + CHK(slCreateEngine(&u->EngineObject, 0, NULL, 0, NULL, NULL)); + CHK(({ + SLresult r = (*u->EngineObject)->Realize(u->EngineObject, SL_BOOLEAN_FALSE); + if (r == SL_RESULT_CONTENT_UNSUPPORTED) + pa_log( + "Failed to initialize OpenSL ES; did you grant Termux the " + "RECORD_AUDIO permission (you can use termux-microphone-record " + "from Termux:API for this)?" + ); + r; + })); + + // create the recorder + CHK((*u->EngineObject)->GetInterface(u->EngineObject, SL_IID_ENGINE, &u->EngineItf)); + CHK(({ + SLresult r = (*u->EngineItf)->CreateAudioRecorder(u->EngineItf, + &u->RecorderObject, + + // source/sink + &(SLDataSource){ + .pLocator = &(SLDataLocator_IODevice){ + .locatorType = SL_DATALOCATOR_IODEVICE, + .deviceType = SL_IODEVICE_AUDIOINPUT, + .deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT, + .device = NULL, + }, + .pFormat = NULL, + }, + &(SLDataSink){ + .pLocator = &(SLDataLocator_AndroidSimpleBufferQueue){ + .locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, + .numBuffers = 8, + }, + .pFormat = &pcm, + }, + + // required interfaces + 2, + (SLInterfaceID[]){SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_ANDROIDCONFIGURATION}, + (SLboolean[]) {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE} + ); + if (r == SL_RESULT_CONTENT_UNSUPPORTED) + pa_log( + "Failed to initialize OpenSL ES; try checking logcat and " + "searching for messages with 'libOpenSLES:'" + ); + r; + })); + + // update the configuration + CHK((*u->RecorderObject)->GetInterface(u->RecorderObject, SL_IID_ANDROIDCONFIGURATION, &u->ConfigurationItf)); + CHK((*u->ConfigurationItf)->SetConfiguration(u->ConfigurationItf, SL_ANDROID_KEY_RECORDING_PRESET, &(SLuint32){SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION}, sizeof(SLuint32))); + + // realize the recorder + CHK((*u->RecorderObject)->Realize(u->RecorderObject, SL_BOOLEAN_FALSE)); + CHK((*u->RecorderObject)->GetInterface(u->RecorderObject, SL_IID_RECORD, &u->RecordItf)); + + // register the callback + CHK((*u->RecorderObject)->GetInterface(u->RecorderObject, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &u->BufferQueueItf)); + CHK((*u->BufferQueueItf)->RegisterCallback(u->BufferQueueItf, sles_callback, u)); + + // cleanup + #undef CHK + + return 0; +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + pa_assert(u); + + pa_thread_mq_install(&u->thread_mq); + for (;;) { + int ret; + if ((ret = pa_rtpoll_run(u->rtpoll)) < 0) { + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + break; + } + if (ret == 0) { + break; + } + } +} + +static int state_func(pa_source *s, pa_source_state_t state, pa_suspend_cause_t suspend_cause) { + struct userdata *u = s->userdata; + pa_assert(u); + + if (PA_SOURCE_IS_OPENED(s->state) && (state == PA_SOURCE_SUSPENDED || state == PA_SOURCE_UNLINKED)) + (*u->RecordItf)->SetRecordState(u->RecordItf, SL_RECORDSTATE_STOPPED); + else if ((s->state == PA_SOURCE_SUSPENDED || s->state == PA_SOURCE_INIT) && PA_SOURCE_IS_OPENED(state)) + (*u->RecordItf)->SetRecordState(u->RecordItf, SL_RECORDSTATE_RECORDING); + return 0; +} + +int pa__init(pa_module *m) { + struct userdata *u = NULL; + pa_modargs *ma = NULL; + pa_source_new_data source_data; + pa_sample_spec ss; + pa_channel_map map; + uint32_t latency = 0; + + pa_assert(m); + + m->userdata = u = pa_xnew0(struct userdata, 1); + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + u->core = m->core; + u->module = m; + + u->rtpoll = pa_rtpoll_new(); + if (pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll) < 0) { + pa_log("pa_thread_mq_init() failed."); + goto fail; + } + if (!(u->sles_msgq = pa_asyncmsgq_new(0))) { + pa_log("pa_asyncmsgq_new() failed."); + goto fail; + } + u->rtpoll_item = pa_rtpoll_item_new_asyncmsgq_read(u->rtpoll, PA_RTPOLL_EARLY - 1, u->sles_msgq); + + pa_source_new_data_init(&source_data); + source_data.driver = __FILE__; + source_data.module = m; + + ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) { + pa_log("Invalid sample format specification or channel map."); + goto fail; + } + + if (pa_init_sles_record(u, &ss)) + goto fail; + + pa_source_new_data_set_name(&source_data, pa_modargs_get_value(ma, "source_name", DEFAULT_SOURCE_NAME)); + pa_source_new_data_set_sample_spec(&source_data, &ss); + pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "OpenSL ES Input"); + pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_CLASS, "abstract"); + + if (pa_modargs_get_proplist(ma, "source_properties", source_data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties."); + pa_source_new_data_done(&source_data); + goto fail; + } + + if (!(u->source = pa_source_new(m->core, &source_data, PA_SOURCE_LATENCY))) { + pa_log("Failed to create source."); + pa_source_new_data_done(&source_data); + goto fail; + } + pa_source_new_data_done(&source_data); + + u->source->userdata = u; + u->source->parent.process_msg = source_process_msg; + u->source->set_state_in_main_thread = state_func; + + pa_source_set_asyncmsgq(u->source, u->thread_mq.inq); + pa_source_set_rtpoll(u->source, u->rtpoll); + + pa_modargs_get_value_u32(ma, "latency", &latency); + u->block_usec = latency + ? PA_USEC_PER_MSEC * latency + : PA_USEC_PER_MSEC * 125; + pa_source_set_fixed_latency(u->source, u->block_usec); + + u->nbytes = pa_usec_to_bytes(u->block_usec, &u->source->sample_spec); + u->buf = calloc(1, u->nbytes); + u->memchunk.memblock = pa_memblock_new_fixed(m->core->mempool, u->buf, u->nbytes, false); + + if (!(u->thread = pa_thread_new("sles-source", thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + pa_source_put(u->source); + sles_callback(u->BufferQueueItf, u); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_source_linked_by(u->source); +} + +void pa__done(pa_module *m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->source) + pa_source_unlink(u->source); + + if (u->RecorderObject) + (*u->RecorderObject)->Destroy(u->RecorderObject); + if (u->EngineObject) + (*u->EngineObject)->Destroy(u->EngineObject); + + if (u->memchunk.memblock) + pa_memblock_unref_fixed(u->memchunk.memblock); + free(u->buf); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + pa_thread_mq_done(&u->thread_mq); + + if (u->source) + pa_source_unref(u->source); + if (u->rtpoll_item) + pa_rtpoll_item_free(u->rtpoll_item); + if (u->sles_msgq) + pa_asyncmsgq_unref(u->sles_msgq); + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + pa_xfree(u); +} diff -uNr 30-pulseaudio/src/pulsecore/core-util.c 30-pulseaudio-mod/src/pulsecore/core-util.c --- 30-pulseaudio/src/pulsecore/core-util.c 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/pulsecore/core-util.c 2024-12-15 20:43:42.846655547 -0300 @@ -1766,7 +1766,7 @@ * users, too. Since we need POSIX locking and UNIX sockets in * this directory, we try XDG_RUNTIME_DIR first, and if that isn't * set create a directory in $HOME and link it to a random subdir - * in /tmp, if it was not explicitly configured. */ + * in /data/data/com.micewine.emu/files/usr/tmp, if it was not explicitly configured. */ m = pa_in_system_mode() ? 0755U : 0700U; @@ -1839,7 +1839,7 @@ #ifdef HAVE_SYMLINK /* Hmm, so the runtime directory didn't exist yet, so let's - * create one in /tmp and symlink that to it */ + * create one in /data/data/com.micewine.emu/files/usr/tmp and symlink that to it */ if (make_random_dir_and_link(0700, k) < 0) { @@ -3229,8 +3229,8 @@ if ((f = pa_fopen_cloexec(PA_MACHINE_ID, "r")) || (f = pa_fopen_cloexec(PA_MACHINE_ID_FALLBACK, "r")) || #if !defined(OS_IS_WIN32) - (f = pa_fopen_cloexec("/etc/machine-id", "r")) || - (f = pa_fopen_cloexec("/var/lib/dbus/machine-id", "r")) + (f = pa_fopen_cloexec("/data/data/com.micewine.emu/files/usr/etc/machine-id", "r")) || + (f = pa_fopen_cloexec("/data/data/com.micewine.emu/files/usr/var/lib/dbus/machine-id", "r")) #else false #endif @@ -3595,7 +3595,7 @@ pa_is_path_absolute(t)) return t; - return "/tmp"; + return "/data/data/com.micewine.emu/files/usr/tmp"; } int pa_open_cloexec(const char *fn, int flags, mode_t mode) { diff -uNr 30-pulseaudio/src/pulsecore/esound.h 30-pulseaudio-mod/src/pulsecore/esound.h --- 30-pulseaudio/src/pulsecore/esound.h 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/pulsecore/esound.h 2024-12-15 20:43:42.846655547 -0300 @@ -23,8 +23,8 @@ /* Most of the following is blatantly stolen from esound. */ /* path and name of the default EsounD domain socket */ -#define ESD_UNIX_SOCKET_DIR "/tmp/.esd" -#define ESD_UNIX_SOCKET_NAME "/tmp/.esd/socket" +#define ESD_UNIX_SOCKET_DIR "/data/data/com.micewine.emu/files/usr/tmp/.esd" +#define ESD_UNIX_SOCKET_NAME "/data/data/com.micewine.emu/files/usr/tmp/.esd/socket" /* length of the audio buffer size */ #define ESD_BUF_SIZE (4 * 1024) diff -uNr 30-pulseaudio/src/pulsecore/log.c 30-pulseaudio-mod/src/pulsecore/log.c --- 30-pulseaudio/src/pulsecore/log.c 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/pulsecore/log.c 2024-12-15 20:43:42.846655547 -0300 @@ -30,6 +30,10 @@ #include #include +#ifdef __ANDROID__ +#undef HAVE_EXECINFO_H +#endif + #ifdef HAVE_EXECINFO_H #include #endif diff -uNr 30-pulseaudio/src/pulsecore/meson.build 30-pulseaudio-mod/src/pulsecore/meson.build --- 30-pulseaudio/src/pulsecore/meson.build 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/pulsecore/meson.build 2024-12-15 20:43:42.846655547 -0300 @@ -185,14 +185,7 @@ foreach simd_kwargs : simd_variants if host_machine.cpu_family() == 'arm' and 'neon' in simd_kwargs - if not cc.compiles(''' - #include - int main() { - return sizeof(uint8x8_t) + sizeof(int32x4_t) + sizeof(float32x4_t); - } - ''', name : 'neon code') - continue - endif + continue endif libpulsecore_simd = simd.check('libpulsecore_simd', diff -uNr 30-pulseaudio/src/pulsecore/shm.c 30-pulseaudio-mod/src/pulsecore/shm.c --- 30-pulseaudio/src/pulsecore/shm.c 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/pulsecore/shm.c 2024-12-15 20:43:42.847655547 -0300 @@ -67,7 +67,7 @@ /* On Linux we know that the shared memory blocks are files in * /dev/shm. We can use that information to list all blocks and * cleanup unused ones */ -#define SHM_PATH "/dev/shm/" +#define SHM_PATH "/data/data/com.micewine.emu/files/usr/tmp/" #define SHM_ID_LEN 10 #elif defined(__sun) #define SHM_PATH "/tmp" diff -uNr 30-pulseaudio/src/tests/meson.build 30-pulseaudio-mod/src/tests/meson.build --- 30-pulseaudio/src/tests/meson.build 2024-01-12 14:22:09.000000000 -0300 +++ 30-pulseaudio-mod/src/tests/meson.build 2024-12-15 20:43:42.847655547 -0300 @@ -106,8 +106,6 @@ default_tests += [ [ 'sigbus-test', 'sigbus-test.c', [ check_dep, libpulse_dep, libpulsecommon_dep, libpulsecore_dep ] ], - [ 'usergroup-test', 'usergroup-test.c', - [ check_dep, libpulse_dep, libpulsecommon_dep, libpulsecore_dep ] ], ] endif ================================================ FILE: packages/pulseaudio/02-aaudio-sink.patch ================================================ diff -uNr pulseaudio/meson.build pulseaudio-aaudio/meson.build --- pulseaudio/meson.build 2025-02-15 15:37:24.487223369 -0300 +++ pulseaudio-aaudio/meson.build 2025-02-15 15:38:33.368888460 -0300 @@ -446,6 +446,7 @@ libm_dep = cc.find_library('m', required : true) sles_dep = cc.find_library('OpenSLES', required : true) +aaudio_dep = cc.find_library('aaudio', required : true) thread_dep = dependency('threads') foreach f : [ diff -uNr pulseaudio/src/modules/aaudio/module-aaudio-sink.c pulseaudio-aaudio/src/modules/aaudio/module-aaudio-sink.c --- pulseaudio/src/modules/aaudio/module-aaudio-sink.c 1969-12-31 21:00:00.000000000 -0300 +++ pulseaudio-aaudio/src/modules/aaudio/module-aaudio-sink.c 2025-02-15 15:37:44.518442135 -0300 @@ -0,0 +1,450 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#undef __INTRODUCED_IN +#define __INTRODUCED_IN(api_level) +#include + +PA_MODULE_AUTHOR("Tom Yan"); +PA_MODULE_DESCRIPTION("Android AAudio sink"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_USAGE( + "sink_name= " + "sink_properties= " + "rate= " + "latency= " + "pm= " + "no_close_hack= " +); + +#define DEFAULT_SINK_NAME "AAudio sink" + +enum { + SINK_MESSAGE_RENDER = PA_SINK_MESSAGE_MAX, + SINK_MESSAGE_OPEN_STREAM +}; + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink *sink; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + pa_rtpoll_item *rtpoll_item; + pa_asyncmsgq *aaudio_msgq; + + uint32_t rate; + uint32_t latency; + uint32_t pm; + bool no_close; + + pa_memchunk memchunk; + size_t frame_size; + + AAudioStreamBuilder *builder; + AAudioStream *stream; + pa_sample_spec ss; +}; + +static const char* const valid_modargs[] = { + "sink_name", + "sink_properties", + "rate", + "latency", + "pm", + "no_close_hack", + NULL +}; + +static int process_render(struct userdata *u, void *audioData, int64_t numFrames) { + pa_assert(u->sink->thread_info.state != PA_SINK_INIT); + + /* a render message could be queued after a set state message */ + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state)) + return AAUDIO_CALLBACK_RESULT_STOP; + + u->memchunk.memblock = pa_memblock_new_fixed(u->core->mempool, audioData, u->frame_size * numFrames, false); + u->memchunk.length = pa_memblock_get_length(u->memchunk.memblock); + pa_sink_render_into_full(u->sink, &u->memchunk); + pa_memblock_unref_fixed(u->memchunk.memblock); + + return AAUDIO_CALLBACK_RESULT_CONTINUE; +} + +static aaudio_data_callback_result_t data_callback(AAudioStream *stream, void *userdata, void *audioData, int32_t numFrames) { + struct userdata* u = userdata; + + pa_assert(u); + + return pa_asyncmsgq_send(u->aaudio_msgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_RENDER, audioData, numFrames, NULL); +} + +static void error_callback(AAudioStream *stream, void *userdata, aaudio_result_t error) { + struct userdata* u = userdata; + + pa_assert(u); + + while (u->sink->state == PA_SINK_INIT); + + if (error != AAUDIO_ERROR_DISCONNECTED) + pa_log_debug("AAudio error: %d", error); + + pa_sink_suspend(u->sink, true, PA_SUSPEND_UNAVAILABLE); + pa_sink_suspend(u->sink, false, PA_SUSPEND_UNAVAILABLE); +} + +#define CHK(stmt) { \ + aaudio_result_t res = stmt; \ + if (res != AAUDIO_OK) { \ + fprintf(stderr, "error %d at %s:%d\n", res, __FILE__, __LINE__); \ + goto fail; \ + } \ +} + +static int pa_open_aaudio_stream(struct userdata *u) +{ + bool want_float; + aaudio_format_t format; + pa_sample_spec *ss = &u->ss; + + CHK(AAudio_createStreamBuilder(&u->builder)); + AAudioStreamBuilder_setPerformanceMode(u->builder, AAUDIO_PERFORMANCE_MODE_NONE + u->pm); + AAudioStreamBuilder_setDataCallback(u->builder, data_callback, u); + AAudioStreamBuilder_setErrorCallback(u->builder, error_callback, u); + + want_float = ss->format > PA_SAMPLE_S16BE; + ss->format = want_float ? PA_SAMPLE_FLOAT32LE : PA_SAMPLE_S16LE; + format = want_float ? AAUDIO_FORMAT_PCM_FLOAT : AAUDIO_FORMAT_PCM_I16; + AAudioStreamBuilder_setFormat(u->builder, format); + + if (u->rate) + AAudioStreamBuilder_setSampleRate(u->builder, u->rate); + + AAudioStreamBuilder_setChannelCount(u->builder, ss->channels); + + CHK(AAudioStreamBuilder_openStream(u->builder, &u->stream)); + CHK(AAudioStreamBuilder_delete(u->builder)); + + ss->rate = AAudioStream_getSampleRate(u->stream); + u->frame_size = pa_frame_size(ss); + + return 0; + +fail: + return -1; +} + +#undef CHK + +static pa_usec_t get_latency(struct userdata *u) { + if(!u->latency) { + return PA_USEC_PER_SEC * AAudioStream_getBufferSizeInFrames(u->stream) / u->ss.rate / 2; + } else { + return PA_USEC_PER_MSEC * u->latency; + } +} + +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *memchunk) { + struct userdata* u = PA_SINK(o)->userdata; + + pa_assert(u); + + switch (code) { + case SINK_MESSAGE_RENDER: + return process_render(u, data, offset); + case SINK_MESSAGE_OPEN_STREAM: + if (pa_open_aaudio_stream(u) < 0) { + pa_log("pa_open_aaudio_stream() failed."); + return -1; + } + code = PA_SINK_MESSAGE_SET_FIXED_LATENCY; + offset = get_latency(u); + break; + } + + return pa_sink_process_msg(o, code, data, offset, memchunk); +}; + +static int state_func_main(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) { + struct userdata *u = s->userdata; + uint32_t idx; + pa_sink_input *i; + pa_idxset *inputs; + + if (s->state == PA_SINK_SUSPENDED && PA_SINK_IS_OPENED(state)) { + if (pa_asyncmsgq_send(u->aaudio_msgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_OPEN_STREAM, NULL, 0, NULL) < 0) + return -1; + + inputs = pa_idxset_copy(s->inputs, NULL); + PA_IDXSET_FOREACH(i, inputs, idx) { + if (i->state == PA_SINK_INPUT_RUNNING) { + pa_sink_input_cork(i, true); + } else { + pa_idxset_remove_by_index(inputs, idx); + } + } + + s->alternate_sample_rate = u->ss.rate; + pa_sink_reconfigure(s, &u->ss, false); + s->default_sample_rate = u->ss.rate; + + /* Avoid infinite loop triggered if uncork in this case */ + if (s->suspend_cause == PA_SUSPEND_IDLE) + pa_sink_suspend(u->sink, true, PA_SUSPEND_UNAVAILABLE); + + PA_IDXSET_FOREACH(i, inputs, idx) pa_sink_input_cork(i, false); + pa_idxset_free(inputs, NULL); + } + return 0; +} + +static int state_func_io(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) { + struct userdata *u = s->userdata; + + if (PA_SINK_IS_OPENED(s->thread_info.state) && + (state == PA_SINK_SUSPENDED || state == PA_SINK_UNLINKED)) { + if (!u->no_close) + AAudioStream_close(u->stream); + else + AAudioStream_requestStop(u->stream); + } else if (s->thread_info.state == PA_SINK_SUSPENDED && PA_SINK_IS_OPENED(state)) { + if (AAudioStream_requestStart(u->stream) < 0) + pa_log("AAudioStream_requestStart() failed."); + } else if (s->thread_info.state == PA_SINK_INIT && PA_SINK_IS_LINKED(state)) { + if (PA_SINK_IS_OPENED(state)) { + if (AAudioStream_requestStart(u->stream) < 0) + pa_log("AAudioStream_requestStart() failed."); + } else { + if (!u->no_close) + AAudioStream_close(u->stream); + } + } + return 0; +} + +static void reconfigure_func(pa_sink *s, pa_sample_spec *ss, bool passthrough) { + s->sample_spec.rate = ss->rate; +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + + if (PA_UNLIKELY(u->sink->thread_info.rewind_requested)) + pa_sink_process_rewind(u->sink, 0); + + if ((ret = pa_rtpoll_run(u->rtpoll)) < 0) + goto fail; + + if (ret == 0) + goto finish; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +int pa__init(pa_module*m) { + struct userdata *u = NULL; + pa_channel_map map; + pa_modargs *ma = NULL; + pa_sink_new_data data; + + pa_assert(m); + + m->userdata = u = pa_xnew0(struct userdata, 1); + + u->core = m->core; + u->module = m; + u->rtpoll = pa_rtpoll_new(); + + if (pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll) < 0) { + pa_log("pa_thread_mq_init() failed."); + goto fail; + } + + /* The queue linking the AudioTrack thread and our RT thread */ + u->aaudio_msgq = pa_asyncmsgq_new(0); + if (!u->aaudio_msgq) { + pa_log("pa_asyncmsgq_new() failed."); + goto fail; + } + + /* The msgq from the AudioTrack RT thread should have an even higher + * priority than the normal message queues, to match the guarantee + * all other drivers make: supplying the audio device with data is + * the top priority -- and as long as that is possible we don't do + * anything else */ + u->rtpoll_item = pa_rtpoll_item_new_asyncmsgq_read(u->rtpoll, PA_RTPOLL_EARLY-1, u->aaudio_msgq); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + u->ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + pa_modargs_get_sample_rate(ma, &u->rate); + + pa_modargs_get_value_u32(ma, "latency", &u->latency); + + u->pm = AAUDIO_PERFORMANCE_MODE_LOW_LATENCY - AAUDIO_PERFORMANCE_MODE_NONE; + pa_modargs_get_value_u32(ma, "pm", &u->pm); + + pa_modargs_get_value_boolean(ma, "no_close_hack", &u->no_close); + + if (pa_open_aaudio_stream(u) < 0) + goto fail; + + pa_sink_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + pa_sink_new_data_set_name(&data, pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME)); + pa_sink_new_data_set_sample_spec(&data, &u->ss); + pa_sink_new_data_set_alternate_sample_rate(&data, u->ss.rate); + pa_sink_new_data_set_channel_map(&data, &map); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, _("AAudio Output")); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_CLASS, "abstract"); + + if (pa_modargs_get_proplist(ma, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&data); + goto fail; + } + + u->sink = pa_sink_new(m->core, &data, 0); + pa_sink_new_data_done(&data); + + if (!u->sink) { + pa_log("Failed to create sink object."); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg; + u->sink->set_state_in_main_thread = state_func_main; + u->sink->set_state_in_io_thread = state_func_io; + u->sink->reconfigure = reconfigure_func; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + pa_sink_set_fixed_latency(u->sink, get_latency(u)); + + if (!(u->thread = pa_thread_new("aaudio-sink", thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + pa_sink_put(u->sink); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink); +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->sink) + pa_sink_unref(u->sink); + + if (u->rtpoll_item) + pa_rtpoll_item_free(u->rtpoll_item); + + if (u->aaudio_msgq) + pa_asyncmsgq_unref(u->aaudio_msgq); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + pa_xfree(u); +} diff -uNr pulseaudio/src/modules/meson.build pulseaudio-aaudio/src/modules/meson.build --- pulseaudio/src/modules/meson.build 2025-02-15 15:37:24.545656377 -0300 +++ pulseaudio-aaudio/src/modules/meson.build 2025-02-15 15:37:44.518542565 -0300 @@ -60,6 +60,7 @@ [ 'module-volume-restore', 'module-volume-restore.c' ], [ 'module-sles-sink', 'sles/module-sles-sink.c', [], [], [sles_dep] ], [ 'module-sles-source', 'sles/module-sles-source.c', [], [], [sles_dep] ], + [ 'module-aaudio-sink', 'aaudio/module-aaudio-sink.c', [], [], [aaudio_dep] ], ] if host_machine.system() == 'windows' ================================================ FILE: packages/pulseaudio/build.sh ================================================ PKG_VER=v17.0 SRC_URL=https://github.com/pulseaudio/pulseaudio/archive/refs/tags/$PKG_VER.tar.gz MESON_ARGS="-Dalsa=disabled -Dx11=disabled -Dgtk=disabled -Dopenssl=disabled -Dgsettings=disabled -Ddoxygen=false -Ddatabase=simple -Dsystemd=disabled -Dudev=disabled -Dgstreamer=disabled -Dglib=disabled -Dman=false -Dbashcompletiondir=false -Dzshcompletiondir=false -Dtests=false" CFLAGS="-I$PREFIX/include" CPPFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib -Wl,--undefined-version" DEPENDENCIES="libtool libsndfile" ================================================ FILE: packages/pulseaudio/post-install.sh ================================================ cd $DESTDIR/$PREFIX/lib for lib in pulseaudio/{,modules/}lib*.so*; do ln -v -s -f "$lib" "$(basename "$lib")" done ================================================ FILE: packages/wine/build.sh ================================================ PKG_VER="10.10-esync-xinput-dinput" PKG_CATEGORY="Wine" PKG_PRETTY_NAME="Wine ($PKG_VER)" PKG_DOWNLOADABLE=1 BLACKLIST_ARCH=aarch64 GIT_URL=https://github.com/KreitinnSoftware/wine GIT_COMMIT=ad2c2468a2cf3c39d8487bb3c08b3c4fb479d350 HOST_BUILD_CONFIGURE_ARGS="--enable-win64 --without-x" HOST_BUILD_FOLDER="$INIT_DIR/workdir/$package/wine-tools" HOST_BUILD_MAKE="make -j $(nproc) __tooldeps__ nls/all" OVERRIDE_PREFIX="$(realpath $PREFIX/../wine)" CONFIGURE_ARGS="--enable-archs=i386,x86_64 \ --host=$TOOLCHAIN_TRIPLE \ --with-wine-tools=$INIT_DIR/workdir/$package/wine-tools \ --prefix=$OVERRIDE_PREFIX \ --without-oss \ --disable-winemenubuilder \ --disable-win16 \ --disable-tests \ --with-x \ --x-libraries=$PREFIX/lib \ --x-includes=$PREFIX/include \ --with-pulse \ --with-gstreamer \ --with-opengl \ --with-gnutls \ --with-mingw=gcc \ --with-xinput \ --with-xinput2 \ --enable-nls \ --without-xshm \ --without-xxf86vm \ --without-osmesa \ --without-usb \ --without-sdl \ --without-cups \ --without-netapi \ --without-pcap \ --without-gphoto \ --without-v4l2 \ --without-pcsclite \ --without-wayland \ --without-opencl \ --without-dbus \ --without-sane \ --without-udev \ --without-capi" DEPENDENCIES="libX11 libXext libXcomposite libXrender libXcursor libXrandr libXxf86vm libXinerama libXfixes libXi Vulkan-Headers Vulkan-Loader libglvnd pulseaudio freetype libgnutls gstreamer gst-plugins-base gst-plugins-ugly gst-plugins-good gst-plugins-bad" ================================================ FILE: packages/wine/post-install.sh ================================================ # Get Wine Gecko and Mono Versions MONO_VERSION=$(grep -R "#define MONO_VERSION" "../dlls/appwiz.cpl/addons.c" | cut -d " " -f 3) MONO_VERSION=${MONO_VERSION:1:-1} GECKO_VERSION=$(grep -R "#define GECKO_VERSION" "../dlls/appwiz.cpl/addons.c" | cut -d " " -f 3) GECKO_VERSION=${GECKO_VERSION:1:-1} # Download Wine Gecko and Mono and Package Together with Wine curl -LO# "https://dl.winehq.org/wine/wine-mono/$MONO_VERSION/wine-mono-$MONO_VERSION-x86.tar.xz" curl -LO# "https://dl.winehq.org/wine/wine-gecko/$GECKO_VERSION/wine-gecko-$GECKO_VERSION-x86_64.tar.xz" curl -LO# "https://dl.winehq.org/wine/wine-gecko/$GECKO_VERSION/wine-gecko-$GECKO_VERSION-x86.tar.xz" mkdir -p ../destdir-pkg/$PREFIX mkdir -p ../destdir-pkg/$PREFIX/../wine/share/{mono,gecko} tar -xf "wine-mono-$MONO_VERSION-x86.tar.xz" -C ../destdir-pkg/$PREFIX/../wine/share/wine/mono tar -xf "wine-gecko-$GECKO_VERSION-x86.tar.xz" -C ../destdir-pkg/$PREFIX/../wine/share/wine/gecko tar -xf "wine-gecko-$GECKO_VERSION-x86_64.tar.xz" -C ../destdir-pkg/$PREFIX/../wine/share/wine/gecko rm -rf ../destdir-pkg/$PREFIX rm -f "wine-mono-$MONO_VERSION-x86.tar.xz" "wine-gecko-$GECKO_VERSION-x86.tar.xz" "wine-gecko-$GECKO_VERSION-x86_64.tar.xz" ================================================ FILE: packages/xcb-proto/build.sh ================================================ PKG_VER=1.17.0 SRC_URL=https://xorg.freedesktop.org/archive/individual/proto/xcb-proto-$PKG_VER.tar.xz CONFIGURE_ARGS=" " ================================================ FILE: packages/xkbcommon/build.sh ================================================ PKG_VER=1.10.0 SRC_URL=https://github.com/xkbcommon/libxkbcommon/archive/refs/tags/xkbcommon-$PKG_VER.tar.gz MESON_ARGS="-Denable-tools=false -Denable-wayland=false -Denable-bash-completion=false" DEPENDENCIES="xorgproto xkeyboard-config libxml2 libxcb" ================================================ FILE: packages/xkeyboard-config/build.sh ================================================ PKG_VER=2.41 SRC_URL=https://xorg.freedesktop.org/archive/individual/data/xkeyboard-config/xkeyboard-config-$PKG_VER.tar.xz MESON_ARGS="-Dxkb-base=$PREFIX/share/X11/xkb -Dcompat-rules=true -Dxorg-rules-symlinks=false" ================================================ FILE: packages/xorg-utils-macros/build.sh ================================================ PKG_VER=1.20.1 SRC_URL=https://xorg.freedesktop.org/releases/individual/util/util-macros-$PKG_VER.tar.xz CONFIGURE_ARGS=" " ================================================ FILE: packages/xorgproto/build.sh ================================================ PKG_VER=2024.1 SRC_URL=https://xorg.freedesktop.org/archive/individual/proto/xorgproto-2024.1.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" DEPENDENCIES="xorg-utils-macros" ================================================ FILE: packages/xorgproto/include-x11-Xos_r.h.patch ================================================ diff -uNr xorgproto-2019.1/include/X11/Xos_r.h xorgproto-2019.1.mod/include/X11/Xos_r.h --- xorgproto-2019.1/include/X11/Xos_r.h 2019-06-20 06:13:03.000000000 +0300 +++ xorgproto-2019.1.mod/include/X11/Xos_r.h 2019-06-29 23:32:10.617173769 +0300 @@ -248,7 +248,7 @@ */ #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \ - defined(__APPLE__) || defined(__DragonFly__) + defined(__APPLE__) || defined(__DragonFly__) || defined(__ANDROID__) static __inline__ void _Xpw_copyPasswd(_Xgetpwparams p) { memcpy(&(p).pws, (p).pwp, sizeof(struct passwd)); @@ -261,11 +261,7 @@ (p).len = strlen((p).pwp->pw_passwd); strcpy((p).pws.pw_passwd,(p).pwp->pw_passwd); - (p).pws.pw_class = (p).pws.pw_passwd + (p).len + 1; - (p).len = strlen((p).pwp->pw_class); - strcpy((p).pws.pw_class, (p).pwp->pw_class); - - (p).pws.pw_gecos = (p).pws.pw_class + (p).len + 1; + (p).pws.pw_gecos = (p).pws.pw_passwd + (p).len + 1; (p).len = strlen((p).pwp->pw_gecos); strcpy((p).pws.pw_gecos, (p).pwp->pw_gecos); ================================================ FILE: packages/xtrans/build.sh ================================================ PKG_VER=1.5.0 SRC_URL=https://xorg.freedesktop.org/releases/individual/lib/xtrans-$PKG_VER.tar.xz CONFIGURE_ARGS="--host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE" ================================================ FILE: packages/xtrans/xtrans-1.3.5_Xtransutil.c.patch ================================================ diff -uNr xtrans-1.3.5/Xtransutil.c xtrans-1.3.5.mod/Xtransutil.c --- xtrans-1.3.5/Xtransutil.c 2014-09-12 21:32:47.000000000 +0300 +++ xtrans-1.3.5.mod/Xtransutil.c 2018-06-15 19:15:52.525720899 +0300 @@ -478,27 +478,6 @@ } /* Dir doesn't exist. Try to create it */ -#if !defined(WIN32) && !defined(__CYGWIN__) - /* - * 'sticky' bit requested: assume application makes - * certain security implications. If effective user ID - * is != 0: fail as we may not be able to meet them. - */ - if (geteuid() != 0) { - if (mode & 01000) { - prmsg(1, "mkdir: ERROR: euid != 0," - "directory %s will not be created.\n", - path); -#ifdef FAIL_HARD - return -1; -#endif - } else { - prmsg(1, "mkdir: Cannot create %s with root ownership\n", - path); - } - } -#endif - #ifndef WIN32 if (mkdir(path, mode) == 0) { if (chmod(path, mode)) { @@ -521,14 +500,9 @@ } else { if (S_ISDIR(buf.st_mode)) { - int updateOwner = 0; int updateMode = 0; - int updatedOwner = 0; int updatedMode = 0; int status = 0; - /* Check if the directory's ownership is OK. */ - if (buf.st_uid != 0) - updateOwner = 1; /* * Check if the directory's mode is OK. An exact match isn't @@ -566,7 +540,7 @@ * directory's owner and mode. Otherwise it isn't safe to attempt * to do this. */ - if (updateMode || updateOwner) { + if (updateMode) { int fd = -1; struct stat fbuf; if ((fd = open(path, O_RDONLY)) != -1) { @@ -588,8 +562,6 @@ close(fd); return -1; } - if (updateOwner && fchown(fd, 0, 0) == 0) - updatedOwner = 1; if (updateMode && fchmod(fd, mode) == 0) updatedMode = 1; close(fd); @@ -597,20 +569,6 @@ } #endif - if (updateOwner && !updatedOwner) { -#ifdef FAIL_HARD - if (status & FAIL_IF_NOT_ROOT) { - prmsg(1, "mkdir: ERROR: Owner of %s must be set to root\n", - path); - return -1; - } -#endif -#if !defined(__APPLE_CC__) && !defined(__CYGWIN__) - prmsg(1, "mkdir: Owner of %s should be set to root\n", - path); -#endif - } - if (updateMode && !updatedMode) { #ifdef FAIL_HARD if (status & FAIL_IF_NOMODE) { ================================================ FILE: packages/xtrans/xtrans-1.4.0_Xtranslcl.c.patch ================================================ --- a/Xtranslcl.c +++ b/Xtranslcl.c @@ -213,23 +213,23 @@ #ifndef X11_t #define X_STREAMS_DIR "/dev/X" #else -#define X_STREAMS_DIR "/tmp/.X11-pipe" +#define X_STREAMS_DIR "/data/data/com.micewine.emu/files/usr/tmp/.X11-pipe" #endif #define DEV_PTMX "/dev/ptmx" #if defined(X11_t) -#define NAMEDNODENAME "/tmp/.X11-pipe/X" +#define NAMEDNODENAME "/data/data/com.micewine.emu/files/usr/tmp/.X11-pipe/X" #endif #if defined(XIM_t) -#define NAMEDNODENAME "/tmp/.XIM-pipe/XIM" +#define NAMEDNODENAME "/data/data/com.micewine.emu/files/usr/tmp/.XIM-pipe/XIM" #endif #if defined(FS_t) || defined (FONT_t) -#define NAMEDNODENAME "/tmp/.font-pipe/fs" +#define NAMEDNODENAME "/data/data/com.micewine.emu/files/usr/tmp/.font-pipe/fs" #endif #if defined(ICE_t) -#define NAMEDNODENAME "/tmp/.ICE-pipe/" +#define NAMEDNODENAME "/data/data/com.micewine.emu/files/usr/tmp/.ICE-pipe/" #endif ================================================ FILE: packages/xtrans/xtrans-1.4.0_Xtranssock.c.patch ================================================ diff -uNr xtrans-1.4.0/Xtranssock.c xtrans-1.4.0.mod/Xtranssock.c --- xtrans-1.4.0/Xtranssock.c 2019-03-16 23:30:31.000000000 +0200 +++ xtrans-1.4.0.mod/Xtranssock.c 2019-05-19 00:52:00.404623112 +0300 @@ -200,20 +200,20 @@ #if defined(X11_t) -#define UNIX_PATH "/tmp/.X11-unix/X" -#define UNIX_DIR "/tmp/.X11-unix" +#define UNIX_PATH "/data/data/com.micewine.emu/files/usr/tmp/.X11-unix/X" +#define UNIX_DIR "/data/data/com.micewine.emu/files/usr/tmp/.X11-unix" #endif /* X11_t */ #if defined(XIM_t) -#define UNIX_PATH "/tmp/.XIM-unix/XIM" -#define UNIX_DIR "/tmp/.XIM-unix" +#define UNIX_PATH "/data/data/com.micewine.emu/files/usr/tmp/.XIM-unix/XIM" +#define UNIX_DIR "/data/data/com.micewine.emu/files/usr/tmp/.XIM-unix" #endif /* XIM_t */ #if defined(FS_t) || defined(FONT_t) -#define UNIX_PATH "/tmp/.font-unix/fs" -#define UNIX_DIR "/tmp/.font-unix" +#define UNIX_PATH "/data/data/com.micewine.emu/files/usr/tmp/.font-unix/fs" +#define UNIX_DIR "/data/data/com.micewine.emu/files/usr/tmp/.font-unix" #endif /* FS_t || FONT_t */ #if defined(ICE_t) -#define UNIX_PATH "/tmp/.ICE-unix/" -#define UNIX_DIR "/tmp/.ICE-unix" +#define UNIX_PATH "/data/data/com.micewine.emu/files/usr/tmp/.ICE-unix/" +#define UNIX_DIR "/data/data/com.micewine.emu/files/usr/tmp/.ICE-unix" #endif /* ICE_t */ ================================================ FILE: packages/zlib/build.sh ================================================ PKG_VER=1.3.1 SRC_URL=https://github.com/madler/zlib/releases/download/v$PKG_VER/zlib-$PKG_VER.tar.xz CFLAGS="-fPIC" CMAKE_ARGS=" " ================================================ FILE: packages/zlib/force-shared-library.patch ================================================ --- zlib-1.3.1/configure 2024-01-20 23:29:31.000000000 -0300 +++ zlib-1.3.1.mod/configure 2024-03-02 16:05:29.852262000 -0300 @@ -439,20 +439,7 @@ extern int getchar(); int hello() {return getchar();} EOF -if test $shared -eq 1; then - echo Checking for shared library support... | tee -a configure.log - # we must test in two steps (cc then ld), required at least on SunOS 4.x - if try $CC -c $SFLAGS $test.c && - try $LDSHARED $SFLAGS -o $test$shared_ext $test.o; then - echo Building shared library $SHAREDLIBV with $CC. | tee -a configure.log - elif test -z "$old_cc" -a -z "$old_cflags"; then - echo No shared library support. | tee -a configure.log - shared=0; - else - echo 'No shared library support; try without defining CC and CFLAGS' | tee -a configure.log - shared=0; - fi -fi + if test $shared -eq 0; then LDSHARED="$CC" ALL="static" ================================================ FILE: packages/zstd/build.sh ================================================ PKG_VER=1.5.6 SRC_URL=https://github.com/facebook/zstd/archive/v$PKG_VER.tar.gz MESON_ARGS="-Ddefault_library=both -Dbin_programs=true -Dbin_tests=false -Dbin_contrib=true -Dzlib=enabled -Dlzma=disabled -Dlz4=disabled" DEPENDENCIES="zlib" ================================================ FILE: tools/create-rat-pkg.sh ================================================ #!/bin/bash showHelp() { echo "Usage: $0 [package name] [package pretty name] [vulkan driver lib name] [architecture] [version] [category] [destdir-pkg] [output folder]" echo "" } symlinkToSh() { for folder in $(find $1 -type d); do if [ -d "$folder" ]; then cd "$folder" for file in $(find $PWD -type l); do target=$(readlink $file) if [ "$target" != "nul" ]; then rm "$file" target=$(echo $target | sed "s@$WORKDIR@$APP_ROOT_DIR@g") file=$(echo $file | sed "s@$WORKDIR@$APP_ROOT_DIR@g") echo "ln -sf $target $file" >> $WORKDIR/makeSymlinks.sh fi done cd $OLDPWD fi done } if [ $# -lt 8 ]; then showHelp exit 0 fi export INIT_DIR=$PWD export APP_ROOT_DIR=/data/data/com.micewine.emu/ export PACKAGE_NAME=$1 export PACKAGE_PRETTY_NAME=$2 export PACKAGE_VK_DRIVER_LIB=$3 export PACKAGE_ARCHITECTURE=$4 export PACKAGE_VERSION=$5 export PACKAGE_CATEGORY=$6 export DESTDIR_PKG=$7 export OUTDIR=$8 if [ "$9" != "0" ]; then echo "" echo "Creating Package '$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_ARCHITECTURE.rat'..." fi export WORKDIR="$DESTDIR_PKG" if [ -d "$DESTDIR_PKG/data/" ]; then WORKDIR="$DESTDIR_PKG/data/data/com.micewine.emu/" fi cd $WORKDIR echo "name=$PACKAGE_PRETTY_NAME" > pkg-header echo "category=$PACKAGE_CATEGORY" >> pkg-header echo "version=$PACKAGE_VERSION" >> pkg-header echo "architecture=$PACKAGE_ARCHITECTURE" >> pkg-header echo "vkDriverLib=$PACKAGE_VK_DRIVER_LIB" >> pkg-header symlinkToSh "files/" tar -cJf "$OUTDIR/$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_ARCHITECTURE.rat" pkg-header $(ls | grep -v pkg-header) ================================================ FILE: tools/download-external-dependencies.sh ================================================ customDxvkDownload() { if [ -e "DXVK/$1" ]; then echo "$1 already downloaded." else echo "Downloading $1..." cd "DXVK" curl -# -L -O "$2" if [ $? != 0 ]; then echo "Error on Downloading $1." else mkdir -p "$1" tar -xf "$(basename $2)" mv "dxvk"*"/x32" "dxvk"*"/x64" "$1" rm -rf "dxvk"* fi cd "$OLDPWD" fi } dxvkDownload() { if [ -e "DXVK/DXVK-$1" ]; then echo "DXVK-$1 already downloaded." else echo "Downloading DXVK-$1..." cd "DXVK" curl -# -L -O "https://github.com/doitsujin/dxvk/releases/download/v$1/dxvk-$1.tar.gz" if [ $? != 0 ]; then echo "Error on Downloading DXVK-$1." else mkdir -p "DXVK-$1" tar -xf "dxvk-$1.tar.gz" mv "dxvk"*"/x32" "dxvk"*"/x64" "DXVK-$1" rm -rf "dxvk"* fi cd "$OLDPWD" fi } dxvkAsyncDownload() { if [ -e "DXVK/DXVK-$1-async" ]; then echo "DXVK-$1-async already downloaded." else echo "Downloading DXVK-$1-async..." cd "DXVK" curl -# -L -O "https://github.com/Sporif/dxvk-async/releases/download/$1/dxvk-async-$1.tar.gz" if [ $? != 0 ]; then echo "Error on Downloading DXVK-$1-async." else mkdir -p "DXVK-$1-async" tar -xf "dxvk-async-$1.tar.gz" mv "dxvk"*"/x32" "dxvk"*"/x64" "DXVK-$1-async" rm -rf "dxvk"* fi cd "$OLDPWD" fi } dxvkGplAsyncDownload() { if [ -e "DXVK/DXVK-$1-gplasync" ]; then echo "DXVK-$1-gplasync already downloaded." else echo "Downloading DXVK-$1-gplasync..." cd "DXVK" curl -# -L -O "https://github.com/KreitinnSoftware/dxvk-gplasync/raw/refs/heads/main/dxvk-gplasync-v$1.tar.gz" if [ $? != 0 ]; then echo "Error on Downloading DXVK-$1-gplasync." else mkdir -p "DXVK-$1-gplasync" tar -xf "dxvk-gplasync-v$1.tar.gz" mv "dxvk"*"/x32" "dxvk"*"/x64" "DXVK-$1-gplasync" rm -rf "dxvk"* fi cd "$OLDPWD" fi } wined3dDownload() { if [ -e "WineD3D/WineD3D-($1)" ]; then echo "WineD3D-$1 already downloaded." else echo "Downloading WineD3D-$1..." cd "WineD3D" curl -# -L -O "https://downloads.fdossena.com/Projects/WineD3D/Builds/WineD3DForWindows_$1.zip" curl -# -L -O "https://downloads.fdossena.com/Projects/WineD3D/Builds/WineD3DForWindows_$1-x86_64.zip" if [ $? != 0 ]; then echo "Error on Downloading WineD3D-($1)." else mkdir -p "WineD3D-($1)/x64" mkdir -p "WineD3D-($1)/x32" 7z x "WineD3D*$1-x86_64.zip" -o"wined3d-x64" -aoa &> /dev/zero 7z x "WineD3D*$1.zip" -o"wined3d-x32" -aoa &> /dev/zero for i in $(find "wined3d-x64" -name "*.dll"); do cp -f "$i" "WineD3D-($1)/x64" done for i in $(find "wined3d-x32" -name "*.dll"); do cp -f "$i" "WineD3D-($1)/x32" done rm -rf "wined3d"* *".zip" fi cd "$OLDPWD" fi } vkd3dDownload() { if [ -e "VKD3D/VKD3D-$1" ]; then echo "VKD3D-$1 already downloaded." else cd "VKD3D" echo "Downloading VKD3D-$1..." curl -# -L -O "https://github.com/HansKristian-Work/vkd3d-proton/releases/download/v$1/vkd3d-proton-$1.tar.zst" if [ $? != 0 ]; then echo "Error on Downloading VKD3D-$1." else mkdir -p "VKD3D-$1" tar -xf "vkd3d-proton-$1.tar.zst" mv "vkd3d"*"/x64" "VKD3D-$1/" mv "vkd3d"*"/x86" "VKD3D-$1/x32" rm -rf "vkd3d"* fi cd "$OLDPWD" fi } export INIT_DIR="$PWD" export WORKDIR="$PWD/wine-utils/files" mkdir -p "$WORKDIR" cd "$WORKDIR" mkdir -p "home" "wine-utils" cd "wine-utils" mkdir -p "DXVK" "WineD3D" "VKD3D" export DXVK_GPLASYNC_LIST="" export DXVK_ASYNC_LIST="" export DXVK_LIST="" export WINED3D_LIST="" export VKD3D_LIST="" case "$1" in "--optional") DXVK_GPLASYNC_LIST="2.4-1 2.3.1-1 2.3-1 2.2-4 2.1-4" DXVK_ASYNC_LIST="2.0 1.10.3 1.10.2 1.10.1 1.10 1.9.4 1.9.3 1.9.2 1.9.1 1.9" DXVK_LIST="2.5.3 2.5.2 2.5.1 2.5 2.4.1 2.4 2.3.1 2.3 2.2 2.1 2.0 1.10.3 1.10.2 1.10.1 1.10 1.9.4 1.9.3 1.9.2 1.9.1 1.9 1.7.2 1.7.1 1.7 1.7.3" WINED3D_LIST="10.0 10.0-rc3 9.20 9.16 9.3 9.1 9.0 8.15 7.11 3.17" VKD3D_LIST="2.14.1 2.14 2.13 2.12 2.11.1 2.11 2.10 2.9 2.8" ;; *) DXVK_GPLASYNC_LIST="2.4-1" DXVK_ASYNC_LIST="1.10.3" DXVK_LIST="2.4.1 1.10.3" WINED3D_LIST="3.17 10.0" VKD3D_LIST="2.8" esac for i in $DXVK_GPLASYNC_LIST; do dxvkGplAsyncDownload "$i" done for i in $DXVK_ASYNC_LIST; do dxvkAsyncDownload "$i" done for i in $DXVK_LIST; do dxvkDownload "$i" done for i in $WINED3D_LIST; do wined3dDownload "$i" done for i in $VKD3D_LIST; do vkd3dDownload "$i" done case "$1" in "--optional") customDxvkDownload "DXVK-1.10.6-Sarek" "https://github.com/pythonlover02/DXVK-Sarek/releases/download/v1.10.6/dxvk-sarek-v1.10.6.tar.gz" customDxvkDownload "DXVK-1.10.6-Sarek-ASync" "https://github.com/pythonlover02/DXVK-Sarek/releases/download/v1.10.6/dxvk-sarek-async-v1.10.6.tar.gz" esac cp -rf "$INIT_DIR/common/"* .