From e27a2231dac5253b2c2482d2fc96f2a1fc42a6f1 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Wed, 18 Jun 2025 10:59:40 +0100 Subject: [PATCH 1/3] Add a WebGPU demo Restructures the repository to accommodate non-AudioWorkstation examples and adds an example of interacting with WebGPU via JavaScriptKit and WebAPIKit. Co-authored-by: Max Desiatov Co-authored-by: Dario Rexin Co-authored-by: Allan Shortlidge Co-authored-by: Ben Barham --- .github/workflows/pull_request.yml | 2 +- .../Guest}/.sourcekit-lsp/config.json | 0 .../Guest}/Package.swift | 0 .../Guest}/Sources/Bass/Shared | 0 .../Guest}/Sources/Bass/main.swift | 0 .../Guest}/Sources/HiHat/Shared | 0 .../Guest}/Sources/HiHat/main.swift | 0 .../Guest}/Sources/JavaScript/encoder.js | 0 .../Guest}/Sources/JavaScript/index.js | 0 .../Guest}/Sources/Kick/Shared | 0 .../Guest}/Sources/Kick/main.swift | 0 .../Guest}/Sources/Mix/Shared | 0 .../Guest}/Sources/Mix/main.swift | 0 .../Guest}/Sources/Plotter/Canvas.swift | 0 .../Guest}/Sources/Plotter/Plotter.swift | 0 .../Guest}/Sources/Plotter/main.swift | 0 .../Guest}/Sources/Shared/AudioBuffer.swift | 0 .../Guest}/Sources/Shared/AudioEncode.swift | 0 .../Guest}/Sources/Shared/DOMInterop.swift | 0 .../Sources/Shared/Effects/LadderFilter.swift | 0 .../Sources/Shared/Instruments/Bass.swift | 0 .../Sources/Shared/Instruments/Drums.swift | 0 .../Shared/Instruments/Sequencer.swift | 0 .../Guest}/Sources/Shared/Mixer.swift | 0 .../Sources/Shared/MusicTheory/Pitch.swift | 0 .../Shared/Utilities/AttackHoldRelease.swift | 0 .../Sources/Shared/Utilities/Modulator.swift | 0 .../Guest}/Sources/Shared/Waveforms/Saw.swift | 0 .../Sources/Shared/Waveforms/Signal.swift | 0 .../Sources/Shared/Waveforms/Square.swift | 0 .../Sources/Shared/Waveforms/Triangle.swift | 0 .../Sources/VultDSP/VultLibrary/phase.vult | 0 .../Sources/VultDSP/VultLibrary/tables.vult | 0 .../Sources/VultDSP/VultLibrary/util.vult | 0 .../Guest}/Sources/VultDSP/ahr.vult | 0 .../Sources/VultDSP/include/waveforms.h | 0 .../Guest}/Sources/VultDSP/kick.vult | 0 .../Guest}/Sources/VultDSP/ladder.vult | 0 .../Guest}/Sources/VultDSP/noise.vult | 0 .../Guest}/Sources/VultDSP/out.cpp | 0 .../Guest}/Sources/VultDSP/out.h | 0 .../Guest}/Sources/VultDSP/out.tables.h | 0 .../Guest}/Sources/VultDSP/saturate.vult | 0 .../Guest}/Sources/VultDSP/sine.vult | 0 .../Guest}/Sources/VultDSP/swept.vult | 0 .../Guest}/Sources/VultDSP/triangle.vult | 0 .../Guest}/Sources/VultDSP/vultin.cpp | 0 .../Guest}/Sources/VultDSP/vultin.h | 0 .../dlmalloc/include/__macro_PAGESIZE.h | 0 .../Guest}/Sources/dlmalloc/include/endian.h | 0 .../Guest}/Sources/dlmalloc/include/errno.h | 0 .../Sources/dlmalloc/include/features.h | 0 .../Guest}/Sources/dlmalloc/include/malloc.h | 0 .../Guest}/Sources/dlmalloc/include/string.h | 0 .../Guest}/Sources/dlmalloc/include/unistd.h | 0 .../Sources/dlmalloc/include/wasi_api.h | 0 .../Guest}/Sources/dlmalloc/src/abort.c | 0 .../Guest}/Sources/dlmalloc/src/dlmalloc.c | 0 .../Guest}/Sources/dlmalloc/src/errno.c | 0 .../Guest}/Sources/dlmalloc/src/memcpy.c | 0 .../Guest}/Sources/dlmalloc/src/memset.c | 0 .../Guest}/Sources/dlmalloc/src/sbrk.c | 0 .../Sources/dlmalloc/src/upstream_malloc.h | 0 {Guest => AudioWorkstation/Guest}/build.sh | 0 {Guest => AudioWorkstation/Guest}/index.html | 0 .../LICENSE-vendored.md | 0 LICENSE.txt => AudioWorkstation/LICENSE.txt | 0 AudioWorkstation/README.md | 106 + .../ServerHost}/.gitignore | 0 .../ServerHost}/Package.resolved | 0 .../ServerHost}/Package.swift | 0 .../ServerHost}/Public/.build | 0 .../ServerHost}/Public/Sources/JavaScript | 0 .../ServerHost}/Public/upload.html | 0 .../Sources/Server/App+Logger.swift | 0 .../Sources/Server/App+Router.swift | 0 .../ServerHost}/Sources/Server/App.swift | 0 .../Sources/Server/IndexPage.swift | 0 .../Sources/Server/MixedOutput.swift | 0 .../Tests/ServerTests/ServerTests.swift | 0 .../WATExample}/Package.resolved | 0 .../WATExample}/Package.swift | 0 .../WATExample}/Sources/WATExample/main.swift | 0 .../WATExample}/factorial-flat.wat | 0 .../WATExample}/factorial.wat | 0 Guest/.build/.gitkeep | 1 - README.md | 90 +- WebGPUDemo/.editorconfig | 10 + WebGPUDemo/.sourcekit-lsp/config.json | 5 + WebGPUDemo/.swift-format | 18 + WebGPUDemo/Package.resolved | 33 + WebGPUDemo/Package.swift | 28 + WebGPUDemo/README.md | 17 + .../Resources/SwiftLogo/Swift3DLogo.mtl | 7 + .../Resources/SwiftLogo/Swift3DLogo.obj | 5655 +++++++++++++++++ .../SwiftLogo/T_M_swiftLogo_BaseColor.png | Bin 0 -> 95583 bytes .../T_M_swiftLogo_MetalRoughness.png | Bin 0 -> 4153 bytes .../SwiftLogo/T_M_swiftLogo_Normal.png | Bin 0 -> 163 bytes WebGPUDemo/Resources/shaders.wgsl | 166 + WebGPUDemo/Sources/Drawable.swift | 258 + WebGPUDemo/Sources/Entrypoint.swift | 55 + WebGPUDemo/Sources/Math.swift | 220 + WebGPUDemo/Sources/Renderer.swift | 261 + WebGPUDemo/Sources/Wavefront.swift | 168 + WebGPUDemo/index.html | 36 + 105 files changed, 7053 insertions(+), 83 deletions(-) rename {Guest => AudioWorkstation/Guest}/.sourcekit-lsp/config.json (100%) rename {Guest => AudioWorkstation/Guest}/Package.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Bass/Shared (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Bass/main.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/HiHat/Shared (100%) rename {Guest => AudioWorkstation/Guest}/Sources/HiHat/main.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/JavaScript/encoder.js (100%) rename {Guest => AudioWorkstation/Guest}/Sources/JavaScript/index.js (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Kick/Shared (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Kick/main.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Mix/Shared (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Mix/main.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Plotter/Canvas.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Plotter/Plotter.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Plotter/main.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/AudioBuffer.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/AudioEncode.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/DOMInterop.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Effects/LadderFilter.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Instruments/Bass.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Instruments/Drums.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Instruments/Sequencer.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Mixer.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/MusicTheory/Pitch.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Utilities/AttackHoldRelease.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Utilities/Modulator.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Waveforms/Saw.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Waveforms/Signal.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Waveforms/Square.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/Shared/Waveforms/Triangle.swift (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/VultLibrary/phase.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/VultLibrary/tables.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/VultLibrary/util.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/ahr.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/include/waveforms.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/kick.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/ladder.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/noise.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/out.cpp (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/out.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/out.tables.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/saturate.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/sine.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/swept.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/triangle.vult (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/vultin.cpp (100%) rename {Guest => AudioWorkstation/Guest}/Sources/VultDSP/vultin.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/include/__macro_PAGESIZE.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/include/endian.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/include/errno.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/include/features.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/include/malloc.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/include/string.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/include/unistd.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/include/wasi_api.h (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/src/abort.c (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/src/dlmalloc.c (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/src/errno.c (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/src/memcpy.c (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/src/memset.c (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/src/sbrk.c (100%) rename {Guest => AudioWorkstation/Guest}/Sources/dlmalloc/src/upstream_malloc.h (100%) rename {Guest => AudioWorkstation/Guest}/build.sh (100%) rename {Guest => AudioWorkstation/Guest}/index.html (100%) rename LICENSE-vendored.md => AudioWorkstation/LICENSE-vendored.md (100%) rename LICENSE.txt => AudioWorkstation/LICENSE.txt (100%) create mode 100644 AudioWorkstation/README.md rename {ServerHost => AudioWorkstation/ServerHost}/.gitignore (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Package.resolved (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Package.swift (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Public/.build (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Public/Sources/JavaScript (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Public/upload.html (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Sources/Server/App+Logger.swift (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Sources/Server/App+Router.swift (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Sources/Server/App.swift (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Sources/Server/IndexPage.swift (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Sources/Server/MixedOutput.swift (100%) rename {ServerHost => AudioWorkstation/ServerHost}/Tests/ServerTests/ServerTests.swift (100%) rename {WATExample => AudioWorkstation/WATExample}/Package.resolved (100%) rename {WATExample => AudioWorkstation/WATExample}/Package.swift (100%) rename {WATExample => AudioWorkstation/WATExample}/Sources/WATExample/main.swift (100%) rename {WATExample => AudioWorkstation/WATExample}/factorial-flat.wat (100%) rename {WATExample => AudioWorkstation/WATExample}/factorial.wat (100%) delete mode 100644 Guest/.build/.gitkeep create mode 100644 WebGPUDemo/.editorconfig create mode 100644 WebGPUDemo/.sourcekit-lsp/config.json create mode 100644 WebGPUDemo/.swift-format create mode 100644 WebGPUDemo/Package.resolved create mode 100644 WebGPUDemo/Package.swift create mode 100644 WebGPUDemo/README.md create mode 100644 WebGPUDemo/Resources/SwiftLogo/Swift3DLogo.mtl create mode 100644 WebGPUDemo/Resources/SwiftLogo/Swift3DLogo.obj create mode 100644 WebGPUDemo/Resources/SwiftLogo/T_M_swiftLogo_BaseColor.png create mode 100644 WebGPUDemo/Resources/SwiftLogo/T_M_swiftLogo_MetalRoughness.png create mode 100644 WebGPUDemo/Resources/SwiftLogo/T_M_swiftLogo_Normal.png create mode 100644 WebGPUDemo/Resources/shaders.wgsl create mode 100644 WebGPUDemo/Sources/Drawable.swift create mode 100644 WebGPUDemo/Sources/Entrypoint.swift create mode 100644 WebGPUDemo/Sources/Math.swift create mode 100644 WebGPUDemo/Sources/Renderer.swift create mode 100644 WebGPUDemo/Sources/Wavefront.swift create mode 100644 WebGPUDemo/index.html diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index dc24580..1f6e3a3 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -9,7 +9,7 @@ jobs: name: Test uses: swiftlang/github-workflows/.github/workflows/swift_package_test.yml@main with: - linux_build_command: "cd Guest && ./build.sh" + linux_build_command: "cd AudioWorkstation/Guest && ./build.sh" linux_exclude_swift_versions: '[{"swift_version": "5.9"}, {"swift_version": "5.10"}]' enable_windows_checks: false soundness: diff --git a/Guest/.sourcekit-lsp/config.json b/AudioWorkstation/Guest/.sourcekit-lsp/config.json similarity index 100% rename from Guest/.sourcekit-lsp/config.json rename to AudioWorkstation/Guest/.sourcekit-lsp/config.json diff --git a/Guest/Package.swift b/AudioWorkstation/Guest/Package.swift similarity index 100% rename from Guest/Package.swift rename to AudioWorkstation/Guest/Package.swift diff --git a/Guest/Sources/Bass/Shared b/AudioWorkstation/Guest/Sources/Bass/Shared similarity index 100% rename from Guest/Sources/Bass/Shared rename to AudioWorkstation/Guest/Sources/Bass/Shared diff --git a/Guest/Sources/Bass/main.swift b/AudioWorkstation/Guest/Sources/Bass/main.swift similarity index 100% rename from Guest/Sources/Bass/main.swift rename to AudioWorkstation/Guest/Sources/Bass/main.swift diff --git a/Guest/Sources/HiHat/Shared b/AudioWorkstation/Guest/Sources/HiHat/Shared similarity index 100% rename from Guest/Sources/HiHat/Shared rename to AudioWorkstation/Guest/Sources/HiHat/Shared diff --git a/Guest/Sources/HiHat/main.swift b/AudioWorkstation/Guest/Sources/HiHat/main.swift similarity index 100% rename from Guest/Sources/HiHat/main.swift rename to AudioWorkstation/Guest/Sources/HiHat/main.swift diff --git a/Guest/Sources/JavaScript/encoder.js b/AudioWorkstation/Guest/Sources/JavaScript/encoder.js similarity index 100% rename from Guest/Sources/JavaScript/encoder.js rename to AudioWorkstation/Guest/Sources/JavaScript/encoder.js diff --git a/Guest/Sources/JavaScript/index.js b/AudioWorkstation/Guest/Sources/JavaScript/index.js similarity index 100% rename from Guest/Sources/JavaScript/index.js rename to AudioWorkstation/Guest/Sources/JavaScript/index.js diff --git a/Guest/Sources/Kick/Shared b/AudioWorkstation/Guest/Sources/Kick/Shared similarity index 100% rename from Guest/Sources/Kick/Shared rename to AudioWorkstation/Guest/Sources/Kick/Shared diff --git a/Guest/Sources/Kick/main.swift b/AudioWorkstation/Guest/Sources/Kick/main.swift similarity index 100% rename from Guest/Sources/Kick/main.swift rename to AudioWorkstation/Guest/Sources/Kick/main.swift diff --git a/Guest/Sources/Mix/Shared b/AudioWorkstation/Guest/Sources/Mix/Shared similarity index 100% rename from Guest/Sources/Mix/Shared rename to AudioWorkstation/Guest/Sources/Mix/Shared diff --git a/Guest/Sources/Mix/main.swift b/AudioWorkstation/Guest/Sources/Mix/main.swift similarity index 100% rename from Guest/Sources/Mix/main.swift rename to AudioWorkstation/Guest/Sources/Mix/main.swift diff --git a/Guest/Sources/Plotter/Canvas.swift b/AudioWorkstation/Guest/Sources/Plotter/Canvas.swift similarity index 100% rename from Guest/Sources/Plotter/Canvas.swift rename to AudioWorkstation/Guest/Sources/Plotter/Canvas.swift diff --git a/Guest/Sources/Plotter/Plotter.swift b/AudioWorkstation/Guest/Sources/Plotter/Plotter.swift similarity index 100% rename from Guest/Sources/Plotter/Plotter.swift rename to AudioWorkstation/Guest/Sources/Plotter/Plotter.swift diff --git a/Guest/Sources/Plotter/main.swift b/AudioWorkstation/Guest/Sources/Plotter/main.swift similarity index 100% rename from Guest/Sources/Plotter/main.swift rename to AudioWorkstation/Guest/Sources/Plotter/main.swift diff --git a/Guest/Sources/Shared/AudioBuffer.swift b/AudioWorkstation/Guest/Sources/Shared/AudioBuffer.swift similarity index 100% rename from Guest/Sources/Shared/AudioBuffer.swift rename to AudioWorkstation/Guest/Sources/Shared/AudioBuffer.swift diff --git a/Guest/Sources/Shared/AudioEncode.swift b/AudioWorkstation/Guest/Sources/Shared/AudioEncode.swift similarity index 100% rename from Guest/Sources/Shared/AudioEncode.swift rename to AudioWorkstation/Guest/Sources/Shared/AudioEncode.swift diff --git a/Guest/Sources/Shared/DOMInterop.swift b/AudioWorkstation/Guest/Sources/Shared/DOMInterop.swift similarity index 100% rename from Guest/Sources/Shared/DOMInterop.swift rename to AudioWorkstation/Guest/Sources/Shared/DOMInterop.swift diff --git a/Guest/Sources/Shared/Effects/LadderFilter.swift b/AudioWorkstation/Guest/Sources/Shared/Effects/LadderFilter.swift similarity index 100% rename from Guest/Sources/Shared/Effects/LadderFilter.swift rename to AudioWorkstation/Guest/Sources/Shared/Effects/LadderFilter.swift diff --git a/Guest/Sources/Shared/Instruments/Bass.swift b/AudioWorkstation/Guest/Sources/Shared/Instruments/Bass.swift similarity index 100% rename from Guest/Sources/Shared/Instruments/Bass.swift rename to AudioWorkstation/Guest/Sources/Shared/Instruments/Bass.swift diff --git a/Guest/Sources/Shared/Instruments/Drums.swift b/AudioWorkstation/Guest/Sources/Shared/Instruments/Drums.swift similarity index 100% rename from Guest/Sources/Shared/Instruments/Drums.swift rename to AudioWorkstation/Guest/Sources/Shared/Instruments/Drums.swift diff --git a/Guest/Sources/Shared/Instruments/Sequencer.swift b/AudioWorkstation/Guest/Sources/Shared/Instruments/Sequencer.swift similarity index 100% rename from Guest/Sources/Shared/Instruments/Sequencer.swift rename to AudioWorkstation/Guest/Sources/Shared/Instruments/Sequencer.swift diff --git a/Guest/Sources/Shared/Mixer.swift b/AudioWorkstation/Guest/Sources/Shared/Mixer.swift similarity index 100% rename from Guest/Sources/Shared/Mixer.swift rename to AudioWorkstation/Guest/Sources/Shared/Mixer.swift diff --git a/Guest/Sources/Shared/MusicTheory/Pitch.swift b/AudioWorkstation/Guest/Sources/Shared/MusicTheory/Pitch.swift similarity index 100% rename from Guest/Sources/Shared/MusicTheory/Pitch.swift rename to AudioWorkstation/Guest/Sources/Shared/MusicTheory/Pitch.swift diff --git a/Guest/Sources/Shared/Utilities/AttackHoldRelease.swift b/AudioWorkstation/Guest/Sources/Shared/Utilities/AttackHoldRelease.swift similarity index 100% rename from Guest/Sources/Shared/Utilities/AttackHoldRelease.swift rename to AudioWorkstation/Guest/Sources/Shared/Utilities/AttackHoldRelease.swift diff --git a/Guest/Sources/Shared/Utilities/Modulator.swift b/AudioWorkstation/Guest/Sources/Shared/Utilities/Modulator.swift similarity index 100% rename from Guest/Sources/Shared/Utilities/Modulator.swift rename to AudioWorkstation/Guest/Sources/Shared/Utilities/Modulator.swift diff --git a/Guest/Sources/Shared/Waveforms/Saw.swift b/AudioWorkstation/Guest/Sources/Shared/Waveforms/Saw.swift similarity index 100% rename from Guest/Sources/Shared/Waveforms/Saw.swift rename to AudioWorkstation/Guest/Sources/Shared/Waveforms/Saw.swift diff --git a/Guest/Sources/Shared/Waveforms/Signal.swift b/AudioWorkstation/Guest/Sources/Shared/Waveforms/Signal.swift similarity index 100% rename from Guest/Sources/Shared/Waveforms/Signal.swift rename to AudioWorkstation/Guest/Sources/Shared/Waveforms/Signal.swift diff --git a/Guest/Sources/Shared/Waveforms/Square.swift b/AudioWorkstation/Guest/Sources/Shared/Waveforms/Square.swift similarity index 100% rename from Guest/Sources/Shared/Waveforms/Square.swift rename to AudioWorkstation/Guest/Sources/Shared/Waveforms/Square.swift diff --git a/Guest/Sources/Shared/Waveforms/Triangle.swift b/AudioWorkstation/Guest/Sources/Shared/Waveforms/Triangle.swift similarity index 100% rename from Guest/Sources/Shared/Waveforms/Triangle.swift rename to AudioWorkstation/Guest/Sources/Shared/Waveforms/Triangle.swift diff --git a/Guest/Sources/VultDSP/VultLibrary/phase.vult b/AudioWorkstation/Guest/Sources/VultDSP/VultLibrary/phase.vult similarity index 100% rename from Guest/Sources/VultDSP/VultLibrary/phase.vult rename to AudioWorkstation/Guest/Sources/VultDSP/VultLibrary/phase.vult diff --git a/Guest/Sources/VultDSP/VultLibrary/tables.vult b/AudioWorkstation/Guest/Sources/VultDSP/VultLibrary/tables.vult similarity index 100% rename from Guest/Sources/VultDSP/VultLibrary/tables.vult rename to AudioWorkstation/Guest/Sources/VultDSP/VultLibrary/tables.vult diff --git a/Guest/Sources/VultDSP/VultLibrary/util.vult b/AudioWorkstation/Guest/Sources/VultDSP/VultLibrary/util.vult similarity index 100% rename from Guest/Sources/VultDSP/VultLibrary/util.vult rename to AudioWorkstation/Guest/Sources/VultDSP/VultLibrary/util.vult diff --git a/Guest/Sources/VultDSP/ahr.vult b/AudioWorkstation/Guest/Sources/VultDSP/ahr.vult similarity index 100% rename from Guest/Sources/VultDSP/ahr.vult rename to AudioWorkstation/Guest/Sources/VultDSP/ahr.vult diff --git a/Guest/Sources/VultDSP/include/waveforms.h b/AudioWorkstation/Guest/Sources/VultDSP/include/waveforms.h similarity index 100% rename from Guest/Sources/VultDSP/include/waveforms.h rename to AudioWorkstation/Guest/Sources/VultDSP/include/waveforms.h diff --git a/Guest/Sources/VultDSP/kick.vult b/AudioWorkstation/Guest/Sources/VultDSP/kick.vult similarity index 100% rename from Guest/Sources/VultDSP/kick.vult rename to AudioWorkstation/Guest/Sources/VultDSP/kick.vult diff --git a/Guest/Sources/VultDSP/ladder.vult b/AudioWorkstation/Guest/Sources/VultDSP/ladder.vult similarity index 100% rename from Guest/Sources/VultDSP/ladder.vult rename to AudioWorkstation/Guest/Sources/VultDSP/ladder.vult diff --git a/Guest/Sources/VultDSP/noise.vult b/AudioWorkstation/Guest/Sources/VultDSP/noise.vult similarity index 100% rename from Guest/Sources/VultDSP/noise.vult rename to AudioWorkstation/Guest/Sources/VultDSP/noise.vult diff --git a/Guest/Sources/VultDSP/out.cpp b/AudioWorkstation/Guest/Sources/VultDSP/out.cpp similarity index 100% rename from Guest/Sources/VultDSP/out.cpp rename to AudioWorkstation/Guest/Sources/VultDSP/out.cpp diff --git a/Guest/Sources/VultDSP/out.h b/AudioWorkstation/Guest/Sources/VultDSP/out.h similarity index 100% rename from Guest/Sources/VultDSP/out.h rename to AudioWorkstation/Guest/Sources/VultDSP/out.h diff --git a/Guest/Sources/VultDSP/out.tables.h b/AudioWorkstation/Guest/Sources/VultDSP/out.tables.h similarity index 100% rename from Guest/Sources/VultDSP/out.tables.h rename to AudioWorkstation/Guest/Sources/VultDSP/out.tables.h diff --git a/Guest/Sources/VultDSP/saturate.vult b/AudioWorkstation/Guest/Sources/VultDSP/saturate.vult similarity index 100% rename from Guest/Sources/VultDSP/saturate.vult rename to AudioWorkstation/Guest/Sources/VultDSP/saturate.vult diff --git a/Guest/Sources/VultDSP/sine.vult b/AudioWorkstation/Guest/Sources/VultDSP/sine.vult similarity index 100% rename from Guest/Sources/VultDSP/sine.vult rename to AudioWorkstation/Guest/Sources/VultDSP/sine.vult diff --git a/Guest/Sources/VultDSP/swept.vult b/AudioWorkstation/Guest/Sources/VultDSP/swept.vult similarity index 100% rename from Guest/Sources/VultDSP/swept.vult rename to AudioWorkstation/Guest/Sources/VultDSP/swept.vult diff --git a/Guest/Sources/VultDSP/triangle.vult b/AudioWorkstation/Guest/Sources/VultDSP/triangle.vult similarity index 100% rename from Guest/Sources/VultDSP/triangle.vult rename to AudioWorkstation/Guest/Sources/VultDSP/triangle.vult diff --git a/Guest/Sources/VultDSP/vultin.cpp b/AudioWorkstation/Guest/Sources/VultDSP/vultin.cpp similarity index 100% rename from Guest/Sources/VultDSP/vultin.cpp rename to AudioWorkstation/Guest/Sources/VultDSP/vultin.cpp diff --git a/Guest/Sources/VultDSP/vultin.h b/AudioWorkstation/Guest/Sources/VultDSP/vultin.h similarity index 100% rename from Guest/Sources/VultDSP/vultin.h rename to AudioWorkstation/Guest/Sources/VultDSP/vultin.h diff --git a/Guest/Sources/dlmalloc/include/__macro_PAGESIZE.h b/AudioWorkstation/Guest/Sources/dlmalloc/include/__macro_PAGESIZE.h similarity index 100% rename from Guest/Sources/dlmalloc/include/__macro_PAGESIZE.h rename to AudioWorkstation/Guest/Sources/dlmalloc/include/__macro_PAGESIZE.h diff --git a/Guest/Sources/dlmalloc/include/endian.h b/AudioWorkstation/Guest/Sources/dlmalloc/include/endian.h similarity index 100% rename from Guest/Sources/dlmalloc/include/endian.h rename to AudioWorkstation/Guest/Sources/dlmalloc/include/endian.h diff --git a/Guest/Sources/dlmalloc/include/errno.h b/AudioWorkstation/Guest/Sources/dlmalloc/include/errno.h similarity index 100% rename from Guest/Sources/dlmalloc/include/errno.h rename to AudioWorkstation/Guest/Sources/dlmalloc/include/errno.h diff --git a/Guest/Sources/dlmalloc/include/features.h b/AudioWorkstation/Guest/Sources/dlmalloc/include/features.h similarity index 100% rename from Guest/Sources/dlmalloc/include/features.h rename to AudioWorkstation/Guest/Sources/dlmalloc/include/features.h diff --git a/Guest/Sources/dlmalloc/include/malloc.h b/AudioWorkstation/Guest/Sources/dlmalloc/include/malloc.h similarity index 100% rename from Guest/Sources/dlmalloc/include/malloc.h rename to AudioWorkstation/Guest/Sources/dlmalloc/include/malloc.h diff --git a/Guest/Sources/dlmalloc/include/string.h b/AudioWorkstation/Guest/Sources/dlmalloc/include/string.h similarity index 100% rename from Guest/Sources/dlmalloc/include/string.h rename to AudioWorkstation/Guest/Sources/dlmalloc/include/string.h diff --git a/Guest/Sources/dlmalloc/include/unistd.h b/AudioWorkstation/Guest/Sources/dlmalloc/include/unistd.h similarity index 100% rename from Guest/Sources/dlmalloc/include/unistd.h rename to AudioWorkstation/Guest/Sources/dlmalloc/include/unistd.h diff --git a/Guest/Sources/dlmalloc/include/wasi_api.h b/AudioWorkstation/Guest/Sources/dlmalloc/include/wasi_api.h similarity index 100% rename from Guest/Sources/dlmalloc/include/wasi_api.h rename to AudioWorkstation/Guest/Sources/dlmalloc/include/wasi_api.h diff --git a/Guest/Sources/dlmalloc/src/abort.c b/AudioWorkstation/Guest/Sources/dlmalloc/src/abort.c similarity index 100% rename from Guest/Sources/dlmalloc/src/abort.c rename to AudioWorkstation/Guest/Sources/dlmalloc/src/abort.c diff --git a/Guest/Sources/dlmalloc/src/dlmalloc.c b/AudioWorkstation/Guest/Sources/dlmalloc/src/dlmalloc.c similarity index 100% rename from Guest/Sources/dlmalloc/src/dlmalloc.c rename to AudioWorkstation/Guest/Sources/dlmalloc/src/dlmalloc.c diff --git a/Guest/Sources/dlmalloc/src/errno.c b/AudioWorkstation/Guest/Sources/dlmalloc/src/errno.c similarity index 100% rename from Guest/Sources/dlmalloc/src/errno.c rename to AudioWorkstation/Guest/Sources/dlmalloc/src/errno.c diff --git a/Guest/Sources/dlmalloc/src/memcpy.c b/AudioWorkstation/Guest/Sources/dlmalloc/src/memcpy.c similarity index 100% rename from Guest/Sources/dlmalloc/src/memcpy.c rename to AudioWorkstation/Guest/Sources/dlmalloc/src/memcpy.c diff --git a/Guest/Sources/dlmalloc/src/memset.c b/AudioWorkstation/Guest/Sources/dlmalloc/src/memset.c similarity index 100% rename from Guest/Sources/dlmalloc/src/memset.c rename to AudioWorkstation/Guest/Sources/dlmalloc/src/memset.c diff --git a/Guest/Sources/dlmalloc/src/sbrk.c b/AudioWorkstation/Guest/Sources/dlmalloc/src/sbrk.c similarity index 100% rename from Guest/Sources/dlmalloc/src/sbrk.c rename to AudioWorkstation/Guest/Sources/dlmalloc/src/sbrk.c diff --git a/Guest/Sources/dlmalloc/src/upstream_malloc.h b/AudioWorkstation/Guest/Sources/dlmalloc/src/upstream_malloc.h similarity index 100% rename from Guest/Sources/dlmalloc/src/upstream_malloc.h rename to AudioWorkstation/Guest/Sources/dlmalloc/src/upstream_malloc.h diff --git a/Guest/build.sh b/AudioWorkstation/Guest/build.sh similarity index 100% rename from Guest/build.sh rename to AudioWorkstation/Guest/build.sh diff --git a/Guest/index.html b/AudioWorkstation/Guest/index.html similarity index 100% rename from Guest/index.html rename to AudioWorkstation/Guest/index.html diff --git a/LICENSE-vendored.md b/AudioWorkstation/LICENSE-vendored.md similarity index 100% rename from LICENSE-vendored.md rename to AudioWorkstation/LICENSE-vendored.md diff --git a/LICENSE.txt b/AudioWorkstation/LICENSE.txt similarity index 100% rename from LICENSE.txt rename to AudioWorkstation/LICENSE.txt diff --git a/AudioWorkstation/README.md b/AudioWorkstation/README.md new file mode 100644 index 0000000..57fd125 --- /dev/null +++ b/AudioWorkstation/README.md @@ -0,0 +1,106 @@ +# Swift Audio Workstation + +This example demonstrates support for WebAssembly in latest development snapshots of the Swift toolchain, in combination +with the [Embedded Swift mode](https://github.com/apple/swift/blob/main/docs/EmbeddedSwift/UserManual.md). +With foundational building blocks written in Swift, it utilizes C++ interop for calling into a +[DSP](https://en.wikipedia.org/wiki/Digital_signal_processing) library for synthesizing simple musical sequences. It is +written with a multi-platform approach, which makes it easy to integrate into Wasm-based serverless environment or +native applications and libraries. + +It is split into three packages: `Guest` with Wasm modules built with Embedded Swift, `ServerHost` that embeds these modules, and `WATExample` that demonstrates compilation of WebAssembly Text Format to binary Wasm modules using Swift. + +## Requirements + +WebAssembly support in Swift is available for preview in latest Trunk Development (main) snapshots at +[swift.org/download](https://www.swift.org/download). + +### macOS + +1. Install [Xcode](https://apps.apple.com/us/app/xcode/id497799835?mt=12). +2. Verify selected Xcode path by running `xcode-select -p` in the terminal. If the incorrect Xcode is selected, follow +the steps provided in ["How do I select the default version of Xcode"](https://developer.apple.com/library/archive/technotes/tn2339/_index.html#//apple_ref/doc/uid/DTS40014588-CH1-HOW_DO_I_SELECT_THE_DEFAULT_VERSION_OF_XCODE_TO_USE_FOR_MY_COMMAND_LINE_TOOLS_) section of +["Building from the Command Line with Xcode FAQ"](https://developer.apple.com/library/archive/technotes/tn2339/_index.html). +3. Download latest `main` development snapshot, you can use [`DEVELOPMENT-SNAPSHOT-2024-04-01-a`](https://download.swift.org/development/xcode/swift-DEVELOPMENT-SNAPSHOT-2024-04-01-a/swift-DEVELOPMENT-SNAPSHOT-2024-04-01-a-osx.pkg) or a later version. +4. Run the downloaded installer. Select "Install for me only" option during installation. +5. Select the newly installed snapshot in terminal: + +```sh +export TOOLCHAINS=$(plutil -extract CFBundleIdentifier raw \ + ~/Library/Developer/Toolchains/swift-latest.xctoolchain/Info.plist) +``` + +### Linux + +Follow Linux-specific instructions provided on [swift.org/install](https://www.swift.org/install/#linux) to install the +latest development toolchain for your specific distribution. + +### Docker + +1. Start a docker container in a clone of this repository using the nightly swiftlang Ubuntu image, with a `/root/build` +mount to the current directory: + +```sh +docker run --rm -it -v $(pwd):/root/build swiftlang/swift:nightly-jammy /bin/bash +``` + +2. Navigate to the package directory within the container: + +```sh +cd /root/build +``` + +## How to Build and Run + +Assuming you're within the cloned repository and have the latest development snapshots selected per the instructions +above, first build the package: + +```sh +swift build --triple wasm32-unknown-none-wasm -c release --product swift-audio +``` + +Then start the HTTP server: + +```sh +python3 -m http.server +``` + +Open http://localhost:8000 in your browser to see the project running. + +## License + +Copyright 2024 Apple Inc. and the Swift project authors. Licensed under Apache License v2.0 with Runtime Library Exception. + +See [https://swift.org/LICENSE.txt](https://swift.org/LICENSE.txt) for license information. + +See [https://swift.org/CONTRIBUTORS.txt](https://swift.org/CONTRIBUTORS.txt) for Swift project authors. + +See [`LICENSE-vendored.md`](https://github.com/swiftlang/swift-for-wasm-examples/blob/main/AudioWorkstation/LICENSE-vendored.md) for exact licenses of code vendored in this repository. Specifically: + +* Code in `Guest/Sources/dlmalloc` directory is derived from wasi-libc: https://github.com/WebAssembly/wasi-libc + +> wasi-libc as a whole is multi-licensed under the Apache License v2.0 with LLVM Exceptions, the Apache License v2.0, and the MIT License. See the LICENSE-APACHE-LLVM, LICENSE-APACHE and LICENSE-MIT files, respectively, for details. +> +> Portions of this software are derived from third-party works covered by their own licenses: +> +> dlmalloc/ - CC0; see the notice in malloc.c for details emmalloc/ - MIT; see the notice in emmalloc.c for details libc-bottom-half/cloudlibc/ - BSD-2-Clause; see the LICENSE file for details libc-top-half/musl/ - MIT; see the COPYRIGHT file for details +> +> wasi-libc's changes to these files are multi-licensed under the Apache License v2.0 with LLVM Exceptions, the Apache License v2.0, the MIT License, and the original licenses of the third-party works. + +* .wav format encoding implementation is derived from WavAudioEncoder.js library https://github.com/higuma/wav-audio-encoder-js and is licensed as following: + +> The MIT License (MIT) +> +> Copyright (c) 2015 Yuji Miyane + +* Code in `Guest/Sources/VultDSP` directory is derived from https://github.com/vult-dsp/vult and is licensed as following: + +> MIT License +> +> Copyright (c) 2017 Leonardo Laguna Ruiz + +* Web server starter template code is derived from [the Hummingbird template package](https://github.com/hummingbird-project/template) and is licensed as following: + +> Copyright (c) 2024 Adam Fowler. +> Licensed under Apache License v2.0. +> +> See https://github.com/hummingbird-project/template/blob/main/LICENSE for license information diff --git a/ServerHost/.gitignore b/AudioWorkstation/ServerHost/.gitignore similarity index 100% rename from ServerHost/.gitignore rename to AudioWorkstation/ServerHost/.gitignore diff --git a/ServerHost/Package.resolved b/AudioWorkstation/ServerHost/Package.resolved similarity index 100% rename from ServerHost/Package.resolved rename to AudioWorkstation/ServerHost/Package.resolved diff --git a/ServerHost/Package.swift b/AudioWorkstation/ServerHost/Package.swift similarity index 100% rename from ServerHost/Package.swift rename to AudioWorkstation/ServerHost/Package.swift diff --git a/ServerHost/Public/.build b/AudioWorkstation/ServerHost/Public/.build similarity index 100% rename from ServerHost/Public/.build rename to AudioWorkstation/ServerHost/Public/.build diff --git a/ServerHost/Public/Sources/JavaScript b/AudioWorkstation/ServerHost/Public/Sources/JavaScript similarity index 100% rename from ServerHost/Public/Sources/JavaScript rename to AudioWorkstation/ServerHost/Public/Sources/JavaScript diff --git a/ServerHost/Public/upload.html b/AudioWorkstation/ServerHost/Public/upload.html similarity index 100% rename from ServerHost/Public/upload.html rename to AudioWorkstation/ServerHost/Public/upload.html diff --git a/ServerHost/Sources/Server/App+Logger.swift b/AudioWorkstation/ServerHost/Sources/Server/App+Logger.swift similarity index 100% rename from ServerHost/Sources/Server/App+Logger.swift rename to AudioWorkstation/ServerHost/Sources/Server/App+Logger.swift diff --git a/ServerHost/Sources/Server/App+Router.swift b/AudioWorkstation/ServerHost/Sources/Server/App+Router.swift similarity index 100% rename from ServerHost/Sources/Server/App+Router.swift rename to AudioWorkstation/ServerHost/Sources/Server/App+Router.swift diff --git a/ServerHost/Sources/Server/App.swift b/AudioWorkstation/ServerHost/Sources/Server/App.swift similarity index 100% rename from ServerHost/Sources/Server/App.swift rename to AudioWorkstation/ServerHost/Sources/Server/App.swift diff --git a/ServerHost/Sources/Server/IndexPage.swift b/AudioWorkstation/ServerHost/Sources/Server/IndexPage.swift similarity index 100% rename from ServerHost/Sources/Server/IndexPage.swift rename to AudioWorkstation/ServerHost/Sources/Server/IndexPage.swift diff --git a/ServerHost/Sources/Server/MixedOutput.swift b/AudioWorkstation/ServerHost/Sources/Server/MixedOutput.swift similarity index 100% rename from ServerHost/Sources/Server/MixedOutput.swift rename to AudioWorkstation/ServerHost/Sources/Server/MixedOutput.swift diff --git a/ServerHost/Tests/ServerTests/ServerTests.swift b/AudioWorkstation/ServerHost/Tests/ServerTests/ServerTests.swift similarity index 100% rename from ServerHost/Tests/ServerTests/ServerTests.swift rename to AudioWorkstation/ServerHost/Tests/ServerTests/ServerTests.swift diff --git a/WATExample/Package.resolved b/AudioWorkstation/WATExample/Package.resolved similarity index 100% rename from WATExample/Package.resolved rename to AudioWorkstation/WATExample/Package.resolved diff --git a/WATExample/Package.swift b/AudioWorkstation/WATExample/Package.swift similarity index 100% rename from WATExample/Package.swift rename to AudioWorkstation/WATExample/Package.swift diff --git a/WATExample/Sources/WATExample/main.swift b/AudioWorkstation/WATExample/Sources/WATExample/main.swift similarity index 100% rename from WATExample/Sources/WATExample/main.swift rename to AudioWorkstation/WATExample/Sources/WATExample/main.swift diff --git a/WATExample/factorial-flat.wat b/AudioWorkstation/WATExample/factorial-flat.wat similarity index 100% rename from WATExample/factorial-flat.wat rename to AudioWorkstation/WATExample/factorial-flat.wat diff --git a/WATExample/factorial.wat b/AudioWorkstation/WATExample/factorial.wat similarity index 100% rename from WATExample/factorial.wat rename to AudioWorkstation/WATExample/factorial.wat diff --git a/Guest/.build/.gitkeep b/Guest/.build/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/Guest/.build/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/README.md b/README.md index 1fe8d66..750a9ef 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,16 @@ -# Swift for WebAssembly Examples +# Swift for WebAssembly Example Projects -A repository with a "Swift Audio Workstation" example built with Swift for WebAssembly running in the browser. +A collection of example projects using Swift's WebAssembly support. To learn more, see: -This example demonstrates support for WebAssembly in latest development snapshots of the Swift toolchain, in combination -with the [Embedded Swift mode](https://github.com/apple/swift/blob/main/docs/EmbeddedSwift/UserManual.md). -With foundational building blocks written in Swift, it utilizes C++ interop for calling into a -[DSP](https://en.wikipedia.org/wiki/Digital_signal_processing) library for synthesizing simple musical sequences. It is -written with a multi-platform approach, which makes it easy to integrate into Wasm-based serverless environment or -native applications and libraries. +- [Getting Started with Swift SDKs for WebAssembly](https://www.swift.org/documentation/articles/wasm-getting-started.html) +- [WebAssembly Support in Swift Vision Document](https://github.com/swiftlang/swift-evolution/blob/main/visions/webassembly.md) -The repository is split into three packages: `Guest` with Wasm modules built with Embedded Swift, `ServerHost` that embeds these modules, and `WATExample` that demonstrates compilation of WebAssembly Text Format to binary Wasm modules using Swift. -## Requirements +## Contributing to this repository -WebAssembly support in Swift is available for preview in latest Trunk Development (main) snapshots at -[swift.org/download](https://www.swift.org/download). - -### macOS - -1. Install [Xcode](https://apps.apple.com/us/app/xcode/id497799835?mt=12). -2. Verify selected Xcode path by running `xcode-select -p` in the terminal. If the incorrect Xcode is selected, follow -the steps provided in ["How do I select the default version of Xcode"](https://developer.apple.com/library/archive/technotes/tn2339/_index.html#//apple_ref/doc/uid/DTS40014588-CH1-HOW_DO_I_SELECT_THE_DEFAULT_VERSION_OF_XCODE_TO_USE_FOR_MY_COMMAND_LINE_TOOLS_) section of -["Building from the Command Line with Xcode FAQ"](https://developer.apple.com/library/archive/technotes/tn2339/_index.html). -3. Download latest `main` development snapshot, you can use [`DEVELOPMENT-SNAPSHOT-2024-04-01-a`](https://download.swift.org/development/xcode/swift-DEVELOPMENT-SNAPSHOT-2024-04-01-a/swift-DEVELOPMENT-SNAPSHOT-2024-04-01-a-osx.pkg) or a later version. -4. Run the downloaded installer: - -```sh -installer -target CurrentUserHomeDirectory -pkg ~/Downloads/swift-DEVELOPMENT-SNAPSHOT-2024-04-01-a-osx.pkg -``` - -5. Select the newly installed snapshot: - -```sh -export TOOLCHAINS=$(plutil -extract CFBundleIdentifier raw \ - ~/Library/Developer/Toolchains/swift-latest.xctoolchain/Info.plist) -``` - -### Linux - -Follow Linux-specific instructions provided on [swift.org/install](https://www.swift.org/install/#linux) to install the -latest development toolchain for your specific distribution. - -### Docker - -1. Start a docker container in a clone of this repository using the nightly swiftlang Ubuntu image, with a `/root/build` -mount to the current directory: - -```sh -docker run --rm -it -v $(pwd):/root/build swiftlang/swift:nightly-jammy /bin/bash -``` - -2. Navigate to the package directory within the container: - -```sh -cd /root/build -``` - -## How to Build and Run - -Assuming you're within the cloned repository and have the latest development snapshots selected per the instructions -above, build modules from the `Guest` package (this will copy `.wasm` modules to the home directory of the current user): - -```sh -cd Guest; ./build.sh -``` - - -Then build and start the HTTP server: - -```sh -cd ../ServerHost; swift run Server -``` - -Open http://localhost:8080 in your browser to see the project running. Use the web interface to upload previously built -`Guest` modules from the home directory. - -## Contributing to this example Contributions to Swift are welcomed and encouraged! Please see the [Contributing to Swift guide](https://swift.org/contributing/). -Before submitting the pull request, please make sure you have [tested your - changes](https://github.com/apple/swift/blob/main/docs/ContinuousIntegration.md) - and that they follow the Swift project [guidelines for contributing - code](https://swift.org/contributing/#contributing-code). - To be a truly great community, [Swift.org](https://swift.org/) needs to welcome developers from all walks of life, with different backgrounds, and with a wide range of experience. A diverse and friendly community will have more great @@ -95,8 +22,9 @@ code of conduct defined by the Contributor Covenant. This document is used across many open source communities, and we think it articulates our values well. For more, see the [Code of Conduct](https://swift.org/code-of-conduct/). -## License -See [https://swift.org/LICENSE.txt](https://swift.org/LICENSE.txt) for license information. +## Code of Conduct -See [`LICENSE-vendored.md`](https://github.com/apple/swift-for-wasm-examples/blob/main/LICENSE-vendored.md) for exact licenses of code vendored in this repository. +Like all Swift.org projects, we would like these example projects to foster a diverse and friendly +community. We expect contributors to adhere to the [Swift.org Code of +Conduct](https://swift.org/code-of-conduct/). diff --git a/WebGPUDemo/.editorconfig b/WebGPUDemo/.editorconfig new file mode 100644 index 0000000..2a9df2d --- /dev/null +++ b/WebGPUDemo/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true +xcode_trim_whitespace_on_empty_lines = true diff --git a/WebGPUDemo/.sourcekit-lsp/config.json b/WebGPUDemo/.sourcekit-lsp/config.json new file mode 100644 index 0000000..b789e87 --- /dev/null +++ b/WebGPUDemo/.sourcekit-lsp/config.json @@ -0,0 +1,5 @@ +{ + "swiftPM": { + "swiftSDK": "swift-DEVELOPMENT-SNAPSHOT-2025-06-03-a_wasm" + } +} diff --git a/WebGPUDemo/.swift-format b/WebGPUDemo/.swift-format new file mode 100644 index 0000000..41a022f --- /dev/null +++ b/WebGPUDemo/.swift-format @@ -0,0 +1,18 @@ +{ + "version": 1, + "lineLength": 120, + "indentation": { + "spaces": 2 + }, + "lineBreakBeforeEachArgument": true, + "indentConditionalCompilationBlocks": false, + "prioritizeKeepingFunctionOutputTogether": true, + "rules": { + "AlwaysUseLowerCamelCase": false, + "AmbiguousTrailingClosureOverload": false, + "NoBlockComments": false, + "OrderedImports": true, + "UseLetInEveryBoundCaseVariable": false, + "UseSynthesizedInitializer": false + } +} diff --git a/WebGPUDemo/Package.resolved b/WebGPUDemo/Package.resolved new file mode 100644 index 0000000..275b55a --- /dev/null +++ b/WebGPUDemo/Package.resolved @@ -0,0 +1,33 @@ +{ + "originHash" : "dcbd3e085935ccdf4178dc9a180a6938b0e73f641b50437486b67cc0f3d7c82b", + "pins" : [ + { + "identity" : "javascriptkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftwasm/JavaScriptKit.git", + "state" : { + "branch" : "main", + "revision" : "7eb770ee75b3c1832eef6e7a8a1d46d996fc86ae" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftlang/swift-syntax", + "state" : { + "revision" : "0687f71944021d616d34d922343dcef086855920", + "version" : "600.0.1" + } + }, + { + "identity" : "webapikit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftwasm/WebAPIKit.git", + "state" : { + "branch" : "main", + "revision" : "2832a10fdfd8b4990591d2b72d35cfacf7c647f3" + } + } + ], + "version" : 3 +} diff --git a/WebGPUDemo/Package.swift b/WebGPUDemo/Package.swift new file mode 100644 index 0000000..a766efb --- /dev/null +++ b/WebGPUDemo/Package.swift @@ -0,0 +1,28 @@ +// swift-tools-version: 6.1 + +import PackageDescription + +let package = Package( + name: "WebGPUDemo", + dependencies: [ + .package( + url: "https://github.com/swiftwasm/WebAPIKit.git", + branch: "main", + ), + .package( + url: "https://github.com/swiftwasm/JavaScriptKit.git", + branch: "main", + ), + ], + targets: [ + .executableTarget( + name: "WebGPUDemo", + dependencies: [ + .product(name: "JavaScriptKit", package: "JavaScriptKit"), + .product(name: "JavaScriptEventLoop", package: "JavaScriptKit"), + .product(name: "DOM", package: "WebAPIKit"), + .product(name: "WebGPU", package: "WebAPIKit"), + ], + ) + ] +) diff --git a/WebGPUDemo/README.md b/WebGPUDemo/README.md new file mode 100644 index 0000000..ea91abd --- /dev/null +++ b/WebGPUDemo/README.md @@ -0,0 +1,17 @@ +# WebGPU Example + +Install a development snapshot and Swift SDK for Wasm by following +https://www.swift.org/documentation/articles/wasm-getting-started.html. + +Build with the installed SDK using JavaScriptKit's `PackageToJSPlugin` plugin. Make sure to update +the Swift SDK to the installed version. +``` +swift package --swift-sdk swift-DEVELOPMENT-SNAPSHOT-2025-06-03-a_wasm js --use-cdn +``` + +Start a HTTP server with eg. `python -m http.server` or `npx serve`. And then open +http://localhost:8000 to view the render of Swift using WebGPU. + +> [!NOTE] +> If using an editor with SourceKit-LSP, make sure to update `.sourcekit-lsp/config.json` with the +> Swift SDK used in your build command. diff --git a/WebGPUDemo/Resources/SwiftLogo/Swift3DLogo.mtl b/WebGPUDemo/Resources/SwiftLogo/Swift3DLogo.mtl new file mode 100644 index 0000000..f4e6054 --- /dev/null +++ b/WebGPUDemo/Resources/SwiftLogo/Swift3DLogo.mtl @@ -0,0 +1,7 @@ +newmtl Swift3DLogo:mat_swift3Dlogo +illum 4 +Kd 0.00 0.00 0.00 +Ka 0.00 0.00 0.00 +Tf 1.00 1.00 1.00 +Ni 0.00 +map_Ka T_M_swiftLogo_BaseColor.png diff --git a/WebGPUDemo/Resources/SwiftLogo/Swift3DLogo.obj b/WebGPUDemo/Resources/SwiftLogo/Swift3DLogo.obj new file mode 100644 index 0000000..9321fd6 --- /dev/null +++ b/WebGPUDemo/Resources/SwiftLogo/Swift3DLogo.obj @@ -0,0 +1,5655 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib Swift3DLogo.mtl +g default +v 1.998495 2.052428 0.828249 +v 1.833796 2.106304 0.828249 +v 1.620065 2.357883 0.828249 +v 1.582315 2.149747 0.828249 +v 0.102326 2.392485 0.828249 +v 0.100138 2.190161 0.828249 +v 0.097085 1.987180 0.828249 +v 0.096574 1.783799 0.828249 +v -1.801218 2.359129 0.828249 +v -1.764799 2.145301 0.828249 +v -1.971031 2.317390 0.828249 +v -1.929845 2.110319 0.828249 +v -2.118914 2.268042 0.828249 +v -2.271861 2.087579 0.828249 +v -2.090128 2.076698 0.828249 +v -2.310578 1.922491 0.828249 +v -2.087108 1.892218 0.828249 +v -1.902972 1.907234 0.828249 +v -1.734639 1.932628 0.828249 +v -2.340546 1.747527 0.828249 +v -2.099774 1.716151 0.828249 +v -1.895923 1.715313 0.828249 +v -1.716999 1.727684 0.828249 +v -2.355369 1.510296 0.828249 +v -2.114149 1.489471 0.828249 +v -1.900813 1.483116 0.828249 +v -1.711130 1.485968 0.828249 +v -1.739159 -0.109514 0.828249 +v -1.939600 -0.106643 0.828249 +v -2.146834 -0.103168 0.828249 +v -2.153241 -1.684106 0.828249 +v -2.135349 -1.887227 0.828249 +v -2.358201 -0.101523 0.828249 +v -2.353949 -1.720782 0.828249 +v -2.307433 -1.947412 0.828249 +v 2.275298 -2.088891 0.828249 +v 2.317370 -1.925981 0.828249 +v 2.353388 -1.699519 0.828249 +v 2.392963 -0.086623 0.828249 +v 2.380860 1.543947 0.828249 +v 2.355559 1.781098 0.828249 +v 2.306729 1.950904 0.828249 +v 2.217527 2.107231 0.828249 +v 2.073879 2.226819 0.828249 +v 1.891038 2.306131 0.828249 +v 0.120553 -1.716015 0.828249 +v 0.122910 -1.980036 0.828249 +v 0.124765 -2.190559 0.828249 +v 0.127064 -2.400877 0.828249 +v -1.777167 -1.691605 0.828249 +v -1.793485 -1.918762 0.828249 +v -1.830145 -2.107324 0.828249 +v -1.963433 -1.681229 0.828249 +v -1.968967 -1.892595 0.828249 +v -1.997069 -2.052758 0.828249 +v 0.099685 1.532310 0.828249 +v 1.497313 -0.075511 0.828249 +v 1.524980 1.526556 0.828249 +v 1.534852 1.762164 0.828249 +v 1.551466 1.949675 0.828249 +v 1.751857 -0.076517 0.828249 +v 1.773025 1.520699 0.828249 +v 1.780124 1.748441 0.828249 +v 1.796347 1.921739 0.828249 +v 1.903917 -1.665311 0.828249 +v 1.960857 -0.080596 0.828249 +v 1.966592 1.515925 0.828249 +v 1.964328 1.736947 0.828249 +v 1.969935 1.894866 0.828249 +v 2.091472 -1.895120 0.828249 +v 2.111301 -1.668748 0.828249 +v 2.177203 -0.085412 0.828249 +v 2.170886 1.520234 0.828249 +v 2.155737 1.740219 0.828249 +v 2.136345 1.889113 0.828249 +v -2.218170 -2.106676 0.828249 +v -2.071855 -2.228746 0.828249 +v -1.885143 -2.309875 0.828249 +v 0.110950 -0.085472 0.828249 +v 1.564956 -2.384309 0.828249 +v 1.537307 -2.165154 0.828249 +v 1.513226 -1.947823 0.828249 +v 1.496584 -1.685599 0.828249 +v 1.807597 -2.359134 0.828249 +v 1.767540 -2.142413 0.828249 +v 1.736642 -1.929134 0.828249 +v 1.722727 -1.674396 0.828249 +v 1.974705 -2.317660 0.828249 +v 1.930705 -2.108961 0.828249 +v 1.905153 -1.907206 0.828249 +v 2.121346 -2.268423 0.828249 +v 2.091274 -2.077258 0.828249 +v 2.244854 -2.230733 0.828249 +v -2.115680 -2.007815 0.828249 +v 2.116024 2.008174 0.828249 +v -2.241059 2.231075 0.828249 +v 1.998495 2.052428 -0.818536 +v 1.833796 2.106304 -0.818536 +v 1.796347 1.921739 -0.818536 +v 1.969935 1.894866 -0.818536 +v 2.073879 2.226819 -0.818536 +v 1.891038 2.306131 -0.818536 +v 2.116024 2.008174 -0.818536 +v 2.217527 2.107231 -0.818536 +v 2.136345 1.889113 -0.818536 +v 1.582315 2.149747 -0.818536 +v 1.551466 1.949675 -0.818536 +v 1.620065 2.357883 -0.818536 +v 0.102326 2.392486 -0.818536 +v 0.100138 2.190161 -0.818536 +v 0.097085 1.987180 -0.818536 +v 0.096574 1.783799 -0.818536 +v 0.099685 1.532310 -0.818536 +v 2.121346 -2.268423 -0.818536 +v 1.974705 -2.317660 -0.818536 +v 2.244854 -2.230733 -0.818536 +v 2.275298 -2.088891 -0.818536 +v 2.317370 -1.925981 -0.818536 +v 2.353388 -1.699519 -0.818536 +v -1.801218 2.359129 -0.818536 +v -1.764799 2.145301 -0.818536 +v -1.734639 1.932628 -0.818536 +v -1.716999 1.727684 -0.818536 +v -1.971031 2.317390 -0.818536 +v -1.929845 2.110319 -0.818536 +v -1.902971 1.907234 -0.818536 +v -2.118915 2.268042 -0.818536 +v -2.090128 2.076698 -0.818536 +v -2.087107 1.892219 -0.818536 +v -2.241059 2.231075 -0.818536 +v -2.271861 2.087579 -0.818536 +v -2.310578 1.922491 -0.818536 +v -2.340546 1.747527 -0.818536 +v -2.099774 1.716151 -0.818536 +v -1.895922 1.715312 -0.818536 +v -2.355369 1.510296 -0.818536 +v -2.114149 1.489471 -0.818536 +v -1.900813 1.483116 -0.818536 +v -1.711130 1.485968 -0.818536 +v -2.358201 -0.101523 -0.818536 +v -1.739159 -0.109514 -0.818536 +v -1.939600 -0.106643 -0.818536 +v -2.146834 -0.103168 -0.818536 +v -1.963433 -1.681229 -0.818536 +v -1.777167 -1.691605 -0.818536 +v -2.153241 -1.684106 -0.818536 +v -2.353949 -1.720782 -0.818536 +v -2.307433 -1.947412 -0.818536 +v -2.135349 -1.887227 -0.818536 +v -1.968968 -1.892595 -0.818536 +v -2.218170 -2.106676 -0.818536 +v -2.115679 -2.007815 -0.818536 +v -1.997069 -2.052758 -0.818536 +v -1.885143 -2.309875 -0.818536 +v -1.830145 -2.107324 -0.818536 +v 2.091472 -1.895120 -0.818536 +v 2.091274 -2.077258 -0.818536 +v 2.111301 -1.668748 -0.818536 +v 2.392963 -0.086623 -0.818536 +v 2.177203 -0.085412 -0.818536 +v 2.380860 1.543947 -0.818536 +v 2.170886 1.520234 -0.818536 +v 2.355559 1.781098 -0.818536 +v 2.155737 1.740219 -0.818536 +v 2.306729 1.950904 -0.818536 +v 1.564956 -2.384309 -0.818536 +v 0.120553 -1.716015 -0.818536 +v 0.122910 -1.980036 -0.818536 +v 0.124765 -2.190559 -0.818536 +v 0.127064 -2.400877 -0.818536 +v 0.110950 -0.085472 -0.818536 +v -1.793484 -1.918762 -0.818536 +v -2.071854 -2.228746 -0.818536 +v 1.497313 -0.075511 -0.818536 +v 1.524980 1.526556 -0.818536 +v 1.534853 1.762164 -0.818536 +v 1.751857 -0.076517 -0.818536 +v 1.773025 1.520699 -0.818536 +v 1.780124 1.748441 -0.818536 +v 1.722727 -1.674396 -0.818536 +v 1.903917 -1.665311 -0.818536 +v 1.496584 -1.685599 -0.818536 +v 1.960857 -0.080596 -0.818536 +v 1.966592 1.515925 -0.818536 +v 1.964328 1.736947 -0.818536 +v 1.905153 -1.907206 -0.818536 +v 1.736643 -1.929135 -0.818536 +v 1.930705 -2.108961 -0.818536 +v 1.537307 -2.165154 -0.818536 +v 1.513226 -1.947823 -0.818536 +v 1.807597 -2.359134 -0.818536 +v 1.767540 -2.142413 -0.818536 +v 1.780114 3.535250 0.811717 +v 2.238166 3.501044 0.811717 +v 0.098487 3.537705 0.811717 +v -3.537711 -0.105876 0.811712 +v 1.710558 -3.537223 0.811708 +v 2.061859 -3.527948 0.811716 +v 2.395122 -3.473499 0.811717 +v 2.731544 -3.330359 0.811717 +v 3.104244 -3.033381 0.811717 +v 3.375079 -2.641317 0.811717 +v 3.497656 -2.280303 0.811717 +v 3.533993 -1.889772 0.811715 +v 3.537706 -0.081744 0.811715 +v 3.537191 1.705519 0.811706 +v 3.524927 2.071687 0.811715 +v 3.438766 2.472678 0.811717 +v 3.177249 2.936256 0.811717 +v 2.705739 3.329458 0.811717 +v -2.008730 3.532113 0.811716 +v -2.337551 3.486445 0.811717 +v -2.673327 3.361994 0.811717 +v -3.032638 3.104393 0.811717 +v -3.342083 2.701401 0.811717 +v -3.486417 2.330748 0.811717 +v -3.532720 1.988632 0.811713 +v -3.537728 1.653046 0.811693 +v -3.526466 -1.990484 0.811714 +v -3.443143 -2.459280 0.811717 +v -3.182642 -2.928954 0.811717 +v -2.704217 -3.329309 0.811717 +v -2.229328 -3.502556 0.811717 +v 0.148587 -3.537705 0.811716 +v 1.780114 3.535250 -0.802004 +v 2.238166 3.501044 -0.802004 +v 0.098487 3.537705 -0.802004 +v -3.537710 -0.105876 -0.802000 +v 1.710558 -3.537223 -0.801995 +v 2.061859 -3.527948 -0.802003 +v 2.395122 -3.473499 -0.802004 +v 2.731544 -3.330359 -0.802004 +v 3.104244 -3.033381 -0.802004 +v 3.375079 -2.641317 -0.802004 +v 3.497656 -2.280303 -0.802004 +v 3.533993 -1.889772 -0.802003 +v 3.537706 -0.081744 -0.802003 +v 3.537190 1.705519 -0.801993 +v 3.524927 2.071686 -0.802002 +v 3.438766 2.472678 -0.802004 +v 3.177249 2.936257 -0.802004 +v 2.705739 3.329458 -0.802004 +v -2.008730 3.532113 -0.802004 +v -2.337551 3.486445 -0.802004 +v -2.673327 3.361994 -0.802004 +v -3.032638 3.104393 -0.802004 +v -3.342083 2.701401 -0.802004 +v -3.486417 2.330748 -0.802004 +v -3.532720 1.988632 -0.802000 +v -3.537728 1.653046 -0.801981 +v -3.526467 -1.990484 -0.802001 +v -3.443143 -2.459280 -0.802004 +v -3.182642 -2.928954 -0.802004 +v -2.704217 -3.329309 -0.802004 +v -2.229328 -3.502555 -0.802004 +v 0.148587 -3.537705 -0.802004 +v -2.474991 1.524001 0.828249 +v -2.350135 1.653316 0.828249 +v -2.233215 1.498394 0.828249 +v -2.106894 1.626108 0.828249 +v -2.003787 1.484700 0.828249 +v -1.897075 1.621237 0.828249 +v -1.803912 1.483758 0.828249 +v -1.712816 1.628182 0.828249 +v -1.620515 1.489090 0.828249 +v -2.355752 1.274589 0.828249 +v -2.121941 1.261803 0.828249 +v -1.907138 1.256072 0.828249 +v -1.711443 1.256389 0.828249 +v -2.463103 -0.101249 0.828249 +v -2.252432 -0.102118 0.828249 +v -2.042444 -0.104808 0.828249 +v -1.838642 -0.108276 0.828249 +v -1.640743 -0.110162 0.828249 +v -2.057187 -1.679457 0.828249 +v -1.870577 -1.685756 0.828249 +v -2.252997 -1.698843 0.828249 +v -2.334752 -1.862956 0.828249 +v -2.220581 -1.910499 0.828249 +v -2.144926 -1.814758 0.828249 +v -2.052285 -1.883984 0.828249 +v -1.964647 -1.814018 0.828249 +v -2.269389 -2.030067 0.828249 +v -2.157526 -2.047209 0.828249 +v -2.124174 -1.954274 0.828249 +v -2.065845 -2.025076 0.828249 +v -1.978408 -1.971284 0.828249 +v -2.453591 -1.747036 0.828249 +v -2.395353 -1.991577 0.828249 +v -2.288022 -2.170767 0.828249 +v 0.128624 -2.504869 0.828249 +v -1.780028 -2.339373 0.828249 +v -1.918925 -2.409768 0.828249 +v -1.734461 -2.130566 0.828249 +v -1.855498 -2.208020 0.828249 +v 2.202031 -1.904434 0.828249 +v 2.088662 -1.984770 0.828249 +v 2.180954 -2.074086 0.828249 +v 2.099754 -2.173033 0.828249 +v 2.230837 -1.681058 0.828249 +v 2.099259 -1.807860 0.828249 +v 2.285862 -0.086532 0.828249 +v 2.483510 1.560007 0.828249 +v 2.388238 1.302794 0.828249 +v 2.276000 1.530099 0.828249 +v 2.178145 1.289075 0.828249 +v 2.453995 1.810459 0.828249 +v 2.370395 1.688240 0.828249 +v 2.255401 1.756633 0.828249 +v 2.163612 1.655837 0.828249 +v 2.393838 1.996329 0.828249 +v 2.335065 1.867951 0.828249 +v 2.220867 1.912972 0.828249 +v 2.146673 1.817713 0.828249 +v 2.286972 2.171976 0.828249 +v 2.268367 2.032060 0.828249 +v 2.125113 2.314635 0.828249 +v 1.581269 -2.491695 0.828249 +v 1.550530 -2.275061 0.828249 +v 1.524602 -2.055789 0.828249 +v 0.121813 -1.874827 0.828249 +v 1.503988 -1.842112 0.828249 +v 0.123847 -2.085270 0.828249 +v 0.125808 -2.295934 0.828249 +v 0.102070 1.295136 0.828249 +v -1.681753 -1.697339 0.828249 +v -1.783581 -1.830864 0.828249 +v -1.699677 -1.932152 0.828249 +v -1.809240 -2.010910 0.828249 +v -1.882974 -1.904881 0.828249 +v -1.918092 -2.080781 0.828249 +v -2.029054 -2.139688 0.828249 +v -1.982773 -2.273688 0.828249 +v -2.151323 -2.172989 0.828249 +v 1.517980 1.295386 0.828249 +v 1.529952 1.667364 0.828249 +v 1.635478 -1.679696 0.828249 +v 1.649888 -0.075512 0.828249 +v 1.769549 1.291434 0.828249 +v 1.676476 1.523568 0.828249 +v 1.776135 1.658343 0.828249 +v 1.686006 1.754944 0.828249 +v 1.786233 1.835069 0.828249 +v 1.811330 -1.669132 0.828249 +v 1.855412 -0.078290 0.828249 +v 1.969601 1.287434 0.828249 +v 1.869087 1.517801 0.828249 +v 1.964771 1.651124 0.828249 +v 1.872170 1.741932 0.828249 +v 1.965450 1.817313 0.828249 +v 2.003117 -1.664342 0.828249 +v 1.901496 -1.811241 0.828249 +v 1.994050 -1.897792 0.828249 +v 1.727454 -1.826779 0.828249 +v 1.820172 -1.918118 0.828249 +v 2.068495 -0.083202 0.828249 +v 2.067470 1.516123 0.828249 +v 2.058781 1.735017 0.828249 +v 1.915421 -2.006655 0.828249 +v 2.009424 -2.090698 0.828249 +v -2.122963 -2.316607 0.828249 +v 1.833936 -2.464892 0.828249 +v 1.715915 -2.373950 0.828249 +v 1.786011 -2.251096 0.828249 +v 1.681030 -2.155199 0.828249 +v 1.750544 -2.034719 0.828249 +v 1.652103 -1.938857 0.828249 +v 1.893850 -2.340011 0.828249 +v 1.949409 -2.213497 0.828249 +v 1.850421 -2.126600 0.828249 +v 1.780497 3.544748 -0.787530 +v 1.779531 3.520790 -0.811512 +v -3.547215 -0.105823 -0.787521 +v -3.523241 -0.105957 -0.811510 +v 1.709636 -3.522768 -0.811508 +v 1.711163 -3.546718 -0.787512 +v 1.779531 3.520790 0.821225 +v 1.780497 3.544748 0.797242 +v 2.034425 3.527886 0.811717 +v 2.240096 3.510365 0.797243 +v 2.235227 3.486855 0.821225 +v 0.098629 3.523231 0.821225 +v 0.098394 3.547212 0.797242 +v -1.864061 3.537461 0.811714 +v -2.007571 3.517678 0.821225 +v -2.009491 3.541595 0.797241 +v -3.523241 -0.105957 0.821223 +v -3.547215 -0.105823 0.797234 +v -3.512072 -1.988819 0.821223 +v -3.535921 -1.991578 0.797236 +v 1.711163 -3.546718 0.797225 +v 1.709637 -3.522768 0.821221 +v 1.913100 -3.535711 0.811711 +v 2.060394 -3.513538 0.821224 +v 2.062822 -3.537414 0.797240 +v 2.225807 -3.508698 0.811717 +v 2.391211 -3.459553 0.821225 +v 2.397692 -3.482659 0.797243 +v 2.559983 -3.417886 0.811717 +v 2.724282 -3.317840 0.821225 +v 2.736313 -3.338583 0.797243 +v 2.920957 -3.199421 0.811717 +v 3.093658 -3.023487 0.821225 +v 3.111197 -3.039881 0.797243 +v 3.257426 -2.840549 0.811717 +v 3.362071 -2.634959 0.821225 +v 3.383624 -2.645494 0.797243 +v 3.451777 -2.456079 0.811717 +v 3.483489 -2.277297 0.821225 +v 3.506961 -2.282278 0.797243 +v 3.522851 -2.109457 0.811717 +v 3.519544 -1.888836 0.821224 +v 3.543483 -1.890387 0.797239 +v 3.523234 -0.081696 0.821224 +v 3.547213 -0.081776 0.797239 +v 3.537720 1.393784 0.811710 +v 3.522739 1.704521 0.821220 +v 3.546683 1.706174 0.797221 +v 3.535570 1.909040 0.811710 +v 3.510546 2.069919 0.821224 +v 3.534372 2.072847 0.797239 +v 3.497330 2.260798 0.811717 +v 3.425133 2.467786 0.821225 +v 3.447721 2.475891 0.797243 +v 3.335221 2.703626 0.811717 +v 3.166033 2.927068 0.821225 +v 3.184617 2.942292 0.797243 +v 2.955406 3.153179 0.811717 +v 2.698647 3.316822 0.821225 +v 2.710398 3.337758 0.797243 +v 2.464299 3.440157 0.811717 +v -2.169597 3.516569 0.811717 +v -2.334109 3.472378 0.821225 +v -2.339812 3.495684 0.797243 +v -2.503483 3.437356 0.811717 +v -2.666693 3.349133 0.821225 +v -2.677685 3.370442 0.797243 +v -2.853021 3.253051 0.811717 +v -3.022623 3.093923 0.821225 +v -3.039217 3.111271 0.797243 +v -3.202255 2.909890 0.811717 +v -3.329393 2.694423 0.821225 +v -3.350419 2.705985 0.797243 +v -3.432333 2.510789 0.811717 +v -3.472356 2.327285 0.821225 +v -3.495653 2.333023 0.797243 +v -3.517749 2.153971 0.811717 +v -3.518284 1.987443 0.821223 +v -3.542202 1.989413 0.797235 +v -3.537720 1.842905 0.811701 +v -3.523275 1.651962 0.821215 +v -3.547222 1.653757 0.797198 +v -3.537721 1.355312 0.811701 +v -3.500232 -2.244205 0.811717 +v -3.429467 -2.454508 0.821225 +v -3.452126 -2.462413 0.797243 +v -3.340822 -2.693166 0.811717 +v -3.171379 -2.919820 0.821225 +v -3.190040 -2.934954 0.797243 +v -2.957974 -3.149734 0.811717 +v -2.697126 -3.316671 0.821225 +v -2.708874 -3.337610 0.797243 +v -2.458766 -3.441483 0.811717 +v -2.226437 -3.488355 0.821225 +v -2.231227 -3.511883 0.797243 +v -2.023612 -3.528830 0.811717 +v 0.148416 -3.523231 0.821225 +v 0.148699 -3.547212 0.797241 +v 2.034425 3.527886 -0.802004 +v 2.235227 3.486855 -0.811512 +v 2.240096 3.510365 -0.787530 +v 0.098394 3.547212 -0.787529 +v 0.098629 3.523231 -0.811512 +v 1.913100 -3.535711 -0.801998 +v 2.062822 -3.537414 -0.787527 +v 2.060394 -3.513538 -0.811511 +v 2.225807 -3.508698 -0.802004 +v 2.397692 -3.482659 -0.787530 +v 2.391211 -3.459553 -0.811512 +v 2.559983 -3.417886 -0.802004 +v 2.736313 -3.338583 -0.787530 +v 2.724282 -3.317840 -0.811512 +v 2.920957 -3.199421 -0.802004 +v 3.111197 -3.039881 -0.787530 +v 3.093658 -3.023487 -0.811512 +v 3.257426 -2.840549 -0.802004 +v 3.383624 -2.645493 -0.787530 +v 3.362071 -2.634959 -0.811512 +v 3.451777 -2.456079 -0.802004 +v 3.506961 -2.282278 -0.787530 +v 3.483489 -2.277297 -0.811512 +v 3.522851 -2.109457 -0.802004 +v 3.543484 -1.890387 -0.787527 +v 3.519544 -1.888836 -0.811511 +v 3.547213 -0.081776 -0.787527 +v 3.523234 -0.081696 -0.811511 +v 3.537720 1.393784 -0.801997 +v 3.546683 1.706174 -0.787508 +v 3.522739 1.704521 -0.811507 +v 3.535570 1.909040 -0.801997 +v 3.534372 2.072847 -0.787526 +v 3.510546 2.069919 -0.811511 +v 3.497330 2.260798 -0.802004 +v 3.447721 2.475891 -0.787530 +v 3.425133 2.467786 -0.811512 +v 3.335221 2.703626 -0.802004 +v 3.184617 2.942292 -0.787530 +v 3.166033 2.927068 -0.811512 +v 2.955406 3.153179 -0.802004 +v 2.710399 3.337758 -0.787530 +v 2.698647 3.316822 -0.811512 +v 2.464299 3.440157 -0.802004 +v -1.864061 3.537461 -0.802001 +v -2.009491 3.541595 -0.787529 +v -2.007571 3.517678 -0.811512 +v -2.169597 3.516569 -0.802004 +v -2.339812 3.495684 -0.787530 +v -2.334109 3.472378 -0.811512 +v -2.503483 3.437356 -0.802004 +v -2.677685 3.370442 -0.787530 +v -2.666693 3.349133 -0.811512 +v -2.853020 3.253051 -0.802004 +v -3.039217 3.111271 -0.787530 +v -3.022622 3.093923 -0.811512 +v -3.202255 2.909890 -0.802004 +v -3.350419 2.705985 -0.787530 +v -3.329393 2.694423 -0.811512 +v -3.432333 2.510789 -0.802004 +v -3.495653 2.333023 -0.787530 +v -3.472356 2.327285 -0.811512 +v -3.517749 2.153971 -0.802004 +v -3.542202 1.989413 -0.787522 +v -3.518284 1.987443 -0.811510 +v -3.537720 1.842905 -0.801989 +v -3.547222 1.653757 -0.787485 +v -3.523275 1.651962 -0.811502 +v -3.537721 1.355312 -0.801988 +v -3.535922 -1.991578 -0.787523 +v -3.512072 -1.988819 -0.811511 +v -3.500232 -2.244205 -0.802004 +v -3.452126 -2.462413 -0.787530 +v -3.429467 -2.454508 -0.811512 +v -3.340822 -2.693166 -0.802004 +v -3.190040 -2.934954 -0.787530 +v -3.171379 -2.919820 -0.811512 +v -2.957975 -3.149734 -0.802004 +v -2.708874 -3.337610 -0.787530 +v -2.697126 -3.316671 -0.811512 +v -2.458766 -3.441483 -0.802004 +v -2.231227 -3.511883 -0.787530 +v -2.226437 -3.488355 -0.811512 +v -2.023612 -3.528830 -0.802004 +v 0.148699 -3.547212 -0.787529 +v 0.148415 -3.523231 -0.811512 +v 1.979578 1.972252 -0.818536 +v 1.884711 1.907502 -0.818536 +v 1.812352 2.011965 -0.818536 +v 1.920556 2.080101 -0.818536 +v 1.860226 2.205312 -0.818536 +v 1.986720 2.270772 -0.818536 +v 2.030801 2.138350 -0.818536 +v 2.151756 2.172228 -0.818536 +v 2.157391 2.047491 -0.818536 +v 2.066546 2.025064 -0.818536 +v 2.124676 1.955214 -0.818536 +v 2.053257 1.885907 -0.818536 +v 1.703607 1.935499 -0.818536 +v 1.565481 2.048142 -0.818536 +v 1.739280 2.129257 -0.818536 +v 1.600601 2.253524 -0.818536 +v 1.787590 2.334939 -0.818536 +v 1.640436 2.461236 -0.818536 +v 1.925627 2.405900 -0.818536 +v 0.103165 2.492734 -0.818536 +v 0.101361 2.291529 -0.818536 +v 0.098523 2.088676 -0.818536 +v 0.096392 1.885775 -0.818536 +v 0.097763 1.680588 -0.818536 +v 2.009764 -2.418848 -0.818536 +v 2.050195 -2.293159 -0.818536 +v 2.163296 -2.359756 -0.818536 +v 2.189188 -2.245366 -0.818536 +v 2.293317 -2.279763 -0.818536 +v 2.255083 -2.168344 -0.818536 +v 2.371141 -2.129383 -0.818536 +v 2.296554 -2.008325 -0.818536 +v 2.429127 -1.960009 -0.818536 +v 2.336261 -1.841195 -0.818536 +v 2.470615 -1.722379 -0.818536 +v -1.707879 2.373929 -0.818536 +v -1.824957 2.463184 -0.818536 +v -1.676844 2.158556 -0.818536 +v -1.781746 2.252704 -0.818536 +v -1.649533 1.943743 -0.818536 +v -1.748637 2.038314 -0.818536 +v -1.630381 1.734769 -0.818536 +v -1.724183 1.829125 -0.818536 +v -1.888954 2.339901 -0.818536 +v -2.003500 2.417236 -0.818536 +v -1.848837 2.128809 -0.818536 +v -1.947603 2.214332 -0.818536 +v -1.818322 1.919920 -0.818536 +v -1.914385 2.007610 -0.818536 +v -2.047395 2.292746 -0.818536 +v -2.158174 2.358894 -0.818536 +v -2.008710 2.091071 -0.818536 +v -2.098612 2.172822 -0.818536 +v -1.990980 1.896186 -0.818536 +v -2.086324 1.983134 -0.818536 +v -2.178796 2.072833 -0.818536 +v -2.252022 2.168061 -0.818536 +v -2.186456 2.245354 -0.818536 +v -2.287430 2.280971 -0.818536 +v -2.196114 1.900777 -0.818536 +v -2.291773 2.005902 -0.818536 +v -2.423074 1.957990 -0.818536 +v -2.366472 2.129041 -0.818536 +v -2.092384 1.804040 -0.818536 +v -2.217917 1.728191 -0.818536 +v -2.327098 1.836809 -0.818536 +v -2.460409 1.772744 -0.818536 +v -1.897353 1.810224 -0.818536 +v -1.993369 1.712822 -0.818536 +v -1.804656 1.720732 -0.818536 +v -2.350135 1.653316 -0.818536 +v -2.474991 1.524001 -0.818536 +v -2.106894 1.626108 -0.818536 +v -2.233216 1.498394 -0.818536 +v -1.897075 1.621237 -0.818536 +v -2.003787 1.484700 -0.818536 +v -1.712815 1.628182 -0.818536 +v -1.803912 1.483758 -0.818536 +v -1.620515 1.489090 -0.818536 +v -2.355752 1.274589 -0.818536 +v -2.121941 1.261803 -0.818536 +v -1.907139 1.256072 -0.818536 +v -1.711443 1.256389 -0.818536 +v -2.463103 -0.101249 -0.818536 +v -1.640743 -0.110162 -0.818536 +v -1.838642 -0.108276 -0.818536 +v -2.042444 -0.104808 -0.818536 +v -1.870577 -1.685756 -0.818536 +v -2.057187 -1.679457 -0.818536 +v -2.252432 -0.102118 -0.818536 +v -2.252997 -1.698843 -0.818536 +v -2.144926 -1.814758 -0.818536 +v -2.220581 -1.910499 -0.818536 +v -2.334752 -1.862956 -0.818536 +v -1.964647 -1.814018 -0.818536 +v -2.052285 -1.883985 -0.818536 +v -2.124174 -1.954274 -0.818536 +v -2.157526 -2.047209 -0.818536 +v -2.269390 -2.030067 -0.818536 +v -1.978408 -1.971284 -0.818536 +v -2.065845 -2.025076 -0.818536 +v -2.453591 -1.747036 -0.818536 +v -2.395353 -1.991577 -0.818536 +v -2.288022 -2.170767 -0.818536 +v -1.918925 -2.409768 -0.818536 +v -1.780028 -2.339373 -0.818536 +v -1.855498 -2.208019 -0.818536 +v -1.734461 -2.130566 -0.818536 +v 2.180954 -2.074086 -0.818536 +v 2.088662 -1.984770 -0.818536 +v 2.202031 -1.904434 -0.818536 +v 2.099754 -2.173033 -0.818536 +v 2.099259 -1.807860 -0.818536 +v 2.230837 -1.681058 -0.818536 +v 2.496995 -0.085747 -0.818536 +v 2.285863 -0.086532 -0.818536 +v 2.388238 1.302794 -0.818536 +v 2.483510 1.560007 -0.818536 +v 2.276000 1.530099 -0.818536 +v 2.178145 1.289075 -0.818536 +v 2.370395 1.688240 -0.818536 +v 2.453995 1.810459 -0.818536 +v 2.163612 1.655837 -0.818536 +v 2.255401 1.756633 -0.818536 +v 2.335065 1.867951 -0.818536 +v 2.393838 1.996329 -0.818536 +v 2.146673 1.817713 -0.818536 +v 2.220867 1.912972 -0.818536 +v 2.268367 2.032060 -0.818536 +v 2.286972 2.171976 -0.818536 +v 2.125113 2.314635 -0.818536 +v 1.581269 -2.491695 -0.818536 +v 0.121813 -1.874827 -0.818536 +v 0.123847 -2.085270 -0.818536 +v 0.125808 -2.295934 -0.818536 +v 0.128624 -2.504869 -0.818536 +v -1.681753 -1.697339 -0.818536 +v -1.699677 -1.932153 -0.818536 +v -1.783581 -1.830864 -0.818536 +v -1.809240 -2.010910 -0.818536 +v -1.882975 -1.904882 -0.818536 +v -1.918092 -2.080781 -0.818536 +v -1.982773 -2.273688 -0.818536 +v -2.029054 -2.139688 -0.818536 +v -2.151323 -2.172989 -0.818536 +v 0.102070 1.295136 -0.818536 +v 1.517980 1.295386 -0.818536 +v 1.529952 1.667364 -0.818536 +v 1.541641 1.855308 -0.818536 +v 1.649888 -0.075512 -0.818536 +v 1.676475 1.523568 -0.818536 +v 1.769549 1.291434 -0.818536 +v 1.686007 1.754944 -0.818536 +v 1.776136 1.658343 -0.818536 +v 1.786233 1.835069 -0.818536 +v 1.811330 -1.669132 -0.818536 +v 1.635478 -1.679696 -0.818536 +v 1.855412 -0.078290 -0.818536 +v 1.869087 1.517801 -0.818536 +v 1.969601 1.287434 -0.818536 +v 1.872170 1.741932 -0.818536 +v 1.964771 1.651124 -0.818536 +v 1.965450 1.817313 -0.818536 +v 2.003118 -1.664342 -0.818536 +v 1.994050 -1.897792 -0.818536 +v 1.901496 -1.811241 -0.818536 +v 1.820172 -1.918118 -0.818536 +v 1.727454 -1.826779 -0.818536 +v 2.068495 -0.083202 -0.818536 +v 2.067470 1.516123 -0.818536 +v 2.058781 1.735017 -0.818536 +v 2.009424 -2.090698 -0.818536 +v 1.915421 -2.006655 -0.818536 +v -2.122963 -2.316607 -0.818536 +v 1.550530 -2.275061 -0.818536 +v 1.524602 -2.055789 -0.818536 +v 1.503988 -1.842112 -0.818536 +v 1.715915 -2.373950 -0.818536 +v 1.833936 -2.464892 -0.818536 +v 1.681030 -2.155199 -0.818536 +v 1.786011 -2.251096 -0.818536 +v 1.652103 -1.938857 -0.818536 +v 1.750544 -2.034719 -0.818536 +v 1.893850 -2.340011 -0.818536 +v 1.850421 -2.126600 -0.818536 +v 1.949409 -2.213497 -0.818536 +v 1.920556 2.080101 0.828249 +v 1.812352 2.011965 0.828249 +v 1.884711 1.907502 0.828249 +v 1.979578 1.972252 0.828249 +v 2.030801 2.138350 0.828249 +v 1.986720 2.270772 0.828249 +v 1.860226 2.205312 0.828249 +v 2.066546 2.025065 0.828249 +v 2.157391 2.047491 0.828249 +v 2.151756 2.172228 0.828249 +v 2.053257 1.885907 0.828249 +v 2.124676 1.955214 0.828249 +v 1.739280 2.129257 0.828249 +v 1.565480 2.048142 0.828249 +v 1.703607 1.935499 0.828249 +v 1.787590 2.334939 0.828249 +v 1.600601 2.253524 0.828249 +v 1.640437 2.461236 0.828249 +v 1.925627 2.405900 0.828249 +v 1.541640 1.855308 0.828249 +v 0.103165 2.492734 0.828249 +v 0.101361 2.291529 0.828249 +v 0.098523 2.088676 0.828249 +v 0.096392 1.885775 0.828249 +v 0.097763 1.680588 0.828249 +v 2.163296 -2.359756 0.828249 +v 2.050195 -2.293159 0.828249 +v 2.009764 -2.418848 0.828249 +v 2.293317 -2.279763 0.828249 +v 2.189188 -2.245366 0.828249 +v 2.371141 -2.129383 0.828249 +v 2.255083 -2.168344 0.828249 +v 2.429127 -1.960009 0.828249 +v 2.296554 -2.008325 0.828249 +v 2.470615 -1.722379 0.828249 +v 2.336261 -1.841195 0.828249 +v 2.496995 -0.085747 0.828249 +v -1.824957 2.463184 0.828249 +v -1.707879 2.373929 0.828249 +v -1.781746 2.252704 0.828249 +v -1.676844 2.158556 0.828249 +v -1.748637 2.038314 0.828249 +v -1.649533 1.943743 0.828249 +v -1.724184 1.829125 0.828249 +v -1.630381 1.734769 0.828249 +v -2.003500 2.417236 0.828249 +v -1.888954 2.339901 0.828249 +v -1.947603 2.214332 0.828249 +v -1.848837 2.128809 0.828249 +v -1.914385 2.007610 0.828249 +v -1.818322 1.919920 0.828249 +v -2.158174 2.358894 0.828249 +v -2.047395 2.292746 0.828249 +v -2.098612 2.172822 0.828249 +v -2.008710 2.091071 0.828249 +v -2.086324 1.983134 0.828249 +v -1.990980 1.896186 0.828249 +v -2.186456 2.245354 0.828249 +v -2.252022 2.168061 0.828249 +v -2.178796 2.072833 0.828249 +v -2.287430 2.280971 0.828249 +v -2.291772 2.005902 0.828249 +v -2.196114 1.900777 0.828249 +v -2.366472 2.129041 0.828249 +v -2.423074 1.957990 0.828249 +v -2.327098 1.836809 0.828249 +v -2.217917 1.728191 0.828249 +v -2.092385 1.804040 0.828249 +v -2.460409 1.772744 0.828249 +v -1.993369 1.712822 0.828249 +v -1.897353 1.810223 0.828249 +v -1.804657 1.720732 0.828249 +v 1.899090 1.991802 -0.818536 +v 1.950120 2.174289 -0.818536 +v 2.101238 2.097431 -0.818536 +v 2.053785 1.955595 -0.818536 +v 1.719400 2.030460 -0.818536 +v 1.762149 2.231487 -0.818536 +v 1.815182 2.437405 -0.818536 +v 2.089022 -2.390736 -0.818536 +v 2.233393 -2.326101 -0.818536 +v 2.337072 -2.210738 -0.818536 +v 2.402007 -2.046054 -0.818536 +v 2.451957 -1.870505 -0.818536 +v -1.726910 2.478944 -0.818536 +v -1.691576 2.266718 -0.818536 +v -1.662527 2.050685 -0.818536 +v -1.638774 1.838365 -0.818536 +v -1.917218 2.442239 -0.818536 +v -1.866987 2.234854 -0.818536 +v -1.832025 2.023475 -0.818536 +v -2.083606 2.389305 -0.818536 +v -2.023901 2.192299 -0.818536 +v -1.997414 1.992163 -0.818536 +v -2.174474 2.159963 -0.818536 +v -2.227836 2.326449 -0.818536 +v -2.186327 1.986521 -0.818536 +v -2.397010 2.044856 -0.818536 +v -2.331794 2.211457 -0.818536 +v -2.207204 1.815352 -0.818536 +v -2.444331 1.867531 -0.818536 +v -1.990374 1.803748 -0.818536 +v -1.809500 1.819213 -0.818536 +v -2.470936 1.672891 -0.818536 +v -2.226574 1.637237 -0.818536 +v -1.997736 1.621381 -0.818536 +v -1.802890 1.623854 -0.818536 +v -1.624489 1.633170 -0.818536 +v -2.471652 1.282109 -0.818536 +v -2.237881 1.267568 -0.818536 +v -2.011834 1.258051 -0.818536 +v -1.807436 1.255624 -0.818536 +v -1.617879 1.258046 -0.818536 +v -2.239198 -1.833753 -0.818536 +v -2.054026 -1.809961 -0.818536 +v -2.195428 -1.983178 -0.818536 +v -2.052971 -1.954712 -0.818536 +v -2.429499 -1.898374 -0.818536 +v -2.348713 -2.083587 -0.818536 +v -1.806391 -2.441791 -0.818536 +v -1.756060 -2.234771 -0.818536 +v 2.190002 -1.988954 -0.818536 +v 2.176195 -2.160459 -0.818536 +v 2.215734 -1.819898 -0.818536 +v 2.490763 1.312141 -0.818536 +v 2.283613 1.294718 -0.818536 +v 2.471751 1.710792 -0.818536 +v 2.266917 1.669124 -0.818536 +v 2.428749 1.904969 -0.818536 +v 2.240490 1.837467 -0.818536 +v 2.347082 2.086544 -0.818536 +v 2.195218 1.984493 -0.818536 +v 2.211993 2.248991 -0.818536 +v 2.029298 2.365957 -0.818536 +v -1.689252 -1.840052 -0.818536 +v -1.715207 -2.029342 -0.818536 +v -1.874938 -1.821585 -0.818536 +v -1.897069 -1.990787 -0.818536 +v -1.946914 -2.176341 -0.818536 +v -2.100663 -2.098011 -0.818536 +v 1.670543 1.293519 -0.818536 +v 1.681064 1.662625 -0.818536 +v 1.692998 1.844781 -0.818536 +v 1.868828 1.289154 -0.818536 +v 1.869964 1.654078 -0.818536 +v 1.876412 1.825309 -0.818536 +v 1.995717 -1.806325 -0.818536 +v 1.812981 -1.818556 -0.818536 +v 2.073091 1.287028 -0.818536 +v 2.062775 1.650774 -0.818536 +v 2.055266 1.812888 -0.818536 +v 1.998846 -1.992604 -0.818536 +v -2.211720 -2.249479 -0.818536 +v -2.024907 -2.369039 -0.818536 +v 1.737470 -2.480836 -0.818536 +v 1.697472 -2.264936 -0.818536 +v 1.665477 -2.046145 -0.818536 +v 1.642197 -1.834420 -0.818536 +v 1.924719 -2.443898 -0.818536 +v 1.869851 -2.233570 -0.818536 +v 1.833256 -2.021124 -0.818536 +v 2.025101 -2.192015 -0.818536 +v 1.899090 1.991802 0.828249 +v 1.950120 2.174289 0.828249 +v 2.101238 2.097431 0.828249 +v 2.053785 1.955595 0.828249 +v 1.719400 2.030460 0.828249 +v 1.762149 2.231487 0.828249 +v 1.815182 2.437405 0.828249 +v 2.089022 -2.390736 0.828249 +v 2.233393 -2.326100 0.828249 +v 2.337072 -2.210738 0.828249 +v 2.402007 -2.046054 0.828249 +v 2.451957 -1.870505 0.828249 +v -1.726910 2.478944 0.828249 +v -1.691576 2.266718 0.828249 +v -1.662527 2.050685 0.828249 +v -1.638774 1.838366 0.828249 +v -1.917218 2.442239 0.828249 +v -1.866987 2.234854 0.828249 +v -1.832025 2.023475 0.828249 +v -2.083606 2.389305 0.828249 +v -2.023901 2.192299 0.828249 +v -1.997414 1.992163 0.828249 +v -2.174474 2.159963 0.828249 +v -2.227836 2.326449 0.828249 +v -2.186328 1.986521 0.828249 +v -2.397010 2.044856 0.828249 +v -2.331794 2.211457 0.828249 +v -2.207204 1.815353 0.828249 +v -2.444331 1.867531 0.828249 +v -1.990374 1.803748 0.828249 +v -1.809500 1.819213 0.828249 +v -2.470936 1.672890 0.828249 +v -2.226574 1.637237 0.828249 +v -1.997736 1.621381 0.828249 +v -1.802890 1.623854 0.828249 +v -1.624489 1.633170 0.828249 +v -2.471652 1.282109 0.828249 +v -2.237881 1.267568 0.828249 +v -2.011834 1.258051 0.828249 +v -1.807436 1.255624 0.828249 +v -1.617879 1.258046 0.828249 +v -2.239198 -1.833753 0.828249 +v -2.054026 -1.809961 0.828249 +v -2.195428 -1.983178 0.828249 +v -2.052972 -1.954711 0.828249 +v -2.429499 -1.898374 0.828249 +v -2.348713 -2.083587 0.828249 +v -1.806391 -2.441791 0.828249 +v -1.756060 -2.234771 0.828249 +v 2.190002 -1.988954 0.828249 +v 2.176195 -2.160459 0.828249 +v 2.215734 -1.819898 0.828249 +v 2.490763 1.312141 0.828249 +v 2.283613 1.294718 0.828249 +v 2.471751 1.710792 0.828249 +v 2.266917 1.669124 0.828249 +v 2.428750 1.904969 0.828249 +v 2.240490 1.837467 0.828249 +v 2.347083 2.086544 0.828249 +v 2.195218 1.984493 0.828249 +v 2.211993 2.248991 0.828249 +v 2.029298 2.365957 0.828249 +v -1.689252 -1.840052 0.828249 +v -1.715207 -2.029342 0.828249 +v -1.874938 -1.821585 0.828249 +v -1.897069 -1.990787 0.828249 +v -1.946914 -2.176341 0.828249 +v -2.100663 -2.098011 0.828249 +v 1.670543 1.293519 0.828249 +v 1.681064 1.662625 0.828249 +v 1.692998 1.844781 0.828249 +v 1.868828 1.289154 0.828249 +v 1.869964 1.654078 0.828249 +v 1.876411 1.825309 0.828249 +v 1.995717 -1.806325 0.828249 +v 1.812981 -1.818556 0.828249 +v 2.073091 1.287028 0.828249 +v 2.062775 1.650774 0.828249 +v 2.055266 1.812888 0.828249 +v 1.998846 -1.992604 0.828249 +v -2.211720 -2.249479 0.828249 +v -2.024907 -2.369038 0.828249 +v 1.737470 -2.480836 0.828249 +v 1.697472 -2.264936 0.828249 +v 1.665477 -2.046145 0.828249 +v 1.642197 -1.834420 0.828249 +v 1.924719 -2.443898 0.828249 +v 1.869851 -2.233570 0.828249 +v 1.833256 -2.021124 0.828249 +v 2.025101 -2.192015 0.828249 +v 2.035424 3.537355 0.797243 +v 2.032904 3.513470 0.821225 +v -1.863330 3.522991 0.821224 +v -1.864541 3.546966 0.797237 +v 1.912024 -3.521256 0.821222 +v 1.913807 -3.545207 0.797231 +v 2.223325 -3.494433 0.821225 +v 2.227438 -3.518069 0.797243 +v 2.554446 -3.404512 0.821225 +v 2.563621 -3.426670 0.797243 +v 2.911972 -3.188071 0.821225 +v 2.926858 -3.206877 0.797243 +v 3.245482 -2.832371 0.821225 +v 3.265271 -2.845921 0.797243 +v 3.438047 -2.451490 0.821225 +v 3.460796 -2.459094 0.797243 +v 3.508474 -2.107715 0.821225 +v 3.532295 -2.110601 0.797243 +v 3.523260 1.393216 0.821222 +v 3.547219 1.394158 0.797228 +v 3.521118 1.907802 0.821222 +v 3.545063 1.909853 0.797228 +v 3.483173 2.257736 0.821225 +v 3.506629 2.262810 0.797243 +v 3.322561 2.696601 0.821225 +v 3.343537 2.708241 0.797243 +v 2.946124 3.142072 0.821225 +v 2.961503 3.160474 0.797243 +v 2.467509 3.449110 0.797243 +v 2.459411 3.426527 0.821225 +v -2.167480 3.502245 0.821225 +v -2.170987 3.525977 0.797243 +v -2.498511 3.423762 0.821225 +v -2.506749 3.446285 0.797243 +v -2.844664 3.241229 0.821225 +v -2.858510 3.260816 0.797243 +v -3.190767 2.901086 0.821225 +v -3.209802 2.915673 0.797243 +v -3.418802 2.505641 0.821225 +v -3.441220 2.514171 0.797243 +v -3.503417 2.151901 0.821225 +v -3.527164 2.155330 0.797243 +v -3.523260 1.841861 0.821218 +v -3.547219 1.843590 0.797213 +v -3.523261 1.354553 0.821218 +v -3.547220 1.355811 0.797212 +v -3.486046 -2.241278 0.821225 +v -3.509550 -2.246127 0.797243 +v -3.328112 -2.686231 0.821225 +v -3.349171 -2.697721 0.797243 +v -2.948667 -3.138649 0.821225 +v -2.964088 -3.157015 0.797243 +v -2.453908 -3.427841 0.821225 +v -2.461956 -3.450443 0.797243 +v -2.022139 -3.514407 0.821225 +v -2.024580 -3.538303 0.797243 +v 2.032904 3.513470 -0.811512 +v 2.035424 3.537355 -0.787530 +v 1.913806 -3.545207 -0.787518 +v 1.912024 -3.521256 -0.811509 +v 2.227438 -3.518069 -0.787530 +v 2.223325 -3.494433 -0.811512 +v 2.563621 -3.426670 -0.787530 +v 2.554446 -3.404512 -0.811512 +v 2.926858 -3.206877 -0.787530 +v 2.911972 -3.188071 -0.811512 +v 3.265271 -2.845921 -0.787530 +v 3.245482 -2.832371 -0.811512 +v 3.460796 -2.459094 -0.787530 +v 3.438047 -2.451490 -0.811512 +v 3.532295 -2.110601 -0.787530 +v 3.508474 -2.107715 -0.811512 +v 3.547219 1.394158 -0.787516 +v 3.523260 1.393216 -0.811509 +v 3.545062 1.909853 -0.787516 +v 3.521118 1.907802 -0.811509 +v 3.506629 2.262810 -0.787530 +v 3.483173 2.257736 -0.811512 +v 3.343537 2.708241 -0.787530 +v 3.322561 2.696601 -0.811512 +v 2.961503 3.160475 -0.787530 +v 2.946124 3.142072 -0.811512 +v 2.459411 3.426527 -0.811512 +v 2.467509 3.449110 -0.787530 +v -1.864541 3.546966 -0.787524 +v -1.863330 3.522991 -0.811511 +v -2.170987 3.525977 -0.787530 +v -2.167480 3.502245 -0.811512 +v -2.506748 3.446285 -0.787530 +v -2.498511 3.423761 -0.811512 +v -2.858509 3.260816 -0.787530 +v -2.844664 3.241229 -0.811512 +v -3.209802 2.915673 -0.787530 +v -3.190766 2.901086 -0.811512 +v -3.441221 2.514171 -0.787530 +v -3.418802 2.505641 -0.811512 +v -3.527164 2.155330 -0.787530 +v -3.503417 2.151901 -0.811512 +v -3.547219 1.843590 -0.787500 +v -3.523260 1.841861 -0.811505 +v -3.547220 1.355812 -0.787499 +v -3.523261 1.354553 -0.811505 +v -3.509550 -2.246127 -0.787530 +v -3.486046 -2.241278 -0.811512 +v -3.349171 -2.697721 -0.787530 +v -3.328112 -2.686231 -0.811512 +v -2.964088 -3.157016 -0.787530 +v -2.948667 -3.138649 -0.811512 +v -2.461956 -3.450443 -0.787530 +v -2.453908 -3.427841 -0.811512 +v -2.024580 -3.538303 -0.787530 +v -2.022139 -3.514407 -0.811512 +vt 0.750890 0.214184 +vt 0.751471 0.351387 +vt 0.750262 0.351409 +vt 0.749681 0.214197 +vt 0.752679 0.351350 +vt 0.752099 0.214167 +vt 0.748960 0.096982 +vt 0.750169 0.096981 +vt 0.751377 0.096990 +vt 0.751780 0.675226 +vt 0.752989 0.675235 +vt 0.753132 0.807160 +vt 0.751925 0.807198 +vt 0.754198 0.675248 +vt 0.754337 0.807095 +vt 0.626840 0.341138 +vt 0.625632 0.341204 +vt 0.624615 0.232162 +vt 0.625823 0.232129 +vt 0.624423 0.341247 +vt 0.623406 0.232191 +vt 0.635912 0.097413 +vt 0.637120 0.097393 +vt 0.637568 0.214993 +vt 0.636359 0.214988 +vt 0.638329 0.097383 +vt 0.638777 0.214994 +vt 0.637221 0.079562 +vt 0.638429 0.079565 +vt 0.637261 0.065174 +vt 0.638468 0.065182 +vt 0.748546 0.064776 +vt 0.748706 0.079205 +vt 0.636013 0.079569 +vt 0.636054 0.065169 +vt 0.639586 0.351814 +vt 0.638377 0.351804 +vt 0.637168 0.351779 +vt 0.638454 0.361951 +vt 0.637246 0.361960 +vt 0.639663 0.361938 +vt 0.638450 0.675922 +vt 0.639658 0.675901 +vt 0.640337 0.807134 +vt 0.639132 0.807077 +vt 0.640867 0.675883 +vt 0.641544 0.807164 +vt 0.513609 0.342208 +vt 0.512399 0.342188 +vt 0.511257 0.233144 +vt 0.512466 0.233146 +vt 0.511191 0.342147 +vt 0.512600 0.356371 +vt 0.511391 0.356354 +vt 0.512744 0.366802 +vt 0.511536 0.366816 +vt 0.513809 0.356371 +vt 0.624493 0.355370 +vt 0.513953 0.366782 +vt 0.512909 0.378384 +vt 0.511702 0.378404 +vt 0.513090 0.390511 +vt 0.511883 0.390531 +vt 0.514117 0.378361 +vt 0.624547 0.365786 +vt 0.624602 0.377340 +vt 0.514297 0.390488 +vt 0.513246 0.402740 +vt 0.512037 0.402767 +vt 0.513355 0.416268 +vt 0.512149 0.416298 +vt 0.514454 0.402716 +vt 0.624652 0.389481 +vt 0.624726 0.401690 +vt 0.514563 0.416245 +vt 0.513503 0.432431 +vt 0.512299 0.432449 +vt 0.513714 0.449776 +vt 0.512506 0.449786 +vt 0.514709 0.432413 +vt 0.624873 0.415214 +vt 0.625030 0.431372 +vt 0.514921 0.449764 +vt 0.513840 0.467053 +vt 0.512636 0.467057 +vt 0.513990 0.483297 +vt 0.512784 0.483292 +vt 0.515048 0.467048 +vt 0.625140 0.448733 +vt 0.625327 0.466018 +vt 0.515198 0.483298 +vt 0.514109 0.497376 +vt 0.512900 0.497373 +vt 0.514181 0.510145 +vt 0.512974 0.510148 +vt 0.515317 0.497377 +vt 0.625469 0.482251 +vt 0.625603 0.496325 +vt 0.515389 0.510145 +vt 0.514252 0.522264 +vt 0.513045 0.522281 +vt 0.514307 0.537705 +vt 0.513100 0.537750 +vt 0.515459 0.522256 +vt 0.625763 0.509059 +vt 0.625914 0.521167 +vt 0.515515 0.537677 +vt 0.515262 0.663733 +vt 0.514053 0.663741 +vt 0.516471 0.663726 +vt 0.516082 0.766748 +vt 0.514873 0.766723 +vt 0.517291 0.766759 +vt 0.516283 0.788538 +vt 0.515075 0.788499 +vt 0.517493 0.788554 +vt 0.628140 0.765961 +vt 0.628278 0.787723 +vt 0.516503 0.802786 +vt 0.515294 0.802769 +vt 0.516668 0.814196 +vt 0.515459 0.814214 +vt 0.517712 0.802786 +vt 0.628283 0.801922 +vt 0.517876 0.814172 +vt 0.516881 0.827608 +vt 0.515675 0.827635 +vt 0.517083 0.843011 +vt 0.515877 0.843035 +vt 0.518088 0.827580 +vt 0.628299 0.813333 +vt 0.628298 0.826716 +vt 0.518289 0.842989 +vt 0.517243 0.860763 +vt 0.516038 0.860769 +vt 0.517239 0.880488 +vt 0.516034 0.880453 +vt 0.518448 0.860759 +vt 0.628334 0.842160 +vt 0.628438 0.859926 +vt 0.518443 0.880528 +vt 0.516584 0.902019 +vt 0.634995 0.009091 +vt 0.637042 0.030130 +vt 0.635839 0.030174 +vt 0.517797 0.902151 +vt 0.628725 0.879639 +vt 0.749109 0.008141 +vt 0.638244 0.030080 +vt 0.637251 0.048751 +vt 0.638457 0.048744 +vt 0.748477 0.029716 +vt 0.748423 0.048345 +vt 0.636044 0.048756 +vt 0.638550 0.373291 +vt 0.637342 0.373304 +vt 0.638659 0.385256 +vt 0.637452 0.385270 +vt 0.639758 0.373274 +vt 0.750278 0.361530 +vt 0.750286 0.372840 +vt 0.639867 0.385239 +vt 0.638748 0.397414 +vt 0.637539 0.397432 +vt 0.638810 0.410463 +vt 0.637606 0.410482 +vt 0.639955 0.397397 +vt 0.750284 0.384813 +vt 0.750300 0.396950 +vt 0.640017 0.410446 +vt 0.638900 0.425225 +vt 0.637694 0.425241 +vt 0.638983 0.441590 +vt 0.637775 0.441604 +vt 0.640107 0.425211 +vt 0.750348 0.410000 +vt 0.750376 0.424745 +vt 0.640192 0.441579 +vt 0.639008 0.459689 +vt 0.637804 0.459691 +vt 0.639123 0.477301 +vt 0.637917 0.477288 +vt 0.640215 0.459687 +vt 0.750423 0.441112 +vt 0.750553 0.459224 +vt 0.640331 0.477307 +vt 0.639192 0.492107 +vt 0.637983 0.492096 +vt 0.639189 0.505318 +vt 0.637982 0.505311 +vt 0.640400 0.492116 +vt 0.750592 0.476840 +vt 0.750654 0.491647 +vt 0.640396 0.505328 +vt 0.639171 0.517903 +vt 0.637963 0.517896 +vt 0.639156 0.529548 +vt 0.637947 0.529552 +vt 0.640379 0.517912 +vt 0.750775 0.504832 +vt 0.750905 0.517433 +vt 0.640365 0.529551 +vt 0.639152 0.539753 +vt 0.637943 0.539796 +vt 0.639149 0.553036 +vt 0.637941 0.553105 +vt 0.640361 0.539729 +vt 0.751023 0.529047 +vt 0.751117 0.539234 +vt 0.640359 0.552993 +vt 0.639235 0.573824 +vt 0.638027 0.573880 +vt 0.640444 0.573786 +vt 0.751238 0.552469 +vt 0.751336 0.573270 +vt 0.640507 0.825069 +vt 0.639301 0.825063 +vt 0.640559 0.840696 +vt 0.639353 0.840705 +vt 0.641713 0.825068 +vt 0.751831 0.825009 +vt 0.641766 0.840687 +vt 0.640600 0.858613 +vt 0.639395 0.858609 +vt 0.640471 0.878540 +vt 0.639266 0.878497 +vt 0.641805 0.858619 +vt 0.751833 0.840619 +vt 0.751847 0.858533 +vt 0.641674 0.878589 +vt 0.639658 0.900390 +vt 0.506930 0.010279 +vt 0.509189 0.031660 +vt 0.507987 0.031716 +vt 0.640870 0.900532 +vt 0.752022 0.878430 +vt 0.621211 0.008140 +vt 0.510391 0.031598 +vt 0.509568 0.050595 +vt 0.508361 0.050614 +vt 0.509737 0.067269 +vt 0.508530 0.067282 +vt 0.510775 0.050575 +vt 0.620756 0.030089 +vt 0.620870 0.048997 +vt 0.510944 0.067258 +vt 0.509874 0.081849 +vt 0.508668 0.081911 +vt 0.510048 0.233137 +vt 0.511080 0.081809 +vt 0.621127 0.065635 +vt 0.621357 0.080155 +vt 0.749914 0.079191 +vt 0.751121 0.079188 +vt 0.749753 0.064759 +vt 0.750960 0.064744 +vt 0.625702 0.355347 +vt 0.625756 0.365783 +vt 0.626911 0.355307 +vt 0.626964 0.365774 +vt 0.625810 0.377341 +vt 0.625859 0.389481 +vt 0.627018 0.377339 +vt 0.627066 0.389478 +vt 0.625934 0.401691 +vt 0.626081 0.415215 +vt 0.627143 0.401695 +vt 0.627287 0.415221 +vt 0.626236 0.431367 +vt 0.626348 0.448722 +vt 0.627440 0.431363 +vt 0.627556 0.448710 +vt 0.626534 0.466001 +vt 0.626676 0.482228 +vt 0.627738 0.465982 +vt 0.627882 0.482201 +vt 0.626810 0.496301 +vt 0.626971 0.509038 +vt 0.628019 0.496276 +vt 0.628178 0.509019 +vt 0.627121 0.521152 +vt 0.627345 0.536528 +vt 0.626137 0.536520 +vt 0.628329 0.521147 +vt 0.628553 0.536552 +vt 0.627334 0.662952 +vt 0.628543 0.662939 +vt 0.629752 0.662927 +vt 0.629349 0.765930 +vt 0.630557 0.765886 +vt 0.629487 0.787688 +vt 0.630695 0.787630 +vt 0.629492 0.801904 +vt 0.629508 0.813337 +vt 0.630701 0.801868 +vt 0.630716 0.813336 +vt 0.629506 0.826726 +vt 0.629543 0.842164 +vt 0.630713 0.826734 +vt 0.630751 0.842169 +vt 0.629643 0.859912 +vt 0.629927 0.879585 +vt 0.630848 0.859900 +vt 0.631129 0.879534 +vt 0.630886 0.901390 +vt 0.749681 0.029752 +vt 0.632087 0.901212 +vt 0.750886 0.029784 +vt 0.749629 0.048342 +vt 0.750834 0.048337 +vt 0.751487 0.361532 +vt 0.752696 0.361529 +vt 0.751494 0.372846 +vt 0.751492 0.384819 +vt 0.752702 0.372849 +vt 0.752699 0.384822 +vt 0.751509 0.396957 +vt 0.751556 0.410007 +vt 0.752719 0.396965 +vt 0.752763 0.410016 +vt 0.751583 0.424750 +vt 0.751630 0.441112 +vt 0.752789 0.424756 +vt 0.752836 0.441117 +vt 0.751759 0.459216 +vt 0.751799 0.476823 +vt 0.752964 0.459208 +vt 0.753005 0.476799 +vt 0.751862 0.491628 +vt 0.751982 0.504812 +vt 0.753070 0.491606 +vt 0.753189 0.504794 +vt 0.752113 0.517412 +vt 0.752232 0.529033 +vt 0.753321 0.517395 +vt 0.753440 0.529027 +vt 0.752327 0.539246 +vt 0.752448 0.552502 +vt 0.753536 0.539279 +vt 0.753657 0.552561 +vt 0.752546 0.573298 +vt 0.753754 0.573344 +vt 0.753037 0.825007 +vt 0.753042 0.840623 +vt 0.754243 0.824995 +vt 0.754248 0.840628 +vt 0.753053 0.858523 +vt 0.753225 0.878382 +vt 0.754259 0.858516 +vt 0.754427 0.878337 +vt 0.754077 0.900527 +vt 0.621961 0.030115 +vt 0.755279 0.900354 +vt 0.623166 0.030138 +vt 0.622076 0.048987 +vt 0.622335 0.065616 +vt 0.623281 0.048974 +vt 0.623542 0.065599 +vt 0.622564 0.080168 +vt 0.623770 0.080203 +vt 0.048278 0.967284 +vt 0.033004 0.951739 +vt 0.100573 0.905614 +vt 0.064581 0.978224 +vt 0.020578 0.934183 +vt 0.095079 0.900289 +vt 0.105045 0.900739 +vt 0.106657 0.909850 +vt 0.080755 0.985300 +vt 0.012817 0.917207 +vt 0.090394 0.894095 +vt 0.100417 0.896074 +vt 0.109196 0.896507 +vt 0.110392 0.904314 +vt 0.113078 0.913105 +vt 0.095637 0.989251 +vt 0.008591 0.901331 +vt 0.086735 0.887251 +vt 0.096526 0.890528 +vt 0.105650 0.892538 +vt 0.111945 0.893586 +vt 0.113664 0.899152 +vt 0.116160 0.906969 +vt 0.119583 0.915488 +vt 0.113258 0.991070 +vt 0.006770 0.887071 +vt 0.108832 0.111182 +vt 0.114427 0.112502 +vt 0.113063 0.118119 +vt 0.106900 0.116621 +vt 0.110742 0.106433 +vt 0.115590 0.107323 +vt 0.119828 0.113175 +vt 0.118946 0.119123 +vt 0.111655 0.124173 +vt 0.105071 0.122676 +vt 0.100327 0.114558 +vt 0.102835 0.108927 +vt 0.105691 0.104012 +vt 0.111920 0.102980 +vt 0.115617 0.102376 +vt 0.120453 0.107360 +vt 0.124682 0.119702 +vt 0.125241 0.113488 +vt 0.117952 0.125290 +vt 0.110364 0.130660 +vt 0.103469 0.129272 +vt 0.098161 0.120832 +vt 0.093593 0.112004 +vt 0.096661 0.105921 +vt 0.100471 0.100486 +vt 0.109176 0.100093 +vt 0.113573 0.097453 +vt 0.120230 0.101561 +vt 0.125549 0.107220 +vt 0.124001 0.125996 +vt 0.130501 0.119998 +vt 0.130849 0.113566 +vt 0.116992 0.131762 +vt 0.109130 0.141402 +vt 0.102038 0.140227 +vt 0.096334 0.127676 +vt 0.091125 0.118681 +vt 0.090532 0.102345 +vt 0.086950 0.109032 +vt 0.095114 0.096282 +vt 0.105007 0.095896 +vt 0.118565 0.095662 +vt 0.110254 0.092348 +vt 0.125213 0.100840 +vt 0.130984 0.106974 +vt 0.123323 0.132502 +vt 0.130047 0.126422 +vt 0.136633 0.120152 +vt 0.136839 0.113535 +vt 0.116002 0.142380 +vt 0.106298 0.243783 +vt 0.099215 0.243670 +vt 0.094796 0.138951 +vt 0.089114 0.125901 +vt 0.084163 0.116267 +vt 0.012910 0.078997 +vt 0.020569 0.062300 +vt 0.100489 0.091049 +vt 0.032766 0.045027 +vt 0.123834 0.094293 +vt 0.115917 0.089670 +vt 0.106451 0.086854 +vt 0.130621 0.100207 +vt 0.136864 0.106695 +vt 0.122588 0.143066 +vt 0.129593 0.132990 +vt 0.136335 0.126700 +vt 0.146144 0.120213 +vt 0.146275 0.113408 +vt 0.113382 0.243883 +vt 0.108952 0.366688 +vt 0.101423 0.367687 +vt 0.092140 0.243584 +vt 0.087512 0.137592 +vt 0.081963 0.123975 +vt 0.008697 0.094644 +vt 0.047773 0.029679 +vt 0.129476 0.093252 +vt 0.121707 0.087692 +vt 0.112747 0.083591 +vt 0.063859 0.018753 +vt 0.136510 0.099658 +vt 0.146261 0.106367 +vt 0.120459 0.243931 +vt 0.129089 0.143539 +vt 0.136036 0.133335 +vt 0.145941 0.126917 +vt 0.162101 0.120230 +vt 0.162221 0.113197 +vt 0.116416 0.365781 +vt 0.109815 0.372698 +vt 0.102349 0.373825 +vt 0.093875 0.368715 +vt 0.085094 0.243517 +vt 0.080299 0.136170 +vt 0.006837 0.108766 +vt 0.135583 0.092448 +vt 0.127768 0.086262 +vt 0.119123 0.081154 +vt 0.079829 0.011593 +vt 0.145974 0.099150 +vt 0.162250 0.105974 +vt 0.123770 0.365030 +vt 0.127577 0.243919 +vt 0.135705 0.143881 +vt 0.145741 0.133655 +vt 0.161942 0.127159 +vt 0.257537 0.121165 +vt 0.257698 0.113806 +vt 0.117192 0.371721 +vt 0.110851 0.378517 +vt 0.103500 0.379690 +vt 0.094853 0.375008 +vt 0.086392 0.369853 +vt 0.078097 0.243458 +vt 0.006323 0.126451 +vt 0.145285 0.091813 +vt 0.134249 0.085226 +vt 0.125719 0.079392 +vt 0.094489 0.007540 +vt 0.162107 0.098642 +vt 0.257880 0.106294 +vt 0.131000 0.364445 +vt 0.124415 0.370991 +vt 0.134780 0.243836 +vt 0.145532 0.144228 +vt 0.161796 0.134069 +vt 0.257413 0.128393 +vt 0.368564 0.124245 +vt 0.368297 0.117783 +vt 0.118079 0.377561 +vt 0.111959 0.384265 +vt 0.104791 0.385344 +vt 0.096099 0.380957 +vt 0.087425 0.376367 +vt 0.079063 0.371182 +vt 0.006142 0.243774 +vt 0.161713 0.091281 +vt 0.144319 0.084495 +vt 0.132675 0.078152 +vt 0.107598 0.005628 +vt 0.258034 0.098706 +vt 0.368229 0.110859 +vt 0.138091 0.364034 +vt 0.131495 0.370490 +vt 0.125107 0.376946 +vt 0.145129 0.243702 +vt 0.161666 0.144717 +vt 0.257343 0.135510 +vt 0.368931 0.130428 +vt 0.378481 0.117952 +vt 0.378992 0.124130 +vt 0.118964 0.383469 +vt 0.113037 0.390060 +vt 0.106134 0.390848 +vt 0.097531 0.386583 +vt 0.088768 0.382490 +vt 0.080163 0.378024 +vt 0.006169 0.380715 +vt 0.161149 0.083979 +vt 0.258112 0.091123 +vt 0.143198 0.077331 +vt 0.118913 0.004888 +vt 0.368537 0.103309 +vt 0.378138 0.111376 +vt 0.138439 0.370198 +vt 0.148147 0.363757 +vt 0.131980 0.376608 +vt 0.125735 0.383077 +vt 0.161682 0.243535 +vt 0.257343 0.146158 +vt 0.369301 0.136518 +vt 0.379566 0.130099 +vt 0.385179 0.117697 +vt 0.385941 0.123628 +vt 0.119735 0.389611 +vt 0.113667 0.396265 +vt 0.107137 0.396530 +vt 0.099069 0.391908 +vt 0.090339 0.388218 +vt 0.081626 0.384463 +vt 0.006542 0.390782 +vt 0.160497 0.076824 +vt 0.258119 0.083648 +vt 0.369396 0.094966 +vt 0.133102 0.004773 +vt 0.378245 0.104150 +vt 0.384522 0.111493 +vt 0.148365 0.370081 +vt 0.138741 0.376485 +vt 0.164272 0.363573 +vt 0.132359 0.382977 +vt 0.126187 0.389569 +vt 0.258038 0.242916 +vt 0.369713 0.146211 +vt 0.380100 0.136049 +vt 0.386710 0.129458 +vt 0.393129 0.122715 +vt 0.392119 0.116981 +vt 0.120012 0.396320 +vt 0.107407 0.402718 +vt 0.113431 0.403244 +vt 0.100429 0.397122 +vt 0.092059 0.393548 +vt 0.083371 0.390484 +vt 0.007621 0.401944 +vt 0.154830 0.004734 +vt 0.258057 0.076387 +vt 0.370685 0.086413 +vt 0.379085 0.096021 +vt 0.384335 0.104694 +vt 0.391139 0.111158 +vt 0.164387 0.370103 +vt 0.148519 0.376556 +vt 0.138924 0.383058 +vt 0.259761 0.365171 +vt 0.132532 0.389778 +vt 0.126166 0.396688 +vt 0.371838 0.242246 +vt 0.380637 0.145695 +vt 0.387388 0.135358 +vt 0.394078 0.128488 +vt 0.400491 0.121517 +vt 0.399259 0.115914 +vt 0.119415 0.403927 +vt 0.101326 0.402416 +vt 0.106378 0.409213 +vt 0.112078 0.410603 +vt 0.093783 0.398539 +vt 0.085320 0.396075 +vt 0.009707 0.413574 +vt 0.257775 0.004729 +vt 0.372280 0.078232 +vt 0.380572 0.087609 +vt 0.384985 0.096978 +vt 0.390592 0.104890 +vt 0.397985 0.110420 +vt 0.259715 0.372040 +vt 0.164441 0.376803 +vt 0.148564 0.383319 +vt 0.138914 0.390083 +vt 0.370532 0.368032 +vt 0.132300 0.397204 +vt 0.125377 0.404702 +vt 0.382922 0.242158 +vt 0.388014 0.145050 +vt 0.394876 0.134424 +vt 0.401594 0.127302 +vt 0.407956 0.120161 +vt 0.406555 0.114609 +vt 0.117899 0.411916 +vt 0.100761 0.407828 +vt 0.095367 0.403252 +vt 0.109359 0.417947 +vt 0.103484 0.415816 +vt 0.087443 0.401279 +vt 0.013102 0.425048 +vt 0.383910 0.004997 +vt 0.382618 0.079535 +vt 0.386489 0.088928 +vt 0.390884 0.097818 +vt 0.397046 0.104708 +vt 0.405055 0.109326 +vt 0.370132 0.374691 +vt 0.259629 0.378983 +vt 0.164409 0.383762 +vt 0.148453 0.390506 +vt 0.138584 0.397702 +vt 0.380492 0.368555 +vt 0.131460 0.405450 +vt 0.123879 0.413069 +vt 0.390265 0.242082 +vt 0.395550 0.144256 +vt 0.402487 0.133339 +vt 0.409180 0.126012 +vt 0.415385 0.118486 +vt 0.413824 0.112844 +vt 0.115422 0.419766 +vt 0.097733 0.413395 +vt 0.096364 0.407063 +vt 0.089708 0.406140 +vt 0.077185 0.489282 +vt 0.064009 0.483041 +vt 0.018312 0.436786 +vt 0.399187 0.005773 +vt 0.388864 0.081129 +vt 0.392236 0.090381 +vt 0.396825 0.098449 +vt 0.403731 0.104116 +vt 0.412114 0.107575 +vt 0.379851 0.375139 +vt 0.369724 0.381210 +vt 0.259515 0.386029 +vt 0.164271 0.391068 +vt 0.148120 0.398208 +vt 0.137807 0.406054 +vt 0.386920 0.369283 +vt 0.130110 0.414008 +vt 0.121735 0.421250 +vt 0.397609 0.242017 +vt 0.403182 0.143370 +vt 0.410146 0.132192 +vt 0.416720 0.124506 +vt 0.422635 0.116332 +vt 0.420886 0.110397 +vt 0.089633 0.493021 +vt 0.049585 0.473365 +vt 0.092882 0.410299 +vt 0.025844 0.449208 +vt 0.411023 0.007519 +vt 0.394869 0.083022 +vt 0.397858 0.091865 +vt 0.402853 0.098782 +vt 0.410388 0.102610 +vt 0.418924 0.104865 +vt 0.385985 0.375830 +vt 0.379203 0.381515 +vt 0.369408 0.387691 +vt 0.259387 0.393207 +vt 0.164009 0.398753 +vt 0.147497 0.406518 +vt 0.136685 0.414678 +vt 0.393703 0.370367 +vt 0.128350 0.422373 +vt 0.101874 0.495191 +vt 0.404958 0.241952 +vt 0.410853 0.142447 +vt 0.417754 0.130904 +vt 0.424100 0.122668 +vt 0.493542 0.083760 +vt 0.495978 0.095478 +vt 0.036126 0.461628 +vt 0.423181 0.010692 +vt 0.400684 0.085176 +vt 0.403403 0.093276 +vt 0.408778 0.097875 +vt 0.416762 0.099682 +vt 0.489699 0.072367 +vt 0.392416 0.376929 +vt 0.385017 0.382075 +vt 0.378675 0.387776 +vt 0.369284 0.394234 +vt 0.259272 0.400493 +vt 0.163607 0.406845 +vt 0.146666 0.415044 +vt 0.135319 0.423108 +vt 0.400768 0.371711 +vt 0.113353 0.496230 +vt 0.412312 0.241880 +vt 0.418478 0.141440 +vt 0.425214 0.129400 +vt 0.497313 0.106849 +vt 0.435986 0.015997 +vt 0.406362 0.087554 +vt 0.407757 0.093990 +vt 0.414413 0.094790 +vt 0.483649 0.060513 +vt 0.399145 0.378388 +vt 0.391012 0.383059 +vt 0.384159 0.388077 +vt 0.378392 0.394013 +vt 0.369608 0.400938 +vt 0.259199 0.407863 +vt 0.163116 0.415072 +vt 0.145710 0.423392 +vt 0.123514 0.496579 +vt 0.408040 0.373218 +vt 0.419637 0.241792 +vt 0.425972 0.140301 +vt 0.497854 0.117205 +vt 0.449765 0.024135 +vt 0.411179 0.090608 +vt 0.474591 0.047414 +vt 0.406173 0.380158 +vt 0.397293 0.384526 +vt 0.389651 0.388736 +vt 0.383558 0.393892 +vt 0.378727 0.400357 +vt 0.370637 0.407900 +vt 0.259158 0.415245 +vt 0.162591 0.423161 +vt 0.136768 0.496582 +vt 0.415341 0.374891 +vt 0.426895 0.241683 +vt 0.497962 0.131331 +vt 0.463104 0.034732 +vt 0.413282 0.382227 +vt 0.403962 0.386538 +vt 0.395337 0.390038 +vt 0.388494 0.393940 +vt 0.383784 0.399689 +vt 0.380052 0.406937 +vt 0.372168 0.414946 +vt 0.259138 0.422567 +vt 0.157527 0.496584 +vt 0.422488 0.376731 +vt 0.498003 0.240302 +vt 0.420253 0.384585 +vt 0.410756 0.389040 +vt 0.401404 0.392270 +vt 0.393405 0.394838 +vt 0.388463 0.398909 +vt 0.385408 0.405637 +vt 0.382090 0.413605 +vt 0.374000 0.421900 +vt 0.259467 0.496589 +vt 0.497375 0.391801 +vt 0.495554 0.406061 +vt 0.417410 0.391981 +vt 0.407619 0.395257 +vt 0.398495 0.397268 +vt 0.392200 0.398316 +vt 0.390481 0.403882 +vt 0.387984 0.411699 +vt 0.384562 0.420218 +vt 0.390887 0.495800 +vt 0.491328 0.421937 +vt 0.413751 0.398824 +vt 0.403727 0.400803 +vt 0.394949 0.401236 +vt 0.393753 0.409043 +vt 0.391067 0.417834 +vt 0.408508 0.493980 +vt 0.483567 0.438912 +vt 0.409066 0.405018 +vt 0.399099 0.405469 +vt 0.397488 0.414579 +vt 0.423390 0.490029 +vt 0.471140 0.456469 +vt 0.403572 0.410343 +vt 0.439563 0.482954 +vt 0.455867 0.472013 +vt 0.395314 0.606453 +vt 0.397245 0.611892 +vt 0.391083 0.613391 +vt 0.389718 0.607773 +vt 0.401310 0.604198 +vt 0.403819 0.609829 +vt 0.399074 0.617947 +vt 0.392490 0.619444 +vt 0.385200 0.614394 +vt 0.384318 0.608446 +vt 0.388556 0.602594 +vt 0.393404 0.601704 +vt 0.398454 0.599283 +vt 0.407485 0.601192 +vt 0.410552 0.607275 +vt 0.405984 0.616103 +vt 0.400677 0.624544 +vt 0.393781 0.625931 +vt 0.386193 0.620561 +vt 0.379463 0.614973 +vt 0.378905 0.608759 +vt 0.383692 0.602631 +vt 0.388529 0.597647 +vt 0.392225 0.598251 +vt 0.394969 0.595364 +vt 0.403674 0.595757 +vt 0.413613 0.597616 +vt 0.417195 0.604303 +vt 0.413020 0.613952 +vt 0.407811 0.622947 +vt 0.402107 0.635498 +vt 0.395016 0.636673 +vt 0.387154 0.627033 +vt 0.380145 0.621267 +vt 0.373644 0.615269 +vt 0.373296 0.608837 +vt 0.378596 0.602491 +vt 0.383916 0.596832 +vt 0.390572 0.592724 +vt 0.399138 0.591167 +vt 0.409032 0.591553 +vt 0.483577 0.557571 +vt 0.491236 0.574269 +vt 0.419983 0.611538 +vt 0.415031 0.621172 +vt 0.409350 0.634222 +vt 0.404930 0.738941 +vt 0.397847 0.739054 +vt 0.388144 0.637651 +vt 0.380822 0.627774 +vt 0.374099 0.621693 +vt 0.367513 0.615423 +vt 0.367307 0.608806 +vt 0.373161 0.602245 +vt 0.378933 0.596111 +vt 0.385581 0.590934 +vt 0.393892 0.587619 +vt 0.403657 0.586321 +vt 0.471379 0.540299 +vt 0.495448 0.589916 +vt 0.422182 0.619246 +vt 0.416633 0.632863 +vt 0.412005 0.738856 +vt 0.402722 0.862958 +vt 0.395193 0.861959 +vt 0.390763 0.739154 +vt 0.381558 0.638337 +vt 0.374553 0.628261 +vt 0.367811 0.621971 +vt 0.358002 0.615484 +vt 0.357871 0.608679 +vt 0.367282 0.601966 +vt 0.373524 0.595479 +vt 0.380311 0.589564 +vt 0.388228 0.584941 +vt 0.397694 0.582125 +vt 0.456372 0.524950 +vt 0.497308 0.604037 +vt 0.423847 0.631441 +vt 0.419051 0.738788 +vt 0.410270 0.863987 +vt 0.401796 0.869097 +vt 0.394329 0.867969 +vt 0.387729 0.861052 +vt 0.383686 0.739202 +vt 0.375057 0.638811 +vt 0.368110 0.628606 +vt 0.358204 0.622188 +vt 0.342044 0.615501 +vt 0.341924 0.608468 +vt 0.357885 0.601638 +vt 0.367635 0.594929 +vt 0.374670 0.588523 +vt 0.382439 0.582964 +vt 0.391398 0.578862 +vt 0.440287 0.514024 +vt 0.497823 0.621722 +vt 0.426048 0.738730 +vt 0.417753 0.865125 +vt 0.409292 0.870279 +vt 0.400645 0.874962 +vt 0.393294 0.873788 +vt 0.386953 0.866992 +vt 0.380375 0.860302 +vt 0.376569 0.739190 +vt 0.368441 0.639153 +vt 0.358405 0.628926 +vt 0.342204 0.622430 +vt 0.246609 0.616436 +vt 0.246448 0.609077 +vt 0.341896 0.601245 +vt 0.358172 0.594421 +vt 0.368563 0.587719 +vt 0.376377 0.581533 +vt 0.385022 0.576425 +vt 0.424317 0.506864 +vt 0.498003 0.739046 +vt 0.425082 0.866453 +vt 0.416720 0.871639 +vt 0.408046 0.876228 +vt 0.399354 0.880615 +vt 0.392186 0.879536 +vt 0.386066 0.872832 +vt 0.379730 0.866262 +vt 0.373145 0.859716 +vt 0.369365 0.739107 +vt 0.358613 0.639499 +vt 0.342349 0.629340 +vt 0.246732 0.623664 +vt 0.135582 0.619515 +vt 0.135849 0.613053 +vt 0.246266 0.601564 +vt 0.342039 0.593913 +vt 0.358860 0.587084 +vt 0.369897 0.580497 +vt 0.378427 0.574663 +vt 0.409657 0.502812 +vt 0.497976 0.875986 +vt 0.423982 0.873295 +vt 0.415377 0.877761 +vt 0.406613 0.881854 +vt 0.398011 0.886119 +vt 0.391108 0.885331 +vt 0.385181 0.878740 +vt 0.379038 0.872217 +vt 0.372650 0.865761 +vt 0.366054 0.859305 +vt 0.359016 0.738973 +vt 0.342479 0.639988 +vt 0.246802 0.630780 +vt 0.135214 0.625699 +vt 0.125153 0.619400 +vt 0.125664 0.613223 +vt 0.135916 0.606130 +vt 0.246112 0.593977 +vt 0.342433 0.586552 +vt 0.359827 0.579766 +vt 0.371471 0.573424 +vt 0.396548 0.500899 +vt 0.497603 0.886054 +vt 0.422519 0.879734 +vt 0.413806 0.883489 +vt 0.405075 0.887179 +vt 0.397007 0.891801 +vt 0.390478 0.891536 +vt 0.384410 0.884882 +vt 0.378410 0.878348 +vt 0.372165 0.871879 +vt 0.365706 0.865469 +vt 0.355998 0.859028 +vt 0.342463 0.738806 +vt 0.246802 0.641429 +vt 0.134844 0.631788 +vt 0.124579 0.625369 +vt 0.118205 0.618899 +vt 0.118967 0.612968 +vt 0.126007 0.606647 +vt 0.135609 0.598580 +vt 0.246033 0.586393 +vt 0.342997 0.579250 +vt 0.360948 0.572602 +vt 0.385233 0.500160 +vt 0.496524 0.897215 +vt 0.420774 0.885756 +vt 0.412086 0.888819 +vt 0.403716 0.892393 +vt 0.396738 0.897989 +vt 0.390714 0.898515 +vt 0.384133 0.891591 +vt 0.377958 0.884840 +vt 0.371786 0.878248 +vt 0.365403 0.871756 +vt 0.355780 0.865352 +vt 0.339873 0.858844 +vt 0.246107 0.738187 +vt 0.134432 0.641482 +vt 0.124046 0.631320 +vt 0.117436 0.624728 +vt 0.111016 0.617986 +vt 0.112026 0.612251 +vt 0.119624 0.606763 +vt 0.125900 0.599420 +vt 0.134750 0.590237 +vt 0.246027 0.578918 +vt 0.343649 0.572095 +vt 0.371044 0.500044 +vt 0.494438 0.908845 +vt 0.418824 0.891346 +vt 0.410361 0.893810 +vt 0.402818 0.897687 +vt 0.397767 0.904484 +vt 0.392067 0.905874 +vt 0.384730 0.899198 +vt 0.377979 0.891959 +vt 0.371612 0.885049 +vt 0.365221 0.878329 +vt 0.355626 0.871828 +vt 0.339758 0.865374 +vt 0.244384 0.860442 +vt 0.132307 0.737517 +vt 0.123509 0.640965 +vt 0.116757 0.630628 +vt 0.110067 0.623758 +vt 0.103655 0.616788 +vt 0.104886 0.611185 +vt 0.113007 0.606429 +vt 0.119810 0.599964 +vt 0.125060 0.591292 +vt 0.133461 0.581684 +vt 0.246088 0.571658 +vt 0.349316 0.500005 +vt 0.491043 0.920319 +vt 0.416702 0.896550 +vt 0.408778 0.898524 +vt 0.403383 0.903099 +vt 0.400660 0.911087 +vt 0.394785 0.913218 +vt 0.386245 0.907187 +vt 0.378768 0.899973 +vt 0.371845 0.892475 +vt 0.365231 0.885354 +vt 0.355581 0.878590 +vt 0.339704 0.872074 +vt 0.244429 0.867311 +vt 0.133613 0.863303 +vt 0.121223 0.737429 +vt 0.116131 0.640321 +vt 0.109269 0.629695 +vt 0.102551 0.622572 +vt 0.096189 0.615432 +vt 0.097591 0.609879 +vt 0.106161 0.605691 +vt 0.113554 0.600161 +vt 0.119160 0.592248 +vt 0.123574 0.582880 +vt 0.131865 0.573502 +vt 0.246370 0.500000 +vt 0.485833 0.932058 +vt 0.414437 0.901411 +vt 0.407781 0.902334 +vt 0.406412 0.908666 +vt 0.440135 0.978312 +vt 0.426959 0.984553 +vt 0.388723 0.915038 +vt 0.380266 0.908340 +vt 0.372685 0.900721 +vt 0.365561 0.892973 +vt 0.355692 0.885777 +vt 0.339736 0.879032 +vt 0.244516 0.874254 +vt 0.134013 0.869962 +vt 0.123653 0.863826 +vt 0.113880 0.737352 +vt 0.108596 0.639527 +vt 0.101658 0.628609 +vt 0.094966 0.621283 +vt 0.088761 0.613757 +vt 0.090321 0.608114 +vt 0.099090 0.604597 +vt 0.107099 0.599979 +vt 0.113262 0.593088 +vt 0.117657 0.584199 +vt 0.121528 0.574805 +vt 0.120236 0.500268 +vt 0.478301 0.944479 +vt 0.411263 0.905570 +vt 0.454559 0.968636 +vt 0.414511 0.988292 +vt 0.382410 0.916522 +vt 0.374035 0.909279 +vt 0.366337 0.901325 +vt 0.356025 0.893480 +vt 0.339874 0.886340 +vt 0.244630 0.881300 +vt 0.134421 0.876481 +vt 0.124294 0.870409 +vt 0.117225 0.864553 +vt 0.106536 0.737287 +vt 0.100963 0.638640 +vt 0.094000 0.627462 +vt 0.087426 0.619776 +vt 0.081511 0.611602 +vt 0.083259 0.605667 +vt 0.092031 0.602846 +vt 0.100415 0.599387 +vt 0.107321 0.593720 +vt 0.111910 0.585652 +vt 0.115282 0.576399 +vt 0.104959 0.501044 +vt 0.468019 0.956900 +vt 0.402270 0.990462 +vt 0.375795 0.917644 +vt 0.367460 0.909949 +vt 0.356648 0.901789 +vt 0.340136 0.894024 +vt 0.244758 0.888478 +vt 0.134737 0.882962 +vt 0.124942 0.876785 +vt 0.118159 0.871100 +vt 0.110442 0.865637 +vt 0.099187 0.737223 +vt 0.093292 0.637717 +vt 0.086392 0.626175 +vt 0.080045 0.617938 +vt 0.008168 0.590748 +vt 0.010604 0.579030 +vt 0.085222 0.600136 +vt 0.093758 0.597880 +vt 0.101293 0.594052 +vt 0.106287 0.587135 +vt 0.109277 0.578292 +vt 0.093122 0.502789 +vt 0.390792 0.991501 +vt 0.368826 0.918379 +vt 0.357478 0.910315 +vt 0.340538 0.902116 +vt 0.244872 0.895764 +vt 0.134861 0.889505 +vt 0.125470 0.883046 +vt 0.119128 0.877346 +vt 0.111728 0.872200 +vt 0.103377 0.866981 +vt 0.091833 0.737150 +vt 0.085668 0.636710 +vt 0.078932 0.624670 +vt 0.006832 0.602120 +vt 0.014447 0.567637 +vt 0.087384 0.594952 +vt 0.095367 0.593145 +vt 0.100742 0.588547 +vt 0.103461 0.580447 +vt 0.080965 0.505963 +vt 0.380631 0.991850 +vt 0.358435 0.918663 +vt 0.341028 0.910343 +vt 0.244946 0.903134 +vt 0.134536 0.896209 +vt 0.125753 0.889284 +vt 0.119986 0.883348 +vt 0.113133 0.878330 +vt 0.105000 0.873659 +vt 0.096105 0.868488 +vt 0.084508 0.737062 +vt 0.078173 0.635571 +vt 0.006292 0.612475 +vt 0.020497 0.555784 +vt 0.089733 0.590060 +vt 0.096388 0.589261 +vt 0.097784 0.582825 +vt 0.068159 0.511267 +vt 0.367376 0.991853 +vt 0.341553 0.918432 +vt 0.244987 0.910516 +vt 0.133508 0.903171 +vt 0.125418 0.895628 +vt 0.120587 0.889162 +vt 0.114494 0.884006 +vt 0.106852 0.879797 +vt 0.097972 0.875428 +vt 0.088804 0.870161 +vt 0.077250 0.736953 +vt 0.006184 0.626602 +vt 0.029555 0.542684 +vt 0.092967 0.585878 +vt 0.054381 0.519405 +vt 0.346618 0.991855 +vt 0.245006 0.917838 +vt 0.131977 0.910216 +vt 0.124093 0.902207 +vt 0.120361 0.894959 +vt 0.115651 0.889210 +vt 0.108808 0.885309 +vt 0.100183 0.881808 +vt 0.090863 0.877497 +vt 0.081656 0.872001 +vt 0.006142 0.735572 +vt 0.041042 0.530003 +vt 0.244678 0.991860 +vt 0.130144 0.917170 +vt 0.122055 0.908876 +vt 0.118737 0.900908 +vt 0.115681 0.894179 +vt 0.110740 0.890108 +vt 0.102741 0.887541 +vt 0.093389 0.884311 +vt 0.083892 0.879855 +vt 0.751525 0.008434 +vt 0.750321 0.008274 +vt 0.629675 0.901542 +vt 0.637408 0.008778 +vt 0.636197 0.008921 +vt 0.515381 0.901859 +vt 0.623629 0.008417 +vt 0.622424 0.008265 +vt 0.752866 0.900673 +vt 0.509339 0.009939 +vt 0.508130 0.010095 +vt 0.638455 0.900221 +vn 0.000000 0.000000 -1.000000 +vn 0.000001 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000001 0.000000 -1.000000 +vn -0.000001 0.000001 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000001 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000001 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000001 0.000000 -1.000000 +vn -0.000001 0.000000 -1.000000 +vn 0.000000 0.000001 -1.000000 +vn -0.000000 0.000001 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000120 0.006181 -0.999981 +vn 0.001054 0.005883 -0.999982 +vn 0.001762 0.005557 -0.999983 +vn 0.000033 0.006227 -0.999981 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000060 0.006244 -0.999981 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.001445 -0.005762 -0.999982 +vn 0.001754 -0.005596 -0.999983 +vn 0.002524 -0.015344 -0.999879 +vn 0.004081 -0.014974 -0.999880 +vn 0.002072 -0.005445 -0.999983 +vn 0.002428 -0.005339 -0.999983 +vn 0.006118 -0.014380 -0.999878 +vn 0.008102 -0.013405 -0.999877 +vn 0.000001 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.003191 -0.005091 -0.999982 +vn 0.000000 0.000000 -1.000000 +vn 0.004514 -0.004105 -0.999981 +vn 0.009796 -0.012310 -0.999876 +vn 0.011566 -0.010844 -0.999874 +vn 0.005298 -0.002795 -0.999982 +vn 0.000000 -0.000000 -1.000000 +vn 0.005438 -0.002156 -0.999983 +vn -0.000000 0.000000 -1.000000 +vn 0.013984 -0.007061 -0.999877 +vn 0.012958 -0.008936 -0.999876 +vn 0.005519 -0.001848 -0.999983 +vn -0.000000 -0.000000 -1.000000 +vn 0.005654 -0.001545 -0.999983 +vn -0.000000 0.000000 -1.000000 +vn 0.015212 -0.003134 -0.999879 +vn 0.014773 -0.005021 -0.999878 +vn 0.005899 -0.000963 -0.999982 +vn 0.000000 -0.000000 -1.000000 +vn 0.006183 -0.000091 -0.999981 +vn -0.000000 -0.000000 -1.000000 +vn 0.016582 -0.000127 -0.999863 +vn 0.015764 -0.001486 -0.999875 +vn 0.016244 -0.000041 -0.999868 +vn 0.006228 -0.000042 -0.999981 +vn 0.006258 0.000035 -0.999981 +vn 0.016258 0.000011 -0.999868 +vn 0.015882 0.000540 -0.999874 +vn 0.015972 0.000080 -0.999872 +vn 0.006085 0.000661 -0.999981 +vn 0.006196 0.000262 -0.999981 +vn 0.015099 0.003270 -0.999881 +vn 0.015424 0.001692 -0.999880 +vn 0.005647 0.001740 -0.999983 +vn 0.005872 0.001239 -0.999982 +vn 0.013286 0.007511 -0.999884 +vn 0.014417 0.005301 -0.999882 +vn 0.004957 0.002915 -0.999984 +vn 0.005343 0.002304 -0.999983 +vn 0.009677 0.011590 -0.999886 +vn 0.011707 0.009893 -0.999883 +vn 0.003793 0.004249 -0.999984 +vn 0.004432 0.003595 -0.999984 +vn 0.007638 0.013063 -0.999886 +vn 0.003047 0.004860 -0.999984 +vn 0.005259 0.014313 -0.999884 +vn 0.002306 0.005252 -0.999984 +vn 0.003075 0.014972 -0.999883 +vn 0.001189 0.015560 -0.999878 +vn -0.000000 0.000000 -1.000000 +vn -0.001099 0.005949 -0.999982 +vn -0.000047 0.016531 -0.999863 +vn -0.001082 0.015577 -0.999878 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.001427 0.005792 -0.999982 +vn 0.000000 0.000000 -1.000000 +vn -0.001727 0.005626 -0.999983 +vn -0.002149 0.015356 -0.999880 +vn -0.003579 0.015042 -0.999880 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.002028 0.005475 -0.999983 +vn -0.000000 0.000000 -1.000000 +vn -0.002344 0.005364 -0.999983 +vn -0.005393 0.014549 -0.999880 +vn -0.007241 0.013754 -0.999879 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.003215 0.005097 -0.999982 +vn -0.004522 0.004078 -0.999982 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.005503 0.001802 -0.999983 +vn -0.005430 0.002175 -0.999983 +vn -0.005625 0.001454 -0.999983 +vn -0.005291 0.002860 -0.999982 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.005760 0.001110 -0.999983 +vn -0.005882 0.000765 -0.999982 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.015356 0.002093 -0.999880 +vn -0.015506 0.000993 -0.999879 +vn -0.006018 0.000322 -0.999982 +vn 0.000000 0.000000 -1.000000 +vn -0.006063 0.000013 -0.999982 +vn 0.000000 -0.000000 -1.000000 +vn -0.015814 0.000223 -0.999875 +vn -0.015856 0.000004 -0.999874 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.006061 -0.000022 -0.999982 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.006036 -0.000036 -0.999982 +vn 0.000001 0.000000 -1.000000 +vn -0.015986 -0.000062 -0.999872 +vn -0.016001 0.000002 -0.999872 +vn -0.000000 0.000000 -1.000000 +vn -0.000001 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000001 -0.000000 -1.000000 +vn 0.000001 -0.000000 -1.000000 +vn 0.000001 -0.000000 -1.000000 +vn 0.000001 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.006206 -0.000099 -0.999981 +vn -0.005818 -0.001297 -0.999982 +vn -0.005373 -0.002245 -0.999983 +vn -0.004980 -0.002882 -0.999983 +vn -0.004448 -0.003582 -0.999984 +vn -0.016971 -0.000304 -0.999856 +vn -0.015538 -0.002789 -0.999875 +vn -0.014448 -0.005151 -0.999882 +vn -0.000095 -0.006285 -0.999980 +vn 0.000058 -0.006289 -0.999980 +vn -0.000092 -0.016430 -0.999865 +vn 0.000024 -0.016653 -0.999861 +vn -0.000000 -0.000000 -1.000000 +vn -0.000150 -0.006171 -0.999981 +vn 0.000000 -0.000000 -1.000000 +vn -0.001761 -0.005574 -0.999983 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000090 0.016120 -0.999870 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn -0.009081 0.012672 -0.999879 +vn -0.011148 0.011343 -0.999874 +vn -0.012453 0.009551 -0.999877 +vn -0.013604 0.007834 -0.999877 +vn -0.014541 0.005667 -0.999878 +vn -0.015044 0.003616 -0.999880 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000001 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000001 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000001 -0.000000 -1.000000 +vn 0.000001 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn -0.003804 -0.004249 -0.999984 +vn -0.003050 -0.004868 -0.999983 +vn -0.002305 -0.005265 -0.999983 +vn -0.013400 -0.007444 -0.999883 +vn -0.011768 -0.009868 -0.999882 +vn -0.009714 -0.011593 -0.999886 +vn -0.007655 -0.013089 -0.999885 +vn -0.005246 -0.014358 -0.999883 +vn -0.003037 -0.015023 -0.999883 +vn -0.000255 -0.016672 -0.999861 +vn 0.000000 -0.000000 -1.000000 +vn 0.000600 -0.006120 -0.999981 +vn 0.000000 -0.000000 -1.000000 +vn 0.001116 -0.005924 -0.999982 +vn 0.000430 -0.016000 -0.999872 +vn 0.001361 -0.015596 -0.999878 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000001 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000001 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000002 0.000001 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000001 0.000001 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000001 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000120 0.006181 0.999981 +vn 0.000033 0.006227 0.999981 +vn 0.000027 0.016154 0.999870 +vn 0.000090 0.016120 0.999870 +vn 0.001054 0.005883 0.999982 +vn 0.001762 0.005557 0.999983 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000060 0.006244 0.999981 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000047 0.016531 0.999863 +vn 0.002428 -0.005339 0.999983 +vn -0.000001 -0.000000 1.000000 +vn 0.002072 -0.005445 0.999983 +vn -0.000000 0.000000 1.000000 +vn 0.001753 -0.005596 0.999983 +vn 0.000000 -0.000000 1.000000 +vn 0.004513 -0.004105 0.999981 +vn 0.000000 0.000000 1.000000 +vn 0.003190 -0.005091 0.999982 +vn -0.000001 -0.000000 1.000000 +vn 0.005297 -0.002794 0.999982 +vn 0.005438 -0.002156 0.999983 +vn 0.000001 0.000001 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.005519 -0.001848 0.999983 +vn 0.005654 -0.001545 0.999983 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.005898 -0.000963 0.999982 +vn 0.006183 -0.000091 0.999981 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.006227 -0.000042 0.999981 +vn 0.016244 -0.000041 0.999868 +vn 0.016582 -0.000127 0.999863 +vn -0.000000 -0.000000 1.000000 +vn 0.006257 0.000035 0.999980 +vn 0.016258 0.000011 0.999868 +vn 0.015972 0.000080 0.999873 +vn 0.006195 0.000262 0.999981 +vn 0.006085 0.000661 0.999981 +vn 0.015883 0.000541 0.999874 +vn 0.005872 0.001239 0.999982 +vn 0.015424 0.001692 0.999880 +vn 0.005647 0.001740 0.999983 +vn 0.015100 0.003270 0.999881 +vn 0.005343 0.002303 0.999983 +vn 0.014378 0.005283 0.999883 +vn 0.004957 0.002915 0.999983 +vn 0.013286 0.007503 0.999884 +vn 0.004432 0.003595 0.999984 +vn 0.011740 0.009914 0.999882 +vn 0.003793 0.004249 0.999984 +vn 0.009677 0.011590 0.999886 +vn 0.007623 0.013030 0.999886 +vn 0.005277 0.014351 0.999883 +vn 0.003047 0.004860 0.999984 +vn 0.002307 0.005252 0.999984 +vn 0.003075 0.014972 0.999883 +vn 0.001189 0.015560 0.999878 +vn -0.001100 0.005948 0.999982 +vn 0.000001 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.001726 0.005626 0.999983 +vn 0.000000 0.000000 1.000000 +vn -0.001426 0.005791 0.999982 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.002344 0.005364 0.999983 +vn 0.000000 0.000000 1.000000 +vn -0.002027 0.005475 0.999983 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000001 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000001 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000001 -0.000001 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.003216 0.005097 0.999982 +vn -0.004523 0.004078 0.999981 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.005431 0.002175 0.999983 +vn -0.005503 0.001802 0.999983 +vn -0.005625 0.001454 0.999983 +vn -0.005292 0.002860 0.999982 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000001 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.005760 0.001110 0.999983 +vn -0.005882 0.000765 0.999982 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.006018 0.000322 0.999982 +vn -0.006063 0.000013 0.999982 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.006061 -0.000022 0.999982 +vn -0.000001 0.000000 1.000000 +vn -0.006036 -0.000036 0.999982 +vn 0.000001 0.000000 1.000000 +vn -0.016002 0.000002 0.999872 +vn -0.015856 0.000004 0.999874 +vn -0.000001 0.000000 1.000000 +vn -0.000001 0.000000 1.000000 +vn 0.000001 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000001 0.000000 1.000000 +vn 0.000001 -0.000000 1.000000 +vn 0.000001 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.015986 -0.000062 0.999872 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000001 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000001 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000001 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000001 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000001 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000001 -0.000001 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000001 0.000000 1.000000 +vn 0.000002 -0.000001 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.006206 -0.000099 0.999981 +vn -0.016971 -0.000304 0.999856 +vn -0.005818 -0.001297 0.999982 +vn -0.015539 -0.002789 0.999875 +vn -0.005373 -0.002245 0.999983 +vn -0.004981 -0.002882 0.999983 +vn -0.014448 -0.005150 0.999882 +vn -0.013364 -0.007420 0.999883 +vn -0.004448 -0.003582 0.999984 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000095 -0.006285 0.999980 +vn -0.000150 -0.006171 0.999981 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.001762 -0.005574 0.999983 +vn -0.000255 -0.016672 0.999861 +vn -0.003036 -0.015023 0.999883 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000058 -0.006289 0.999980 +vn 0.000024 -0.016653 0.999861 +vn 0.000600 -0.006120 0.999981 +vn 0.000431 -0.016000 0.999872 +vn 0.001116 -0.005924 0.999982 +vn 0.001360 -0.015596 0.999878 +vn 0.001445 -0.005762 0.999982 +vn 0.002524 -0.015344 0.999879 +vn 0.004081 -0.014974 0.999880 +vn 0.006119 -0.014380 0.999878 +vn 0.008102 -0.013405 0.999877 +vn 0.009796 -0.012310 0.999876 +vn 0.011567 -0.010843 0.999874 +vn 0.012958 -0.008936 0.999876 +vn 0.013985 -0.007061 0.999877 +vn 0.014774 -0.005021 0.999878 +vn 0.015212 -0.003134 0.999879 +vn 0.015764 -0.001486 0.999875 +vn -0.000001 0.000000 1.000000 +vn 0.000001 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000001 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000001 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000001 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.001082 0.015577 0.999878 +vn -0.002150 0.015356 0.999880 +vn -0.003579 0.015042 0.999881 +vn -0.005393 0.014549 0.999880 +vn -0.007219 0.013716 0.999880 +vn -0.009075 0.012673 0.999879 +vn -0.011172 0.011373 0.999873 +vn -0.012453 0.009552 0.999877 +vn -0.013604 0.007834 0.999877 +vn -0.014541 0.005667 0.999878 +vn -0.015044 0.003616 0.999880 +vn -0.015356 0.002093 0.999880 +vn -0.015506 0.000993 0.999879 +vn -0.015814 0.000223 0.999875 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000001 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000001 0.000000 1.000000 +vn 0.000001 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000001 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000001 -0.000000 1.000000 +vn 0.000001 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000001 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.003804 -0.004249 0.999984 +vn -0.011800 -0.009890 0.999882 +vn -0.009715 -0.011593 0.999886 +vn -0.003050 -0.004868 0.999984 +vn -0.002305 -0.005265 0.999983 +vn -0.005263 -0.014396 0.999883 +vn -0.007640 -0.013056 0.999886 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000001 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.000001 0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn -0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000429 0.707135 -0.707079 +vn -0.001881 0.710240 -0.703958 +vn 0.000609 0.999982 -0.005943 +vn -0.002665 0.999979 -0.005848 +vn 0.000027 0.016154 -0.999870 +vn 0.005089 0.999970 -0.005872 +vn 0.003593 0.709561 -0.704635 +vn -0.999977 -0.003375 -0.005934 +vn -0.707686 -0.002378 -0.706524 +vn -0.999829 -0.017599 -0.005724 +vn -0.714547 -0.012499 -0.699476 +vn 0.000810 -0.710995 -0.703196 +vn -0.001587 -0.707490 -0.706722 +vn -0.002252 -0.999980 -0.005933 +vn 0.001137 -0.999982 -0.005835 +vn 0.003593 0.709568 0.704627 +vn 0.000429 0.707132 0.707081 +vn 0.000609 0.999982 0.005943 +vn 0.005089 0.999970 0.005871 +vn 0.052830 0.708586 0.703644 +vn 0.074603 0.997196 0.005829 +vn 0.142125 0.697081 0.702765 +vn 0.200095 0.979759 0.005800 +vn 0.074603 0.997196 -0.005829 +vn 0.200095 0.979759 -0.005800 +vn -0.002665 0.999979 0.005849 +vn -0.001881 0.710240 0.703957 +vn -0.048337 0.707491 0.705067 +vn -0.068331 0.997645 0.005876 +vn -0.707689 -0.002378 0.706520 +vn -0.714549 -0.012499 0.699474 +vn -0.999829 -0.017598 0.005724 +vn -0.999977 -0.003375 0.005934 +vn 0.001137 -0.999982 0.005835 +vn 0.000810 -0.710988 0.703204 +vn -0.002252 -0.999980 0.005933 +vn -0.001587 -0.707487 0.706725 +vn 0.018671 -0.708873 0.705089 +vn 0.060989 -0.706639 0.704941 +vn 0.026451 -0.999633 0.005883 +vn 0.026452 -0.999633 -0.005883 +vn 0.086206 -0.996260 0.005872 +vn 0.114439 -0.700978 0.703941 +vn 0.186399 -0.686472 0.702860 +vn 0.161365 -0.986878 0.005841 +vn 0.161365 -0.986878 -0.005841 +vn 0.086205 -0.996260 -0.005872 +vn 0.262344 -0.964957 0.005806 +vn 0.278875 -0.655435 0.701879 +vn 0.368863 -0.609154 0.702048 +vn 0.391505 -0.920158 0.005794 +vn 0.391505 -0.920158 -0.005794 +vn 0.262345 -0.964957 -0.005806 +vn 0.517689 -0.855550 0.005788 +vn 0.443678 -0.556788 0.702237 +vn 0.519507 -0.487211 0.701953 +vn 0.623151 -0.782080 0.005778 +vn 0.623151 -0.782081 -0.005778 +vn 0.517688 -0.855550 -0.005788 +vn 0.729507 -0.683949 0.005767 +vn 0.586085 -0.404972 0.701785 +vn 0.635489 -0.321440 0.702019 +vn 0.822773 -0.568340 0.005787 +vn 0.822776 -0.568337 -0.005787 +vn 0.729508 -0.683948 -0.005783 +vn 0.892456 -0.451099 0.005784 +vn 0.674115 -0.228900 0.702263 +vn 0.696461 -0.142690 0.703265 +vn 0.946881 -0.321533 0.005805 +vn 0.946882 -0.321531 -0.005787 +vn 0.892458 -0.451094 -0.005783 +vn 0.979579 -0.200978 0.005819 +vn 0.707598 -0.065770 0.703548 +vn 0.711165 -0.005203 0.703006 +vn 0.995668 -0.092795 0.005830 +vn 0.995668 -0.092795 -0.005830 +vn 0.979579 -0.200977 -0.005819 +vn 0.999956 -0.007354 0.005824 +vn 0.707277 -0.000800 0.706936 +vn 0.999982 -0.001137 0.005942 +vn 0.709305 0.000206 0.704901 +vn 0.999983 0.000296 0.005884 +vn 0.708950 0.002967 0.705253 +vn 0.999974 0.004181 0.005901 +vn 0.999974 0.004183 -0.005901 +vn 0.999983 0.000296 -0.005884 +vn 0.708975 0.023683 0.704836 +vn 0.705516 0.076630 0.704539 +vn 0.999419 0.033559 0.005873 +vn 0.999420 0.033561 -0.005873 +vn 0.994106 0.108253 0.005857 +vn 0.695504 0.149319 0.702836 +vn 0.668979 0.244708 0.701844 +vn 0.977644 0.210186 0.005805 +vn 0.977644 0.210185 -0.005805 +vn 0.994106 0.108251 -0.005857 +vn 0.939020 0.343814 0.005774 +vn 0.621292 0.350258 0.700940 +vn 0.545012 0.460435 0.700686 +vn 0.870961 0.491319 0.005749 +vn 0.870959 0.491322 -0.005751 +vn 0.939020 0.343815 -0.005792 +vn 0.763896 0.645314 0.005747 +vn 0.456564 0.547498 0.701281 +vn 0.360081 0.615774 0.700831 +vn 0.640446 0.767982 0.005749 +vn 0.640445 0.767983 -0.005749 +vn 0.763895 0.645315 -0.005731 +vn 0.504478 0.863405 0.005743 +vn 0.245582 0.669166 0.701360 +vn 0.344535 0.938756 0.005775 +vn 0.344534 0.938756 -0.005758 +vn 0.504475 0.863407 -0.005758 +vn -0.097599 0.703282 0.704180 +vn -0.164005 0.691828 0.703191 +vn -0.137662 0.990462 0.005849 +vn -0.137662 0.990462 -0.005849 +vn -0.068331 0.997645 -0.005876 +vn -0.230927 0.972954 0.005817 +vn -0.247207 0.667171 0.702689 +vn -0.332114 0.630034 0.701967 +vn -0.347561 0.937639 0.005794 +vn -0.347562 0.937639 -0.005811 +vn -0.230927 0.972954 -0.005818 +vn -0.466390 0.884560 0.005794 +vn -0.414912 0.579035 0.701831 +vn -0.499331 0.508204 0.701710 +vn -0.582616 0.812727 0.005777 +vn -0.582618 0.812726 -0.005779 +vn -0.466394 0.884558 -0.005796 +vn -0.700822 0.713313 0.005783 +vn -0.564566 0.433518 0.702373 +vn -0.617098 0.355960 0.701771 +vn -0.793137 0.609016 0.005783 +vn -0.793137 0.609016 -0.005784 +vn -0.700823 0.713312 -0.005767 +vn -0.866375 0.499361 0.005776 +vn -0.663804 0.258490 0.701817 +vn -0.691709 0.165449 0.702969 +vn -0.931826 0.362859 0.005791 +vn -0.931827 0.362857 -0.005791 +vn -0.866375 0.499361 -0.005776 +vn -0.972480 0.232912 0.005811 +vn -0.703688 0.095154 0.704109 +vn -0.707510 0.045357 0.705246 +vn -0.990931 0.134244 0.005846 +vn -0.990931 0.134245 -0.005846 +vn -0.972481 0.232910 -0.005811 +vn -0.997920 0.064202 0.005883 +vn -0.708975 0.010519 0.705156 +vn -0.709219 0.000016 0.704988 +vn -0.999871 0.014962 0.005893 +vn -0.999871 0.014956 -0.005893 +vn -0.997920 0.064202 -0.005883 +vn -0.999983 0.000005 0.005902 +vn -0.710069 -0.000001 0.704132 +vn -0.999983 -0.000004 0.005866 +vn -0.999983 -0.000004 -0.005866 +vn -0.999983 -0.000000 -0.005902 +vn -0.701575 -0.124583 0.701620 +vn -0.671360 -0.238189 0.701813 +vn -0.984513 -0.175220 0.005768 +vn -0.984512 -0.175223 -0.005768 +vn -0.942323 -0.334655 0.005773 +vn -0.623898 -0.345809 0.700833 +vn -0.546778 -0.458457 0.700608 +vn -0.874487 -0.485014 0.005746 +vn -0.874485 -0.485019 -0.005747 +vn -0.942322 -0.334657 -0.005791 +vn -0.766290 -0.642469 0.005745 +vn -0.457524 -0.546748 0.701240 +vn -0.360152 -0.615810 0.700763 +vn -0.641758 -0.766886 0.005748 +vn -0.641758 -0.766886 -0.005748 +vn -0.766288 -0.642472 -0.005728 +vn -0.504525 -0.863378 0.005741 +vn -0.244324 -0.669670 0.701318 +vn -0.139880 -0.697541 0.702759 +vn -0.342751 -0.939409 0.005773 +vn -0.342748 -0.939410 -0.005756 +vn -0.504522 -0.863380 -0.005756 +vn -0.196944 -0.980398 0.005799 +vn -0.010532 -0.713796 0.700274 +vn -0.000092 -0.016430 0.999865 +vn -0.014844 -0.999873 0.005742 +vn -0.014844 -0.999873 -0.005742 +vn -0.196943 -0.980398 -0.005799 +vn 0.052830 0.708583 -0.703647 +vn 0.142125 0.697078 -0.702768 +vn 0.018671 -0.708870 -0.705092 +vn 0.060989 -0.706641 -0.704939 +vn 0.114439 -0.700976 -0.703944 +vn 0.186401 -0.686476 -0.702856 +vn 0.278874 -0.655435 -0.701879 +vn 0.368865 -0.609156 -0.702045 +vn 0.443678 -0.556793 -0.702233 +vn 0.519726 -0.487270 -0.701750 +vn 0.586178 -0.404828 -0.701790 +vn 0.635559 -0.321270 -0.702033 +vn 0.673929 -0.228751 -0.702490 +vn 0.696468 -0.142690 -0.703258 +vn 0.707600 -0.065772 -0.703546 +vn 0.999956 -0.007354 -0.005823 +vn 0.711159 -0.005203 -0.703012 +vn 0.999982 -0.001137 -0.005942 +vn 0.707282 -0.000800 -0.706931 +vn 0.709300 0.000206 -0.704907 +vn 0.708950 0.002968 -0.705252 +vn 0.708974 0.023683 -0.704836 +vn 0.705519 0.076629 -0.704536 +vn 0.695499 0.149318 -0.702841 +vn 0.668795 0.244857 -0.701967 +vn 0.621085 0.350600 -0.700952 +vn 0.544927 0.460714 -0.700569 +vn 0.456561 0.547495 -0.701286 +vn 0.359821 0.615801 -0.700940 +vn 0.245444 0.669331 -0.701251 +vn -0.048337 0.707494 -0.705064 +vn -0.097598 0.703279 -0.704183 +vn -0.164006 0.691822 -0.703196 +vn -0.247365 0.667356 -0.702457 +vn -0.332173 0.629624 -0.702307 +vn -0.415197 0.578834 -0.701828 +vn -0.499566 0.508132 -0.701595 +vn -0.564560 0.433513 -0.702381 +vn -0.617097 0.355959 -0.701772 +vn -0.663804 0.258489 -0.701818 +vn -0.691712 0.165449 -0.702966 +vn -0.703687 0.095154 -0.704109 +vn -0.707508 0.045357 -0.705248 +vn -0.708970 0.010519 -0.705160 +vn -0.709221 0.000015 -0.704987 +vn -0.710068 -0.000001 -0.704133 +vn -0.701578 -0.124584 -0.701617 +vn -0.671545 -0.238367 -0.701576 +vn -0.623478 -0.345925 -0.701150 +vn -0.546694 -0.458744 -0.700486 +vn -0.457521 -0.546745 -0.701245 +vn -0.359890 -0.615838 -0.700873 +vn -0.244186 -0.669842 -0.701203 +vn -0.139880 -0.697539 -0.702761 +vn -0.010532 -0.713801 -0.700270 +s 1 +g Swift3DLogo:swift3DLogo_geometry Swift3DLogo:swift3DLogo Swift3DLogo:Swift3DLogo +usemtl Swift3DLogo:mat_swift3Dlogo +f 555/388/1 813/389/2 97/387/3 +f 97/387/3 813/389/2 558/390/4 +f 100/393/5 556/394/6 555/388/1 +f 555/388/1 556/394/6 813/389/2 +f 556/394/6 99/405/7 813/389/2 +f 813/389/2 99/405/7 557/395/8 +f 813/389/2 557/395/8 558/390/4 +f 558/390/4 557/395/8 98/396/9 +f 97/387/3 558/390/4 561/398/10 +f 561/398/10 558/390/4 814/397/11 +f 558/390/4 98/396/9 814/397/11 +f 814/397/11 98/396/9 559/408/12 +f 814/397/11 559/408/12 560/409/13 +f 560/409/13 559/408/12 102/423/14 +f 561/398/10 814/397/11 101/410/15 +f 101/410/15 814/397/11 560/409/13 +f 561/398/10 815/399/16 97/387/3 +f 97/387/3 815/399/16 564/391/17 +f 101/410/15 562/411/18 561/398/10 +f 561/398/10 562/411/18 815/399/16 +f 562/411/18 104/427/19 815/399/16 +f 815/399/16 104/427/19 563/412/20 +f 564/391/17 815/399/16 103/400/21 +f 103/400/21 815/399/16 563/412/20 +f 97/387/3 564/391/17 555/388/1 +f 555/388/1 564/391/17 816/392/22 +f 564/391/17 103/400/21 816/392/22 +f 816/392/22 103/400/21 565/401/23 +f 816/392/22 565/401/23 566/402/24 +f 566/402/24 565/401/23 105/414/25 +f 555/388/1 816/392/22 100/393/5 +f 100/393/5 816/392/22 566/402/24 +f 557/395/8 817/406/26 98/396/9 +f 98/396/9 817/406/26 569/407/27 +f 99/405/7 567/419/28 557/395/8 +f 557/395/8 567/419/28 817/406/26 +f 817/406/26 567/419/28 568/420/29 +f 568/420/29 567/419/28 107/436/30 +f 569/407/27 817/406/26 106/421/31 +f 106/421/31 817/406/26 568/420/29 +f 98/396/9 569/407/27 559/408/12 +f 559/408/12 569/407/27 818/422/32 +f 106/421/31 570/439/33 569/407/27 +f 569/407/27 570/439/33 818/422/32 +f 570/439/33 108/460/34 818/422/32 +f 818/422/32 108/460/34 571/440/35 +f 818/422/32 571/440/35 559/408/12 +f 559/408/12 571/440/35 102/423/14 +f 108/460/34 572/481/36 571/440/35 +f 571/440/35 572/481/36 819/461/37 +f 571/440/35 819/461/37 102/423/14 +f 102/423/14 819/461/37 573/441/38 +f 572/481/36 108/460/34 574/501/39 +f 574/501/39 108/460/34 109/480/40 +f 570/439/33 106/421/31 575/459/41 +f 575/459/41 106/421/31 110/438/42 +f 575/459/41 109/480/40 570/439/33 +f 570/439/33 109/480/40 108/460/34 +f 568/420/29 107/436/30 576/437/43 +f 576/437/43 107/436/30 111/456/44 +f 576/437/43 110/438/42 568/420/29 +f 568/420/29 110/438/42 106/421/31 +f 577/470/45 111/456/44 703/451/46 +f 703/451/46 111/456/44 107/436/30 +f 109/480/40 590/500/47 574/501/39 +f 574/501/39 590/500/47 825/522/48 +f 110/438/42 592/458/49 575/459/41 +f 575/459/41 592/458/49 826/479/50 +f 111/456/44 594/476/51 576/437/43 +f 576/437/43 594/476/51 827/457/52 +f 112/490/53 596/509/54 577/470/45 +f 577/470/45 596/509/54 828/489/55 +f 899/690/56 579/691/57 1054/717/58 +f 1054/717/58 579/691/57 479/716/59 +f 820/701/60 581/723/61 1056/724/62 +f 1056/724/62 581/723/61 482/743/63 +f 820/701/60 579/691/57 580/676/64 +f 580/676/64 579/691/57 115/663/65 +f 581/723/61 820/701/60 114/700/66 +f 114/700/66 820/701/60 580/676/64 +f 114/700/66 582/722/67 581/723/61 +f 581/723/61 582/722/67 821/742/68 +f 582/722/67 116/741/69 821/742/68 +f 821/742/68 116/741/69 583/758/70 +f 821/742/68 583/758/70 1058/759/71 +f 1058/759/71 583/758/70 485/772/72 +f 583/758/70 116/741/69 822/740/73 +f 822/740/73 116/741/69 584/721/74 +f 822/740/73 584/721/74 585/720/75 +f 585/720/75 584/721/74 117/698/76 +f 585/720/75 488/739/77 822/740/73 +f 822/740/73 488/739/77 1060/757/78 +f 585/720/75 117/698/76 823/697/79 +f 823/697/79 117/698/76 586/673/80 +f 823/697/79 586/673/80 587/672/81 +f 587/672/81 586/673/80 118/646/82 +f 587/672/81 491/696/83 823/697/79 +f 823/697/79 491/696/83 1062/719/84 +f 587/672/81 118/646/82 824/645/85 +f 824/645/85 118/646/82 588/620/86 +f 824/645/85 588/620/86 589/619/87 +f 589/619/87 588/620/86 119/595/88 +f 589/619/87 494/644/89 824/645/85 +f 824/645/85 494/644/89 1064/671/90 +f 494/644/89 589/619/87 496/618/91 +f 496/618/91 589/619/87 669/594/92 +f 669/594/92 865/569/93 496/618/91 +f 496/618/91 865/569/93 1066/593/94 +f 1068/549/95 499/572/96 867/526/97 +f 867/526/97 499/572/96 672/548/98 +f 1070/506/99 502/527/100 869/485/101 +f 869/485/101 502/527/100 676/505/102 +f 1072/467/103 505/486/104 871/448/105 +f 871/448/105 505/486/104 680/466/106 +f 1074/445/107 508/463/108 873/426/109 +f 873/426/109 508/463/108 684/444/110 +f 511/443/111 685/424/112 1075/442/113 +f 1075/442/113 685/424/112 874/425/114 +f 470/462/115 573/441/38 1049/482/116 +f 1049/482/116 573/441/38 819/461/37 +f 590/500/47 120/521/117 825/522/48 +f 825/522/48 120/521/117 591/544/118 +f 825/522/48 591/544/118 1078/545/119 +f 1078/545/119 591/544/118 515/568/120 +f 575/459/41 826/479/50 109/480/40 +f 109/480/40 826/479/50 590/500/47 +f 826/479/50 592/458/49 593/499/121 +f 593/499/121 592/458/49 121/478/122 +f 826/479/50 593/499/121 590/500/47 +f 590/500/47 593/499/121 120/521/117 +f 576/437/43 827/457/52 110/438/42 +f 110/438/42 827/457/52 592/458/49 +f 827/457/52 594/476/51 595/477/123 +f 595/477/123 594/476/51 122/496/124 +f 592/458/49 827/457/52 121/478/122 +f 121/478/122 827/457/52 595/477/123 +f 577/470/45 828/489/55 111/456/44 +f 111/456/44 828/489/55 594/476/51 +f 828/489/55 596/509/54 597/510/125 +f 597/510/125 596/509/54 123/531/126 +f 594/476/51 828/489/55 122/496/124 +f 122/496/124 828/489/55 597/510/125 +f 120/521/117 598/543/127 591/544/118 +f 591/544/118 598/543/127 829/567/128 +f 598/543/127 124/566/129 829/567/128 +f 829/567/128 124/566/129 599/591/130 +f 829/567/128 599/591/130 1080/592/131 +f 1080/592/131 599/591/130 518/617/132 +f 120/521/117 593/499/121 598/543/127 +f 598/543/127 593/499/121 830/520/133 +f 593/499/121 121/478/122 830/520/133 +f 830/520/133 121/478/122 600/498/134 +f 830/520/133 600/498/134 601/542/135 +f 601/542/135 600/498/134 125/519/136 +f 598/543/127 830/520/133 124/566/129 +f 124/566/129 830/520/133 601/542/135 +f 121/478/122 595/477/123 600/498/134 +f 600/498/134 595/477/123 831/497/137 +f 595/477/123 122/496/124 831/497/137 +f 831/497/137 122/496/124 602/517/138 +f 831/497/137 602/517/138 603/518/139 +f 603/518/139 602/517/138 126/539/140 +f 600/498/134 831/497/137 125/519/136 +f 125/519/136 831/497/137 603/518/139 +f 124/566/129 604/590/141 599/591/130 +f 599/591/130 604/590/141 832/616/142 +f 604/590/141 127/615/143 832/616/142 +f 832/616/142 127/615/143 605/642/144 +f 832/616/142 605/642/144 1082/643/145 +f 1082/643/145 605/642/144 521/670/146 +f 124/566/129 601/542/135 604/590/141 +f 604/590/141 601/542/135 833/565/147 +f 601/542/135 125/519/136 833/565/147 +f 833/565/147 125/519/136 606/541/148 +f 833/565/147 606/541/148 607/589/149 +f 607/589/149 606/541/148 128/564/150 +f 604/590/141 833/565/147 127/615/143 +f 127/615/143 833/565/147 607/589/149 +f 125/519/136 603/518/139 606/541/148 +f 606/541/148 603/518/139 834/540/151 +f 603/518/139 126/539/140 834/540/151 +f 834/540/151 126/539/140 608/562/152 +f 834/540/151 608/562/152 609/563/153 +f 609/563/153 608/562/152 129/586/154 +f 606/541/148 834/540/151 128/564/150 +f 128/564/150 834/540/151 609/563/153 +f 127/615/143 607/589/149 612/639/155 +f 612/639/155 607/589/149 835/612/156 +f 607/589/149 128/564/150 835/612/156 +f 835/612/156 128/564/150 610/587/157 +f 835/612/156 610/587/157 611/638/158 +f 611/638/158 610/587/157 131/613/159 +f 612/639/155 835/612/156 130/666/160 +f 130/666/160 835/612/156 611/638/158 +f 127/615/143 612/639/155 605/642/144 +f 605/642/144 612/639/155 836/667/161 +f 612/639/155 130/666/160 836/667/161 +f 836/667/161 130/666/160 613/694/162 +f 131/613/159 610/587/157 615/614/163 +f 615/614/163 610/587/157 837/588/164 +f 128/564/150 609/563/153 610/587/157 +f 610/587/157 609/563/153 837/588/164 +f 609/563/153 129/586/154 837/588/164 +f 837/588/164 129/586/154 614/611/165 +f 615/614/163 837/588/164 132/637/166 +f 132/637/166 837/588/164 614/611/165 +f 615/614/163 838/640/167 131/613/159 +f 131/613/159 838/640/167 617/641/168 +f 132/637/166 616/664/169 615/614/163 +f 615/614/163 616/664/169 838/640/167 +f 131/613/159 617/641/168 611/638/158 +f 611/638/158 617/641/168 839/665/170 +f 611/638/158 839/665/170 130/666/160 +f 130/666/160 839/665/170 613/694/162 +f 132/637/166 614/611/165 620/657/171 +f 620/657/171 614/611/165 840/630/172 +f 129/586/154 618/604/173 614/611/165 +f 614/611/165 618/604/173 840/630/172 +f 618/604/173 134/629/174 840/630/172 +f 840/630/172 134/629/174 619/656/175 +f 620/657/171 840/630/172 133/684/176 +f 133/684/176 840/630/172 619/656/175 +f 620/657/171 841/685/177 132/637/166 +f 132/637/166 841/685/177 616/664/169 +f 133/684/176 621/710/178 620/657/171 +f 620/657/171 621/710/178 841/685/177 +f 608/562/152 842/579/179 129/586/154 +f 129/586/154 842/579/179 618/604/173 +f 126/539/140 622/555/180 608/562/152 +f 608/562/152 622/555/180 842/579/179 +f 622/555/180 135/578/181 842/579/179 +f 842/579/179 135/578/181 623/603/182 +f 842/579/179 623/603/182 618/604/173 +f 618/604/173 623/603/182 134/629/174 +f 602/517/138 843/532/183 126/539/140 +f 126/539/140 843/532/183 622/555/180 +f 122/496/124 597/510/125 602/517/138 +f 602/517/138 597/510/125 843/532/183 +f 597/510/125 123/531/126 843/532/183 +f 843/532/183 123/531/126 624/554/184 +f 843/532/183 624/554/184 622/555/180 +f 622/555/180 624/554/184 135/578/181 +f 1090/711/185 841/685/177 533/734/186 +f 533/734/186 841/685/177 621/710/178 +f 621/710/178 133/684/176 844/732/187 +f 844/732/187 133/684/176 625/708/188 +f 844/732/187 625/708/188 626/751/189 +f 626/751/189 625/708/188 136/731/190 +f 1092/752/191 844/732/187 536/768/192 +f 536/768/192 844/732/187 626/751/189 +f 133/684/176 619/656/175 625/708/188 +f 625/708/188 619/656/175 845/682/193 +f 619/656/175 134/629/174 845/682/193 +f 845/682/193 134/629/174 627/654/194 +f 845/682/193 627/654/194 628/707/195 +f 628/707/195 627/654/194 137/681/196 +f 625/708/188 845/682/193 136/731/190 +f 136/731/190 845/682/193 628/707/195 +f 623/603/182 846/627/197 134/629/174 +f 134/629/174 846/627/197 627/654/194 +f 135/578/181 629/601/198 623/603/182 +f 623/603/182 629/601/198 846/627/197 +f 629/601/198 138/626/199 846/627/197 +f 846/627/197 138/626/199 630/653/200 +f 846/627/197 630/653/200 627/654/194 +f 627/654/194 630/653/200 137/681/196 +f 624/554/184 847/576/201 135/578/181 +f 135/578/181 847/576/201 629/601/198 +f 123/531/126 631/552/202 624/554/184 +f 624/554/184 631/552/202 847/576/201 +f 631/552/202 139/575/203 847/576/201 +f 847/576/201 139/575/203 632/600/204 +f 847/576/201 632/600/204 629/601/198 +f 629/601/198 632/600/204 138/626/199 +f 596/509/54 848/530/205 123/531/126 +f 123/531/126 848/530/205 631/552/202 +f 848/530/205 633/553/206 631/552/202 +f 631/552/202 633/553/206 139/575/203 +f 633/553/206 848/530/205 113/533/207 +f 113/533/207 848/530/205 578/511/208 +f 596/509/54 112/490/53 848/530/205 +f 848/530/205 112/490/53 578/511/208 +f 634/750/209 849/767/210 136/731/190 +f 136/731/190 849/767/210 626/751/189 +f 635/706/211 850/730/212 137/681/196 +f 137/681/196 850/730/212 628/707/195 +f 850/730/212 634/750/209 628/707/195 +f 628/707/195 634/750/209 136/731/190 +f 138/626/199 636/652/213 630/653/200 +f 630/653/200 636/652/213 851/680/214 +f 851/680/214 635/706/211 630/653/200 +f 630/653/200 635/706/211 137/681/196 +f 139/575/203 637/599/215 632/600/204 +f 632/600/204 637/599/215 852/625/216 +f 632/600/204 852/625/216 138/626/199 +f 138/626/199 852/625/216 636/652/213 +f 633/553/206 853/577/217 139/575/203 +f 139/575/203 853/577/217 637/599/215 +f 849/767/210 634/750/209 638/780/218 +f 638/780/218 634/750/209 140/766/219 +f 638/780/218 374/792/220 849/767/210 +f 849/767/210 374/792/220 1094/781/221 +f 853/577/217 639/602/222 637/599/215 +f 637/599/215 639/602/222 141/624/223 +f 637/599/215 141/624/223 852/625/216 +f 852/625/216 141/624/223 640/651/224 +f 852/625/216 640/651/224 636/652/213 +f 636/652/213 640/651/224 142/679/225 +f 636/652/213 142/679/225 851/680/214 +f 851/680/214 142/679/225 641/705/226 +f 641/705/226 143/729/227 851/680/214 +f 851/680/214 143/729/227 635/706/211 +f 641/705/226 142/679/225 643/728/228 +f 643/728/228 142/679/225 144/704/229 +f 145/650/230 642/678/231 141/624/223 +f 141/624/223 642/678/231 640/651/224 +f 642/678/231 144/704/229 640/651/224 +f 640/651/224 144/704/229 142/679/225 +f 641/705/226 643/728/228 143/729/227 +f 143/729/227 643/728/228 146/748/232 +f 850/730/212 635/706/211 644/749/233 +f 644/749/233 635/706/211 143/729/227 +f 644/749/233 140/766/219 850/730/212 +f 850/730/212 140/766/219 634/750/209 +f 143/729/227 146/748/232 644/749/233 +f 644/749/233 146/748/232 645/765/234 +f 644/749/233 645/765/234 140/766/219 +f 140/766/219 645/765/234 147/779/235 +f 146/748/232 646/764/236 645/765/234 +f 645/765/234 646/764/236 854/778/237 +f 646/764/236 149/777/238 854/778/237 +f 854/778/237 149/777/238 647/789/239 +f 854/778/237 647/789/239 648/790/240 +f 648/790/240 647/789/239 148/800/241 +f 645/765/234 854/778/237 147/779/235 +f 147/779/235 854/778/237 648/790/240 +f 643/728/228 855/747/242 146/748/232 +f 146/748/232 855/747/242 646/764/236 +f 643/728/228 144/704/229 855/747/242 +f 855/747/242 144/704/229 649/727/243 +f 855/747/242 649/727/243 650/763/244 +f 650/763/244 649/727/243 150/746/245 +f 646/764/236 855/747/242 149/777/238 +f 149/777/238 855/747/242 650/763/244 +f 149/777/238 651/788/246 647/789/239 +f 647/789/239 651/788/246 856/799/247 +f 651/788/246 152/798/248 856/799/247 +f 856/799/247 152/798/248 652/806/249 +f 856/799/247 652/806/249 653/807/250 +f 653/807/250 652/806/249 151/812/251 +f 647/789/239 856/799/247 148/800/241 +f 148/800/241 856/799/247 653/807/250 +f 149/777/238 650/763/244 651/788/246 +f 651/788/246 650/763/244 857/776/252 +f 650/763/244 150/746/245 857/776/252 +f 857/776/252 150/746/245 654/762/253 +f 857/776/252 654/762/253 655/787/254 +f 655/787/254 654/762/253 153/775/255 +f 651/788/246 857/776/252 152/798/248 +f 152/798/248 857/776/252 655/787/254 +f 140/766/219 147/779/235 638/780/218 +f 638/780/218 147/779/235 656/791/256 +f 147/779/235 648/790/240 656/791/256 +f 656/791/256 648/790/240 858/801/257 +f 648/790/240 148/800/241 858/801/257 +f 858/801/257 148/800/241 657/808/258 +f 148/800/241 653/807/250 657/808/258 +f 657/808/258 653/807/250 859/813/259 +f 653/807/250 151/812/251 859/813/259 +f 859/813/259 151/812/251 658/816/260 +f 638/780/218 656/791/256 374/792/220 +f 374/792/220 656/791/256 539/802/261 +f 656/791/256 858/801/257 539/802/261 +f 539/802/261 858/801/257 1096/809/262 +f 858/801/257 657/808/258 1096/809/262 +f 1096/809/262 657/808/258 542/814/263 +f 690/770/264 686/755/265 554/783/266 +f 554/783/266 686/755/265 375/771/267 +f 660/769/268 860/782/269 154/773/270 +f 154/773/270 860/782/269 659/784/271 +f 660/769/268 154/773/270 861/753/272 +f 861/753/272 154/773/270 661/760/273 +f 861/753/272 661/760/273 662/733/274 +f 662/733/274 661/760/273 155/744/275 +f 861/753/272 662/733/274 689/735/276 +f 689/735/276 662/733/274 169/712/277 +f 663/674/278 862/647/279 117/698/76 +f 117/698/76 862/647/279 586/673/80 +f 157/648/280 664/622/281 663/674/278 +f 663/674/278 664/622/281 862/647/279 +f 664/622/281 156/597/282 862/647/279 +f 862/647/279 156/597/282 665/621/283 +f 862/647/279 665/621/283 586/673/80 +f 586/673/80 665/621/283 118/646/82 +f 117/698/76 584/721/74 663/674/278 +f 663/674/278 584/721/74 863/699/284 +f 584/721/74 116/741/69 863/699/284 +f 863/699/284 116/741/69 582/722/67 +f 863/699/284 582/722/67 666/675/285 +f 666/675/285 582/722/67 114/700/66 +f 663/674/278 863/699/284 157/648/280 +f 157/648/280 863/699/284 666/675/285 +f 665/621/283 864/596/286 118/646/82 +f 118/646/82 864/596/286 588/620/86 +f 156/597/282 667/573/287 665/621/283 +f 665/621/283 667/573/287 864/596/286 +f 864/596/286 667/573/287 668/571/288 +f 668/571/288 667/573/287 158/550/289 +f 588/620/86 864/596/286 119/595/88 +f 119/595/88 864/596/286 668/571/288 +f 589/619/87 119/595/88 669/594/92 +f 669/594/92 119/595/88 159/570/290 +f 160/528/291 670/547/292 158/550/289 +f 158/550/289 670/547/292 668/571/288 +f 670/547/292 159/570/290 668/571/288 +f 668/571/288 159/570/290 119/595/88 +f 159/570/290 671/546/293 669/594/92 +f 669/594/92 671/546/293 865/569/93 +f 671/546/293 161/525/294 865/569/93 +f 865/569/93 161/525/294 672/548/98 +f 865/569/93 672/548/98 1066/593/94 +f 1066/593/94 672/548/98 499/572/96 +f 673/503/295 866/524/296 162/487/297 +f 162/487/297 866/524/296 674/507/298 +f 161/525/294 671/546/293 673/503/295 +f 673/503/295 671/546/293 866/524/296 +f 671/546/293 159/570/290 866/524/296 +f 866/524/296 159/570/290 670/547/292 +f 866/524/296 670/547/292 674/507/298 +f 674/507/298 670/547/292 160/528/291 +f 161/525/294 675/504/299 672/548/98 +f 672/548/98 675/504/299 867/526/97 +f 675/504/299 163/484/300 867/526/97 +f 867/526/97 163/484/300 676/505/102 +f 867/526/97 676/505/102 1068/549/95 +f 1068/549/95 676/505/102 502/527/100 +f 673/503/295 868/483/301 161/525/294 +f 161/525/294 868/483/301 675/504/299 +f 162/487/297 677/468/302 673/503/295 +f 673/503/295 677/468/302 868/483/301 +f 677/468/302 164/449/303 868/483/301 +f 868/483/301 164/449/303 678/464/304 +f 868/483/301 678/464/304 675/504/299 +f 675/504/299 678/464/304 163/484/300 +f 163/484/300 679/465/305 676/505/102 +f 676/505/102 679/465/305 869/485/101 +f 679/465/305 165/447/306 869/485/101 +f 869/485/101 165/447/306 680/466/106 +f 869/485/101 680/466/106 1070/506/99 +f 1070/506/99 680/466/106 505/486/104 +f 678/464/304 870/446/307 163/484/300 +f 163/484/300 870/446/307 679/465/305 +f 164/449/303 681/430/308 678/464/304 +f 678/464/304 681/430/308 870/446/307 +f 681/430/308 105/414/25 870/446/307 +f 870/446/307 105/414/25 682/428/309 +f 870/446/307 682/428/309 679/465/305 +f 679/465/305 682/428/309 165/447/306 +f 165/447/306 683/429/310 680/466/106 +f 680/466/106 683/429/310 871/448/105 +f 683/429/310 104/427/19 871/448/105 +f 871/448/105 104/427/19 684/444/110 +f 871/448/105 684/444/110 1072/467/103 +f 1072/467/103 684/444/110 508/463/108 +f 682/428/309 872/413/311 165/447/306 +f 165/447/306 872/413/311 683/429/310 +f 105/414/25 565/401/23 682/428/309 +f 682/428/309 565/401/23 872/413/311 +f 565/401/23 103/400/21 872/413/311 +f 872/413/311 103/400/21 563/412/20 +f 872/413/311 563/412/20 683/429/310 +f 683/429/310 563/412/20 104/427/19 +f 104/427/19 562/411/18 684/444/110 +f 684/444/110 562/411/18 873/426/109 +f 562/411/18 101/410/15 873/426/109 +f 873/426/109 101/410/15 685/424/112 +f 873/426/109 685/424/112 1074/445/107 +f 1074/445/107 685/424/112 511/443/111 +f 101/410/15 560/409/13 685/424/112 +f 685/424/112 560/409/13 874/425/114 +f 874/425/114 560/409/13 573/441/38 +f 573/441/38 560/409/13 102/423/14 +f 1075/442/113 874/425/114 470/462/115 +f 470/462/115 874/425/114 573/441/38 +f 1049/482/116 819/461/37 372/502/312 +f 372/502/312 819/461/37 572/481/36 +f 167/605/313 182/581/314 687/631/315 +f 687/631/315 182/581/314 731/606/316 +f 168/658/317 190/632/318 688/686/319 +f 688/686/319 190/632/318 730/659/320 +f 169/712/277 189/687/321 689/735/276 +f 689/735/276 189/687/321 729/713/322 +f 170/754/323 166/736/324 690/770/264 +f 690/770/264 166/736/324 686/755/265 +f 170/754/323 690/770/264 660/769/268 +f 660/769/268 690/770/264 860/782/269 +f 687/631/315 168/658/317 875/655/325 +f 875/655/325 168/658/317 692/683/326 +f 689/735/276 170/754/323 861/753/272 +f 861/753/272 170/754/323 660/769/268 +f 853/577/217 633/553/206 700/556/327 +f 700/556/327 633/553/206 113/533/207 +f 691/628/328 639/602/222 167/605/313 +f 167/605/313 639/602/222 171/580/329 +f 691/628/328 145/650/230 639/602/222 +f 639/602/222 145/650/230 141/624/223 +f 875/655/325 691/628/328 687/631/315 +f 687/631/315 691/628/328 167/605/313 +f 692/683/326 172/702/330 875/655/325 +f 875/655/325 172/702/330 693/677/331 +f 875/655/325 693/677/331 691/628/328 +f 691/628/328 693/677/331 145/650/230 +f 876/709/332 692/683/326 688/686/319 +f 688/686/319 692/683/326 168/658/317 +f 662/733/274 876/709/332 169/712/277 +f 169/712/277 876/709/332 688/686/319 +f 662/733/274 155/744/275 876/709/332 +f 876/709/332 155/744/275 694/725/333 +f 876/709/332 694/725/333 692/683/326 +f 692/683/326 694/725/333 172/702/330 +f 693/677/331 877/703/334 145/650/230 +f 145/650/230 877/703/334 642/678/231 +f 172/702/330 695/726/335 693/677/331 +f 693/677/331 695/726/335 877/703/334 +f 695/726/335 150/746/245 877/703/334 +f 877/703/334 150/746/245 649/727/243 +f 877/703/334 649/727/243 642/678/231 +f 642/678/231 649/727/243 144/704/229 +f 694/725/333 878/745/336 172/702/330 +f 172/702/330 878/745/336 695/726/335 +f 155/744/275 696/761/337 694/725/333 +f 694/725/333 696/761/337 878/745/336 +f 696/761/337 153/775/255 878/745/336 +f 878/745/336 153/775/255 654/762/253 +f 878/745/336 654/762/253 695/726/335 +f 695/726/335 654/762/253 150/746/245 +f 661/760/273 879/774/338 155/744/275 +f 155/744/275 879/774/338 696/761/337 +f 154/773/270 697/785/339 661/760/273 +f 661/760/273 697/785/339 879/774/338 +f 697/785/339 173/796/340 879/774/338 +f 879/774/338 173/796/340 698/786/341 +f 879/774/338 698/786/341 696/761/337 +f 696/761/337 698/786/341 153/775/255 +f 698/786/341 880/797/342 153/775/255 +f 153/775/255 880/797/342 655/787/254 +f 173/796/340 699/805/343 698/786/341 +f 698/786/341 699/805/343 880/797/342 +f 699/805/343 151/812/251 880/797/342 +f 880/797/342 151/812/251 652/806/249 +f 655/787/254 880/797/342 152/798/248 +f 152/798/248 880/797/342 652/806/249 +f 1084/695/344 836/667/161 524/718/345 +f 524/718/345 836/667/161 613/694/162 +f 1086/693/346 839/665/170 527/669/347 +f 527/669/347 839/665/170 617/641/168 +f 1088/668/348 838/640/167 530/692/349 +f 530/692/349 838/640/167 616/664/169 +f 536/768/192 626/751/189 1094/781/221 +f 1094/781/221 626/751/189 849/767/210 +f 700/556/327 171/580/329 853/577/217 +f 853/577/217 171/580/329 639/602/222 +f 700/556/327 113/533/207 701/534/350 +f 701/534/350 113/533/207 175/512/351 +f 578/511/208 112/490/53 702/491/352 +f 702/491/352 112/490/53 176/471/353 +f 701/534/350 174/557/354 700/556/327 +f 700/556/327 174/557/354 171/580/329 +f 702/491/352 175/512/351 578/511/208 +f 578/511/208 175/512/351 113/533/207 +f 703/451/46 176/471/353 577/470/45 +f 577/470/45 176/471/353 112/490/53 +f 177/514/355 180/536/356 704/535/357 +f 704/535/357 180/536/356 711/558/358 +f 174/557/354 701/534/350 704/535/357 +f 704/535/357 701/534/350 881/513/359 +f 701/534/350 175/512/351 881/513/359 +f 881/513/359 175/512/351 705/492/360 +f 705/492/360 178/473/361 881/513/359 +f 881/513/359 178/473/361 706/493/362 +f 704/535/357 881/513/359 177/514/355 +f 177/514/355 881/513/359 706/493/362 +f 175/512/351 702/491/352 705/492/360 +f 705/492/360 702/491/352 882/472/363 +f 702/491/352 176/471/353 882/472/363 +f 882/472/363 176/471/353 707/452/364 +f 707/452/364 179/433/365 882/472/363 +f 882/472/363 179/433/365 708/453/366 +f 882/472/363 708/453/366 705/492/360 +f 705/492/360 708/453/366 178/473/361 +f 176/471/353 703/451/46 707/452/364 +f 707/452/364 703/451/46 883/432/367 +f 703/451/46 107/436/30 883/432/367 +f 883/432/367 107/436/30 567/419/28 +f 567/419/28 99/405/7 883/432/367 +f 883/432/367 99/405/7 709/416/368 +f 883/432/367 709/416/368 707/452/364 +f 707/452/364 709/416/368 179/433/365 +f 180/536/356 177/514/355 710/515/369 +f 710/515/369 177/514/355 712/494/370 +f 704/535/357 711/558/358 174/557/354 +f 174/557/354 711/558/358 182/581/314 +f 710/515/369 712/494/370 181/516/371 +f 181/516/371 712/494/370 183/495/372 +f 712/494/370 177/514/355 884/474/373 +f 884/474/373 177/514/355 706/493/362 +f 178/473/361 713/454/374 706/493/362 +f 706/493/362 713/454/374 884/474/373 +f 713/454/374 184/455/375 884/474/373 +f 884/474/373 184/455/375 714/475/376 +f 884/474/373 714/475/376 712/494/370 +f 712/494/370 714/475/376 183/495/372 +f 708/453/366 885/434/377 178/473/361 +f 178/473/361 885/434/377 713/454/374 +f 179/433/365 715/417/378 708/453/366 +f 708/453/366 715/417/378 885/434/377 +f 715/417/378 185/418/379 885/434/377 +f 885/434/377 185/418/379 716/435/380 +f 885/434/377 716/435/380 713/454/374 +f 713/454/374 716/435/380 184/455/375 +f 709/416/368 886/403/381 179/433/365 +f 179/433/365 886/403/381 715/417/378 +f 99/405/7 556/394/6 709/416/368 +f 709/416/368 556/394/6 886/403/381 +f 556/394/6 100/393/5 886/403/381 +f 886/403/381 100/393/5 717/404/382 +f 886/403/381 717/404/382 715/417/378 +f 715/417/378 717/404/382 185/418/379 +f 718/529/383 887/551/384 181/516/371 +f 181/516/371 887/551/384 720/537/385 +f 158/550/289 667/573/287 718/529/383 +f 718/529/383 667/573/287 887/551/384 +f 667/573/287 156/597/282 887/551/384 +f 887/551/384 156/597/282 719/574/386 +f 887/551/384 719/574/386 720/537/385 +f 720/537/385 719/574/386 186/560/387 +f 181/516/371 720/537/385 710/515/369 +f 710/515/369 720/537/385 888/538/388 +f 720/537/385 186/560/387 888/538/388 +f 888/538/388 186/560/387 721/561/389 +f 888/538/388 721/561/389 722/559/390 +f 722/559/390 721/561/389 187/583/391 +f 710/515/369 888/538/388 180/536/356 +f 180/536/356 888/538/388 722/559/390 +f 181/516/371 183/495/372 718/529/383 +f 718/529/383 183/495/372 723/508/392 +f 718/529/383 723/508/392 158/550/289 +f 158/550/289 723/508/392 160/528/291 +f 723/508/392 183/495/372 889/488/393 +f 889/488/393 183/495/372 714/475/376 +f 184/455/375 724/469/394 714/475/376 +f 714/475/376 724/469/394 889/488/393 +f 889/488/393 724/469/394 674/507/298 +f 674/507/298 724/469/394 162/487/297 +f 723/508/392 889/488/393 160/528/291 +f 160/528/291 889/488/393 674/507/298 +f 716/435/380 890/450/395 184/455/375 +f 184/455/375 890/450/395 724/469/394 +f 185/418/379 725/431/396 716/435/380 +f 716/435/380 725/431/396 890/450/395 +f 725/431/396 164/449/303 890/450/395 +f 890/450/395 164/449/303 677/468/302 +f 724/469/394 890/450/395 162/487/297 +f 162/487/297 890/450/395 677/468/302 +f 717/404/382 891/415/397 185/418/379 +f 185/418/379 891/415/397 725/431/396 +f 100/393/5 566/402/24 717/404/382 +f 717/404/382 566/402/24 891/415/397 +f 566/402/24 105/414/25 891/415/397 +f 891/415/397 105/414/25 681/430/308 +f 891/415/397 681/430/308 725/431/396 +f 725/431/396 681/430/308 164/449/303 +f 156/597/282 664/622/281 719/574/386 +f 719/574/386 664/622/281 892/598/398 +f 664/622/281 157/648/280 892/598/398 +f 892/598/398 157/648/280 726/623/399 +f 892/598/398 726/623/399 727/585/400 +f 727/585/400 726/623/399 188/610/401 +f 719/574/386 892/598/398 186/560/387 +f 186/560/387 892/598/398 727/585/400 +f 151/812/251 699/805/343 658/816/260 +f 658/816/260 699/805/343 893/811/402 +f 699/805/343 173/796/340 893/811/402 +f 893/811/402 173/796/340 728/804/403 +f 173/796/340 697/785/339 728/804/403 +f 728/804/403 697/785/339 894/795/404 +f 154/773/270 659/784/271 697/785/339 +f 697/785/339 659/784/271 894/795/404 +f 657/808/258 859/813/259 542/814/263 +f 542/814/263 859/813/259 1098/817/405 +f 859/813/259 658/816/260 1098/817/405 +f 1098/817/405 658/816/260 545/818/406 +f 658/816/260 893/811/402 545/818/406 +f 545/818/406 893/811/402 1100/815/407 +f 893/811/402 728/804/403 1100/815/407 +f 1100/815/407 728/804/403 548/810/408 +f 548/810/408 728/804/403 1102/803/409 +f 1102/803/409 728/804/403 894/795/404 +f 659/784/271 551/794/410 894/795/404 +f 894/795/404 551/794/410 1102/803/409 +f 551/794/410 659/784/271 1104/793/411 +f 1104/793/411 659/784/271 860/782/269 +f 1104/793/411 860/782/269 554/783/266 +f 554/783/266 860/782/269 690/770/264 +f 174/557/354 182/581/314 171/580/329 +f 171/580/329 182/581/314 167/605/313 +f 689/735/276 729/713/322 170/754/323 +f 170/754/323 729/713/322 166/736/324 +f 688/686/319 730/659/320 169/712/277 +f 169/712/277 730/659/320 189/687/321 +f 687/631/315 731/606/316 168/658/317 +f 168/658/317 731/606/316 190/632/318 +f 166/736/324 732/714/412 686/755/265 +f 686/755/265 732/714/412 895/737/413 +f 732/714/412 191/689/414 895/737/413 +f 895/737/413 191/689/414 733/715/415 +f 895/737/413 733/715/415 1052/756/416 +f 1052/756/416 733/715/415 476/738/417 +f 729/713/322 896/688/418 166/736/324 +f 166/736/324 896/688/418 732/714/412 +f 189/687/321 734/660/419 729/713/322 +f 729/713/322 734/660/419 896/688/418 +f 734/660/419 192/634/420 896/688/418 +f 896/688/418 192/634/420 735/661/421 +f 896/688/418 735/661/421 732/714/412 +f 732/714/412 735/661/421 191/689/414 +f 730/659/320 897/633/422 189/687/321 +f 189/687/321 897/633/422 734/660/419 +f 190/632/318 736/607/423 730/659/320 +f 730/659/320 736/607/423 897/633/422 +f 736/607/423 187/583/391 897/633/422 +f 897/633/422 187/583/391 737/608/424 +f 897/633/422 737/608/424 734/660/419 +f 734/660/419 737/608/424 192/634/420 +f 731/606/316 898/582/425 190/632/318 +f 190/632/318 898/582/425 736/607/423 +f 731/606/316 182/581/314 898/582/425 +f 898/582/425 182/581/314 711/558/358 +f 898/582/425 711/558/358 722/559/390 +f 722/559/390 711/558/358 180/536/356 +f 736/607/423 898/582/425 187/583/391 +f 187/583/391 898/582/425 722/559/390 +f 191/689/414 738/662/426 733/715/415 +f 733/715/415 738/662/426 899/690/56 +f 738/662/426 115/663/65 899/690/56 +f 899/690/56 115/663/65 579/691/57 +f 191/689/414 735/661/421 738/662/426 +f 738/662/426 735/661/421 900/635/427 +f 735/661/421 192/634/420 900/635/427 +f 900/635/427 192/634/420 739/609/428 +f 900/635/427 739/609/428 740/636/429 +f 740/636/429 739/609/428 188/610/401 +f 738/662/426 900/635/427 115/663/65 +f 115/663/65 900/635/427 740/636/429 +f 192/634/420 737/608/424 739/609/428 +f 739/609/428 737/608/424 901/584/430 +f 737/608/424 187/583/391 901/584/430 +f 901/584/430 187/583/391 721/561/389 +f 901/584/430 721/561/389 727/585/400 +f 727/585/400 721/561/389 186/560/387 +f 739/609/428 901/584/430 188/610/401 +f 188/610/401 901/584/430 727/585/400 +f 115/663/65 740/636/429 580/676/64 +f 580/676/64 740/636/429 902/649/431 +f 740/636/429 188/610/401 902/649/431 +f 902/649/431 188/610/401 726/623/399 +f 902/649/431 726/623/399 666/675/285 +f 666/675/285 726/623/399 157/648/280 +f 580/676/64 902/649/431 114/700/66 +f 114/700/66 902/649/431 666/675/285 +f 741/820/432 903/821/433 1/819/434 +f 1/819/434 903/821/433 744/822/435 +f 2/825/436 742/826/437 741/820/432 +f 741/820/432 742/826/437 903/821/433 +f 742/826/437 64/837/438 903/821/433 +f 903/821/433 64/837/438 743/827/439 +f 903/821/433 743/827/439 744/822/435 +f 744/822/435 743/827/439 69/828/440 +f 1/819/434 745/823/441 741/820/432 +f 741/820/432 745/823/441 904/824/442 +f 745/823/441 44/832/443 904/824/442 +f 904/824/442 44/832/443 746/833/444 +f 904/824/442 746/833/444 747/834/445 +f 747/834/445 746/833/444 45/847/446 +f 741/820/432 904/824/442 2/825/436 +f 2/825/436 904/824/442 747/834/445 +f 748/830/447 905/831/448 1/819/434 +f 1/819/434 905/831/448 745/823/441 +f 748/830/447 95/842/449 905/831/448 +f 905/831/448 95/842/449 749/843/450 +f 749/843/450 43/858/451 905/831/448 +f 905/831/448 43/858/451 750/844/452 +f 905/831/448 750/844/452 745/823/441 +f 745/823/441 750/844/452 44/832/443 +f 1/819/434 744/822/435 748/830/447 +f 748/830/447 744/822/435 906/829/453 +f 744/822/435 69/828/440 906/829/453 +f 906/829/453 69/828/440 751/840/454 +f 906/829/453 751/840/454 752/841/455 +f 752/841/455 751/840/454 75/856/456 +f 748/830/447 906/829/453 95/842/449 +f 95/842/449 906/829/453 752/841/455 +f 753/835/457 907/836/458 2/825/436 +f 2/825/436 907/836/458 742/826/437 +f 753/835/457 4/849/459 907/836/458 +f 907/836/458 4/849/459 754/850/460 +f 907/836/458 754/850/460 755/851/461 +f 755/851/461 754/850/460 60/867/462 +f 907/836/458 755/851/461 742/826/437 +f 742/826/437 755/851/461 64/837/438 +f 2/825/436 747/834/445 753/835/457 +f 753/835/457 747/834/445 908/848/463 +f 45/847/446 756/863/464 747/834/445 +f 747/834/445 756/863/464 908/848/463 +f 756/863/464 3/880/465 908/848/463 +f 908/848/463 3/880/465 757/864/466 +f 908/848/463 757/864/466 753/835/457 +f 753/835/457 757/864/466 4/849/459 +f 757/864/466 762/881/467 4/849/459 +f 4/849/459 762/881/467 6/865/468 +f 3/880/465 5/898/469 757/864/466 +f 757/864/466 5/898/469 762/881/467 +f 758/897/470 761/916/471 3/880/465 +f 3/880/465 761/916/471 5/898/469 +f 761/916/471 758/897/470 382/935/472 +f 382/935/472 758/897/470 377/915/473 +f 3/880/465 756/863/464 758/897/470 +f 758/897/470 756/863/464 909/879/474 +f 756/863/464 45/847/446 909/879/474 +f 909/879/474 45/847/446 759/862/475 +f 754/850/460 763/866/476 60/867/462 +f 60/867/462 763/866/476 7/884/477 +f 4/849/459 6/865/468 754/850/460 +f 754/850/460 6/865/468 763/866/476 +f 60/867/462 7/884/477 760/885/478 +f 760/885/478 7/884/477 764/903/479 +f 760/885/478 764/903/479 59/904/480 +f 59/904/480 764/903/479 8/923/481 +f 5/898/469 761/916/471 779/917/482 +f 779/917/482 761/916/471 915/936/483 +f 6/865/468 762/881/467 781/882/484 +f 781/882/484 762/881/467 916/899/485 +f 762/881/467 5/898/469 916/899/485 +f 916/899/485 5/898/469 779/917/482 +f 7/884/477 763/866/476 783/902/486 +f 783/902/486 763/866/476 917/883/487 +f 763/866/476 6/865/468 917/883/487 +f 917/883/487 6/865/468 781/882/484 +f 8/923/481 764/903/479 785/943/488 +f 785/943/488 764/903/479 918/922/489 +f 764/903/479 7/884/477 918/922/489 +f 918/922/489 7/884/477 783/902/486 +f 765/944/490 938/965/491 56/966/492 +f 56/966/492 938/965/491 265/988/493 +f 765/944/490 8/923/481 938/965/491 +f 938/965/491 8/923/481 785/943/488 +f 59/904/480 8/923/481 336/924/494 +f 336/924/494 8/923/481 765/944/490 +f 56/966/492 58/945/495 765/944/490 +f 765/944/490 58/945/495 336/924/494 +f 995/956/496 915/936/483 382/935/472 +f 382/935/472 915/936/483 761/916/471 +f 766/1166/497 91/1146/498 910/1145/499 +f 910/1145/499 91/1146/498 767/1122/500 +f 910/1145/499 767/1122/500 768/1121/501 +f 768/1121/501 767/1122/500 88/1096/502 +f 769/1202/503 93/1186/504 911/1185/505 +f 911/1185/505 93/1186/504 770/1167/506 +f 911/1185/505 770/1167/506 766/1166/497 +f 766/1166/497 770/1167/506 91/1146/498 +f 912/1187/507 771/1169/508 772/1168/509 +f 772/1168/509 771/1169/508 36/1148/510 +f 769/1202/503 912/1187/507 93/1186/504 +f 93/1186/504 912/1187/507 772/1168/509 +f 913/1149/511 773/1126/512 774/1125/513 +f 774/1125/513 773/1126/512 37/1100/514 +f 771/1169/508 913/1149/511 36/1148/510 +f 36/1148/510 913/1149/511 774/1125/513 +f 914/1101/515 775/1074/516 776/1073/517 +f 776/1073/517 775/1074/516 38/1047/518 +f 773/1126/512 914/1101/515 37/1100/514 +f 37/1100/514 914/1101/515 776/1073/517 +f 777/1048/519 775/1074/516 414/1075/520 +f 414/1075/520 775/1074/516 412/1102/521 +f 775/1074/516 777/1048/519 38/1047/518 +f 38/1047/518 777/1048/519 39/1022/522 +f 777/1048/519 414/1075/520 955/1023/523 +f 955/1023/523 414/1075/520 1011/1049/524 +f 417/1024/525 303/999/526 1011/1049/524 +f 1011/1049/524 303/999/526 955/1023/523 +f 303/999/526 417/1024/525 957/976/527 +f 957/976/527 417/1024/525 1013/1000/528 +f 307/954/529 420/977/530 959/933/531 +f 959/933/531 420/977/530 1015/955/532 +f 311/913/533 423/934/534 961/894/535 +f 961/894/535 423/934/534 1017/914/536 +f 315/876/537 426/895/538 963/859/539 +f 963/859/539 426/895/538 1019/877/540 +f 429/860/541 1022/861/542 317/845/543 +f 317/845/543 1022/861/542 964/846/544 +f 381/878/545 994/896/546 759/862/475 +f 759/862/475 994/896/546 909/879/474 +f 994/896/546 377/915/473 909/879/474 +f 909/879/474 377/915/473 758/897/470 +f 778/957/547 9/937/548 915/936/483 +f 915/936/483 9/937/548 779/917/482 +f 9/937/548 780/918/549 779/917/482 +f 779/917/482 780/918/549 916/899/485 +f 916/899/485 780/918/549 781/882/484 +f 781/882/484 780/918/549 10/900/550 +f 781/882/484 10/900/550 917/883/487 +f 917/883/487 10/900/550 782/901/551 +f 917/883/487 782/901/551 783/902/486 +f 783/902/486 782/901/551 19/921/552 +f 783/902/486 19/921/552 918/922/489 +f 918/922/489 19/921/552 784/942/553 +f 918/922/489 784/942/553 785/943/488 +f 785/943/488 784/942/553 23/964/554 +f 786/1002/555 11/980/556 919/979/557 +f 919/979/557 11/980/556 787/958/558 +f 919/979/557 787/958/558 778/957/547 +f 778/957/547 787/958/558 9/937/548 +f 9/937/548 787/958/558 780/918/549 +f 780/918/549 787/958/558 920/938/559 +f 787/958/558 11/980/556 920/938/559 +f 920/938/559 11/980/556 788/959/560 +f 920/938/559 788/959/560 789/919/561 +f 789/919/561 788/959/560 12/939/562 +f 780/918/549 920/938/559 10/900/550 +f 10/900/550 920/938/559 789/919/561 +f 10/900/550 789/919/561 782/901/551 +f 782/901/551 789/919/561 921/920/563 +f 789/919/561 12/939/562 921/920/563 +f 921/920/563 12/939/562 790/940/564 +f 921/920/563 790/940/564 791/941/565 +f 791/941/565 790/940/564 18/962/566 +f 782/901/551 921/920/563 19/921/552 +f 19/921/552 921/920/563 791/941/565 +f 792/1051/567 13/1027/568 922/1026/569 +f 922/1026/569 13/1027/568 793/1003/570 +f 922/1026/569 793/1003/570 786/1002/555 +f 786/1002/555 793/1003/570 11/980/556 +f 11/980/556 793/1003/570 788/959/560 +f 788/959/560 793/1003/570 923/981/571 +f 793/1003/570 13/1027/568 923/981/571 +f 923/981/571 13/1027/568 794/1004/572 +f 923/981/571 794/1004/572 795/960/573 +f 795/960/573 794/1004/572 15/982/574 +f 788/959/560 923/981/571 12/939/562 +f 12/939/562 923/981/571 795/960/573 +f 12/939/562 795/960/573 790/940/564 +f 790/940/564 795/960/573 924/961/575 +f 795/960/573 15/982/574 924/961/575 +f 924/961/575 15/982/574 796/983/576 +f 924/961/575 796/983/576 797/984/577 +f 797/984/577 796/983/576 17/1007/578 +f 790/940/564 924/961/575 18/962/566 +f 18/962/566 924/961/575 797/984/577 +f 13/1027/568 798/1052/579 794/1004/572 +f 794/1004/572 798/1052/579 925/1028/580 +f 798/1052/579 96/1078/581 925/1028/580 +f 925/1028/580 96/1078/581 799/1053/582 +f 925/1028/580 799/1053/582 800/1005/583 +f 800/1005/583 799/1053/582 14/1029/584 +f 794/1004/572 925/1028/580 15/982/574 +f 15/982/574 925/1028/580 800/1005/583 +f 13/1027/568 792/1051/567 798/1052/579 +f 798/1052/579 792/1051/567 926/1077/585 +f 798/1052/579 926/1077/585 96/1078/581 +f 96/1078/581 926/1077/585 801/1104/586 +f 14/1029/584 802/1030/587 800/1005/583 +f 800/1005/583 802/1030/587 927/1006/588 +f 802/1030/587 16/1056/589 927/1006/588 +f 927/1006/588 16/1056/589 803/1031/590 +f 803/1031/590 17/1007/578 927/1006/588 +f 927/1006/588 17/1007/578 796/983/576 +f 927/1006/588 796/983/576 800/1005/583 +f 800/1005/583 796/983/576 15/982/574 +f 804/1054/591 928/1055/592 14/1029/584 +f 14/1029/584 928/1055/592 802/1030/587 +f 928/1055/592 805/1082/593 802/1030/587 +f 802/1030/587 805/1082/593 16/1056/589 +f 14/1029/584 799/1053/582 804/1054/591 +f 804/1054/591 799/1053/582 929/1079/594 +f 799/1053/582 96/1078/581 929/1079/594 +f 929/1079/594 96/1078/581 801/1104/586 +f 16/1056/589 806/1083/595 803/1031/590 +f 803/1031/590 806/1083/595 930/1057/596 +f 806/1083/595 20/1108/597 930/1057/596 +f 930/1057/596 20/1108/597 807/1084/598 +f 807/1084/598 21/1058/599 930/1057/596 +f 930/1057/596 21/1058/599 808/1032/600 +f 930/1057/596 808/1032/600 803/1031/590 +f 803/1031/590 808/1032/600 17/1007/578 +f 805/1082/593 931/1107/601 16/1056/589 +f 16/1056/589 931/1107/601 806/1083/595 +f 931/1107/601 809/1130/602 806/1083/595 +f 806/1083/595 809/1130/602 20/1108/597 +f 808/1032/600 932/1008/603 17/1007/578 +f 17/1007/578 932/1008/603 797/984/577 +f 21/1058/599 810/1033/604 808/1032/600 +f 808/1032/600 810/1033/604 932/1008/603 +f 810/1033/604 22/1009/605 932/1008/603 +f 932/1008/603 22/1009/605 811/985/606 +f 932/1008/603 811/985/606 797/984/577 +f 797/984/577 811/985/606 18/962/566 +f 811/985/606 933/963/607 18/962/566 +f 18/962/566 933/963/607 791/941/565 +f 22/1009/605 812/986/608 811/985/606 +f 811/985/606 812/986/608 933/963/607 +f 812/986/608 23/964/554 933/963/607 +f 933/963/607 23/964/554 784/942/553 +f 933/963/607 784/942/553 791/941/565 +f 791/941/565 784/942/553 19/921/552 +f 934/1152/609 257/1172/610 258/1131/611 +f 258/1131/611 257/1172/610 24/1153/612 +f 809/1130/602 934/1152/609 20/1108/597 +f 20/1108/597 934/1152/609 258/1131/611 +f 20/1108/597 258/1131/611 807/1084/598 +f 807/1084/598 258/1131/611 935/1109/613 +f 258/1131/611 24/1153/612 935/1109/613 +f 935/1109/613 24/1153/612 259/1132/614 +f 935/1109/613 259/1132/614 260/1085/615 +f 260/1085/615 259/1132/614 25/1110/616 +f 807/1084/598 935/1109/613 21/1058/599 +f 21/1058/599 935/1109/613 260/1085/615 +f 260/1085/615 936/1059/617 21/1058/599 +f 21/1058/599 936/1059/617 810/1033/604 +f 25/1110/616 261/1086/618 260/1085/615 +f 260/1085/615 261/1086/618 936/1059/617 +f 261/1086/618 26/1060/619 936/1059/617 +f 936/1059/617 26/1060/619 262/1034/620 +f 936/1059/617 262/1034/620 810/1033/604 +f 810/1033/604 262/1034/620 22/1009/605 +f 262/1034/620 937/1010/621 22/1009/605 +f 22/1009/605 937/1010/621 812/986/608 +f 26/1060/619 263/1035/622 262/1034/620 +f 262/1034/620 263/1035/622 937/1010/621 +f 263/1035/622 27/1011/623 937/1010/621 +f 937/1010/621 27/1011/623 264/987/624 +f 937/1010/621 264/987/624 812/986/608 +f 812/986/608 264/987/624 23/964/554 +f 264/987/624 938/965/491 23/964/554 +f 23/964/554 938/965/491 785/943/488 +f 27/1011/623 265/988/493 264/987/624 +f 264/987/624 265/988/493 938/965/491 +f 257/1172/610 939/1190/625 24/1153/612 +f 24/1153/612 939/1190/625 266/1173/626 +f 939/1190/625 270/1205/627 266/1173/626 +f 266/1173/626 270/1205/627 33/1191/628 +f 939/1190/625 257/1172/610 1037/1204/629 +f 1037/1204/629 257/1172/610 451/1189/630 +f 259/1132/614 940/1154/631 25/1110/616 +f 25/1110/616 940/1154/631 267/1133/632 +f 24/1153/612 266/1173/626 259/1132/614 +f 259/1132/614 266/1173/626 940/1154/631 +f 266/1173/626 33/1191/628 940/1154/631 +f 940/1154/631 33/1191/628 271/1174/633 +f 940/1154/631 271/1174/633 267/1133/632 +f 267/1133/632 271/1174/633 30/1155/634 +f 26/1060/619 261/1086/618 268/1087/635 +f 268/1087/635 261/1086/618 941/1111/636 +f 25/1110/616 267/1133/632 261/1086/618 +f 261/1086/618 267/1133/632 941/1111/636 +f 267/1133/632 30/1155/634 941/1111/636 +f 941/1111/636 30/1155/634 272/1134/637 +f 268/1087/635 941/1111/636 29/1112/638 +f 29/1112/638 941/1111/636 272/1134/637 +f 27/1011/623 263/1035/622 269/1036/639 +f 269/1036/639 263/1035/622 942/1061/640 +f 263/1035/622 26/1060/619 942/1061/640 +f 942/1061/640 26/1060/619 268/1087/635 +f 942/1061/640 268/1087/635 273/1088/641 +f 273/1088/641 268/1087/635 29/1112/638 +f 265/988/493 27/1011/623 943/1012/642 +f 943/1012/642 27/1011/623 269/1036/639 +f 943/1012/642 269/1036/639 274/1037/643 +f 274/1037/643 269/1036/639 28/1062/644 +f 56/966/492 265/988/493 325/989/645 +f 325/989/645 265/988/493 943/1012/642 +f 273/1088/641 28/1062/644 942/1061/640 +f 942/1061/640 28/1062/644 269/1036/639 +f 270/1205/627 939/1190/625 387/1216/646 +f 387/1216/646 939/1190/625 1037/1204/629 +f 326/1063/647 274/1037/643 50/1089/648 +f 50/1089/648 274/1037/643 28/1062/644 +f 273/1088/641 276/1113/649 28/1062/644 +f 28/1062/644 276/1113/649 50/1089/648 +f 29/1112/638 53/1135/650 273/1088/641 +f 273/1088/641 53/1135/650 276/1113/649 +f 272/1134/637 275/1156/651 29/1112/638 +f 29/1112/638 275/1156/651 53/1135/650 +f 272/1134/637 30/1155/634 275/1156/651 +f 275/1156/651 30/1155/634 31/1175/652 +f 271/1174/633 33/1191/628 277/1192/653 +f 277/1192/653 33/1191/628 34/1206/654 +f 277/1192/653 31/1175/652 271/1174/633 +f 271/1174/633 31/1175/652 30/1155/634 +f 31/1175/652 277/1192/653 280/1193/655 +f 280/1193/655 277/1192/653 944/1207/656 +f 277/1192/653 34/1206/654 944/1207/656 +f 944/1207/656 34/1206/654 278/1218/657 +f 944/1207/656 278/1218/657 279/1219/658 +f 279/1219/658 278/1218/657 35/383/659 +f 280/1193/655 944/1207/656 32/1208/660 +f 32/1208/660 944/1207/656 279/1219/658 +f 280/1193/655 945/1176/661 31/1175/652 +f 31/1175/652 945/1176/661 275/1156/651 +f 280/1193/655 32/1208/660 945/1176/661 +f 945/1176/661 32/1208/660 281/1194/662 +f 945/1176/661 281/1194/662 282/1157/663 +f 282/1157/663 281/1194/662 54/1177/664 +f 275/1156/651 945/1176/661 53/1135/650 +f 53/1135/650 945/1176/661 282/1157/663 +f 32/1208/660 279/1219/658 285/1220/665 +f 285/1220/665 279/1219/658 946/382/666 +f 279/1219/658 35/383/659 946/382/666 +f 946/382/666 35/383/659 283/374/667 +f 946/382/666 283/374/667 284/373/668 +f 284/373/668 283/374/667 76/367/669 +f 285/1220/665 946/382/666 94/381/670 +f 94/381/670 946/382/666 284/373/668 +f 32/1208/660 285/1220/665 281/1194/662 +f 281/1194/662 285/1220/665 947/1209/671 +f 285/1220/665 94/381/670 947/1209/671 +f 947/1209/671 94/381/670 286/1221/672 +f 947/1209/671 286/1221/672 287/1195/673 +f 287/1195/673 286/1221/672 55/1210/674 +f 281/1194/662 947/1209/671 54/1177/664 +f 54/1177/664 947/1209/671 287/1195/673 +f 270/1205/627 387/1216/646 288/1217/675 +f 288/1217/675 387/1216/646 389/385/676 +f 288/1217/675 34/1206/654 270/1205/627 +f 270/1205/627 34/1206/654 33/1191/628 +f 34/1206/654 288/1217/675 278/1218/657 +f 278/1218/657 288/1217/675 948/384/677 +f 288/1217/675 389/385/676 948/384/677 +f 948/384/677 389/385/676 1039/376/678 +f 278/1218/657 948/384/677 35/383/659 +f 35/383/659 948/384/677 289/375/679 +f 35/383/659 289/375/679 283/374/667 +f 283/374/667 289/375/679 949/368/680 +f 289/375/679 455/369/681 949/368/680 +f 949/368/680 455/369/681 1041/364/682 +f 283/374/667 949/368/680 76/367/669 +f 76/367/669 949/368/680 290/363/683 +f 49/1181/684 292/1198/685 291/1199/686 +f 291/1199/686 292/1198/685 950/1213/687 +f 292/1198/685 49/1181/684 951/1180/688 +f 951/1180/688 49/1181/684 324/1161/689 +f 292/1198/685 78/1212/690 950/1213/687 +f 950/1213/687 78/1212/690 293/1224/691 +f 950/1213/687 293/1224/691 1047/386/692 +f 1047/386/692 293/1224/691 464/377/693 +f 951/1180/688 294/1160/694 295/1197/695 +f 295/1197/695 294/1160/694 52/1179/696 +f 292/1198/685 951/1180/688 78/1212/690 +f 78/1212/690 951/1180/688 295/1197/695 +f 318/1182/697 392/1200/698 985/1163/699 +f 985/1163/699 392/1200/698 997/1183/700 +f 362/1142/701 394/1164/702 989/1120/703 +f 989/1120/703 394/1164/702 999/1143/704 +f 768/1121/501 397/1144/705 910/1145/499 +f 910/1145/499 397/1144/705 1001/1165/706 +f 766/1166/497 400/1184/707 911/1185/505 +f 911/1185/505 400/1184/707 1003/1201/708 +f 403/1215/709 1005/1203/710 769/1202/503 +f 769/1202/503 1005/1203/710 912/1187/507 +f 406/1188/711 1007/1170/712 771/1169/508 +f 771/1169/508 1007/1170/712 913/1149/511 +f 409/1150/713 1009/1127/714 773/1126/512 +f 773/1126/512 1009/1127/714 914/1101/515 +f 774/1125/513 952/1099/715 36/1148/510 +f 36/1148/510 952/1099/715 298/1124/716 +f 37/1100/514 296/1072/717 774/1125/513 +f 774/1125/513 296/1072/717 952/1099/715 +f 296/1072/717 70/1045/718 952/1099/715 +f 952/1099/715 70/1045/718 297/1071/719 +f 952/1099/715 297/1071/719 298/1124/716 +f 298/1124/716 297/1071/719 92/1098/720 +f 36/1148/510 298/1124/716 772/1168/509 +f 772/1168/509 298/1124/716 953/1147/721 +f 298/1124/716 92/1098/720 953/1147/721 +f 953/1147/721 92/1098/720 299/1123/722 +f 953/1147/721 299/1123/722 770/1167/506 +f 770/1167/506 299/1123/722 91/1146/498 +f 772/1168/509 953/1147/721 93/1186/504 +f 93/1186/504 953/1147/721 770/1167/506 +f 776/1073/517 954/1046/723 37/1100/514 +f 37/1100/514 954/1046/723 296/1072/717 +f 776/1073/517 38/1047/518 954/1046/723 +f 954/1046/723 38/1047/518 300/1021/724 +f 954/1046/723 300/1021/724 301/1020/725 +f 301/1020/725 300/1021/724 71/996/726 +f 954/1046/723 301/1020/725 296/1072/717 +f 296/1072/717 301/1020/725 70/1045/718 +f 300/1021/724 302/997/727 71/996/726 +f 71/996/726 302/997/727 72/973/728 +f 38/1047/518 39/1022/522 300/1021/724 +f 300/1021/724 39/1022/522 302/997/727 +f 39/1022/522 777/1048/519 304/998/729 +f 304/998/729 777/1048/519 955/1023/523 +f 72/973/728 302/997/727 306/951/730 +f 306/951/730 302/997/727 956/974/731 +f 302/997/727 39/1022/522 956/974/731 +f 956/974/731 39/1022/522 304/998/729 +f 304/998/729 955/1023/523 40/975/732 +f 40/975/732 955/1023/523 303/999/526 +f 956/974/731 304/998/729 305/952/733 +f 305/952/733 304/998/729 40/975/732 +f 306/951/730 956/974/731 73/930/734 +f 73/930/734 956/974/731 305/952/733 +f 307/954/529 41/932/735 957/976/527 +f 957/976/527 41/932/735 308/953/736 +f 957/976/527 308/953/736 303/999/526 +f 303/999/526 308/953/736 40/975/732 +f 308/953/736 958/931/737 40/975/732 +f 40/975/732 958/931/737 305/952/733 +f 41/932/735 309/911/738 308/953/736 +f 308/953/736 309/911/738 958/931/737 +f 309/911/738 74/891/739 958/931/737 +f 958/931/737 74/891/739 310/910/740 +f 958/931/737 310/910/740 305/952/733 +f 305/952/733 310/910/740 73/930/734 +f 311/913/533 42/893/741 959/933/531 +f 959/933/531 42/893/741 312/912/742 +f 959/933/531 312/912/742 307/954/529 +f 307/954/529 312/912/742 41/932/735 +f 312/912/742 960/892/743 41/932/735 +f 41/932/735 960/892/743 309/911/738 +f 42/893/741 313/874/744 312/912/742 +f 312/912/742 313/874/744 960/892/743 +f 313/874/744 75/856/456 960/892/743 +f 960/892/743 75/856/456 314/873/745 +f 960/892/743 314/873/745 309/911/738 +f 309/911/738 314/873/745 74/891/739 +f 315/876/537 43/858/451 961/894/535 +f 961/894/535 43/858/451 316/875/746 +f 961/894/535 316/875/746 311/913/533 +f 311/913/533 316/875/746 42/893/741 +f 316/875/746 962/857/747 42/893/741 +f 42/893/741 962/857/747 313/874/744 +f 43/858/451 749/843/450 316/875/746 +f 316/875/746 749/843/450 962/857/747 +f 749/843/450 95/842/449 962/857/747 +f 962/857/747 95/842/449 752/841/455 +f 962/857/747 752/841/455 313/874/744 +f 313/874/744 752/841/455 75/856/456 +f 317/845/543 44/832/443 963/859/539 +f 963/859/539 44/832/443 750/844/452 +f 963/859/539 750/844/452 315/876/537 +f 315/876/537 750/844/452 43/858/451 +f 964/846/544 759/862/475 746/833/444 +f 746/833/444 759/862/475 45/847/446 +f 964/846/544 746/833/444 317/845/543 +f 317/845/543 746/833/444 44/832/443 +f 318/1182/697 80/1162/748 291/1199/686 +f 291/1199/686 80/1162/748 49/1181/684 +f 319/1140/749 81/1117/750 324/1161/689 +f 324/1161/689 81/1117/750 48/1139/751 +f 80/1162/748 319/1140/749 49/1181/684 +f 49/1181/684 319/1140/749 324/1161/689 +f 320/1092/752 82/1065/753 323/1116/754 +f 323/1116/754 82/1065/753 47/1091/755 +f 81/1117/750 320/1092/752 48/1139/751 +f 48/1139/751 320/1092/752 323/1116/754 +f 321/1064/756 47/1091/755 322/1039/757 +f 322/1039/757 47/1091/755 82/1065/753 +f 46/1038/758 321/1064/756 83/1014/759 +f 83/1014/759 321/1064/756 322/1039/757 +f 321/1064/756 965/1090/760 47/1091/755 +f 47/1091/755 965/1090/760 328/1115/761 +f 46/1038/758 326/1063/647 321/1064/756 +f 321/1064/756 326/1063/647 965/1090/760 +f 966/1138/762 323/1116/754 328/1115/761 +f 328/1115/761 323/1116/754 47/1091/755 +f 951/1180/688 324/1161/689 294/1160/694 +f 294/1160/694 324/1161/689 48/1139/751 +f 79/1013/763 274/1037/643 46/1038/758 +f 46/1038/758 274/1037/643 326/1063/647 +f 325/989/645 943/1012/642 79/1013/763 +f 79/1013/763 943/1012/642 274/1037/643 +f 294/1160/694 48/1139/751 966/1138/762 +f 966/1138/762 48/1139/751 323/1116/754 +f 50/1089/648 327/1114/764 326/1063/647 +f 326/1063/647 327/1114/764 965/1090/760 +f 327/1114/764 51/1137/765 965/1090/760 +f 965/1090/760 51/1137/765 328/1115/761 +f 51/1137/765 329/1159/766 328/1115/761 +f 328/1115/761 329/1159/766 966/1138/762 +f 329/1159/766 52/1179/696 966/1138/762 +f 966/1138/762 52/1179/696 294/1160/694 +f 276/1113/649 967/1136/767 50/1089/648 +f 50/1089/648 967/1136/767 327/1114/764 +f 53/1135/650 282/1157/663 276/1113/649 +f 276/1113/649 282/1157/663 967/1136/767 +f 282/1157/663 54/1177/664 967/1136/767 +f 967/1136/767 54/1177/664 330/1158/768 +f 967/1136/767 330/1158/768 327/1114/764 +f 327/1114/764 330/1158/768 51/1137/765 +f 330/1158/768 968/1178/769 51/1137/765 +f 51/1137/765 968/1178/769 329/1159/766 +f 54/1177/664 287/1195/673 330/1158/768 +f 330/1158/768 287/1195/673 968/1178/769 +f 287/1195/673 55/1210/674 968/1178/769 +f 968/1178/769 55/1210/674 331/1196/770 +f 968/1178/769 331/1196/770 329/1159/766 +f 329/1159/766 331/1196/770 52/1179/696 +f 331/1196/770 969/1211/771 52/1179/696 +f 52/1179/696 969/1211/771 295/1197/695 +f 55/1210/674 332/1222/772 331/1196/770 +f 331/1196/770 332/1222/772 969/1211/771 +f 332/1222/772 77/379/773 969/1211/771 +f 969/1211/771 77/379/773 333/1223/774 +f 969/1211/771 333/1223/774 295/1197/695 +f 295/1197/695 333/1223/774 78/1212/690 +f 286/1221/672 970/380/775 55/1210/674 +f 55/1210/674 970/380/775 332/1222/772 +f 286/1221/672 94/381/670 970/380/775 +f 970/380/775 94/381/670 284/373/668 +f 284/373/668 76/367/669 970/380/775 +f 970/380/775 76/367/669 334/372/776 +f 970/380/775 334/372/776 332/1222/772 +f 332/1222/772 334/372/776 77/379/773 +f 778/957/547 385/978/777 919/979/557 +f 919/979/557 385/978/777 1023/1001/778 +f 786/1002/555 433/1025/779 922/1026/569 +f 922/1026/569 433/1025/779 1025/1050/780 +f 792/1051/567 436/1076/781 926/1077/585 +f 926/1077/585 436/1076/781 1027/1103/782 +f 439/1128/783 1029/1105/784 801/1104/586 +f 801/1104/586 1029/1105/784 929/1079/594 +f 442/1080/785 1031/1081/786 804/1054/591 +f 804/1054/591 1031/1081/786 928/1055/592 +f 445/1106/787 1033/1129/788 805/1082/593 +f 805/1082/593 1033/1129/788 931/1107/601 +f 448/1151/789 1035/1171/790 809/1130/602 +f 809/1130/602 1035/1171/790 934/1152/609 +f 325/989/645 335/967/791 56/966/492 +f 56/966/492 335/967/791 58/945/495 +f 79/1013/763 57/990/792 325/989/645 +f 325/989/645 57/990/792 335/967/791 +f 337/991/793 87/969/794 338/968/795 +f 338/968/795 87/969/794 61/947/796 +f 46/1038/758 83/1014/759 79/1013/763 +f 79/1013/763 83/1014/759 57/990/792 +f 338/968/795 57/990/792 337/991/793 +f 337/991/793 57/990/792 83/1014/759 +f 971/946/797 335/967/791 338/968/795 +f 338/968/795 335/967/791 57/990/792 +f 971/946/797 338/968/795 339/926/798 +f 339/926/798 338/968/795 61/947/796 +f 335/967/791 971/946/797 58/945/495 +f 58/945/495 971/946/797 340/925/799 +f 340/925/799 971/946/797 62/906/800 +f 62/906/800 971/946/797 339/926/798 +f 58/945/495 340/925/799 336/924/494 +f 336/924/494 340/925/799 972/905/801 +f 62/906/800 341/887/802 340/925/799 +f 340/925/799 341/887/802 972/905/801 +f 341/887/802 63/869/803 972/905/801 +f 972/905/801 63/869/803 342/886/804 +f 336/924/494 972/905/801 59/904/480 +f 59/904/480 972/905/801 342/886/804 +f 59/904/480 342/886/804 760/885/478 +f 760/885/478 342/886/804 973/868/805 +f 63/869/803 343/852/806 342/886/804 +f 342/886/804 343/852/806 973/868/805 +f 343/852/806 64/837/438 973/868/805 +f 973/868/805 64/837/438 755/851/461 +f 760/885/478 973/868/805 60/867/462 +f 60/867/462 973/868/805 755/851/461 +f 344/948/807 65/949/808 345/927/809 +f 345/927/809 65/949/808 66/928/810 +f 345/927/809 61/947/796 344/948/807 +f 344/948/807 61/947/796 87/969/794 +f 339/926/798 61/947/796 974/907/811 +f 974/907/811 61/947/796 345/927/809 +f 974/907/811 345/927/809 346/908/812 +f 346/908/812 345/927/809 66/928/810 +f 62/906/800 339/926/798 347/888/813 +f 347/888/813 339/926/798 974/907/811 +f 347/888/813 974/907/811 67/889/814 +f 67/889/814 974/907/811 346/908/812 +f 347/888/813 975/870/815 62/906/800 +f 62/906/800 975/870/815 341/887/802 +f 67/889/814 348/871/816 347/888/813 +f 347/888/813 348/871/816 975/870/815 +f 348/871/816 68/854/817 975/870/815 +f 975/870/815 68/854/817 349/853/818 +f 975/870/815 349/853/818 341/887/802 +f 341/887/802 349/853/818 63/869/803 +f 349/853/818 976/838/819 63/869/803 +f 63/869/803 976/838/819 343/852/806 +f 68/854/817 350/839/820 349/853/818 +f 349/853/818 350/839/820 976/838/819 +f 350/839/820 69/828/440 976/838/819 +f 976/838/819 69/828/440 743/827/439 +f 976/838/819 743/827/439 343/852/806 +f 343/852/806 743/827/439 64/837/438 +f 351/972/821 71/996/726 356/950/822 +f 356/950/822 71/996/726 72/973/728 +f 352/971/823 977/995/824 65/949/808 +f 65/949/808 977/995/824 351/972/821 +f 90/994/825 353/1019/826 352/971/823 +f 352/971/823 353/1019/826 977/995/824 +f 353/1019/826 70/1045/718 977/995/824 +f 977/995/824 70/1045/718 301/1020/725 +f 977/995/824 301/1020/725 351/972/821 +f 351/972/821 301/1020/725 71/996/726 +f 65/949/808 344/948/807 352/971/823 +f 352/971/823 344/948/807 978/970/827 +f 344/948/807 87/969/794 978/970/827 +f 978/970/827 87/969/794 354/992/828 +f 978/970/827 354/992/828 355/993/829 +f 355/993/829 354/992/828 86/1016/830 +f 352/971/823 978/970/827 90/994/825 +f 90/994/825 978/970/827 355/993/829 +f 356/950/822 66/928/810 351/972/821 +f 351/972/821 66/928/810 65/949/808 +f 346/908/812 66/928/810 979/929/831 +f 979/929/831 66/928/810 356/950/822 +f 979/929/831 356/950/822 306/951/730 +f 306/951/730 356/950/822 72/973/728 +f 67/889/814 346/908/812 357/909/832 +f 357/909/832 346/908/812 979/929/831 +f 979/929/831 306/951/730 357/909/832 +f 357/909/832 306/951/730 73/930/734 +f 357/909/832 980/890/833 67/889/814 +f 67/889/814 980/890/833 348/871/816 +f 357/909/832 73/930/734 980/890/833 +f 980/890/833 73/930/734 310/910/740 +f 310/910/740 74/891/739 980/890/833 +f 980/890/833 74/891/739 358/872/834 +f 980/890/833 358/872/834 348/871/816 +f 348/871/816 358/872/834 68/854/817 +f 358/872/834 981/855/835 68/854/817 +f 68/854/817 981/855/835 350/839/820 +f 74/891/739 314/873/745 358/872/834 +f 358/872/834 314/873/745 981/855/835 +f 314/873/745 75/856/456 981/855/835 +f 981/855/835 75/856/456 751/840/454 +f 981/855/835 751/840/454 350/839/820 +f 350/839/820 751/840/454 69/828/440 +f 70/1045/718 353/1019/826 297/1071/719 +f 297/1071/719 353/1019/826 982/1044/836 +f 353/1019/826 90/994/825 982/1044/836 +f 982/1044/836 90/994/825 359/1018/837 +f 982/1044/836 359/1018/837 360/1070/838 +f 360/1070/838 359/1018/837 89/1043/839 +f 297/1071/719 982/1044/836 92/1098/720 +f 92/1098/720 982/1044/836 360/1070/838 +f 76/367/669 290/363/683 334/372/776 +f 334/372/776 290/363/683 983/366/840 +f 290/363/683 458/361/841 983/366/840 +f 983/366/840 458/361/841 1043/362/842 +f 334/372/776 983/366/840 77/379/773 +f 77/379/773 983/366/840 361/371/843 +f 77/379/773 361/371/843 333/1223/774 +f 333/1223/774 361/371/843 984/378/844 +f 984/378/844 361/371/843 1045/370/845 +f 1045/370/845 361/371/843 461/365/846 +f 984/378/844 293/1224/691 333/1223/774 +f 333/1223/774 293/1224/691 78/1212/690 +f 362/1142/701 84/1119/847 985/1163/699 +f 985/1163/699 84/1119/847 363/1141/848 +f 985/1163/699 363/1141/848 318/1182/697 +f 318/1182/697 363/1141/848 80/1162/748 +f 363/1141/848 986/1118/849 80/1162/748 +f 80/1162/748 986/1118/849 319/1140/749 +f 84/1119/847 364/1094/850 363/1141/848 +f 363/1141/848 364/1094/850 986/1118/849 +f 364/1094/850 85/1067/851 986/1118/849 +f 986/1118/849 85/1067/851 365/1093/852 +f 986/1118/849 365/1093/852 319/1140/749 +f 319/1140/749 365/1093/852 81/1117/750 +f 365/1093/852 987/1066/853 81/1117/750 +f 81/1117/750 987/1066/853 320/1092/752 +f 85/1067/851 366/1041/854 365/1093/852 +f 365/1093/852 366/1041/854 987/1066/853 +f 366/1041/854 86/1016/830 987/1066/853 +f 987/1066/853 86/1016/830 367/1040/855 +f 987/1066/853 367/1040/855 320/1092/752 +f 320/1092/752 367/1040/855 82/1065/753 +f 367/1040/855 988/1015/856 82/1065/753 +f 82/1065/753 988/1015/856 322/1039/757 +f 367/1040/855 86/1016/830 988/1015/856 +f 988/1015/856 86/1016/830 354/992/828 +f 988/1015/856 354/992/828 337/991/793 +f 337/991/793 354/992/828 87/969/794 +f 322/1039/757 988/1015/856 83/1014/759 +f 83/1014/759 988/1015/856 337/991/793 +f 768/1121/501 88/1096/502 989/1120/703 +f 989/1120/703 88/1096/502 368/1095/857 +f 989/1120/703 368/1095/857 362/1142/701 +f 362/1142/701 368/1095/857 84/1119/847 +f 84/1119/847 368/1095/857 364/1094/850 +f 364/1094/850 368/1095/857 990/1068/858 +f 368/1095/857 88/1096/502 990/1068/858 +f 990/1068/858 88/1096/502 369/1069/859 +f 990/1068/858 369/1069/859 370/1042/860 +f 370/1042/860 369/1069/859 89/1043/839 +f 364/1094/850 990/1068/858 85/1067/851 +f 85/1067/851 990/1068/858 370/1042/860 +f 85/1067/851 370/1042/860 366/1041/854 +f 366/1041/854 370/1042/860 991/1017/861 +f 370/1042/860 89/1043/839 991/1017/861 +f 991/1017/861 89/1043/839 359/1018/837 +f 991/1017/861 359/1018/837 355/993/829 +f 355/993/829 359/1018/837 90/994/825 +f 366/1041/854 991/1017/861 86/1016/830 +f 86/1016/830 991/1017/861 355/993/829 +f 88/1096/502 767/1122/500 369/1069/859 +f 369/1069/859 767/1122/500 992/1097/862 +f 767/1122/500 91/1146/498 992/1097/862 +f 992/1097/862 91/1146/498 299/1123/722 +f 992/1097/862 299/1123/722 360/1070/838 +f 360/1070/838 299/1123/722 92/1098/720 +f 369/1069/859 992/1097/862 89/1043/839 +f 89/1043/839 992/1097/862 360/1070/838 +f 227/1/863 513/2/864 472/4/865 +f 472/4/865 513/2/864 1077/3/866 +f 1078/5/119 513/2/864 473/6/867 +f 473/6/867 513/2/864 227/1/863 +f 371/7/868 225/8/869 472/4/865 +f 472/4/865 225/8/869 227/1/863 +f 227/1/863 225/8/869 473/6/867 +f 473/6/867 225/8/869 372/9/312 +f 372/502/312 572/481/36 473/523/867 +f 473/523/867 572/481/36 574/501/39 +f 373/10/870 228/11/871 538/13/872 +f 538/13/872 228/11/871 251/12/873 +f 251/12/873 228/11/871 539/15/261 +f 539/15/261 228/11/871 374/14/220 +f 229/17/874 256/18/875 375/16/267 +f 375/16/267 256/18/875 554/19/266 +f 256/18/875 229/17/874 553/21/876 +f 553/21/876 229/17/874 376/20/877 +f 1052/756/416 375/771/267 895/737/413 +f 895/737/413 375/771/267 686/755/265 +f 1054/717/58 476/738/417 899/690/56 +f 899/690/56 476/738/417 733/715/415 +f 1056/724/62 479/716/59 820/701/60 +f 820/701/60 479/716/59 579/691/57 +f 1058/759/71 482/743/63 821/742/68 +f 821/742/68 482/743/63 581/723/61 +f 822/740/73 1060/757/78 583/758/70 +f 583/758/70 1060/757/78 485/772/72 +f 823/697/79 1062/719/84 585/720/75 +f 585/720/75 1062/719/84 488/739/77 +f 824/645/85 1064/671/90 587/672/81 +f 587/672/81 1064/671/90 491/696/83 +f 574/501/39 825/522/48 473/523/867 +f 473/523/867 825/522/48 1078/545/119 +f 1080/592/131 515/568/120 829/567/128 +f 829/567/128 515/568/120 591/544/118 +f 1082/643/145 518/617/132 832/616/142 +f 832/616/142 518/617/132 599/591/130 +f 1084/695/344 521/670/146 836/667/161 +f 836/667/161 521/670/146 605/642/144 +f 524/718/345 613/694/162 1086/693/346 +f 1086/693/346 613/694/162 839/665/170 +f 527/669/347 617/641/168 1088/668/348 +f 1088/668/348 617/641/168 838/640/167 +f 530/692/349 616/664/169 1090/711/185 +f 1090/711/185 616/664/169 841/685/177 +f 533/734/186 621/710/178 1092/752/191 +f 1092/752/191 621/710/178 844/732/187 +f 377/22/473 193/23/878 382/25/472 +f 382/25/472 193/23/878 195/24/879 +f 195/24/879 193/23/878 383/27/880 +f 383/27/880 193/23/878 378/26/881 +f 378/26/881 371/7/868 383/27/880 +f 383/27/880 371/7/868 472/4/865 +f 193/23/878 379/28/882 378/26/881 +f 378/26/881 379/28/882 993/29/883 +f 379/28/882 194/30/884 993/29/883 +f 993/29/883 194/30/884 380/31/885 +f 993/29/883 380/31/885 1050/33/886 +f 1050/33/886 380/31/885 471/32/887 +f 377/22/473 994/34/546 193/23/878 +f 193/23/878 994/34/546 379/28/882 +f 994/34/546 381/35/545 379/28/882 +f 379/28/882 381/35/545 194/30/884 +f 996/36/888 384/37/889 383/27/880 +f 383/27/880 384/37/889 195/24/879 +f 195/24/879 384/37/889 382/25/472 +f 382/25/472 384/37/889 995/38/496 +f 995/38/496 384/37/889 385/40/777 +f 385/40/777 384/37/889 211/39/890 +f 915/936/483 995/956/496 778/957/547 +f 778/957/547 995/956/496 385/978/777 +f 384/37/889 996/36/888 211/39/890 +f 211/39/890 996/36/888 386/41/891 +f 387/42/646 196/43/892 389/45/676 +f 389/45/676 196/43/892 219/44/893 +f 219/44/893 196/43/892 390/47/894 +f 390/47/894 196/43/892 388/46/895 +f 388/46/895 373/10/870 390/47/894 +f 390/47/894 373/10/870 538/13/872 +f 391/48/896 197/49/897 468/51/898 +f 468/51/898 197/49/897 224/50/899 +f 376/20/877 391/48/896 553/21/876 +f 553/21/876 391/48/896 468/51/898 +f 392/52/698 197/49/897 997/54/700 +f 997/54/700 197/49/897 393/53/900 +f 997/54/700 393/53/900 394/56/702 +f 394/56/702 393/53/900 198/55/901 +f 985/1163/699 997/1183/700 362/1142/701 +f 362/1142/701 997/1183/700 394/1164/702 +f 197/49/897 391/48/896 393/53/900 +f 393/53/900 391/48/896 998/57/902 +f 998/57/902 391/48/896 1051/58/903 +f 1051/58/903 391/48/896 376/20/877 +f 393/53/900 998/57/902 198/55/901 +f 198/55/901 998/57/902 395/59/904 +f 394/56/702 198/55/901 999/61/704 +f 999/61/704 198/55/901 396/60/905 +f 999/61/704 396/60/905 397/63/705 +f 397/63/705 396/60/905 199/62/906 +f 989/1120/703 999/1143/704 768/1121/501 +f 768/1121/501 999/1143/704 397/1144/705 +f 198/55/901 395/59/904 396/60/905 +f 396/60/905 395/59/904 1000/64/907 +f 1000/64/907 395/59/904 1053/66/908 +f 1053/66/908 395/59/904 475/65/909 +f 396/60/905 1000/64/907 199/62/906 +f 199/62/906 1000/64/907 398/67/910 +f 397/63/705 199/62/906 1001/69/706 +f 1001/69/706 199/62/906 399/68/911 +f 399/68/911 200/70/912 1001/69/706 +f 1001/69/706 200/70/912 400/71/707 +f 910/1145/499 1001/1165/706 766/1166/497 +f 766/1166/497 1001/1165/706 400/1184/707 +f 199/62/906 398/67/910 399/68/911 +f 399/68/911 398/67/910 1002/72/913 +f 1002/72/913 398/67/910 1055/74/914 +f 1055/74/914 398/67/910 478/73/915 +f 1002/72/913 401/75/916 399/68/911 +f 399/68/911 401/75/916 200/70/912 +f 200/70/912 402/76/917 400/71/707 +f 400/71/707 402/76/917 1003/77/708 +f 1003/77/708 402/76/917 403/79/709 +f 403/79/709 402/76/917 201/78/918 +f 911/1185/505 1003/1201/708 769/1202/503 +f 769/1202/503 1003/1201/708 403/1215/709 +f 401/75/916 1004/80/919 200/70/912 +f 200/70/912 1004/80/919 402/76/917 +f 1004/80/919 401/75/916 1057/82/920 +f 1057/82/920 401/75/916 481/81/921 +f 402/76/917 1004/80/919 201/78/918 +f 201/78/918 1004/80/919 404/83/922 +f 201/78/918 405/84/923 403/79/709 +f 403/79/709 405/84/923 1005/85/710 +f 1005/85/710 405/84/923 406/87/711 +f 406/87/711 405/84/923 202/86/924 +f 1005/1203/710 406/1188/711 912/1187/507 +f 912/1187/507 406/1188/711 771/1169/508 +f 201/78/918 404/83/922 405/84/923 +f 405/84/923 404/83/922 1006/88/925 +f 1006/88/925 404/83/922 1059/90/926 +f 1059/90/926 404/83/922 484/89/927 +f 405/84/923 1006/88/925 202/86/924 +f 202/86/924 1006/88/925 407/91/928 +f 406/87/711 202/86/924 1007/93/712 +f 1007/93/712 202/86/924 408/92/929 +f 408/92/929 203/94/930 1007/93/712 +f 1007/93/712 203/94/930 409/95/713 +f 1007/1170/712 409/1150/713 913/1149/511 +f 913/1149/511 409/1150/713 773/1126/512 +f 202/86/924 407/91/928 408/92/929 +f 408/92/929 407/91/928 1008/96/931 +f 1008/96/931 407/91/928 1061/98/932 +f 1061/98/932 407/91/928 487/97/933 +f 1008/96/931 410/99/934 408/92/929 +f 408/92/929 410/99/934 203/94/930 +f 203/94/930 411/100/935 409/95/713 +f 409/95/713 411/100/935 1009/101/714 +f 411/100/935 204/102/936 1009/101/714 +f 1009/101/714 204/102/936 412/103/521 +f 1009/1127/714 412/1102/521 914/1101/515 +f 914/1101/515 412/1102/521 775/1074/516 +f 410/99/934 1010/104/937 203/94/930 +f 203/94/930 1010/104/937 411/100/935 +f 1010/104/937 410/99/934 1063/106/938 +f 1063/106/938 410/99/934 490/105/939 +f 1010/104/937 413/107/940 411/100/935 +f 411/100/935 413/107/940 204/102/936 +f 204/102/936 205/108/941 412/103/521 +f 412/103/521 205/108/941 414/109/520 +f 205/108/941 204/102/936 415/110/942 +f 415/110/942 204/102/936 413/107/940 +f 414/109/520 205/108/941 1011/112/524 +f 1011/112/524 205/108/941 416/111/943 +f 416/111/943 205/108/941 1012/113/944 +f 1012/113/944 205/108/941 415/110/942 +f 1011/112/524 416/111/943 417/115/525 +f 417/115/525 416/111/943 206/114/945 +f 418/116/946 1012/113/944 498/118/947 +f 498/118/947 1012/113/944 1065/117/948 +f 416/111/943 1012/113/944 206/114/945 +f 206/114/945 1012/113/944 418/116/946 +f 417/115/525 206/114/945 1013/120/528 +f 1013/120/528 206/114/945 419/119/949 +f 1013/120/528 419/119/949 420/122/530 +f 420/122/530 419/119/949 207/121/950 +f 420/977/530 307/954/529 1013/1000/528 +f 1013/1000/528 307/954/529 957/976/527 +f 206/114/945 418/116/946 419/119/949 +f 419/119/949 418/116/946 1014/123/951 +f 1014/123/951 418/116/946 1067/124/952 +f 1067/124/952 418/116/946 498/118/947 +f 419/119/949 1014/123/951 207/121/950 +f 207/121/950 1014/123/951 421/125/953 +f 420/122/530 207/121/950 1015/127/532 +f 1015/127/532 207/121/950 422/126/954 +f 1015/127/532 422/126/954 423/129/534 +f 423/129/534 422/126/954 208/128/955 +f 423/934/534 311/913/533 1015/955/532 +f 1015/955/532 311/913/533 959/933/531 +f 207/121/950 421/125/953 422/126/954 +f 422/126/954 421/125/953 1016/130/956 +f 1016/130/956 421/125/953 1069/132/957 +f 1069/132/957 421/125/953 501/131/958 +f 422/126/954 1016/130/956 208/128/955 +f 208/128/955 1016/130/956 424/133/959 +f 423/129/534 208/128/955 1017/135/536 +f 1017/135/536 208/128/955 425/134/960 +f 1017/135/536 425/134/960 426/137/538 +f 426/137/538 425/134/960 209/136/961 +f 426/895/538 315/876/537 1017/914/536 +f 1017/914/536 315/876/537 961/894/535 +f 208/128/955 424/133/959 425/134/960 +f 425/134/960 424/133/959 1018/138/962 +f 1018/138/962 424/133/959 1071/140/963 +f 1071/140/963 424/133/959 504/139/964 +f 425/134/960 1018/138/962 209/136/961 +f 209/136/961 1018/138/962 427/141/965 +f 209/136/961 428/142/966 426/137/538 +f 426/137/538 428/142/966 1019/1230/540 +f 1019/143/540 428/1229/966 429/145/541 +f 429/145/541 428/1229/966 210/144/967 +f 429/860/541 317/845/543 1019/877/540 +f 1019/877/540 317/845/543 963/859/539 +f 427/141/965 1020/146/968 209/136/961 +f 209/136/961 1020/146/968 428/142/966 +f 1020/146/968 427/141/965 1073/1227/969 +f 1073/1227/969 427/141/965 507/147/970 +f 428/1229/966 1020/1228/968 210/144/967 +f 210/144/967 1020/1228/968 430/149/971 +f 194/30/884 431/150/972 380/31/885 +f 380/31/885 431/150/972 1021/151/973 +f 1021/151/973 431/150/972 430/149/971 +f 430/149/971 431/150/972 210/144/967 +f 1021/151/973 430/149/971 1076/153/974 +f 1076/153/974 430/149/971 510/152/975 +f 381/35/545 1022/154/542 194/30/884 +f 194/30/884 1022/154/542 431/150/972 +f 1022/861/542 381/878/545 964/846/544 +f 964/846/544 381/878/545 759/862/475 +f 431/150/972 1022/154/542 210/144/967 +f 210/144/967 1022/154/542 429/145/541 +f 385/40/777 211/39/890 1023/156/778 +f 1023/156/778 211/39/890 432/155/976 +f 1023/156/778 432/155/976 433/158/779 +f 433/158/779 432/155/976 212/157/977 +f 919/979/557 1023/1001/778 786/1002/555 +f 786/1002/555 1023/1001/778 433/1025/779 +f 211/39/890 386/41/891 432/155/976 +f 432/155/976 386/41/891 1024/159/978 +f 1024/159/978 386/41/891 1079/161/979 +f 1079/161/979 386/41/891 514/160/980 +f 432/155/976 1024/159/978 212/157/977 +f 212/157/977 1024/159/978 434/162/981 +f 433/158/779 212/157/977 1025/164/780 +f 1025/164/780 212/157/977 435/163/982 +f 435/163/982 213/165/983 1025/164/780 +f 1025/164/780 213/165/983 436/166/781 +f 436/1076/781 792/1051/567 1025/1050/780 +f 1025/1050/780 792/1051/567 922/1026/569 +f 212/157/977 434/162/981 435/163/982 +f 435/163/982 434/162/981 1026/167/984 +f 1026/167/984 434/162/981 1081/169/985 +f 1081/169/985 434/162/981 517/168/986 +f 435/163/982 1026/167/984 213/165/983 +f 213/165/983 1026/167/984 437/170/987 +f 436/166/781 213/165/983 1027/172/782 +f 1027/172/782 213/165/983 438/171/988 +f 1027/172/782 438/171/988 439/174/783 +f 439/174/783 438/171/988 214/173/989 +f 1027/1103/782 439/1128/783 926/1077/585 +f 926/1077/585 439/1128/783 801/1104/586 +f 213/165/983 437/170/987 438/171/988 +f 438/171/988 437/170/987 1028/175/990 +f 1028/175/990 437/170/987 1083/177/991 +f 1083/177/991 437/170/987 520/176/992 +f 438/171/988 1028/175/990 214/173/989 +f 214/173/989 1028/175/990 440/178/993 +f 214/173/989 441/179/994 439/174/783 +f 439/174/783 441/179/994 1029/180/784 +f 1029/180/784 441/179/994 442/182/785 +f 442/182/785 441/179/994 215/181/995 +f 1029/1105/784 442/1080/785 929/1079/594 +f 929/1079/594 442/1080/785 804/1054/591 +f 440/178/993 1030/183/996 214/173/989 +f 214/173/989 1030/183/996 441/179/994 +f 1030/183/996 440/178/993 1085/185/997 +f 1085/185/997 440/178/993 523/184/998 +f 441/179/994 1030/183/996 215/181/995 +f 215/181/995 1030/183/996 443/186/999 +f 442/182/785 215/181/995 1031/188/786 +f 1031/188/786 215/181/995 444/187/1000 +f 444/187/1000 216/189/1001 1031/188/786 +f 1031/188/786 216/189/1001 445/190/787 +f 1031/1081/786 445/1106/787 928/1055/592 +f 928/1055/592 445/1106/787 805/1082/593 +f 215/181/995 443/186/999 444/187/1000 +f 444/187/1000 443/186/999 1032/191/1002 +f 1032/191/1002 443/186/999 1087/193/1003 +f 1087/193/1003 443/186/999 526/192/1004 +f 1032/191/1002 446/194/1005 444/187/1000 +f 444/187/1000 446/194/1005 216/189/1001 +f 216/189/1001 447/195/1006 445/190/787 +f 445/190/787 447/195/1006 1033/196/788 +f 447/195/1006 217/197/1007 1033/196/788 +f 1033/196/788 217/197/1007 448/198/789 +f 1033/1129/788 448/1151/789 931/1107/601 +f 931/1107/601 448/1151/789 809/1130/602 +f 446/194/1005 1034/199/1008 216/189/1001 +f 216/189/1001 1034/199/1008 447/195/1006 +f 1034/199/1008 446/194/1005 1089/201/1009 +f 1089/201/1009 446/194/1005 529/200/1010 +f 1034/199/1008 449/202/1011 447/195/1006 +f 447/195/1006 449/202/1011 217/197/1007 +f 217/197/1007 450/203/1012 448/198/789 +f 448/198/789 450/203/1012 1035/204/790 +f 450/203/1012 218/205/1013 1035/204/790 +f 1035/204/790 218/205/1013 451/206/630 +f 1035/1171/790 451/1189/630 934/1152/609 +f 934/1152/609 451/1189/630 257/1172/610 +f 449/202/1011 1036/207/1014 217/197/1007 +f 217/197/1007 1036/207/1014 450/203/1012 +f 1036/207/1014 449/202/1011 1091/209/1015 +f 1091/209/1015 449/202/1011 532/208/1016 +f 1036/207/1014 452/210/1017 450/203/1012 +f 450/203/1012 452/210/1017 218/205/1013 +f 218/205/1013 453/211/1018 451/206/630 +f 451/206/630 453/211/1018 1037/212/629 +f 452/210/1017 1038/213/1019 218/205/1013 +f 218/205/1013 1038/213/1019 453/211/1018 +f 1038/213/1019 452/210/1017 1093/215/1020 +f 1093/215/1020 452/210/1017 535/214/1021 +f 388/46/895 196/43/892 1038/213/1019 +f 1038/213/1019 196/43/892 453/211/1018 +f 453/211/1018 196/43/892 1037/212/629 +f 1037/212/629 196/43/892 387/42/646 +f 389/45/676 219/44/893 1039/217/678 +f 1039/217/678 219/44/893 454/216/1022 +f 1039/217/678 454/216/1022 455/219/681 +f 455/219/681 454/216/1022 220/218/1023 +f 948/384/677 1039/376/678 289/375/679 +f 289/375/679 1039/376/678 455/369/681 +f 219/44/893 390/47/894 454/216/1022 +f 454/216/1022 390/47/894 1040/220/1024 +f 1040/220/1024 390/47/894 1095/221/1025 +f 1095/221/1025 390/47/894 538/13/872 +f 454/216/1022 1040/220/1024 220/218/1023 +f 220/218/1023 1040/220/1024 456/222/1026 +f 455/219/681 220/218/1023 1041/224/682 +f 1041/224/682 220/218/1023 457/223/1027 +f 1041/224/682 457/223/1027 458/226/841 +f 458/226/841 457/223/1027 221/225/1028 +f 949/368/680 1041/364/682 290/363/683 +f 290/363/683 1041/364/682 458/361/841 +f 220/218/1023 456/222/1026 457/223/1027 +f 457/223/1027 456/222/1026 1042/227/1029 +f 1042/227/1029 456/222/1026 1097/229/1030 +f 1097/229/1030 456/222/1026 541/228/1031 +f 457/223/1027 1042/227/1029 221/225/1028 +f 221/225/1028 1042/227/1029 459/230/1032 +f 221/225/1028 460/231/1033 458/226/841 +f 458/226/841 460/231/1033 1043/1236/842 +f 1043/232/842 460/1235/1033 461/234/846 +f 461/234/846 460/1235/1033 222/233/1034 +f 983/366/840 1043/362/842 361/371/843 +f 361/371/843 1043/362/842 461/365/846 +f 459/230/1032 1044/235/1035 221/225/1028 +f 221/225/1028 1044/235/1035 460/231/1033 +f 1044/235/1035 459/230/1032 1099/1233/1036 +f 1099/1233/1036 459/230/1032 544/236/1037 +f 460/1235/1033 1044/1234/1035 222/233/1034 +f 222/233/1034 1044/1234/1035 462/238/1038 +f 461/234/846 222/233/1034 1045/240/845 +f 1045/240/845 222/233/1034 463/239/1039 +f 463/239/1039 223/241/1040 1045/240/845 +f 1045/240/845 223/241/1040 464/242/693 +f 1045/370/845 464/377/693 984/378/844 +f 984/378/844 464/377/693 293/1224/691 +f 222/233/1034 462/238/1038 463/239/1039 +f 463/239/1039 462/238/1038 1046/243/1041 +f 1046/243/1041 462/238/1038 1101/245/1042 +f 1101/245/1042 462/238/1038 547/244/1043 +f 1046/243/1041 465/246/1044 463/239/1039 +f 463/239/1039 465/246/1044 223/241/1040 +f 223/241/1040 466/247/1045 464/242/693 +f 464/242/693 466/247/1045 1047/248/692 +f 466/247/1045 224/50/899 1047/248/692 +f 1047/248/692 224/50/899 467/249/1046 +f 291/1199/686 950/1213/687 467/1214/1046 +f 467/1214/1046 950/1213/687 1047/386/692 +f 465/246/1044 1048/250/1047 223/241/1040 +f 223/241/1040 1048/250/1047 466/247/1045 +f 1048/250/1047 465/246/1044 1103/252/1048 +f 1103/252/1048 465/246/1044 550/251/1049 +f 224/50/899 466/247/1045 468/51/898 +f 468/51/898 466/247/1045 1048/250/1047 +f 197/49/897 392/52/698 224/50/899 +f 224/50/899 392/52/698 467/249/1046 +f 392/1200/698 318/1182/697 467/1214/1046 +f 467/1214/1046 318/1182/697 291/1199/686 +f 372/9/312 225/8/869 1049/254/116 +f 1049/254/116 225/8/869 469/253/1050 +f 1049/254/116 469/253/1050 470/256/115 +f 470/256/115 469/253/1050 226/255/1051 +f 225/8/869 371/7/868 469/253/1050 +f 469/253/1050 371/7/868 1050/33/886 +f 993/29/883 1050/33/886 378/26/881 +f 378/26/881 1050/33/886 371/7/868 +f 469/253/1050 1050/33/886 226/255/1051 +f 226/255/1051 1050/33/886 471/32/887 +f 1077/3/866 996/36/888 472/4/865 +f 472/4/865 996/36/888 383/27/880 +f 229/17/874 474/257/1052 376/20/877 +f 376/20/877 474/257/1052 1051/58/903 +f 474/257/1052 230/258/1053 1051/58/903 +f 1051/58/903 230/258/1053 475/65/909 +f 998/57/902 1051/58/903 395/59/904 +f 395/59/904 1051/58/903 475/65/909 +f 375/16/267 1052/259/416 229/17/874 +f 229/17/874 1052/259/416 474/257/1052 +f 1052/259/416 476/260/417 474/257/1052 +f 474/257/1052 476/260/417 230/258/1053 +f 230/258/1053 477/261/1054 475/65/909 +f 475/65/909 477/261/1054 1053/66/908 +f 477/261/1054 231/262/1055 1053/66/908 +f 1053/66/908 231/262/1055 478/73/915 +f 1000/64/907 1053/66/908 398/67/910 +f 398/67/910 1053/66/908 478/73/915 +f 476/260/417 1054/263/58 230/258/1053 +f 230/258/1053 1054/263/58 477/261/1054 +f 1054/263/58 479/264/59 477/261/1054 +f 477/261/1054 479/264/59 231/262/1055 +f 231/262/1055 480/265/1056 478/73/915 +f 478/73/915 480/265/1056 1055/74/914 +f 1055/74/914 480/265/1056 481/81/921 +f 481/81/921 480/265/1056 232/266/1057 +f 1002/72/913 1055/74/914 401/75/916 +f 401/75/916 1055/74/914 481/81/921 +f 479/264/59 1056/267/62 231/262/1055 +f 231/262/1055 1056/267/62 480/265/1056 +f 480/265/1056 1056/267/62 232/266/1057 +f 232/266/1057 1056/267/62 482/268/63 +f 481/81/921 232/266/1057 1057/82/920 +f 1057/82/920 232/266/1057 483/269/1058 +f 483/269/1058 233/270/1059 1057/82/920 +f 1057/82/920 233/270/1059 484/89/927 +f 1004/80/919 1057/82/920 404/83/922 +f 404/83/922 1057/82/920 484/89/927 +f 232/266/1057 482/268/63 483/269/1058 +f 483/269/1058 482/268/63 1058/271/71 +f 1058/271/71 485/272/72 483/269/1058 +f 483/269/1058 485/272/72 233/270/1059 +f 484/89/927 233/270/1059 1059/90/926 +f 1059/90/926 233/270/1059 486/273/1060 +f 1059/90/926 486/273/1060 487/97/933 +f 487/97/933 486/273/1060 234/274/1061 +f 1006/88/925 1059/90/926 407/91/928 +f 407/91/928 1059/90/926 487/97/933 +f 233/270/1059 485/272/72 486/273/1060 +f 486/273/1060 485/272/72 1060/275/78 +f 1060/275/78 488/276/77 486/273/1060 +f 486/273/1060 488/276/77 234/274/1061 +f 487/97/933 234/274/1061 1061/98/932 +f 1061/98/932 234/274/1061 489/277/1062 +f 1061/98/932 489/277/1062 490/105/939 +f 490/105/939 489/277/1062 235/278/1063 +f 1008/96/931 1061/98/932 410/99/934 +f 410/99/934 1061/98/932 490/105/939 +f 488/276/77 1062/279/84 234/274/1061 +f 234/274/1061 1062/279/84 489/277/1062 +f 489/277/1062 1062/279/84 235/278/1063 +f 235/278/1063 1062/279/84 491/280/83 +f 490/105/939 235/278/1063 1063/106/938 +f 1063/106/938 235/278/1063 492/281/1064 +f 1063/106/938 492/281/1064 493/283/1065 +f 493/283/1065 492/281/1064 236/282/1066 +f 1010/104/937 1063/106/938 413/107/940 +f 413/107/940 1063/106/938 493/283/1065 +f 235/278/1063 491/280/83 492/281/1064 +f 492/281/1064 491/280/83 1064/284/90 +f 492/281/1064 1064/284/90 236/282/1066 +f 236/282/1066 1064/284/90 494/285/89 +f 415/110/942 413/107/940 495/286/1067 +f 495/286/1067 413/107/940 493/283/1065 +f 493/283/1065 236/282/1066 495/286/1067 +f 495/286/1067 236/282/1066 237/287/1068 +f 236/282/1066 494/285/89 237/287/1068 +f 237/287/1068 494/285/89 496/288/91 +f 415/110/942 495/286/1067 1012/113/944 +f 1012/113/944 495/286/1067 1065/117/948 +f 495/286/1067 237/287/1068 1065/117/948 +f 1065/117/948 237/287/1068 497/289/1069 +f 497/289/1069 237/287/1068 1066/290/94 +f 1066/290/94 237/287/1068 496/288/91 +f 497/289/1069 238/291/1070 1065/117/948 +f 1065/117/948 238/291/1070 498/118/947 +f 1066/290/94 499/292/96 497/289/1069 +f 497/289/1069 499/292/96 238/291/1070 +f 238/291/1070 500/293/1071 498/118/947 +f 498/118/947 500/293/1071 1067/124/952 +f 500/293/1071 239/294/1072 1067/124/952 +f 1067/124/952 239/294/1072 501/131/958 +f 1014/123/951 1067/124/952 421/125/953 +f 421/125/953 1067/124/952 501/131/958 +f 499/292/96 1068/295/95 238/291/1070 +f 238/291/1070 1068/295/95 500/293/1071 +f 1068/295/95 502/296/100 500/293/1071 +f 500/293/1071 502/296/100 239/294/1072 +f 239/294/1072 503/297/1073 501/131/958 +f 501/131/958 503/297/1073 1069/132/957 +f 503/297/1073 240/298/1074 1069/132/957 +f 1069/132/957 240/298/1074 504/139/964 +f 1016/130/956 1069/132/957 424/133/959 +f 424/133/959 1069/132/957 504/139/964 +f 502/296/100 1070/299/99 239/294/1072 +f 239/294/1072 1070/299/99 503/297/1073 +f 1070/299/99 505/300/104 503/297/1073 +f 503/297/1073 505/300/104 240/298/1074 +f 504/139/964 240/298/1074 1071/140/963 +f 1071/140/963 240/298/1074 506/301/1075 +f 1071/140/963 506/301/1075 507/147/970 +f 507/147/970 506/301/1075 241/302/1076 +f 1018/138/962 1071/140/963 427/141/965 +f 427/141/965 1071/140/963 507/147/970 +f 240/298/1074 505/300/104 506/301/1075 +f 506/301/1075 505/300/104 1072/303/103 +f 506/301/1075 1072/303/103 241/302/1076 +f 241/302/1076 1072/303/103 508/304/108 +f 507/147/970 241/302/1076 1073/1227/969 +f 1073/1227/969 241/302/1076 509/305/1077 +f 509/1226/1077 242/306/1078 1073/148/969 +f 1073/148/969 242/306/1078 510/152/975 +f 1020/1228/968 1073/148/969 430/149/971 +f 430/149/971 1073/148/969 510/152/975 +f 241/302/1076 508/304/108 509/305/1077 +f 509/305/1077 508/304/108 1074/307/107 +f 1074/1225/107 511/308/111 509/1226/1077 +f 509/1226/1077 511/308/111 242/306/1078 +f 470/256/115 226/255/1051 1075/310/113 +f 1075/310/113 226/255/1051 512/309/1079 +f 1075/310/113 512/309/1079 511/308/111 +f 511/308/111 512/309/1079 242/306/1078 +f 226/255/1051 471/32/887 512/309/1079 +f 512/309/1079 471/32/887 1076/153/974 +f 1021/151/973 1076/153/974 380/31/885 +f 380/31/885 1076/153/974 471/32/887 +f 512/309/1079 1076/153/974 242/306/1078 +f 242/306/1078 1076/153/974 510/152/975 +f 513/2/864 243/311/1080 1077/3/866 +f 1077/3/866 243/311/1080 514/160/980 +f 996/36/888 1077/3/866 386/41/891 +f 386/41/891 1077/3/866 514/160/980 +f 1078/5/119 515/312/120 513/2/864 +f 513/2/864 515/312/120 243/311/1080 +f 243/311/1080 516/313/1081 514/160/980 +f 514/160/980 516/313/1081 1079/161/979 +f 516/313/1081 244/314/1082 1079/161/979 +f 1079/161/979 244/314/1082 517/168/986 +f 1024/159/978 1079/161/979 434/162/981 +f 434/162/981 1079/161/979 517/168/986 +f 515/312/120 1080/315/131 243/311/1080 +f 243/311/1080 1080/315/131 516/313/1081 +f 1080/315/131 518/316/132 516/313/1081 +f 516/313/1081 518/316/132 244/314/1082 +f 244/314/1082 519/317/1083 517/168/986 +f 517/168/986 519/317/1083 1081/169/985 +f 1081/169/985 519/317/1083 520/176/992 +f 520/176/992 519/317/1083 245/318/1084 +f 1026/167/984 1081/169/985 437/170/987 +f 437/170/987 1081/169/985 520/176/992 +f 518/316/132 1082/319/145 244/314/1082 +f 244/314/1082 1082/319/145 519/317/1083 +f 519/317/1083 1082/319/145 245/318/1084 +f 245/318/1084 1082/319/145 521/320/146 +f 520/176/992 245/318/1084 1083/177/991 +f 1083/177/991 245/318/1084 522/321/1085 +f 1083/177/991 522/321/1085 523/184/998 +f 523/184/998 522/321/1085 246/322/1086 +f 1028/175/990 1083/177/991 440/178/993 +f 440/178/993 1083/177/991 523/184/998 +f 245/318/1084 521/320/146 522/321/1085 +f 522/321/1085 521/320/146 1084/323/344 +f 522/321/1085 1084/323/344 246/322/1086 +f 246/322/1086 1084/323/344 524/324/345 +f 523/184/998 246/322/1086 1085/185/997 +f 1085/185/997 246/322/1086 525/325/1087 +f 525/325/1087 247/326/1088 1085/185/997 +f 1085/185/997 247/326/1088 526/192/1004 +f 1030/183/996 1085/185/997 443/186/999 +f 443/186/999 1085/185/997 526/192/1004 +f 246/322/1086 524/324/345 525/325/1087 +f 525/325/1087 524/324/345 1086/327/346 +f 1086/327/346 527/328/347 525/325/1087 +f 525/325/1087 527/328/347 247/326/1088 +f 247/326/1088 528/329/1089 526/192/1004 +f 526/192/1004 528/329/1089 1087/193/1003 +f 1087/193/1003 528/329/1089 529/200/1010 +f 529/200/1010 528/329/1089 248/330/1090 +f 1032/191/1002 1087/193/1003 446/194/1005 +f 446/194/1005 1087/193/1003 529/200/1010 +f 527/328/347 1088/331/348 247/326/1088 +f 247/326/1088 1088/331/348 528/329/1089 +f 528/329/1089 1088/331/348 248/330/1090 +f 248/330/1090 1088/331/348 530/332/349 +f 529/200/1010 248/330/1090 1089/201/1009 +f 1089/201/1009 248/330/1090 531/333/1091 +f 1089/201/1009 531/333/1091 532/208/1016 +f 532/208/1016 531/333/1091 249/334/1092 +f 1034/199/1008 1089/201/1009 449/202/1011 +f 449/202/1011 1089/201/1009 532/208/1016 +f 248/330/1090 530/332/349 531/333/1091 +f 531/333/1091 530/332/349 1090/335/185 +f 531/333/1091 1090/335/185 249/334/1092 +f 249/334/1092 1090/335/185 533/336/186 +f 532/208/1016 249/334/1092 1091/209/1015 +f 1091/209/1015 249/334/1092 534/337/1093 +f 1091/209/1015 534/337/1093 535/214/1021 +f 535/214/1021 534/337/1093 250/338/1094 +f 1036/207/1014 1091/209/1015 452/210/1017 +f 452/210/1017 1091/209/1015 535/214/1021 +f 249/334/1092 533/336/186 534/337/1093 +f 534/337/1093 533/336/186 1092/339/191 +f 534/337/1093 1092/339/191 250/338/1094 +f 250/338/1094 1092/339/191 536/340/192 +f 535/214/1021 250/338/1094 1093/215/1020 +f 1093/215/1020 250/338/1094 537/341/1095 +f 250/338/1094 536/340/192 537/341/1095 +f 537/341/1095 536/340/192 1094/342/221 +f 374/14/220 228/11/871 1094/342/221 +f 1094/342/221 228/11/871 537/341/1095 +f 537/341/1095 228/11/871 1093/215/1020 +f 1093/215/1020 228/11/871 373/10/870 +f 373/10/870 388/46/895 1093/215/1020 +f 1093/215/1020 388/46/895 1038/213/1019 +f 251/12/873 540/343/1096 538/13/872 +f 538/13/872 540/343/1096 1095/221/1025 +f 540/343/1096 252/344/1097 1095/221/1025 +f 1095/221/1025 252/344/1097 541/228/1031 +f 1040/220/1024 1095/221/1025 456/222/1026 +f 456/222/1026 1095/221/1025 541/228/1031 +f 539/15/261 1096/345/262 251/12/873 +f 251/12/873 1096/345/262 540/343/1096 +f 1096/345/262 542/346/263 540/343/1096 +f 540/343/1096 542/346/263 252/344/1097 +f 541/228/1031 252/344/1097 1097/229/1030 +f 1097/229/1030 252/344/1097 543/347/1098 +f 1097/229/1030 543/347/1098 544/236/1037 +f 544/236/1037 543/347/1098 253/348/1099 +f 1042/227/1029 1097/229/1030 459/230/1032 +f 459/230/1032 1097/229/1030 544/236/1037 +f 542/346/263 1098/349/405 252/344/1097 +f 252/344/1097 1098/349/405 543/347/1098 +f 543/347/1098 1098/349/405 253/348/1099 +f 253/348/1099 1098/349/405 545/350/406 +f 544/236/1037 253/348/1099 1099/1233/1036 +f 1099/1233/1036 253/348/1099 546/351/1100 +f 546/1232/1100 254/352/1101 1099/237/1036 +f 1099/237/1036 254/352/1101 547/244/1043 +f 1044/1234/1035 1099/237/1036 462/238/1038 +f 462/238/1038 1099/237/1036 547/244/1043 +f 253/348/1099 545/350/406 546/351/1100 +f 546/351/1100 545/350/406 1100/353/407 +f 1100/1231/407 548/354/408 546/1232/1100 +f 546/1232/1100 548/354/408 254/352/1101 +f 547/244/1043 254/352/1101 1101/245/1042 +f 1101/245/1042 254/352/1101 549/355/1102 +f 1101/245/1042 549/355/1102 550/251/1049 +f 550/251/1049 549/355/1102 255/356/1103 +f 1046/243/1041 1101/245/1042 465/246/1044 +f 465/246/1044 1101/245/1042 550/251/1049 +f 254/352/1101 548/354/408 549/355/1102 +f 549/355/1102 548/354/408 1102/357/409 +f 549/355/1102 1102/357/409 255/356/1103 +f 255/356/1103 1102/357/409 551/358/410 +f 550/251/1049 255/356/1103 1103/252/1048 +f 1103/252/1048 255/356/1103 552/359/1104 +f 1103/252/1048 552/359/1104 553/21/876 +f 553/21/876 552/359/1104 256/18/875 +f 468/51/898 1048/250/1047 553/21/876 +f 553/21/876 1048/250/1047 1103/252/1048 +f 255/356/1103 551/358/410 552/359/1104 +f 552/359/1104 551/358/410 1104/360/411 +f 552/359/1104 1104/360/411 256/18/875 +f 256/18/875 1104/360/411 554/19/266 diff --git a/WebGPUDemo/Resources/SwiftLogo/T_M_swiftLogo_BaseColor.png b/WebGPUDemo/Resources/SwiftLogo/T_M_swiftLogo_BaseColor.png new file mode 100644 index 0000000000000000000000000000000000000000..95d737d84873e7108f7d313299691b61af64e409 GIT binary patch literal 95583 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 dHX|a}36*Zhwk1N literal 0 HcmV?d00001 diff --git a/WebGPUDemo/Resources/SwiftLogo/T_M_swiftLogo_MetalRoughness.png b/WebGPUDemo/Resources/SwiftLogo/T_M_swiftLogo_MetalRoughness.png new file mode 100644 index 0000000000000000000000000000000000000000..4e63c8401d889399e5e2ff6f686d1fde08499ce3 GIT binary patch literal 4153 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 literal 0 HcmV?d00001 diff --git a/WebGPUDemo/Resources/SwiftLogo/T_M_swiftLogo_Normal.png b/WebGPUDemo/Resources/SwiftLogo/T_M_swiftLogo_Normal.png new file mode 100644 index 0000000000000000000000000000000000000000..26cd4033d8865164bb055805e341e93108a02738 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaMwQX@Rme0>?T zfNTy1#`a7G7LXDkmI7i12Id8f49q~95hS*N2`lFz;gC(v c$oTP3o`J21>HB+!e|aDUp00i_>zopr0FW;n6#xJL literal 0 HcmV?d00001 diff --git a/WebGPUDemo/Resources/shaders.wgsl b/WebGPUDemo/Resources/shaders.wgsl new file mode 100644 index 0000000..8b1e898 --- /dev/null +++ b/WebGPUDemo/Resources/shaders.wgsl @@ -0,0 +1,166 @@ + +@group(0) @binding(0) var vertices: array; +@group(0) @binding(1) var indices: array; +@group(0) @binding(2) var uvs: array; +@group(0) @binding(3) var normals: array; +@group(0) @binding(4) var albedoTexture: texture_2d; +@group(0) @binding(5) var normalTexture: texture_2d; +@group(0) @binding(6) var metallicRoughnessTexture: texture_2d; +@group(0) @binding(7) var modelMatrix: mat4x4f; +@group(0) @binding(8) var texSampler: sampler; +@group(0) @binding(9) var viewProjectionMatrix: mat4x4f; + +struct VSOut { + @builtin(position) pos: vec4f, + @location(0) worldPos: vec4f, + @location(1) texCoord: vec2f, + @location(2) normal: vec3f, + @location(3) tangent: vec3f, +}; + +fn hash(_a: u32) -> u32 { + var a = _a; + a = (a+0x7ed55d16) + (a<<12); + a = (a^0xc761c23c) ^ (a>>19); + a = (a+0x165667b1) + (a<<5); + a = (a+0xd3a2646c) ^ (a<<9); + a = (a+0xfd7046c5) + (a<<3); + a = (a^0xb55a4f09) ^ (a>>16); + return a; +} + +fn getRow(row: u32, m: mat4x4f) -> vec4f { + return vec4(m[0][row], m[1][row], m[2][row], m[3][row]); +} + +fn mat3x3f_make_row_first(a: vec3, b: vec3, c: vec3) -> mat3x3f { + return mat3x3f(vec3(a.x, b.x, c.x), + vec3(a.y, b.y, c.y), + vec3(a.z, b.z, c.z)); +} + +fn adjoint(m: mat4x4f) -> mat3x3f { + return mat3x3f_make_row_first( + cross(getRow(1, m).xyz, getRow(2, m).xyz) * -1.0, + cross(getRow(2, m).xyz, getRow(0, m).xyz) * -1.0, + cross(getRow(0, m).xyz, getRow(1, m).xyz) * -1.0 + ); +} + +@vertex fn vs( + @builtin(vertex_index) vertexIndex : u32 +) -> VSOut { + var out = VSOut(); + let index = vertexIndex; + out.worldPos = modelMatrix * vertices[index]; + out.pos = viewProjectionMatrix * out.worldPos; + out.texCoord = uvs[index]; + out.normal = normalize(adjoint(modelMatrix) * normals[index].xyz); + + var up = vec3(1.0, 0.0, 0.0); + if (out.normal.y < 0.999) { + up = vec3(0.0, 1.0, 0.0); + } + out.tangent = normalize(cross(up, out.normal)); + + return out; +} + +fn sqr(x: f32) -> f32 { + return x * x; +} + +fn schlickFresnel(VdotH: f32, F0: vec3f, F90: f32) -> vec3f { + return (F0 + (1.0 - F0) * pow(1.0f - VdotH, 5)); +} + +fn ggxDistribution(NoH: f32, roughness: f32, h: vec3f) -> f32 { + let oneMinusNoHSquared = 1 - NoH * NoH; + let a = NoH * roughness; + let k = roughness / (oneMinusNoHSquared + a * a); + let d = k * k * (1.0 / 3.1415); + + return min(d, 65504.0); +} + +fn V_SmithGGXCorrelated(alpha2: f32, NoV: f32, NoL: f32) -> f32 { + let lambdaV = NoL * sqrt((NoV - alpha2 * NoV) * NoV + alpha2); + let lambdaL = NoV * sqrt((NoL - alpha2 * NoL) * NoL + alpha2); + let v = 0.5 / (lambdaV + lambdaL); + return min(v, 65504.0); +} + +fn BRDF_diffuse(F: vec3f, NoL: f32, metallic: f32) -> vec3f { + let diffuse = (1.0 - F) * (1.0 - metallic); + + return diffuse * NoL; +} + +fn BRDF_specular(roughness: f32, F: vec3f, H: vec3f, NoH: f32, NoV: f32, NoL: f32) -> vec3f { + let D = ggxDistribution(NoH, roughness, H); + let Vis = V_SmithGGXCorrelated(sqr(roughness), NoV, NoL); + let specular = D * Vis * F; + + return specular * NoL; +} + +struct Lighting { + diffuse: vec3f, + specular: vec3f, +}; + +fn sunLight(V: vec3f, N: vec3f, F0: vec3f, roughness: f32, metallic: f32) -> Lighting { + let L = normalize(vec3f(0.5, -0.5, -0.5)); + let H = normalize(L + V); + + let NoH = saturate(dot(N, H)); + let NoV = saturate(dot(N, V)); + let NoL = saturate(dot(N, L)); + let VoH = saturate(dot(V, H)); + + let F90 = saturate(dot(F0, vec3(0.33))); + let F = schlickFresnel(VoH, F0, F90); + + let lightColor = vec3(1.0, 1.0, 0.984) * 2.5; + + let diffuse = lightColor * BRDF_diffuse(F, NoL, metallic); + let specular = lightColor * BRDF_specular(roughness, F, H, NoH, NoV, NoL); + + return Lighting(diffuse, specular); +} + +fn ACESToneMapping(color: vec3f) -> vec3f { + let a = 2.51f; + let b = 0.03f; + let c = 2.43f; + let d = 0.59f; + let e = 0.14f; + return saturate((color*(a*color+b))/(color*(c*color+d)+e)); +} + +@fragment fn fs(input: VSOut) -> @location(0) vec4f { + let vertPos = input.pos; + + let N = normalize(input.normal); + var T = normalize(input.tangent); + var B = normalize(cross(N, T)); + + var normalMap = textureSample(normalTexture, texSampler, input.texCoord).xyz * 2.0 - 1.0; + normalMap = vec3f(normalMap.xy * 2.0, normalMap.z); + normalMap = normalize(normalMap); + let TBN = mat3x3(T.x, B.x, N.x, T.y, B.y, N.y, T.z, B.z, N.z); + + var worldNormal = normalize(TBN * normalMap); + worldNormal.y *= -1; + let albedo = textureSample(albedoTexture, texSampler, input.texCoord); + let metalRoughness = textureSample(metallicRoughnessTexture, texSampler, input.texCoord); + + let V = normalize(input.worldPos).xyz; + let F0 = mix(vec3f(0.04), albedo.rgb, metalRoughness.b); + let roughness = max(0.08, metalRoughness.g); + + let lighting = sunLight(V, worldNormal, F0, roughness, metalRoughness.b); + + return vec4f(ACESToneMapping(albedo.rgb * max(lighting.diffuse, vec3(0.2, 0.2, 0.2)) + lighting.specular), 1.0); +} + diff --git a/WebGPUDemo/Sources/Drawable.swift b/WebGPUDemo/Sources/Drawable.swift new file mode 100644 index 0000000..5ff1233 --- /dev/null +++ b/WebGPUDemo/Sources/Drawable.swift @@ -0,0 +1,258 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +import DOM +import WebGPU + +public struct Drawable { + let indexBuffer: GPUBuffer + let vertexBuffer: GPUBuffer + let uvBuffer: GPUBuffer + let normalBuffer: GPUBuffer + let matrixBuffer: GPUBuffer + let viewProjectionMatrixBuffer: GPUBuffer + let bindGroup: GPUBindGroup + let indexCount: Int + + let albedoTexture: GPUTexture + let normalTexture: GPUTexture + let metalRoughnessTexture: GPUTexture + + var position: Vector4 + var scale: Vector4 + var rotation: Quaternion + + init( + device: GPUDevice, + bindGroupLayout: GPUBindGroupLayout, + mesh: Mesh, + position: Vector4, + scale: Vector4, + rotation: Quaternion = .identity, + assets: Renderer.Assets, + ) { + func createTextureFromImage(_ image: ImageBitmap, label: String) -> GPUTexture { + let texture = device.createTexture( + descriptor: .init( + label: label, + size: .init([image.width, image.height]), + format: .rgba8unorm, + usage: (GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST + | GPUTextureUsage.RENDER_ATTACHMENT), + ) + ) + + device.queue.copyExternalImageToTexture( + source: .init(source: .init(image), flipY: true), + destination: .init(texture: texture), + copySize: .init(.init(width: image.width, height: image.height)), + ) + + return texture + } + + self.indexCount = mesh.indices.count + self.scale = scale + self.position = position + self.rotation = rotation + let vertices = Float32Array(length: mesh.vertices.count * 4) + for (i, v) in mesh.vertices.enumerated() { + let index = i * 4 + vertices[index] = v.x + vertices[index + 1] = v.y + vertices[index + 2] = v.z + vertices[index + 3] = v.w + } + + self.vertexBuffer = device.createBuffer( + descriptor: .init( + label: "Vertices", + size: .init(vertices.lengthInBytes), + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST, + ) + ) + device.queue.writeBuffer( + buffer: vertexBuffer, + bufferOffset: 0, + data: .init(vertices.arrayBuffer), + dataOffset: 0 + ) + + let indices = Uint32Array(length: mesh.indices.count) + for (i, v) in mesh.indices.enumerated() { + indices[i] = v + } + + indexBuffer = device.createBuffer( + descriptor: .init( + label: "Indices", + size: .init(indices.lengthInBytes), + usage: + GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST + ) + ) + device.queue.writeBuffer( + buffer: indexBuffer, + bufferOffset: 0, + data: .init(indices.arrayBuffer), + dataOffset: 0 + ) + + let uvs = Float32Array(length: mesh.uvs.count * 4) + for (i, v) in mesh.uvs.enumerated() { + let index = i * 2 + uvs[index] = v.x + uvs[index + 1] = v.y + } + uvBuffer = device.createBuffer( + descriptor: .init( + label: "UVs", + size: .init(uvs.lengthInBytes), + usage: + GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST + ), + ) + device.queue.writeBuffer( + buffer: uvBuffer, + bufferOffset: 0, + data: .init(uvs.arrayBuffer), + dataOffset: 0 + ) + + let normals = Float32Array(length: mesh.normals.count * 4) + for (i, v) in mesh.normals.enumerated() { + let index = i * 4 + normals[index] = v.x + normals[index + 1] = v.y + normals[index + 2] = v.z + normals[index + 3] = v.w + } + normalBuffer = device.createBuffer( + descriptor: .init( + label: "Normals", + size: .init(normals.lengthInBytes), + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST + ), + ) + device.queue.writeBuffer( + buffer: normalBuffer, + bufferOffset: 0, + data: .init(normals.arrayBuffer), + dataOffset: 0 + ) + + matrixBuffer = device.createBuffer( + descriptor: .init( + label: "Model Matrix", + size: .init(MemoryLayout.stride * 16), + usage: + GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST + ) + ) + + viewProjectionMatrixBuffer = device.createBuffer( + descriptor: .init( + label: "View Projection Matrix", + size: .init(MemoryLayout.stride * 16), + usage: GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST + ), + ) + albedoTexture = createTextureFromImage(assets.albedo, label: "Albedo") + normalTexture = createTextureFromImage(assets.normal, label: "Normal") + metalRoughnessTexture = createTextureFromImage(assets.metalRoughness, label: "MetalRoughness") + + let sampler = device.createSampler( + descriptor: .init( + addressModeU: .repeat, + addressModeV: .repeat, + magFilter: .linear, + ) + ) + + bindGroup = device.createBindGroup( + descriptor: .init( + label: "bind group", + layout: bindGroupLayout, + entries: [ + .init(binding: 0, resource: GPUBindingResource(.init(buffer: vertexBuffer))), + .init(binding: 1, resource: GPUBindingResource(.init(buffer: indexBuffer))), + .init(binding: 2, resource: GPUBindingResource(.init(buffer: uvBuffer))), + .init(binding: 3, resource: GPUBindingResource(.init(buffer: normalBuffer))), + .init( + binding: 4, + resource: GPUBindingResource.gpuTextureView(albedoTexture.createView()) + ), + .init(binding: 5, resource: GPUBindingResource(normalTexture.createView())), + .init(binding: 6, resource: GPUBindingResource(metalRoughnessTexture.createView())), + .init(binding: 7, resource: GPUBindingResource(.init(buffer: matrixBuffer))), + .init(binding: 8, resource: GPUBindingResource(sampler)), + .init( + binding: 9, + resource: GPUBindingResource(.init(buffer: viewProjectionMatrixBuffer)) + ), + ] + ) + ) + } + + var matrix: Matrix4x4 { + let scaleM = Matrix4x4( + axisX: scale.xVec, + axisY: scale.yVec, + axisZ: scale.zVec, + translation: position + ) + let transRotM = Matrix4x4(translation: position, rotation: rotation) + + return scaleM * transRotM + } + + func updateMatrixBuffer(queue: GPUQueue, viewProjection: Matrix4x4) { + func writeMatrix(_ m: Matrix4x4, buffer: GPUBuffer) { + let matrixArray = Float32Array(length: 16) + matrixArray[0] = m.axisX.x + matrixArray[1] = m.axisX.y + matrixArray[2] = m.axisX.z + matrixArray[3] = m.axisX.w + + matrixArray[4] = m.axisY.x + matrixArray[5] = m.axisY.y + matrixArray[6] = m.axisY.z + matrixArray[7] = m.axisY.w + + matrixArray[8] = m.axisZ.x + matrixArray[9] = m.axisZ.y + matrixArray[10] = m.axisZ.z + matrixArray[11] = m.axisZ.w + + matrixArray[12] = m.translation.x + matrixArray[13] = m.translation.y + matrixArray[14] = m.translation.z + matrixArray[15] = m.translation.w + + queue.writeBuffer( + buffer: buffer, + bufferOffset: 0, + data: .init(matrixArray.arrayBuffer), + dataOffset: 0 + ) + } + + writeMatrix(self.matrix, buffer: matrixBuffer) + writeMatrix(viewProjection, buffer: viewProjectionMatrixBuffer) + } + + public func draw(pass: GPURenderPassEncoder) { + pass.setBindGroup(index: 0, bindGroup: bindGroup) + pass.draw(vertexCount: .init(indexCount)) + } +} diff --git a/WebGPUDemo/Sources/Entrypoint.swift b/WebGPUDemo/Sources/Entrypoint.swift new file mode 100644 index 0000000..8376c73 --- /dev/null +++ b/WebGPUDemo/Sources/Entrypoint.swift @@ -0,0 +1,55 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +import DOM +import JavaScriptEventLoop +import JavaScriptKit +import WebGPU + +func fetchString(url: String) async throws -> String { + let result = try await Window.global.fetch(input: .init(url)) + return try await result.text() +} + +func fetchImageBitmap(url: String) async throws -> ImageBitmap { + let blob = try await Window.global.fetch(input: .init(url)).blob() + return try await Window.global.createImageBitmap( + image: .blob(blob), + options: .init(colorSpaceConversion: ColorSpaceConversion.none) + ) +} + +@main +struct Entrypoint { + static func main() { + JavaScriptEventLoop.installGlobalExecutor() + let gpu = Window.global.navigator.gpu + Task { + let adapter = try await gpu.requestAdapter()! + let device = try await adapter.requestDevice() + + let renderer = try await Renderer( + device: device, + gpu: gpu, + assets: .init( + shaders: fetchString(url: "Resources/shaders.wgsl"), + model: fetchString(url: "Resources/SwiftLogo/Swift3DLogo.obj"), + albedo: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_BaseColor.png"), + normal: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_Normal.png"), + metalRoughness: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_MetalRoughness.png"), + ), + ) + + draw(renderer: renderer) + } + } +} diff --git a/WebGPUDemo/Sources/Math.swift b/WebGPUDemo/Sources/Math.swift new file mode 100644 index 0000000..034572b --- /dev/null +++ b/WebGPUDemo/Sources/Math.swift @@ -0,0 +1,220 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +import JavaScriptKit + +public func sin(_ x: T) -> T { + T(JSObject.global.Math.sin.function!(Float(x).jsValue).number!) +} + +public func cos(_ x: T) -> T { + T(JSObject.global.Math.cos.function!(Float(x).jsValue).number!) +} + +public func tan(_ x: T) -> T { + T(JSObject.global.Math.tan.function!(Float(x).jsValue).number!) +} + +public func square(_ x: Float) -> Float { + x * x +} + +extension BinaryFloatingPoint { + public func lerp(_ b: Self, _ s: Self) -> Self { + self + (b - self) * s + } +} + +public typealias Vector2 = SIMD2 +public typealias Vector4 = SIMD4 + +public extension SIMD4 where Scalar: BinaryFloatingPoint { + var xVec: Self { + .init(x: x, y: 0, z: 0, w: 0) + } + + var yVec: Self { + .init(x: 0, y: y, z: 0, w: 0) + } + + var zVec: Self { + .init(x: 0, y: 0, z: z, w: 0) + } + + var wVec: Self { + .init(x: 0, y: 0, z: 0, w: w) + } + + static var oneX: Self { + .init(x: 1, y: 0, z: 0, w: 0) + } + + static var oneY: Self { + .init(x: 0, y: 1, z: 0, w: 0) + } + + static var oneZ: Self { + .init(x: 0, y: 0, z: 1, w: 0) + } + + static var oneW: Self { + .init(x: 0, y: 0, z: 0, w: 1) + } + + var length: Scalar { + dot(self).squareRoot() + } + + var normalized: Self { + self / self.length + } + + func dot(_ b: Self) -> Scalar { + let xx = x * b.x + let yy = y * b.y + let zz = z * b.z + let ww = w * b.w + + return xx + yy + zz + ww + } +} + +public struct Matrix4x4 { + public var axisX: SIMD4 + public var axisY: SIMD4 + public var axisZ: SIMD4 + public var translation: SIMD4 + + init() { + self.init(axisX: .zero, axisY: .zero, axisZ: .zero, translation: .zero) + } + + init(axisX: SIMD4, axisY: SIMD4, axisZ: SIMD4, translation: SIMD4) { + self.axisX = axisX + self.axisY = axisY + self.axisZ = axisZ + self.translation = translation + } + + init(rotation: Quaternion) { + self.init(translation: .oneW, rotation: rotation) + } + + init(translation: SIMD4, rotation: Quaternion) { + let xq = rotation.a * rotation.components * 2 + let yq = rotation.b * rotation.components * 2 + let zq = rotation.c * rotation.components * 2 + + self.axisX = .init(x: 1 - yq.y - zq.z, y: xq.y + zq.w, z: xq.z - yq.w, w: 0) + self.axisY = .init(x: xq.y - zq.w, y: 1 - xq.x - zq.z, z: yq.z + xq.w, w: 0) + self.axisZ = .init(x: xq.z + yq.w, y: yq.z - xq.w, z: 1 - xq.x - yq.y, w: 0) + self.translation = translation + } + + public static func * (a: Self, b: SIMD4) -> SIMD4 { + let x = a.axisX.x * b.x + a.axisY.x * b.y + a.axisZ.x * b.z + a.translation.x * b.w + let y = a.axisX.y * b.x + a.axisY.y * b.y + a.axisZ.y * b.z + a.translation.y * b.w + let z = a.axisX.z * b.x + a.axisY.z * b.y + a.axisZ.z * b.z + a.translation.z * b.w + let w = a.axisX.w * b.x + a.axisY.w * b.y + a.axisZ.w * b.z + a.translation.w * b.w + + return .init(x: x, y: y, z: z, w: w) + } + + public static func * (a: Self, b: Self) -> Self { + let axisX = a * b.axisX + let axisY = a * b.axisY + let axisZ = a * b.axisZ + let translation = a * b.translation + + return Matrix4x4(axisX: axisX, axisY: axisY, axisZ: axisZ, translation: translation) + } + + public static func *= (a: inout Self, b: Self) { + a = a * b + } + + public var transposed: Self { + return Matrix4x4( + axisX: .init(x: axisX.x, y: axisY.x, z: axisZ.x, w: translation.x), + axisY: .init(x: axisX.y, y: axisY.y, z: axisZ.y, w: translation.y), + axisZ: .init(x: axisX.z, y: axisY.z, z: axisZ.z, w: translation.z), + translation: .init(x: axisX.w, y: axisY.w, z: axisZ.w, w: translation.w) + ) + } + + public static var identity: Self { + .init(axisX: .oneX, axisY: .oneY, axisZ: .oneZ, translation: .oneW) + } +} + +public struct Quaternion { + var components: SIMD4 + + public init(components: SIMD4) { + self.components = components + } + + public init(a: Scalar, b: Scalar, c: Scalar, d: Scalar) { + components = .init(x: a, y: b, z: c, w: d) + } + + public init(axis: SIMD4, radians: Scalar) { + let radHalf = radians * 0.5 + let sinR = sin(radHalf) + let cosR = cos(radHalf) + + components = axis * sinR + components.w = cosR + + components = components.normalized + } + + public var a: Scalar { + components.x + } + + public var b: Scalar { + components.y + } + + public var c: Scalar { + components.z + } + + public var d: Scalar { + components.w + } + + public static func * (a: Self, b: Self) -> Self { + let _a = a.a * b.d + a.b * b.c - a.c * b.b + a.d * b.a + let _b = a.b * b.d - a.a * b.c + a.c * b.a + a.d * b.b + let _c = a.c * b.d + a.a * b.b - a.b * b.a + a.d * b.c + let _d = a.d * b.d - a.a * b.a - a.b * b.b - a.c * b.c + return .init(a: _a, b: _b, c: _c, d: _d) + } + + public static func * (a: Self, b: Scalar) -> Self { + return .init(components: a.components * b) + } + + public static func *= (a: inout Self, b: Self) { + a = a * b + } + + public func dot(_ b: Self) -> Scalar { + return components.dot(b.components) + } + + public static var identity: Self { + .init(a: 0, b: 0, c: 0, d: 1) + } +} diff --git a/WebGPUDemo/Sources/Renderer.swift b/WebGPUDemo/Sources/Renderer.swift new file mode 100644 index 0000000..a8b884e --- /dev/null +++ b/WebGPUDemo/Sources/Renderer.swift @@ -0,0 +1,261 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +import DOM +import WebGPU + +func draw(renderer: Renderer) { + _ = Window.global.requestAnimationFrame { + renderer.render(timestamp: $0) + draw(renderer: renderer) + } +} + +final class Renderer { + struct Assets { + let shaders: String + let model: String + let albedo: ImageBitmap + let normal: ImageBitmap + let metalRoughness: ImageBitmap + } + + let device: GPUDevice + let context: GPUCanvasContext + let pipeline: GPURenderPipeline + var lastTick: Double + let rotation: Quaternion + let passDescriptor: GPURenderPassDescriptor + let depthTexture: GPUTexture + let projectionMatrix: Matrix4x4 + var time: Double = 0.0 + var drawable: Drawable + let multisampleTexture: GPUTexture + + init(device: GPUDevice, gpu: GPU, assets: Assets) { + let window = Window.global + let document = window.document + + let canvas = HTMLCanvasElement(unsafelyWrapping: document.createElement(localName: "canvas").jsObject) + canvas.width = UInt32(window.innerWidth) + canvas.height = UInt32(window.innerHeight) + _ = document.body!.appendChild(node: canvas) + + context = canvas.getContext(GPUCanvasContext.self)! + + let format = gpu.getPreferredCanvasFormat() + context.configure( + configuration: .init( + device: device, + format: format, + ) + ) + + depthTexture = + device.createTexture( + descriptor: .init( + size: .init([canvas.width, canvas.height]), + sampleCount: 4, + format: .depth24plus, + usage: GPUTextureUsage.RENDER_ATTACHMENT, + ) + ) + + let canvasTexture = context.getCurrentTexture() + multisampleTexture = device.createTexture( + descriptor: .init( + size: .init([canvasTexture.width, canvasTexture.height]), + sampleCount: 4, + format: canvasTexture.format, + usage: GPUTextureUsage.RENDER_ATTACHMENT, + ) + ) + + passDescriptor = .init( + label: "triangle render pass", + colorAttachments: [ + .init( + view: multisampleTexture.createView(), + clearValue: .init([0.2, 0.2, 0.2, 1.0]), + loadOp: .clear, + storeOp: .store, + ) + ], + depthStencilAttachment: + .init( + view: depthTexture.createView(), + depthClearValue: 1.0, + depthLoadOp: .clear, + depthStoreOp: .store, + ) + ) + + let module = device.createShaderModule( + descriptor: .init( + label: "shaders", + code: assets.shaders, + ) + ) + let bindGroupLayout = device.createBindGroupLayout( + descriptor: .init( + label: "bind group layout", + entries: [ + .init( + binding: 0, + visibility: GPUShaderStage.VERTEX, + buffer: .init(type: .readOnlyStorage) + ), + .init( + binding: 1, + visibility: GPUShaderStage.VERTEX, + buffer: .init(type: .readOnlyStorage) + ), + .init( + binding: 2, + visibility: GPUShaderStage.VERTEX, + buffer: .init(type: .readOnlyStorage) + ), + .init( + binding: 3, + visibility: GPUShaderStage.VERTEX, + buffer: .init(type: .readOnlyStorage) + ), + .init( + binding: 4, + visibility: GPUShaderStage.FRAGMENT, + texture: .init() + ), + .init( + binding: 5, + visibility: GPUShaderStage.FRAGMENT, + texture: .init() + ), + .init( + binding: 6, + visibility: GPUShaderStage.FRAGMENT, + texture: .init() + ), + .init( + binding: 7, + visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, + buffer: .init(type: .readOnlyStorage) + ), + .init( + binding: 8, + visibility: GPUShaderStage.FRAGMENT, + sampler: .init() + ), + .init( + binding: 9, + visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, + buffer: .init(type: .readOnlyStorage) + ), + ] + ) + ) + + let pipelineLayout = device.createPipelineLayout( + descriptor: .init(bindGroupLayouts: [ + bindGroupLayout // @group(0) + ]) + ) + + pipeline = device.createRenderPipeline( + descriptor: .init( + // label: "pipeline", + layout: .init(pipelineLayout), + vertex: .init( + module: module, + entryPoint: "vs", + ), + primitive: .init( + topology: .triangleList, + frontFace: .ccw, + cullMode: .back, + ), + depthStencil: .init( + format: .depth24plus, + depthWriteEnabled: true, + depthCompare: .less, + ), + multisample: .init(count: 4), + fragment: .init( + module: module, + entryPoint: "fs", + targets: [.init(format: format)] + ), + ) + ) + self.device = device + + lastTick = Window.global.performance.timeOrigin + rotation = Quaternion(axis: Vector4(x: 1.0, y: 1.0, z: 1.0, w: 0.0), radians: 3.14) + + let nearZ: Float = 0.001 + let farZ: Float = 1000.0 + let fov: Float = Float.pi / 3 + let aspect = Float(canvas.width) / Float(canvas.height) + let va_tan = Float(1.0) / tan(fov * 0.5) + let ys = va_tan + let xs = ys / aspect + let zs = -(farZ + nearZ) / (farZ - nearZ) + let zss = -(2.0 * farZ * nearZ) / (farZ - nearZ) + self.projectionMatrix = Matrix4x4( + axisX: Vector4(x: xs, y: 0.0, z: 0.0, w: 0.0), + axisY: Vector4(x: 0.0, y: ys, z: 0.0, w: 0.0), + axisZ: Vector4(x: 0.0, y: 0.0, z: zs, w: -1.0), + translation: Vector4(x: 0.0, y: 0.0, z: zss, w: 0.0) + ) + + let model = ObjParser().parse(text: assets.model) + drawable = Drawable( + device: device, + bindGroupLayout: bindGroupLayout, + mesh: model.meshes[0], + position: Vector4(x: 0.0, y: 0.0, z: -1.5, w: 1.0), + scale: Vector4(x: 0.1, y: 0.1, z: 0.1, w: 1.0), + assets: assets, + ) + let initialRad = 1.57079633 * (500 / 1000.0) + let rotation = Quaternion(axis: .oneY, radians: Float(initialRad)) + drawable.rotation *= rotation + } + + let pi: Double = 3.1415926 + + func update(delta: Double) { + let rad = 1.57079633 * (delta / 1000.0) + let rotation = Quaternion(axis: .oneY, radians: Float(rad)) + drawable.rotation *= rotation + drawable.updateMatrixBuffer(queue: device.queue, viewProjection: projectionMatrix) + } + + func render(timestamp: Double) { + let delta = max(0.0, timestamp - lastTick) + lastTick = timestamp + time += delta + self.update(delta: delta) + + passDescriptor.colorAttachments[0]?.view = multisampleTexture.createView() + passDescriptor.colorAttachments[0]?.resolveTarget = context.getCurrentTexture().createView() + + let encoder = device.createCommandEncoder(descriptor: .init(label: "command encoder")) + + let pass = encoder.beginRenderPass(descriptor: passDescriptor) + pass.setPipeline(pipeline: pipeline) + drawable.draw(pass: pass) + pass.end() + + let commandBuffer = encoder.finish() + device.queue.submit(commandBuffers: [commandBuffer]) + } +} diff --git a/WebGPUDemo/Sources/Wavefront.swift b/WebGPUDemo/Sources/Wavefront.swift new file mode 100644 index 0000000..a25b7a4 --- /dev/null +++ b/WebGPUDemo/Sources/Wavefront.swift @@ -0,0 +1,168 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2025 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +import JavaScriptKit + +extension UInt8 { + static let newline = UInt8(ascii: "\n") + static let space = UInt8(ascii: " ") + static let forwardSlash = UInt8(ascii: "/") +} + +public struct ObjParser { + init() {} + + func parse(text: String) -> Model { + var lines = text.utf8.lazy.split(separator: .newline).makeIterator() + var meshes = [Mesh]() + var builder = MeshBuilder() + + while let line = lines.next() { + let parts = line.split(separator: .space) + if parts.isEmpty { + continue + } + + switch parts[0] { + case "o": + if !builder.isEmpty { + meshes.append(builder.mesh) + builder = MeshBuilder() + } + + case "v": + if parts.count == 4 { + builder.vertices.append(Vector4(x: Float(parts[1])!, y: Float(parts[2])!, z: Float(parts[3])!, w: 1.0)) + } else { + builder.vertices.append( + Vector4(x: Float(parts[1])!, y: Float(parts[2])!, z: Float(parts[3])!, w: Float(parts[4])!) + ) + } + + case "vt": + builder.uvs.append(Vector2(x: Float(parts[1])!, y: Float(parts[2])!)) + + case "vn": + builder.normals.append(Vector4(x: Float(parts[1])!, y: Float(parts[2])!, z: Float(parts[3])!, w: 1.0)) + + case "f": + guard parts.count == 4 else { + fatalError("Can only support triangles") + } + func parseIndices(_ text: some Sequence) { + let parts = text.split(separator: .forwardSlash, omittingEmptySubsequences: false) + if parts.count >= 1 { + builder.vertexIndices.append(UInt32(parts[0])! - 1) + } + if parts.count >= 2 && !parts[1].isEmpty { + builder.uvIndices.append(UInt32(parts[1])! - 1) + } + if parts.count >= 3 { + builder.normalIndices.append(UInt32(parts[2])! - 1) + } + } + parseIndices(parts[1]) + parseIndices(parts[2]) + parseIndices(parts[3]) + + default: + continue + } + } + + if !builder.isEmpty { + meshes.append(builder.mesh) + } + return Model(meshes: meshes) + } +} + +public struct Model { + let meshes: [Mesh] +} + +struct MeshBuilder { + var vertices: [Vector4] = [] + var vertexIndices: [UInt32] = [] + var normals: [Vector4] = [] + var normalIndices: [UInt32] = [] + var uvs: [Vector2] = [] + var uvIndices: [UInt32] = [] + + var isEmpty: Bool { + vertices.isEmpty && vertexIndices.isEmpty && normals.isEmpty && normalIndices.isEmpty && uvs.isEmpty + && uvIndices.isEmpty + } + + var mesh: Mesh { + var remappedVertices: [Vector4] = Array(repeating: .zero, count: vertexIndices.count) + var remappedNormals: [Vector4] = Array(repeating: .zero, count: vertexIndices.count) + var remappedUVs: [Vector2] = Array(repeating: .zero, count: vertexIndices.count) + for (n, index) in normalIndices.enumerated() { + remappedNormals[n] = normals[Int(index)] + } + + for (n, index) in uvIndices.enumerated() { + remappedUVs[n] = uvs[Int(index)] + } + + for (n, index) in vertexIndices.enumerated() { + remappedVertices[n] = vertices[Int(index)] + } + + return Mesh( + vertices: remappedVertices, + indices: vertexIndices, + normals: remappedNormals, + uvs: remappedUVs + ) + } +} + +public struct Mesh { + public let vertices: [Vector4] + public let indices: [UInt32] + public let normals: [Vector4] + public let uvs: [Vector2] +} + +extension Float { + init?(_ text: some Collection) { + let text = String(decoding: text, as: UTF8.self) + guard let parsed = JSObject.global.parseFloat!(text).number else { + return nil + } + self.init(parsed) + } +} + +extension UInt32 { + init?(_ text: some Collection) { + let text = String(decoding: text, as: UTF8.self) + self.init(text) + } +} + +extension String { + static func ~= (lhs: Self, rhs: some Collection) -> Bool { + let lhs = lhs.utf8 + guard lhs.count == rhs.count else { return false } + var lhsIndex = lhs.startIndex + var rhsIndex = rhs.startIndex + while lhsIndex < lhs.endIndex { + guard lhs[lhsIndex] == rhs[rhsIndex] else { return false } + lhs.formIndex(after: &lhsIndex) + rhs.formIndex(after: &rhsIndex) + } + return true + } +} diff --git a/WebGPUDemo/index.html b/WebGPUDemo/index.html new file mode 100644 index 0000000..568373d --- /dev/null +++ b/WebGPUDemo/index.html @@ -0,0 +1,36 @@ + + + + + + Swift WebGPU Demo + + + + + + From ffcb2db235bcb88b3578efe0679239963bf10985 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Wed, 18 Jun 2025 11:05:26 +0100 Subject: [PATCH 2/3] Add back `.build/.gitkeep` to fix `Public/.build` symlink --- AudioWorkstation/Guest/.build/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 AudioWorkstation/Guest/.build/.gitkeep diff --git a/AudioWorkstation/Guest/.build/.gitkeep b/AudioWorkstation/Guest/.build/.gitkeep new file mode 100644 index 0000000..e69de29 From 5b8137e46898612e0715ceb50c9911aa3216ee94 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Wed, 18 Jun 2025 11:11:14 +0100 Subject: [PATCH 3/3] Fix compatibility with Embedded Swift --- WebGPUDemo/Sources/Entrypoint.swift | 38 +++++++++++++++++------------ 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/WebGPUDemo/Sources/Entrypoint.swift b/WebGPUDemo/Sources/Entrypoint.swift index 8376c73..4cf2a38 100644 --- a/WebGPUDemo/Sources/Entrypoint.swift +++ b/WebGPUDemo/Sources/Entrypoint.swift @@ -10,17 +10,19 @@ // //===----------------------------------------------------------------------===// +import _Concurrency import DOM import JavaScriptEventLoop import JavaScriptKit +import WebAPIBase import WebGPU -func fetchString(url: String) async throws -> String { +func fetchString(url: String) async throws(JSException) -> String { let result = try await Window.global.fetch(input: .init(url)) return try await result.text() } -func fetchImageBitmap(url: String) async throws -> ImageBitmap { +func fetchImageBitmap(url: String) async throws(JSException) -> ImageBitmap { let blob = try await Window.global.fetch(input: .init(url)).blob() return try await Window.global.createImageBitmap( image: .blob(blob), @@ -34,22 +36,26 @@ struct Entrypoint { JavaScriptEventLoop.installGlobalExecutor() let gpu = Window.global.navigator.gpu Task { - let adapter = try await gpu.requestAdapter()! - let device = try await adapter.requestDevice() + do throws(JSException) { + let adapter = try await gpu.requestAdapter()! + let device = try await adapter.requestDevice() - let renderer = try await Renderer( - device: device, - gpu: gpu, - assets: .init( - shaders: fetchString(url: "Resources/shaders.wgsl"), - model: fetchString(url: "Resources/SwiftLogo/Swift3DLogo.obj"), - albedo: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_BaseColor.png"), - normal: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_Normal.png"), - metalRoughness: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_MetalRoughness.png"), - ), - ) + let renderer = try await Renderer( + device: device, + gpu: gpu, + assets: .init( + shaders: fetchString(url: "Resources/shaders.wgsl"), + model: fetchString(url: "Resources/SwiftLogo/Swift3DLogo.obj"), + albedo: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_BaseColor.png"), + normal: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_Normal.png"), + metalRoughness: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_MetalRoughness.png"), + ), + ) - draw(renderer: renderer) + draw(renderer: renderer) + } catch { + console.error(data: error.thrownValue) + } } } }