diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..ae59494 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,71 @@ +name: CI + +on: + push: + branches: ["main"] + pull_request: + +env: + CARGO_TERM_COLOR: always + +jobs: + test: + name: Rust tests (core, reader, end-to-end) + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + components: clippy, rustfmt + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Install IfcOpenShell + IfcTester (the IFC reader bridge) + run: python -m pip install --upgrade pip && python -m pip install ifcopenshell "ifctester" --no-deps && python -m pip install lxml xmlschema + - name: Install Tauri system dependencies (Linux) + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf + - uses: Swatinem/rust-cache@v2 + - name: Format + run: cargo fmt --all -- --check + - name: Clippy + run: cargo clippy --workspace --all-targets -- -D warnings + - name: Test + run: cargo test --workspace + - name: CLI smoke run on the broken fixture (expected exit code 1 = FAIL) + run: | + cargo run -q -p verimodel-cli -- check --ifc tests/fixtures/broken_building.ifc --ids examples/sample.ids --config examples/residential/project.yaml --out out/broken || test $? -eq 1 + ls -la out/broken + + bundle: + name: Desktop bundle (${{ matrix.os }}) + needs: test + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04, windows-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - name: Install Tauri system dependencies (Linux) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf + - uses: Swatinem/rust-cache@v2 + - name: Install Tauri CLI + run: cargo install tauri-cli --version "^2" --locked + - name: Build installers + run: cargo tauri build + - uses: actions/upload-artifact@v4 + with: + name: verimodel-${{ matrix.os }} + path: | + target/release/bundle/**/*.msi + target/release/bundle/**/*.exe + target/release/bundle/**/*.dmg + target/release/bundle/**/*.AppImage + target/release/bundle/**/*.deb + if-no-files-found: warn diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..06a6062 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,83 @@ +name: Release + +# Builds installers for Windows, macOS and Linux when a version tag is pushed +# (e.g. `git tag v1.0.0 && git push origin v1.0.0`) and attaches them to a +# GitHub Release. The CLI binaries are attached too. + +on: + push: + tags: ["v*"] + +permissions: + contents: write + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + name: Build (${{ matrix.name }}) + strategy: + fail-fast: false + matrix: + include: + - name: windows-x64 + os: windows-latest + bundles: msi,nsis + cli: target/release/verimodel.exe + cli_asset: verimodel-cli-windows-x64.exe + - name: macos-arm64 + os: macos-latest + bundles: dmg + cli: target/release/verimodel + cli_asset: verimodel-cli-macos-arm64 + - name: linux-x64 + os: ubuntu-24.04 + bundles: appimage,deb + cli: target/release/verimodel + cli_asset: verimodel-cli-linux-x64 + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - name: Install Tauri system dependencies (Linux) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf + - uses: Swatinem/rust-cache@v2 + - name: Install Tauri CLI + run: cargo install tauri-cli --version "^2" --locked + - name: Build CLI + run: cargo build --release -p verimodel-cli + - name: Build desktop installers + run: cargo tauri build --bundles ${{ matrix.bundles }} + - name: Collect artifacts + shell: bash + run: | + mkdir -p dist + cp "${{ matrix.cli }}" "dist/${{ matrix.cli_asset }}" + find target/release/bundle -type f \( -name "*.msi" -o -name "*.exe" -o -name "*.dmg" -o -name "*.AppImage" -o -name "*.deb" \) -exec cp {} dist/ \; + ls -la dist + - uses: actions/upload-artifact@v4 + with: + name: verimodel-${{ matrix.name }} + path: dist/* + + release: + name: Publish GitHub Release + needs: build + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + path: dist + merge-multiple: true + - name: Checksums + run: cd dist && sha256sum * > SHA256SUMS.txt && cat SHA256SUMS.txt + - uses: softprops/action-gh-release@v2 + with: + name: VeriModel ${{ github.ref_name }} + body_path: docs/RELEASE_NOTES.md + files: dist/* diff --git a/.gitignore b/.gitignore index 1b3d4e7..26d407e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ # Rust /target/ **/target/ -Cargo.lock +# Cargo.lock is committed: this workspace builds binaries (CLI + desktop) # Keep Cargo.lock for the Tauri binary / CLI — uncomment if this becomes a library-only crate # !Cargo.lock @@ -31,6 +31,7 @@ out/ *.ifc *.ifczip !tests/fixtures/*.ifc +!examples/demo/*.ifc # OS / editors .DS_Store @@ -41,3 +42,4 @@ Thumbs.db *.swo .env .env.local +src-tauri/gen/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..8b6536c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,42 @@ +# Contributing to VeriModel + +VeriModel is a local-first IFC quality gate, quantity takeoff and BCF exporter, +source-available under the PolyForm Noncommercial License 1.0.0. +Read this before you open a pull request. + +## Before touching anything + +```sh +pip install ifcopenshell ifctester # the IFC reader bridge +cargo test --workspace # unit + end-to-end tests (real IFC fixtures) +cargo clippy --workspace --all-targets -- -D warnings +cargo fmt --all +cargo tauri dev # the desktop app +``` + +## Where things live + +- `README.md`: what VeriModel is, how to run it, architecture, demo script. +- `docs/CONFIG.md`, `docs/RULES.md`, `docs/IDS.md`, `docs/ASSUMPTIONS.md`: reference. +- `crates/core`: every decision (rules, score, QTO, BCF, reports). No IFC dependency. +- `crates/ifc_reader`: the only code that touches IFC (IfcOpenShell bridge). Facts only. +- `crates/assistant`: the read-only language-model copilot. Never part of a verdict. +- `frontend/`: presentation only. `src-tauri/` and `crates/cli/`: thin shells over core. +- `examples/`, `tests/fixtures/`: sample configurations and public IFC files. + +## Work rules + +1. Nothing project-specific in Rust: element types, property names, storeys, tolerances and classification come from `project.yaml`, `.ids` or a rule pack. A new check is a new YAML rule, or a new generic check kind with tests. +2. No change ships without the suite green, including the end-to-end tests on the fixtures. +3. Every fixed bug carries a regression test, verified to fail without the fix. +4. Outputs stay deterministic: `report.json`, `failures.csv`, `qto.*` and `report.html` must be byte-identical for the same inputs. Timestamps live only in `run.json` and `audit.log`. +5. The verdict is never produced or influenced by the assistant model. +6. Code, identifiers and comments in English. UI strings in both `en` and `es`, through the i18n files, never hardcoded. +7. A check that cannot run is reported as SKIPPED with a reason, never as PASS. +8. Do not add dependencies without a line in the README's "Dependencies and licenses" table. + +## Licence + +By contributing you agree that your contribution is licensed under the project +licence (PolyForm Noncommercial 1.0.0) and that the copyright holder may license +the project, including your contribution, under other terms. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..a00c8dc --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,6641 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "adobe-cmap-parser" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8abfa9a4688de8fc9f42b3f013b6fffec18ed8a554f5f113577e0b9b3212a3" +dependencies = [ + "pom", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "serde", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a" + +[[package]] +name = "alloc-stdlib" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5c1865780388bfa186411ab5f247819487fc4864c6e9c3106611fa347586e1" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "arbitrary" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bc62ac97cc33321f50863d514c3bc38a453947a8f9e781137e47c7401020aed" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f8abc12baad266b1c8cec146854c195b5864b4221d4b2ca7296a7ae82d9e451" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8b851b75c23ca7873623d612fe49bd1989aeb03d08fb9432187eb253d3d4c6b" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941cd9bd4ddab83cb46fa5a2d428f1c857b24ac78cb876cf7beb710840934bd7" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.13.2", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbad30e4b4c14a39e3cc8aed085a12a327257c316619c93581e017bc52be591" +dependencies = [ + "serde_core", +] + +[[package]] +name = "candle-core" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ecb245093b0f791b89d3420c3df9c6d49c60ab63ba54db896bf8a3baf486706" +dependencies = [ + "byteorder", + "float8", + "gemm", + "half", + "libc", + "libm", + "memmap2", + "num-traits", + "num_cpus", + "rand", + "rand_distr", + "rayon", + "safetensors", + "thiserror 2.0.21", + "tokenizers 0.22.2", + "yoke", + "zerocopy", + "zip 8.6.0", +] + +[[package]] +name = "candle-nn" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaa10b6ccc365b33210ce404fbf45e60d3e0bdac1004463cf1052e6ee1c1739a" +dependencies = [ + "candle-core", + "half", + "libc", + "num-traits", + "rayon", + "safetensors", + "serde", + "thiserror 2.0.21", +] + +[[package]] +name = "candle-transformers" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcbbf7ff00ff6fe2af22b93600195917fe90e90ff48424a140d1a926c44b1c1" +dependencies = [ + "byteorder", + "candle-core", + "candle-nn", + "fancy-regex", + "num-traits", + "rand", + "rayon", + "serde", + "serde_json", + "serde_plain", + "tracing", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.21", +] + +[[package]] +name = "cargo_toml" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f4b26e751e711a5302649417f2da046dce6391b2ea30a4820f37462314f0b9" +dependencies = [ + "semver", + "serde", + "toml 1.1.8+spec-1.1.0", +] + +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6651c9ed80effdc7db0ff72512157f901af5e3549e341e24b1dd4887d836d838" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a347dcabdae9c31b0825fd6a8bed285ec9c2acb89c47827126d52fa4f59cece3" +dependencies = [ + "fnv", + "uuid", + "web-time", +] + +[[package]] +name = "cff-parser" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f5b6e9141c036f3ff4ce7b2f7e432b0f00dee416ddcd4f17741d189ddc2e9d" + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clap" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "clap_lex" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "4.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4356eba6976435498d05a311ee9fc486da3bc81c200d3f0d7dd9703b41913f92" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compact_str" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "serde", + "static_assertions", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "cookie" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.13.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.2", + "core-foundation", + "libc", +] + +[[package]] +name = "core_detect" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a" +dependencies = [ + "quote", + "syn 3.0.9", +] + +[[package]] +name = "csv" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "csv-core" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctor" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914a755b7c2d4af2bdcff7ce1739e2db9a1b81a9b07123d8015786ae03c0980d" + +[[package]] +name = "daachorse" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5614204febbc33cc07a2806aa6440b904ac012b68eecc37f4493ea4a76455a3d" + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" +dependencies = [ + "darling_core 0.24.1", + "darling_macro 0.24.1", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", +] + +[[package]] +name = "darling_core" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.9", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" +dependencies = [ + "darling_core 0.24.1", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "dary_heap" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1e3a325bc115f096c8b77bbf027a7c2592230e70be2d985be950d3d5e60ebe" +dependencies = [ + "serde", +] + +[[package]] +name = "dbus" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "defmt" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a0795ac740cb54d7b3775c9c17345f6aaecf884c01733b39d6017738e0e3e1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "840bb056bd99c495c9188198a258ab787c79f306d864db3e6e8451442d6d8366" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "defmt-parser" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71958f69fb2de856c5dd51ac9377e986ca1aa5919f931bf5395a807277f889a0" +dependencies = [ + "thiserror 2.0.21", +] + +[[package]] +name = "deranged" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9de72ce2ad1f90dc62fa25f0f430ef85eb4b0d8fa0be4f30373bc40a21d28e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "derive_arbitrary" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b034bd7d5f032402a2479444dcc6f74e36a03f31854d41680fb240ef682a1ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.119", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d57d423b3c82e89b9a24ca3091fee61f456a26edbd28d26c65906f4bc1dcd8f" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.2", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dom_query" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac5fca71e65e94cc718a6e2af65d6e0f9c6027751c2aa562fbb5087fda639bc" +dependencies = [ + "bit-set", + "cssparser", + "foldhash", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "dyn-stack" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4713e43e2886ba72b8271aa66c93d722116acf7a75555cce11dcde84388fe8" +dependencies = [ + "bytemuck", + "dyn-stack-macros", +] + +[[package]] +name = "dyn-stack-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d926b4d407d372f141f93bb444696142c29d32962ccbd3531117cf3aa0bfa9" + +[[package]] +name = "ecb" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a8bfa975b1aec2145850fcaa1c6fe269a16578c44705a532ae3edc92b8881c7" +dependencies = [ + "cipher", +] + +[[package]] +name = "either" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" + +[[package]] +name = "embed-resource" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6168487b5e7eb2673e6efe1200b1848016e436a6ca0b8031bf04bd9d493a249f" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.8+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e985e0451871ad22fb8d2b6b076e2028a502a0d3950998c2c5c0a4f9b5d9679" +dependencies = [ + "cfg-if", + "core_detect", + "multiversion_no_op", + "rustversion", + "scopeguard", + "simdutf8", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "env_filter" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "esaxx-rs" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d817e038c30374a4bcb22f94d0a8a0e216958d4c3dcde369b1439fec4bdda6e6" + +[[package]] +name = "euclid" +version = "0.20.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb7ef65b3777a325d1eeefefab5b6d4959da54747e33bd6258e789640f307ad" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fancy-regex" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e1dacd0d2082dfcf1351c4bdd566bbe89a2b263235a2b50058f1e130a47277" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[package]] +name = "float8" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d1f04709a8ac06e8e8042875a3c466cc4832d3c1a18dbcb9dba3c6e83046bc" +dependencies = [ + "half", + "num-traits", + "rand", + "rand_distr", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "gemm" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa0673db364b12263d103b68337a68fbecc541d6f6b61ba72fe438654709eacb" +dependencies = [ + "dyn-stack", + "gemm-c32", + "gemm-c64", + "gemm-common", + "gemm-f16", + "gemm-f32", + "gemm-f64", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-c32" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "086936dbdcb99e37aad81d320f98f670e53c1e55a98bee70573e83f95beb128c" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-c64" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c8aeeeec425959bda4d9827664029ba1501a90a0d1e6228e48bef741db3a3f" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-common" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88027625910cc9b1085aaaa1c4bc46bb3a36aad323452b33c25b5e4e7c8e2a3e" +dependencies = [ + "bytemuck", + "dyn-stack", + "half", + "libm", + "num-complex", + "num-traits", + "once_cell", + "paste", + "pulp", + "raw-cpuid", + "rayon", + "seq-macro", + "sysctl", +] + +[[package]] +name = "gemm-f16" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3df7a55202e6cd6739d82ae3399c8e0c7e1402859b30e4cb780e61525d9486e" +dependencies = [ + "dyn-stack", + "gemm-common", + "gemm-f32", + "half", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "rayon", + "seq-macro", +] + +[[package]] +name = "gemm-f32" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0b8c9da1fbec6e3e3ab2ce6bc259ef18eb5f6f0d3e4edf54b75f9fd41a81c" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-f64" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056131e8f2a521bfab322f804ccd652520c79700d81209e9d9275bbdecaadc6a" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.13.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", + "num-traits", + "rand", + "rand_distr", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", + "serde_core", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html-escape" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9356095b4b41197bba32173600e1582792cda618f65d12f68e2e77d273413c5" + +[[package]] +name = "html5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c" +dependencies = [ + "atomic-waker", + "bytes", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" +dependencies = [ + "base64 0.23.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4200d433cbd5178df7797c9c2e75b348b728e39631cf14520d1e2fc424201f4" +dependencies = [ + "cfb", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jiff" +version = "0.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b005715dcbeb0089a3c0dab99f2ff1cc3b2525323552703d648585d342a383" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link", +] + +[[package]] +name = "jiff-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c" +dependencies = [ + "defmt", + "log", +] + +[[package]] +name = "jiff-static" +version = "0.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cc9817253cf7c7ee4684451bd327e88d6f3658014e54a29198625590650695c" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa8377070c6bae868759445e5a77f66d84f0b72f3a054bfb00e6d038b8282da7" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "js-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7421438de105a0827e44fadd05377727847d717c80ce29a229f85fd04c427b72" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 2.0.21", +] + +[[package]] +name = "jsonptr" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5a3cc660ba5d72bce0b3bb295bf20847ccbb40fd423f3f05b61273672e561fe" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" +dependencies = [ + "bitflags 2.13.2", + "serde", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "lopdf" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fa2559e99ba0f26a12458aabc754432c805bbb8cba516c427825a997af1fb7" +dependencies = [ + "aes", + "bitflags 2.13.2", + "cbc", + "ecb", + "encoding_rs", + "flate2", + "indexmap 2.14.2", + "itoa", + "log", + "md-5", + "nom 8.0.0", + "nom_locate", + "rand", + "rangemap", + "sha2", + "stringprep", + "thiserror 2.0.21", + "weezl", +] + +[[package]] +name = "macro_rules_attribute" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3ae8f6d608c795738406608304d30a2dfbdc8e58e44f7ba43236da5208ded3c" +dependencies = [ + "macro_rules_attribute-proc_macro", + "pastey", +] + +[[package]] +name = "macro_rules_attribute-proc_macro" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc04a4c58212d57930a24bf47d3fa87485264a3a054e9c10e042eb373573ad3c" + +[[package]] +name = "markup5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memmap2" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" +dependencies = [ + "libc", + "stable_deref_trait", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "monostate" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3341a273f6c9d5bef1908f17b7267bbab0e95c9bf69a0d4dcf8e9e1b2c76ef67" +dependencies = [ + "monostate-impl", + "serde", + "serde_core", +] + +[[package]] +name = "monostate-impl" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4db6d5580af57bf992f59068d4ea26fd518574ff48d7639b255a36f9de6e7e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "muda" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cca139e57da4383727f189e43e66e84fa372347027fc996f9f1a007ec0a37996" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.21", + "windows-sys 0.61.2", +] + +[[package]] +name = "multiversion_no_op" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.2", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom_locate" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b3575c68438d" +dependencies = [ + "bytecount", + "memchr", + "nom 8.0.0", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "bytemuck", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "objc2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08849bbd4767dfae9457696856ae1c84fe4e0281bbe4a7abff2d0e06fb7981f8" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.2", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.2", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.2", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "onig" +version = "6.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc3cbf698f9438986c11a880c90a6d04b9de27575afd28bbf45b154b6c709e2" +dependencies = [ + "bitflags 2.13.2", + "libc", + "once_cell", + "onig_sys", +] + +[[package]] +name = "onig_sys" +version = "69.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e68317604e77e53b85896388e1a803c1d21b74c899ec9e5e1112db90735edd7" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "open" +version = "5.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa576c76302b7b808eecc68061e67336c47833ef9d22caa74dda10fa9675eebc" +dependencies = [ + "dunce", + "is-wsl", + "libc", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + +[[package]] +name = "pdf-extract" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2f44c6c642e359e2fe7f662bf5438db3811b6b4be60afc6de04b619ce51e1a" +dependencies = [ + "adobe-cmap-parser", + "cff-parser", + "encoding_rs", + "euclid", + "log", + "lopdf", + "postscript", + "type1-encoding-parser", + "unicode-normalization", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plist" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896bade328c13f7042a297ea5ac5b0951f6cf989dea5f32c2fd98da398195cb" +dependencies = [ + "base64 0.23.1", + "indexmap 2.14.2", + "quick-xml 0.42.0", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "pom" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60f6ce597ecdcc9a098e7fddacb1065093a3d66446fa16c675e7e71d1b5c28e6" + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "postscript" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78451badbdaebaf17f053fd9152b3ffb33b516104eacb45e7864aaa9c712f306" + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.17+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pulp" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", + "reborrow", + "version_check", +] + +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_distr" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "rangemap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a611d15b50743feb4c76b7d03edcb0e64f399c26961e4efe6975bc398be6aa3d" + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-cond" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2964d0cf57a3e7a06e8183d14a8b527195c706b7983549cd5462d5aa3747438f" +dependencies = [ + "either", + "itertools", + "rayon", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "redox_users" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" +dependencies = [ + "libredox", + "thiserror 2.0.21", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16a1cfa75cc186dd73d5818e510e042e40927bccc9c236b061cea97e1eb08029" +dependencies = [ + "base64 0.23.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rfd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" +dependencies = [ + "block2", + "dispatch2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.60.2", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rust_xlsxwriter" +version = "0.79.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c743cb9f2a4524676020e26ee5f298445a82d882b09956811b1e78ca7e42b440" +dependencies = [ + "zip 2.6.1", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +dependencies = [ + "bitflags 2.13.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "safetensors" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79b079b829cb27a1c3c374341345ed2e8b2c0c839034522cee576c140bd7f846" +dependencies = [ + "hashbrown 0.16.1", + "libc", + "serde", + "serde_json", + "tempfile", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab508826f74a77ca9d5aba6ff19b522583ee3eaf28a19384ff3d0e5835fadf6e" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.119", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d" +dependencies = [ + "bitflags 2.13.2", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "foldhash", + "indexmap 2.14.2", + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_plain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7523beb55eece201a2356bee0bbca0d1ab466c14c07703b2e0ee6d42cb0c2c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9adc193c780ef8f159aee8b61e2d5801aaa555e6eb0947fe45530ec506296f" +dependencies = [ + "base64 0.23.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.2", + "jiff", + "schemars 0.9.0", + "schemars 1.2.3", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17bbc68e28663bbbb90df47e058aa7eda4fb445b89fe70457bb94fbccf6e49" +dependencies = [ + "darling 0.24.1", + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.14.2", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b3dc8af474f516a851ff4bd12db780f948b9250ad37211e4eec0bccea54e01b" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "spm_precompiled" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851699c4033c63636f7ea4cf7b7c1f1bf06d0cc03cfb42e711de5a5c46cf326" +dependencies = [ + "base64 0.13.1", + "nom 7.1.3", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "static_vcruntime" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7589a1859b09232522bb9edf076ca7fcf14ded96685d3fa629db73023ffbb7" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefd87076fd385308ee4aff597256c902f1fbb4d031de1558efc12f8ffefadd9" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "sysctl" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" +dependencies = [ + "bitflags 2.13.2", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.37.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37f381f4e048e6cdf038b5705f8cf14ad108279d46eb968140a7b291aba9400" +dependencies = [ + "bitflags 2.13.2", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f316751027fc2644221d1a448564d519efb07067fda584879d9cda966391d212" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.21", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "641dd5fd297c99ab92717b0428cca5b9c6f960b2ac96ca131b3eebc9d70b8ddc" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "static_vcruntime", + "strsim", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6585c5b536c00f039d12ce70a9755172d5423bbcfd3969863baa70314c3e02f" +dependencies = [ + "base64 0.23.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.18.1", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.119", + "tauri-utils", + "thiserror 2.0.21", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e83a0cfa1bae376e8fbbdc0b1692707aed50cd6072ce85cae4789af5d6c19f" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67fb21a77e8f94e8beb3325e583102488659365af0a3948b7ea244c5b779c291" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "walkdir", +] + +[[package]] +name = "tauri-plugin-dialog" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7461aaacf1901915ea7b9f5cd74f8224a351ed96af0a62c07fce934003cb34b" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.21", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d58eb1d4984e535f47a642ffec09a2da6f5c18a12b5902d12126cb7626d628b" +dependencies = [ + "anyhow", + "dunce", + "glob", + "log", + "objc2-foundation", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.21", + "toml 1.1.8+spec-1.1.0", + "url", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53810be1b4fed22bb6ac3f4cab5a2b80d9391d1af436bda145607532bc0bb219" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.21", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c55766d99cea69055904d1735b93c2049302b2e09effd462120deb5581d78e9" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.21", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d61892587aea2a85245bcaec98c6fe46268874c0a0deae5535fb71ca7b93eae" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "362ab21cd4cc713f2a02b1a9b5688198b1541cfb6907c4281e9190e0f0ef4aa3" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.21", + "toml 1.1.8+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.8+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" +dependencies = [ + "new_debug_unreachable", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" + +[[package]] +name = "tokenizers" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b238e22d44a15349529690fb07bd645cf58149a1b1e44d6cb5bd1641ff1a6223" +dependencies = [ + "ahash", + "aho-corasick", + "compact_str", + "dary_heap", + "derive_builder", + "esaxx-rs", + "getrandom 0.3.4", + "itertools", + "log", + "macro_rules_attribute", + "monostate", + "onig", + "paste", + "rand", + "rayon", + "rayon-cond", + "regex", + "regex-syntax", + "serde", + "serde_json", + "spm_precompiled", + "thiserror 2.0.21", + "unicode-normalization-alignments", + "unicode-segmentation", + "unicode_categories", +] + +[[package]] +name = "tokenizers" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7afbf6e88718afcc138bad01d6ccc3051dbbc3b2ce9793d8b8a3aeb610969cfc" +dependencies = [ + "ahash", + "compact_str", + "daachorse", + "dary_heap", + "derive_builder", + "esaxx-rs", + "getrandom 0.3.4", + "itertools", + "log", + "macro_rules_attribute", + "monostate", + "onig", + "paste", + "rand", + "rayon", + "rayon-cond", + "regex", + "regex-syntax", + "serde", + "serde_json", + "spm_precompiled", + "thiserror 2.0.21", + "unicode-normalization-alignments", + "unicode-segmentation", + "unicode_categories", +] + +[[package]] +name = "tokio" +version = "1.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce3335fa71841cda333a58d7615b03901380ecf09d59b3296d21f8bbac0dde4e" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "1.1.8+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20489e00e4d8741d6be680764cc12e270655e375a20d1011e844a9c3379e678d" +dependencies = [ + "indexmap 2.14.2", + "serde_core", + "serde_spanned 1.1.2", + "toml_datetime 1.1.2+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.2", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.2", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.17+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3641d5bbb5349a79e1020a242d251efbc546ad8048d133958323ce9c40a9c9c" +dependencies = [ + "indexmap 2.14.2", + "toml_datetime 1.1.2+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06bdbd8cfc056b8d2e2e85f29b56a3bdbecb527cef81eb39e3e7b98af4652770" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.2", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b9c52859a94554803ccd4a24b98f74148ebc73b90676d783f3490b1bff9d72" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.21", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "type1-encoding-parser" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa10c302f5a53b7ad27fd42a3996e23d096ba39b5b8dd6d9e683a05b01bee749" +dependencies = [ + "pom", +] + +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "unicode-normalization" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75cd3fb03d5288b3ba9a1ee103ac7e9cbb59f0b03d64f8ddfcc04dd42758a85d" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-normalization-alignments" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f613e4fa046e69818dd287fdc4bc78175ff20331479dab6e1b0f98d57062de" +dependencies = [ + "smallvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64 0.22.1", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "url", + "webpki-roots 0.26.11", +] + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df16f50ef4cc145211879a3867ba757076b25dfee812040dcb0658bd9ae7904b" +dependencies = [ + "icu_properties", + "regex", + "serde", + "url", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cc1186384beb7dd8eedea376413fd654937285ea6c9cfbb928dc3043ea4b606" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "sha1_smol", + "wasm-bindgen", +] + +[[package]] +name = "verimodel-assistant" +version = "1.0.0" +dependencies = [ + "candle-core", + "candle-transformers", + "hex", + "log", + "pdf-extract", + "quick-xml 0.37.5", + "regex", + "serde", + "serde_json", + "serde_yaml", + "sha2", + "tempfile", + "thiserror 2.0.21", + "tokenizers 0.23.2", + "ureq", + "verimodel-core", + "zip 2.6.1", +] + +[[package]] +name = "verimodel-cli" +version = "1.0.0" +dependencies = [ + "anyhow", + "clap", + "env_logger", + "log", + "serde_json", + "tempfile", + "verimodel-assistant", + "verimodel-core", + "verimodel-ifc-reader", +] + +[[package]] +name = "verimodel-core" +version = "1.0.0" +dependencies = [ + "chrono", + "csv", + "hex", + "html-escape", + "indexmap 2.14.2", + "log", + "quick-xml 0.37.5", + "regex", + "rust_xlsxwriter", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_yaml", + "sha2", + "tempfile", + "thiserror 2.0.21", + "uuid", + "zip 2.6.1", +] + +[[package]] +name = "verimodel-desktop" +version = "1.0.0" +dependencies = [ + "chrono", + "log", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-dialog", + "tauri-plugin-opener", + "tempfile", + "verimodel-assistant", + "verimodel-core", + "verimodel-ifc-reader", +] + +[[package]] +name = "verimodel-ifc-reader" +version = "1.0.0" +dependencies = [ + "log", + "serde", + "serde_json", + "tempfile", + "thiserror 2.0.21", + "verimodel-core", +] + +[[package]] +name = "verimodel-tests" +version = "1.0.0" +dependencies = [ + "serde_json", + "tempfile", + "verimodel-core", + "verimodel-ifc-reader", + "zip 2.6.1", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" +dependencies = [ + "js-sys", + "tokio", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.9", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8b815c1b593dc0baf78dd0f4fc8fdb2de53198fb1163738093e9a311c33fb3" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.9", +] + +[[package]] +name = "webpki-roots" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webview2-com" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f89fca7a704cee10dcb3654c1dbb8941d1783132f1917358af75bec37a7d7e6" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "webview2-com-sys" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a07132775117d6065853d9d1178157b8c90e228de47129d6bce2c7edebedfb" +dependencies = [ + "thiserror 2.0.21", + "windows", + "windows-core", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111e51caca442cafd9bab396628ac4d814880eaea4e63dfd76a12e9f342b5580" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "windows-sys 0.61.2", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d6f32a0ff4a9f6f01231eb2059cc85479330739333e0e58cadf03b6af2cca10" +dependencies = [ + "cfg-if", + "windows-sys 0.61.2", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "wry" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a819957a01b3119af85e638a38d242af76dbc87d130dca67bfd0441072e21ff0" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.21", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.4", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 3.0.9", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812a12be4ead7a59e18ea8f047d08add0066b73bc62fc1467066a2472ae088dd" +dependencies = [ + "serde", + "winnow 1.0.4", + "zvariant", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + +[[package]] +name = "zerocopy" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879" + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "zip" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "flate2", + "indexmap 2.14.2", + "memchr", + "zopfli", +] + +[[package]] +name = "zip" +version = "8.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" +dependencies = [ + "crc32fast", + "indexmap 2.14.2", + "memchr", + "typed-path", +] + +[[package]] +name = "zlib-rs" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zopfli" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf7fc5d30c28483d93805c4a5e12b05bbb52407fa67c5f8bd552374cd01fb11" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zvariant" +version = "5.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80bf6d6cd6a4b601acb64cfb8284cdc643fcfa75ef26ae3c46ec8aa4e8a1fbb7" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 1.0.4", + "zcheapstr", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2672456ba1cb54b5eaec136e63135b3c7495fb938e53b28a62e633496d486d" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 3.0.9", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 3.0.9", + "winnow 1.0.4", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..f6cb2df --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,38 @@ +[workspace] +resolver = "2" +members = ["crates/core", "crates/ifc_reader", "crates/assistant", "crates/cli", "src-tauri", "tests"] + +[workspace.package] +version = "1.0.0" +edition = "2021" +license = "PolyForm-Noncommercial-1.0.0" +authors = ["VeriModel contributors"] +repository = "https://github.com/grohle/verimodel" + +[workspace.dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = { version = "1", features = ["preserve_order"] } +serde_yaml = "0.9" +schemars = "0.8" +thiserror = "2" +anyhow = "1" +regex = "1" +sha2 = "0.10" +hex = "0.4" +chrono = { version = "0.4", default-features = false, features = ["clock", "std", "serde"] } +csv = "1" +zip = { version = "2", default-features = false, features = ["deflate"] } +quick-xml = { version = "0.37", features = ["serialize"] } +rust_xlsxwriter = "0.79" +uuid = { version = "1", features = ["v4", "v5"] } +indexmap = { version = "2", features = ["serde"] } +clap = { version = "4", features = ["derive"] } +tempfile = "3" +log = "0.4" +env_logger = "0.11" +html-escape = "0.2" + +[profile.release] +lto = "thin" +codegen-units = 1 +strip = true diff --git a/LICENSE b/LICENSE index 206e5c8..5fe3d55 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,75 @@ -MIT License - -Copyright (c) 2026 Alberto Miranda - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Required Notice: Copyright 2026 Grohle (https://github.com/Grohle/VeriModel) + +# PolyForm Noncommercial License 1.0.0 + + + +## Acceptance + +In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses. + +## Copyright License + +The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license). + +## Distribution License + +The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license). + +## Notices + +You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example: + +> Required Notice: Copyright Yoyodyne, Inc. (http://example.com) + +## Changes and New Works License + +The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose. + +## Patent License + +The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software. + +## Noncommercial Purposes + +Any noncommercial purpose is a permitted purpose. + +## Personal Uses + +Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose. + +## Noncommercial Organizations + +Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding. + +## Fair Use + +You may have "fair use" rights for the software under the law. These terms do not limit them. + +## No Other Rights + +These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses. + +## Patent Defense + +If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company. + +## Violations + +The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately. + +## No Liability + +***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.*** + +## Definitions + +The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms. + +**You** refers to the individual or entity agreeing to these terms. + +**Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect. + +**Your licenses** are all the licenses granted to you for the software under these terms. + +**Use** means anything you do with the software requiring one of your licenses. diff --git a/README.md b/README.md index d134f9e..28864a8 100644 --- a/README.md +++ b/README.md @@ -2,102 +2,365 @@ > **Your model does not pass unless it proves it passes.** -VeriModel is a local-first desktop app: **IFC QA Gate + Quantity Takeoff (QTO) + BCF Export**. +VeriModel is a local-first desktop application and CLI: **IFC QA Gate + Quantity Takeoff (QTO) + BCF Export**. + +It takes **any** IFC model from **any** BIM project and answers, with proof: + +1. **Is this model compliant** with the project's requirements (buildingSMART IDS + a configurable rule pack)? +2. **How much is in it** (quantities, optionally priced with your own unit rates)? +3. **What is wrong, exactly where**, in a format a coordinator can open in any BCF tool? + +Not a bot that clicks. Not a flow builder. A quality gate a model must cross with evidence: deterministic checks, a run ledger with SHA-256 hashes, and outputs that are byte-for-byte reproducible. + +![VeriModel architecture](docs/screenshots/architecture.png) + +## Contents + +- [Why VeriModel](#why-verimodel) +- [Quickstart](#quickstart) +- [UI walkthrough (3 steps)](#ui-walkthrough-3-steps) +- [CLI](#cli) +- [Outputs of a run](#outputs-of-a-run) +- [Configuration (`project.yaml`)](#configuration-projectyaml) +- [Rules and rule packs](#rules-and-rule-packs) +- [IDS](#ids) +- [Quantity takeoff](#quantity-takeoff) +- [BCF export](#bcf-export) +- [Architecture: why hybrid Rust + IfcOpenShell](#architecture-why-hybrid-rust--ifcopenshell) +- [Demo script](#demo-script) +- [Tests](#tests) +- [Assumptions](#assumptions) +- [Limitations](#limitations) +- [License](#license) +- [Dependencies and licenses](#dependencies-and-licenses) -It takes ANY IFC model from ANY BIM project and answers, with proof: +## Why VeriModel -1. Is this model compliant with the project's requirements? -2. How much is in it (quantities)? -3. What is wrong, exactly where, in a format a coordinator can open in any BCF tool? +- **Verifiable, not vibes.** Every number has evidence one click away. Deterministic code decides pass/fail; no LLM is involved in any verdict. +- **Generic by design.** Any building or infrastructure type, any discipline, IFC2x3 / IFC4 / IFC4.3 (auto-detected), any units (read from the file, converted to SI internally), any classification system, any naming convention. Everything project-specific lives in `project.yaml` and `.ids`, never in Rust code. There is no `if project == X`, no hardcoded list of element types, property names or storey names. +- **Pluggable rules.** A rule is data: `{id, description, scope, check, severity, fix_hint}` in YAML. New rules are added by adding a YAML entry, not by editing the engine. +- **Local-first.** No accounts, no cloud, no telemetry, no CDN at run time. All data stays on the machine. +- **Standards-based.** IFC, buildingSMART IDS 1.0, BCF 2.1 and 3.0 (validated against the official XSDs). +- **Source-available.** PolyForm Noncommercial 1.0.0: free for any noncommercial purpose; commercial licences on request (see [License](#license)). -Not a bot that clicks. Not a flow builder. A quality gate a model must cross with evidence: audit trail, policy / IDS gate, deterministic checks, reproducible outputs. +## Quickstart -## Status +### Prerequisites -Scaffold only (README + LICENSE + .gitignore + directory layout). No engine yet. +| Need | Why | Install | +|---|---|---| +| Rust 1.80+ | engine, CLI, desktop shell | | +| Python 3.9+ with `ifcopenshell` and `ifctester` | the IFC reader bridge (parsing, geometry, IDS) | `pip install ifcopenshell ifctester` | +| Tauri v2 system deps (Linux only) | desktop app | `libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf` | +| `cargo tauri` CLI (only to build the desktop app) | bundling | `cargo install tauri-cli --version "^2" --locked` | -## Why VeriModel +`verimodel doctor` tells you whether Python and IfcOpenShell are found. Set `VERIMODEL_PYTHON=/path/to/python` to point at a specific interpreter. -- **Verifiable, not vibes:** every number has evidence one click away. Deterministic code decides pass/fail, never an LLM. -- **Generic by design:** any building / infrastructure type, any discipline, any IFC schema (IFC2x3, IFC4, IFC4.3), any units, any classification system, any language. All project-specific values come from `project.yaml` + `.ids`, never from hardcoded lists in code. -- **Local-first:** no accounts, no cloud, no telemetry. All data stays on the machine. -- **Standards-based:** IFC + buildingSMART IDS (Information Delivery Specification) + BCF (BIM Collaboration Format). +### CLI + +```bash +cargo build --release -p verimodel-cli +./target/release/verimodel check \ + --ifc tests/fixtures/bsi_ifc4_building_structural.ifc \ + --ids examples/sample.ids \ + --config examples/residential/project.yaml \ + --out ./out +``` -## Planned architecture +Exit code `0` = PASS / PASS WITH WARNINGS, `1` = FAIL, `2` = bad input, `3` = feature not implemented (clash). -Rust engine + HTML interface via **Tauri v2**. +### Desktop app (development) +```bash +cargo tauri dev # opens the VeriModel window with the static frontend ``` -verimodel/ - crates/ - core/ # Pure Rust: rule engine, QTO aggregation, BCF writer, audit, report, config - ifc_reader/ # IFC reading bridge: calls IfcOpenShell for parsing + geometry + IDS, returns facts to core - cli/ # Rust CLI, shares crates/core with the desktop app - src-tauri/ # Tauri v2 app: exposes core via Tauri commands, file dialogs, bundling - frontend/ # HTML/CSS/JS UI — presentation only, no business logic - examples/ # 3 example project.yaml + sample IDS + sample rates.csv for 3 different project types - tests/ # Rust integration tests + fixtures + +### Desktop app (installers) + +```bash +cargo tauri build # Windows .msi + .exe (NSIS), macOS .dmg, Linux .AppImage + .deb ``` -Division of responsibilities: +One version number (`Cargo.toml` → workspace `version`) is used by the CLI, the app and every installer. + +## UI walkthrough (3 steps) + +The UI is a stepper: **1 Load → 2 Review → 3 Export**. One primary action per screen; every term has a tooltip; errors are plain language with a hint, never a stack trace (those go to the log file). + +### 1 · Load + +Drop an IFC (plus optional IDS and `project.yaml`), click **Load the demo** (a two-storey pavilion with five deliberate defects, its settings and an IDS, the fastest way to see the tool work), or try one of the three bundled buildingSMART samples. The file card shows the name, SHA-256, schema, size, element count, units, disciplines and storeys. "Project settings" (collapsed by default) edits the rule pack, tolerances, classification, QTO grouping and currency and writes a reusable `project.yaml`. Defaults work with zero configuration. + +![Step 1 — Load](docs/screenshots/step1-load.png) + +### 2 · Review + +Score (0–100), verdict badge (PASS / PASS WITH WARNINGS / FAIL), counts and run time. Tabs: **Checks** (per-rule pass/fail/skipped with reason), **Failures** (one row per element per rule, with expected vs actual and a fix hint; click a row for the element's properties and quantities), **Quantities**, **IDS**, **Clash**. Filters by severity, rule, storey, type, and search by GlobalId or name. Pagination keeps large failure lists fast. + +![Step 2 — Review](docs/screenshots/step2-review.png) + +![Step 2 — Element detail](docs/screenshots/step2-detail.png) -- **Rust `core` does ALL deterministic logic:** rule engine, QTO, BCF, audit ledger, report, config validation. -- **`ifc_reader` does ONLY IFC reading:** it returns facts, `core` decides pass/fail. -- **Frontend does ONLY presentation:** file pickers, forms, tables, filters, downloads. +### 3 · Export -Why hybrid: there is no mature pure-Rust equivalent to IfcOpenShell for geometry + IDS + quantities today. Using IfcOpenShell as the reader and Rust as the brain gives a real Rust engine without reinventing the geometry kernel. +One list of downloads with plain descriptions, plus the run history with a diff against the previous run of the same file ("12 fewer errors than last run"). -## Planned UI — 3 steps +![Step 3 — Export](docs/screenshots/step3-export.png) -1. **Load** — drag & drop IFC + optional IDS + `project.yaml`. File card: schema, element count, units, disciplines, hash. -2. **Review** — overall score + verdict (PASS / PASS WITH WARNINGS / FAIL), per-rule pass/fail, filterable failures (severity / rule / storey / type), QTO tables, element detail on click. -3. **Export** — `report.html`, `failures.csv`, `qto.csv` + `qto.xlsx`, `issues.bcfzip`, `run.json`, `project.yaml`. Plus run history with diff vs previous run. +Dark theme, Spanish UI, and imperial display units are toggles in the top bar; all three persist. -Design: intuitive, one primary action per screen, evidence first, dark + light themes, EN/ES, metric/imperial. +![Dark theme](docs/screenshots/step2-dark.png) -## Planned outputs (per run) +### Assistant (optional) -- `report.html` — human-readable summary + per-rule table + QTO + failure list -- `report.json` — machine-readable, same data -- `failures.csv` — one row per element per rule -- `qto.csv` + `qto.xlsx` — quantities (+ cost if rates provided) -- `issues.bcfzip` — BCF 2.1/3.0, opens in any free BCF viewer -- `run.json` — run ledger: input SHA256, IDS SHA256, config SHA256, version, duration, counts, scores -- `audit.log` — append-only log +The **Assistant** button in the header opens a side panel (Escape closes it) with a small language model that runs on your computer. It is optional: the model is not bundled, you download it once from the panel (about 0.5 GB from Hugging Face), and nothing about your model leaves the machine. It helps you: -Determinism: same IFC + same IDS + same config = same `report.json` / `failures.csv` / `qto.csv` byte-for-byte (except timestamps in `run.json`). +- **find** things ("show the errors on Level 1" proposes a filter you apply with one button; values that are not in the report are dropped and listed), +- **understand** a failure ("Explain with assistant" in the element detail), +- **configure** (it drafts a `project.yaml` fragment, marked Valid or Invalid by the real config parser; "Use in settings" only works when it is valid), +- and **look things up** in the built-in docs, the current report and your own documentation (**Import documentation…** accepts .md, .txt, .yaml, .json, .docx and .pdf; "Save knowledge.yaml" keeps the converted text). -## Planned CLI +It is a read-only copilot: verdicts, scores and quantities are computed by the engine and never come from the assistant, and nothing changes until you press a button. +![Assistant panel](docs/screenshots/assistant.png) + +## CLI + +```text +verimodel check --ifc model.ifc [--ids spec.ids] [--config project.yaml] [--out ./out] [--no-geometry] [--json] +verimodel qto --ifc model.ifc [--config project.yaml] [--out ./out] +verimodel clash --ifc-a a.ifc --ifc-b b.ifc [--config project.yaml] [--out ./out] # phase 2: explicit "not implemented" +verimodel validate-config --config project.yaml [--schema] +verimodel inspect --ifc model.ifc +verimodel doctor +verimodel ask --question "What does rule CL-001 check?" [--report out/report.json] [--app-data DIR] +verimodel assistant status [--app-data DIR] +verimodel assistant download [--app-data DIR] +verimodel docs-to-yaml --in docs/ bep.docx naming.pdf --out knowledge.yaml ``` -verimodel check --ifc model.ifc --ids spec.ids --config project.yaml --out ./out -verimodel qto --ifc model.ifc --config project.yaml --out ./out -verimodel clash --ifc-a model_a.ifc --ifc-b model_b.ifc --config project.yaml --out ./out -verimodel validate-config --config project.yaml + +The CLI and the desktop app call the same `verimodel-core` functions; there is one implementation of every check, quantity and writer. + +### Assistant commands + +The optional local assistant (see "Assistant" above) is also available headless. The model lives in `/assistant/`; by default `` is the desktop app's data folder (`~/.local/share/io.verimodel.desktop` on Linux, `~/Library/Application Support/io.verimodel.desktop` on macOS, `%APPDATA%\io.verimodel.desktop` on Windows), so the CLI and the app share one download. Set `VERIMODEL_APP_DATA` or pass `--app-data` to use another folder. + +- `verimodel assistant status` shows whether the model is installed, its size, license and memory need. +- `verimodel assistant download` downloads it once (progress on stderr). +- `verimodel ask --question "..."` answers from the built-in docs; add `--report out/report.json` to ask about a run. If the model is not installed it prints a plain-language hint and exits with code 2. +- `verimodel docs-to-yaml --in --out knowledge.yaml` converts documentation to the assistant's knowledge format (no model needed) and prints the files read, the files skipped and the chunk count. + +The assistant only prints text. It never changes a verdict, a score or a quantity. + +## Outputs of a run + +Every run writes an `out/` folder: + +| File | What it is | Deterministic | +|---|---|---| +| `report.html` | Human-readable report: summary, per-rule table, failures, quantities, IDS, clash | yes | +| `report.json` | The same data, machine-readable | yes | +| `failures.csv` | One row per element per rule | yes | +| `qto.csv`, `qto.xlsx`, `qto.json` | Quantities per group, totals, cost, hand-check samples | yes | +| `issues.bcfzip` | BCF 2.1 (or 3.0) issues, one topic per ERROR/WARNING | yes, except creation dates | +| `issues.csv` | The same issues for Excel | yes | +| `project.yaml` | The exact configuration used | yes | +| `run.json` | Run ledger: input SHA-256s, tool version, timestamp, duration, counts, score, SHA-256 of `report.json` | carries the timestamp | +| `audit.log` | Append-only trail of what ran | carries timestamps | + +Same IFC + same IDS + same config ⇒ identical `report.json`, `failures.csv`, `qto.*`, `report.html` and `issues.csv`, byte for byte. This is enforced by a test. + +## Configuration (`project.yaml`) + +Everything project-specific. Every field has a default; unknown keys are rejected so a typo can never silently disable a check. Full reference: [docs/CONFIG.md](docs/CONFIG.md). Three complete examples for different project types live in [`examples/`](examples/README.md). + +```yaml +project: + name: "Generic Project" + language: en # en | es + units: auto # auto | metric | imperial (display only; the engine works in SI) + classification_system: Uniclass + ifc_versions: [IFC2X3, IFC4, IFC4X3] +requirements: + ids_file: spec.ids # optional, source of truth when given + rule_pack: generic # or a path to a custom rule pack YAML + required_psets: # each entry generates rules, no code involved + - pset: Pset_WallCommon + applies_to: [IfcWall] + properties: [FireRating, IsExternal] +tolerances: + far_from_origin_m: 10000 + geometry: { min_volume_m3: 0.000001, min_area_m2: 0.000001, max_extent_m: 5000 } +qto: + group_by: [type, storey] # type | storey | classification | material | predefined_type | type_name + unit_rates_file: rates.csv # optional cost estimate + currency: EUR +classification: + required: false + code_pattern: '^[A-Z][a-z]_[0-9]{2}(_[0-9]{2}){0,3}$' +naming: + patterns: { IfcWall: '^W-[0-9]{3}$' } +checks: + rules: { ID-003: false } # toggle any rule + categories: { naming: false } # or a whole category +clash: + enabled: false # phase 2 +output: + language: en + bcf_version: "2.1" # or "3.0" ``` -CLI and desktop app share the same Rust core — never two implementations. +`verimodel validate-config --config project.yaml --schema` prints the JSON schema. + +## Rules and rule packs + +The built-in generic pack is a data file: [`crates/core/rule_packs/generic.yaml`](crates/core/rule_packs/generic.yaml). It covers the seven check categories: + +| Category | Rules | Examples | +|---|---|---| +| A · Identity | ID-001..003 | duplicate GlobalId, invalid GlobalId, duplicate names within type + storey | +| B · Spatial | SP-001..004 | element not in any storey, container missing from hierarchy, site/building/storey (or facility/part) missing, far from origin | +| C · IDS | IDS-ss-rr | generated from the IDS file, requirement quoted | +| D · Properties | PR-001 + CFG-PSET-* | empty values, required psets/properties from `project.yaml` | +| E · Geometry | GEO-001..003 | no representation, degenerate shape, bounding box beyond project bounds | +| F · Classification & naming | CL-001..002, NAM-001 | missing classification, code outside the configured list/pattern, name pattern | +| G · Sanity | QT-001..002, SCH-001 | zero volume / area where a quantity is reported, schema accepted by the project | + +A rule looks like this; `$config.` pulls a value from `project.yaml`: + +```yaml +- id: SP-004 + category: spatial + description: Elements must not be far from the project origin + severity: warning + scope: { ifc_types: [IfcElement] } + check: { kind: distance_from_origin, max_m: "$config.tolerances.far_from_origin_m" } + fix_hint: Move the model close to the origin or set the shared coordinates correctly. +``` + +To add a custom rule: copy `generic.yaml`, add an entry using any of the 20 check kinds (`unique_global_id`, `property_exists`, `property_matches`, `classification_exists`, `name_matches`, `quantity_positive`, `types_present`, …), and point `requirements.rule_pack` at your file. The engine code does not change. Scopes use IFC supertypes (`IfcElement`, `IfcDistributionElement`) so they work in every schema. Every check kind, its parameters and the score formula are documented in [docs/RULES.md](docs/RULES.md). + +A check that cannot run (for example geometry when the kernel is unavailable) is reported as **SKIPPED with a reason**, never as PASS. + +**Verdict and score.** FAIL = at least one ERROR. PASS WITH WARNINGS = no errors, at least one WARNING. PASS = neither. Score = 100 × (1 − (errors + 0.25 × warnings) / element checks), where "element checks" is the number of (element, rule) pairs evaluated. The UI and the report show this sentence verbatim. + +## IDS + +Give VeriModel an `.ids` file (buildingSMART Information Delivery Specification 1.0) and it becomes the source of truth: every specification/requirement pair becomes a rule `IDS-ss-rr`, every failing entity a finding whose *expected* column quotes the requirement text verbatim ("FireRating data shall be provided in the dataset Pset_WallCommon"). The IDS engine is IfcTester (part of the IfcOpenShell project); VeriModel reads its facts and decides. A minimal IDS and a walkthrough of how to write one are in [docs/IDS.md](docs/IDS.md) and [`examples/sample.ids`](examples/sample.ids). + +## Quantity takeoff -## Roadmap +- Quantities come from `IfcElementQuantity` / base quantities when present (`NetVolume`, `GrossVolume`, `NetArea`, `Length`, …), converted to SI using the file's `IfcUnitAssignment`. +- Fallback: volume, area and length are computed from the tessellated geometry by IfcOpenShell. **Every row records how many values came from each source**, and the report explains the method in plain language. +- Grouping is configurable (`qto.group_by`): type, storey, classification, material, predefined type, type name, or any combination. +- Cost: `rates.csv` (`code, description, unit, rate, currency, match_type, match_storey, match_classification`) prices each group; the rate code and source file are shown per row so the estimate is auditable. +- Reconciliation: the report lists five sample elements with GlobalId, type, quantity and calculation method for a hand check. The end-to-end tests reconcile the broken fixture against hand-computed volumes (5 m × 3 m × 0.2 m = 3.0 m³, …). -- v0.1: scaffold + core rule engine + one end-to-end check (duplicate GlobalId) + one QTO table + HTML report on a sample IFC -- v0.2: full generic check categories + IDS + BCF + 3-step UI -- v0.3: clash (phase 2), revision diff, run history +## BCF export + +One `.bcfzip` per run with one topic per ERROR and WARNING: title, description (rule, element, expected vs actual, fix hint), status, priority, author, creation date, labels, the element's GlobalId as a viewpoint component and a perspective camera framing its bounding box. BCF 2.1 by default, BCF 3.0 with `output.bcf_version: "3.0"`. Topic GUIDs are UUID v5 of the input hash + rule + element, so re-runs produce the same topics. The writer is validated against the official BCF-XML XSDs (2.1 and 3.0) and opened with the open-source `bcf-client` library used by Bonsai; a BCF 2.1 file produced here opens in Bonsai (Blender), BIMcollab Zoom and Solibri, which all read BCF 2.1. + +## Architecture: why hybrid Rust + IfcOpenShell + +``` +verimodel/ + crates/core/ PURE Rust: rule engine, QTO, BCF, report, audit, config. No IFC dependency. + crates/ifc_reader/ The ONLY crate that touches IFC: drives IfcOpenShell (Python) and returns facts. + crates/cli/ `verimodel` binary, shares core with the desktop app. + src-tauri/ Tauri v2 shell: commands, file dialogs, bundling. + frontend/ Static HTML/CSS/JS, presentation only. + examples/ Three project.yaml for different project types, sample IDS, rates.csv. + tests/ End-to-end tests + fixtures (public buildingSMART samples + a broken IFC). +``` + +**Division of responsibilities.** `core` makes every decision and is unit-tested with synthetic models. `ifc_reader` only reads: it streams NDJSON facts (header, units, spatial tree, elements with psets/quantities/classification/materials, geometry metrics, IDS results) from an embedded Python extractor and converts them into `core::Model`. The frontend only presents. + +**Why not pure Rust?** There is no mature pure-Rust equivalent of IfcOpenShell for geometry, IDS and quantities across IFC2x3/IFC4/IFC4.3. Rewriting fifteen years of geometry kernel would take months and be less correct. Using IfcOpenShell as the reader and Rust as the brain gives a real Rust engine without reinventing the kernel. The bridge is a subprocess rather than an embedded interpreter so the binaries stay plain Rust and installers do not depend on a specific Python build; the only runtime requirement is a Python with `ifcopenshell` (+ `ifctester`). + +**Why vanilla HTML/JS?** No build step, no bundler fragility, no CDN, fully auditable static files that Tauri serves as-is; the UI contains no business logic, so a framework buys little. + +**The assistant: Rust-native, read-only by construction.** The optional copilot lives in `crates/assistant` and runs a small quantized GGUF model (default Qwen2.5-0.5B-Instruct, Q4_K_M, about 0.5 GB, Apache-2.0) with [Candle](https://github.com/huggingface/candle), Hugging Face's pure-Rust ML framework: no Python, no C++ toolchain, no GPU required, one binary. Guardrails are architectural, not prompt-based: + +- The model gets **text in, text out**. It has no tools, no file-system or network access, and the Tauri command layer never gives it one. Downloading the model is a separate, explicit user action with the size and licence shown first. +- It **never takes part in a verdict**: pass/fail, scores, quantities and BCF issues are computed by `verimodel-core` before the assistant exists; the assistant only reads the finished report. +- Every answer is **structured and validated**. A filter may only name rule ids, storeys, types and severities that exist in the current report (anything else is dropped and shown as "ignored"); a `project.yaml` suggestion is run through the real config parser and shown as Valid/Invalid before "Use in settings" is offered; an answer that does not fit its schema is shown as plain text and marked as unstructured, never applied. +- **Retrieval, not invention.** Prompts are built from BM25-retrieved chunks of the built-in docs, the rule pack, the current report and any documentation you import; the model is asked to answer from those chunks. Decoding is greedy, so the same question with the same context gives the same answer. +- **Documentation → YAML.** `verimodel docs-to-yaml --in --out knowledge.yaml` (also "Import documentation…" in the panel) converts Markdown, text, YAML, JSON, Word (.docx) and PDF into a readable `knowledge.yaml` of chunks that the assistant indexes, so a BIM execution plan or an employer's information requirements can be asked about, and turned into draft `project.yaml` rules, offline. + +**Size.** Elements are streamed from the extractor and the geometry kernel runs multi-threaded; the UI paginates every table. The core keeps a compact model in memory (a 100k-element model is a few hundred MB), which is the trade-off for whole-model checks such as duplicate GlobalIds. + +## Demo script + +1. **Public sample, under 60 s:** `verimodel check --ifc tests/fixtures/bsi_ifc4_building_structural.ifc --out out/structural` → open `out/structural/report.html`. The buildingSMART sample passes the identity and spatial checks; warnings point at missing psets. +2. **Broken model FAILS with a fix list, not a crash:** `verimodel check --ifc tests/fixtures/broken_building.ifc --ids examples/sample.ids --config examples/residential/project.yaml --out out/broken` → verdict FAIL, 6 errors (duplicate GlobalId ×2, invalid GlobalId, orphan column, missing FireRating ×2 from the config), 9 warnings (zero-volume wall, beam 25 km from the origin, empty property values, duplicate names, IDS requirements), each with GlobalId, storey, expected vs actual and how to fix. +3. **Fix or relax, re-run, see the diff:** add `ID-003: false` under `checks.rules` and `FireRating` to the walls (or remove the `required_psets` entry) → re-run → score goes up; the Export screen's run history shows "N fewer errors than last run". +4. **Open the BCF:** import `out/broken/issues.bcfzip` in Bonsai (Blender → BCF panel), BIMcollab Zoom or Solibri: one topic per issue, selecting the element. +5. **Reconcile the QTO:** `out/broken/qto.csv` says IfcWall volume 5.4 m³ = 3.0 + 2.4 + 0 (walls 5000×3000×200 mm, 4000×3000×200 mm and a zero-thickness wall); the "Hand-check samples" table lists the elements and the method (geometry, because the fixture has no base quantities). + +## Tests + +```bash +cargo test --workspace +``` + +- `crates/core`: 58 unit tests + integration tests, no IFC file needed (rule engine, scoring, config validation, QTO aggregation, BCF writer, report writers, IDS evaluation, determinism of writers). +- `crates/ifc_reader`: reads IFC2x3, IFC4 and IFC4.3 fixtures, unit conversion, IDS results, plain-language errors. +- `tests/`: end-to-end on real files: golden expectations for the broken fixture, QTO reconciliation against hand-computed values and against base quantities, the same IFC with two different configurations producing different correct results (genericity), two runs producing identical outputs (determinism), IDS violations quoted, all three schemas. +- `src-tauri`: the command helpers are plain functions with their own tests. + +Fixtures are the public buildingSMART sample scene (CC BY 4.0, see [tests/fixtures/README.md](tests/fixtures/README.md)) plus `broken_building.ifc`, generated by [`tests/fixtures/make_broken.py`](tests/fixtures/make_broken.py) with the IfcOpenShell API so every defect is documented. Set `VERIMODEL_SKIP_IFC_TESTS=1` to skip the IFC-dependent tests explicitly (never silently). + +## Assumptions + +Standards interpretations made where the specification leaves room, also listed in [docs/ASSUMPTIONS.md](docs/ASSUMPTIONS.md): + +- The engine works in SI base units (m, m², m³, kg); conversion uses the file's `IfcUnitAssignment`. Imperial is a display preference. +- Schema identifiers are normalised: `IFC4X3_ADD2` → `IFC4X3`; `IFC4X1`/`IFC4X2` are treated as `IFC4`. +- A GlobalId is valid when it has 22 characters from the IFC base64 alphabet and starts with `0`–`3`. +- Elements are "physical" when they inherit `IfcElement`; feature elements (openings), virtual elements and annotations are excluded from geometry checks and from the takeoff. +- IDS cardinality (`required` / `optional` / `prohibited`) governs whether applicable entities must exist; a failed requirement on an applicable entity is always an ERROR. +- "Degenerate geometry" (GEO-002) means a shape with no triangles or with both volume and area below tolerance; a zero-volume wall with a non-zero surface is reported by QT-001 instead, as a WARNING, because surface-modelled elements are legitimate in some disciplines. +- The score formula weights a warning as a quarter of an error and uses (element, rule) pairs as the denominator so that a model with many checks is not punished for having many checks. +- BCF: no snapshot images are written (there is no renderer); viewpoints carry the component selection and a camera when geometry is available. + +## Limitations + +- Clash detection is **phase 2**: the configuration, the report section and the `verimodel clash` command exist and say so explicitly; no clashes are computed yet. +- The IFC reader needs a Python with `ifcopenshell`; installers do not bundle Python. `verimodel doctor` explains what is missing. +- Base quantities are trusted as declared; VeriModel does not recompute them when they disagree with the geometry (it reports the source of every value so you can). +- BCF snapshots (PNG) are not generated. +- The UI has been exercised in a browser with mock data and through the Tauri commands' tests; a full packaged-app UI test harness is not included. +- The assistant is a 0.5B-parameter model: good at finding, explaining and drafting from the retrieved context, not a substitute for reading the report. It runs on CPU at a few tokens per second per core; larger GGUF models can be dropped into the same folder. ## License -MIT. See [LICENSE](LICENSE). +VeriModel is **source-available** under the [PolyForm Noncommercial License 1.0.0](LICENSE). It is not open source in the OSI sense, on purpose: -Developed by **Alberto Miranda**. +- **Allowed, for free:** any **noncommercial** purpose: education and teaching, personal study, research and experiments for public knowledge, hobby projects, and use by educational institutions, public research organisations, charities and government bodies. You may study, change and share the code for those purposes, keeping the licence and the `Required Notice` line. +- **Not allowed:** any **commercial** use of any kind, including inside a company, in a paid product or service, or to produce commercial work, without a separate licence. +- **The author** keeps every right: distributing VeriModel, selling it, or licensing it commercially to others is up to the copyright holder. Commercial licences are available on request. ---- +Required Notice: Copyright 2026 Grohle (https://github.com/Grohle/VeriModel) + +This is a summary for convenience; the [LICENSE](LICENSE) text is what applies. -## Español +## Dependencies and licenses -VeriModel es una app de escritorio local: **puerta de calidad IFC + mediciones (QTO) + exportación BCF**. +Runtime and build dependencies and their licences (all permissive; none restricts VeriModel's own terms): -Toma CUALQUIER modelo IFC de CUALQUIER proyecto BIM y responde, con pruebas: ¿cumple los requisitos del proyecto?, ¿cuánto hay?, ¿qué está mal y dónde, en un formato que un coordinador puede abrir en cualquier visor BCF? +| Dependency | License | Role | +|---|---|---| +| IfcOpenShell, IfcTester (Python) | LGPL-3.0 (used as a separate process, not linked) | IFC parsing, geometry, IDS | +| Tauri 2, tauri-plugin-dialog/opener | MIT / Apache-2.0 | desktop shell | +| serde, serde_json, serde_yaml, schemars | MIT / Apache-2.0 | data model, config schema | +| regex, sha2, hex, chrono, uuid, indexmap, thiserror, anyhow, log, env_logger | MIT / Apache-2.0 | engine support | +| csv, zip, quick-xml, html-escape | MIT / Apache-2.0 / BSD | writers | +| rust_xlsxwriter | MIT / Apache-2.0 | `qto.xlsx` | +| clap | MIT / Apache-2.0 | CLI | +| Sample IFC files (buildingSMART International) | CC BY 4.0 | test fixtures | -No es un bot que hace clics ni un constructor de flujos. Es la puerta que un modelo tiene que cruzar con evidencia. +IfcOpenShell is invoked as an external interpreter process via its public Python API and is not statically or dynamically linked into the VeriModel binaries; its LGPL terms apply to IfcOpenShell itself. Users install it separately. The optional assistant model (Qwen2.5 0.5B Instruct, Apache-2.0) is downloaded by the user on demand and keeps its own licence, shown before download. -Motor Rust + interfaz HTML (Tauri v2), local-first, sin cuentas ni nube. Genérica por diseño: cualquier tipo de proyecto, disciplina, esquema IFC, unidades o sistema de clasificación — todo lo específico del proyecto viene de `project.yaml` + `.ids`, nunca de listas hardcodeadas en el código. +--- + +Developed by **Alberto Miranda**. diff --git a/crates/assistant/Cargo.toml b/crates/assistant/Cargo.toml new file mode 100644 index 0000000..c26cfef --- /dev/null +++ b/crates/assistant/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "verimodel-assistant" +version.workspace = true +edition.workspace = true +license.workspace = true +description = "VeriModel copilot: a small local language model for navigation, explanation and configuration help. Read-only by construction; never part of a verdict." + +[lib] +name = "verimodel_assistant" +path = "src/lib.rs" + +[features] +default = ["candle"] +# Pure-Rust inference of GGUF models (Qwen2.5 / Llama / SmolLM) via Hugging Face Candle. +candle = ["dep:candle-core", "dep:candle-transformers", "dep:tokenizers"] + +[dependencies] +verimodel-core = { path = "../core" } +serde.workspace = true +serde_json.workspace = true +serde_yaml.workspace = true +thiserror.workspace = true +sha2.workspace = true +hex.workspace = true +regex.workspace = true +log.workspace = true +zip.workspace = true +quick-xml.workspace = true +ureq = { version = "2", default-features = false, features = ["tls"] } +pdf-extract = "0.9" +candle-core = { version = "0.11", optional = true } +candle-transformers = { version = "0.11", optional = true } +tokenizers = { version = "0.23", optional = true, default-features = false, features = ["onig"] } + +[dev-dependencies] +tempfile.workspace = true diff --git a/crates/assistant/src/backend/candle.rs b/crates/assistant/src/backend/candle.rs new file mode 100644 index 0000000..4ffae12 --- /dev/null +++ b/crates/assistant/src/backend/candle.rs @@ -0,0 +1,40 @@ +//! Candle backend: quantized GGUF inference in pure Rust (CPU; Metal/CUDA via +//! candle features later). STUB: to be implemented. +//! +//! Contract: +//! * `CandleBackend::load(gguf, tokenizer_json)` reads the GGUF header to pick +//! the architecture (`general.architecture`: "qwen2" | "llama" | ...) and +//! builds the matching `candle_transformers::models::quantized_*` model. +//! * `generate` tokenises the ChatML prompt, runs greedy decoding (or sampling +//! when `temperature > 0`) up to `max_tokens`, stops on EOS or any `stop` +//! string, and returns the decoded text without the stop sequence. +//! * Must never panic on a bad file: return `AssistantError::Load`. + +use std::path::Path; + +use super::{Backend, GenOptions}; +use crate::error::{AssistantError, AssistantResult}; + +pub struct CandleBackend { + name: String, +} + +impl CandleBackend { + pub fn load(gguf: &Path, tokenizer: &Path) -> AssistantResult { + let _ = (gguf, tokenizer); + Err(AssistantError::Load( + "candle backend not implemented yet".into(), + )) + } +} + +impl Backend for CandleBackend { + fn name(&self) -> &str { + &self.name + } + fn generate(&mut self, _prompt: &str, _opts: &GenOptions) -> AssistantResult { + Err(AssistantError::Generation( + "candle backend not implemented yet".into(), + )) + } +} diff --git a/crates/assistant/src/backend/mock.rs b/crates/assistant/src/backend/mock.rs new file mode 100644 index 0000000..c2595d0 --- /dev/null +++ b/crates/assistant/src/backend/mock.rs @@ -0,0 +1,33 @@ +//! A scripted backend for tests: returns canned answers in order. + +use std::collections::VecDeque; + +use super::{Backend, GenOptions}; +use crate::error::{AssistantError, AssistantResult}; + +#[derive(Debug, Default)] +pub struct MockBackend { + pub answers: VecDeque, + pub prompts: Vec, +} + +impl MockBackend { + pub fn new(answers: impl IntoIterator>) -> MockBackend { + MockBackend { + answers: answers.into_iter().map(Into::into).collect(), + prompts: Vec::new(), + } + } +} + +impl Backend for MockBackend { + fn name(&self) -> &str { + "mock" + } + fn generate(&mut self, prompt: &str, _opts: &GenOptions) -> AssistantResult { + self.prompts.push(prompt.to_string()); + self.answers + .pop_front() + .ok_or_else(|| AssistantError::Generation("mock backend has no more answers".into())) + } +} diff --git a/crates/assistant/src/backend/mod.rs b/crates/assistant/src/backend/mod.rs new file mode 100644 index 0000000..f7116da --- /dev/null +++ b/crates/assistant/src/backend/mod.rs @@ -0,0 +1,79 @@ +//! Inference backends. The assistant only ever calls [`Backend::generate`] +//! with a prompt string; a backend has no access to anything else. + +use std::path::Path; + +use crate::error::{AssistantError, AssistantResult}; + +#[cfg(feature = "candle")] +pub mod candle; +pub mod mock; + +pub use mock::MockBackend; + +/// Generation settings. Greedy by default so answers are reproducible. +#[derive(Debug, Clone)] +pub struct GenOptions { + pub max_tokens: usize, + /// 0.0 = greedy (default). Anything else samples with this temperature. + pub temperature: f64, + /// Generation stops when any of these strings appears. + pub stop: Vec, +} + +impl Default for GenOptions { + fn default() -> Self { + Self { + max_tokens: 384, + temperature: 0.0, + stop: vec!["<|im_end|>".into(), "<|endoftext|>".into()], + } + } +} + +/// A chat message for prompt building. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Message { + pub role: &'static str, + pub content: String, +} + +/// Text in, text out. Nothing else. +pub trait Backend: Send { + fn name(&self) -> &str; + /// Generate a completion for a chat-formatted prompt (see [`chatml`]). + fn generate(&mut self, prompt: &str, opts: &GenOptions) -> AssistantResult; +} + +/// ChatML prompt (Qwen2.5 / SmolLM2 format). Llama 3.x uses a different +/// template; the Candle backend maps by model family. +pub fn chatml(messages: &[Message]) -> String { + let mut s = String::new(); + for m in messages { + s.push_str("<|im_start|>"); + s.push_str(m.role); + s.push('\n'); + s.push_str(&m.content); + s.push_str("<|im_end|>\n"); + } + s.push_str("<|im_start|>assistant\n"); + s +} + +/// Load the default installed model with the default backend. +pub fn load_default(app_data: &Path) -> AssistantResult> { + #[cfg(feature = "candle")] + { + let status = crate::model::status(app_data); + if !status.installed { + return Err(AssistantError::ModelNotInstalled); + } + let b = candle::CandleBackend::load(&status.gguf_path, &status.tokenizer_path)?; + Ok(Box::new(b)) + } + #[cfg(not(feature = "candle"))] + { + let _ = app_data; + Err(AssistantError::NoBackend) + } +} diff --git a/crates/assistant/src/convert.rs b/crates/assistant/src/convert.rs new file mode 100644 index 0000000..1e90de3 --- /dev/null +++ b/crates/assistant/src/convert.rs @@ -0,0 +1,51 @@ +//! Documentation → knowledge YAML. +//! +//! Turns project documentation (BIM execution plans, employer's information +//! requirements, naming conventions, ...) into [`Knowledge`] chunks the +//! assistant can retrieve. Pure text extraction, no model involved. +//! +//! STUB: to be implemented. Contract: +//! * `convert_paths(paths)` accepts files and directories (recursed) with +//! extensions .md .markdown .txt .yaml .yml .json .docx .pdf; others are +//! skipped and listed in `ConvertReport.skipped`. +//! * .md/.txt: `knowledge::chunk_markdown`. .yaml/.yml: if it already is a +//! Knowledge file, merge; else chunk the YAML text by top-level keys. +//! .json: pretty-print and chunk. .docx: unzip `word/document.xml`, take +//! `w:p` paragraphs (quick-xml), headings from `w:pStyle` Heading1..3. +//! .pdf: `pdf_extract::extract_text`, paragraphs split on blank lines. +//! * Every chunk gets `source` = relative path, `keywords` = top 8 distinct +//! capitalised or underscored tokens (identifiers like Pset_WallCommon). +//! * Deterministic order (sorted paths). + +use std::path::{Path, PathBuf}; + +use serde::{Deserialize, Serialize}; + +use crate::error::AssistantResult; +use crate::knowledge::Knowledge; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct ConvertReport { + pub knowledge: Knowledge, + pub files_read: Vec, + pub skipped: Vec, +} + +pub const SUPPORTED_EXTENSIONS: &[&str] = &[ + "md", "markdown", "txt", "yaml", "yml", "json", "docx", "pdf", +]; + +/// Convert files/directories into knowledge. +pub fn convert_paths(paths: &[PathBuf]) -> AssistantResult { + let _ = paths; + Err(crate::error::AssistantError::Convert( + "not implemented yet".into(), + )) +} + +/// Convert and write `knowledge.yaml` next to the outputs. +pub fn convert_to_file(paths: &[PathBuf], out: &Path) -> AssistantResult { + let r = convert_paths(paths)?; + std::fs::write(out, r.knowledge.to_yaml())?; + Ok(r) +} diff --git a/crates/assistant/src/error.rs b/crates/assistant/src/error.rs new file mode 100644 index 0000000..b737f78 --- /dev/null +++ b/crates/assistant/src/error.rs @@ -0,0 +1,47 @@ +//! Plain-language errors; the UI shows `message` and `hint` verbatim. + +use thiserror::Error; + +#[derive(Debug, Error, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub enum AssistantError { + #[error("The assistant model is not installed yet.")] + ModelNotInstalled, + #[error("Download problem: {0}")] + Download(String), + #[error("The downloaded model file is corrupt (checksum mismatch): {0}")] + Checksum(String), + #[error("The model could not be loaded: {0}")] + Load(String), + #[error("The model could not generate an answer: {0}")] + Generation(String), + #[error("Document conversion problem: {0}")] + Convert(String), + #[error("The assistant is built without an inference backend.")] + NoBackend, + #[error("{0}")] + Other(String), +} + +impl AssistantError { + /// A short, actionable hint for the UI. + pub fn hint(&self) -> String { + match self { + AssistantError::ModelNotInstalled => "Open the Assistant panel and choose \"Download model\" (about 0.5 GB, one time, stored locally).".into(), + AssistantError::Download(_) => "Check the internet connection and retry; the download resumes from scratch.".into(), + AssistantError::Checksum(_) => "Delete the model folder and download again.".into(), + AssistantError::Load(_) => "The file may be incomplete; download the model again.".into(), + AssistantError::Generation(_) => "Try a shorter question.".into(), + AssistantError::Convert(_) => "Supported inputs: .md, .txt, .yaml, .json, .docx, .pdf.".into(), + AssistantError::NoBackend => "Rebuild VeriModel with the 'candle' feature enabled.".into(), + AssistantError::Other(_) => String::new(), + } + } +} + +pub type AssistantResult = Result; + +impl From for AssistantError { + fn from(e: std::io::Error) -> Self { + AssistantError::Other(e.to_string()) + } +} diff --git a/crates/assistant/src/knowledge.rs b/crates/assistant/src/knowledge.rs new file mode 100644 index 0000000..96659a6 --- /dev/null +++ b/crates/assistant/src/knowledge.rs @@ -0,0 +1,397 @@ +//! Knowledge base and retrieval (RAG without embeddings). +//! +//! A [`Knowledge`] is a list of text chunks in a simple YAML format that a +//! coordinator can read and edit: +//! +//! ```yaml +//! chunks: +//! - source: docs/RULES.md +//! title: "Check kinds › property_exists" +//! text: "Property must exist ..." +//! keywords: [property, pset] +//! ``` +//! +//! Retrieval is BM25 over lower-cased word tokens: deterministic, dependency +//! free and fast enough for a few thousand chunks. + +use std::collections::{BTreeMap, HashMap}; + +use serde::{Deserialize, Serialize}; + +use verimodel_core::model::RunReport; + +/// One retrievable unit of text. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct Chunk { + pub source: String, + pub title: String, + pub text: String, + #[serde(default)] + pub keywords: Vec, +} + +/// The knowledge base. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct Knowledge { + #[serde(default)] + pub chunks: Vec, +} + +/// Built-in documentation embedded at compile time. +const BUILTIN_DOCS: &[(&str, &str)] = &[ + ("docs/CONFIG.md", include_str!("../../../docs/CONFIG.md")), + ("docs/RULES.md", include_str!("../../../docs/RULES.md")), + ("docs/IDS.md", include_str!("../../../docs/IDS.md")), + ( + "docs/ASSUMPTIONS.md", + include_str!("../../../docs/ASSUMPTIONS.md"), + ), + ( + "rule_packs/generic.yaml", + verimodel_core::rules::pack::GENERIC_RULE_PACK_YAML, + ), +]; + +pub fn tokenize(text: &str) -> Vec { + text.to_lowercase() + .split(|c: char| !(c.is_alphanumeric() || c == '_' || c == '-' || c == '.')) + .map(|t| t.trim_matches(|c| c == '.' || c == '-')) + .filter(|t| t.len() > 1) + .map(|t| t.to_string()) + .collect() +} + +/// Split markdown into chunks at headings (## / ###), keeping the heading path as title. +pub fn chunk_markdown(source: &str, text: &str) -> Vec { + let mut out = Vec::new(); + let mut path: Vec<(usize, String)> = Vec::new(); + let mut buf = String::new(); + let flush = |buf: &mut String, path: &Vec<(usize, String)>, out: &mut Vec| { + let t = buf.trim(); + if !t.is_empty() { + let title = path + .iter() + .map(|(_, h)| h.as_str()) + .collect::>() + .join(" › "); + for piece in split_long(t, 1800) { + out.push(Chunk { + source: source.to_string(), + title: title.clone(), + text: piece, + keywords: vec![], + }); + } + } + buf.clear(); + }; + for line in text.lines() { + let hashes = line.chars().take_while(|c| *c == '#').count(); + if hashes >= 1 && hashes <= 4 && line.chars().nth(hashes) == Some(' ') { + flush(&mut buf, &path, &mut out); + path.retain(|(lvl, _)| *lvl < hashes); + path.push((hashes, line[hashes..].trim().to_string())); + } else { + buf.push_str(line); + buf.push('\n'); + } + } + flush(&mut buf, &path, &mut out); + out +} + +/// Split text into pieces of at most `max` chars at paragraph boundaries. +pub fn split_long(text: &str, max: usize) -> Vec { + if text.chars().count() <= max { + return vec![text.to_string()]; + } + let mut out = Vec::new(); + let mut cur = String::new(); + for para in text.split("\n\n") { + if !cur.is_empty() && cur.chars().count() + para.chars().count() + 2 > max { + out.push(cur.trim().to_string()); + cur.clear(); + } + if para.chars().count() > max { + for (i, ch) in para.chars().enumerate() { + if i > 0 && i % max == 0 { + out.push(cur.trim().to_string()); + cur.clear(); + } + cur.push(ch); + } + cur.push_str("\n\n"); + } else { + cur.push_str(para); + cur.push_str("\n\n"); + } + } + if !cur.trim().is_empty() { + out.push(cur.trim().to_string()); + } + out +} + +impl Knowledge { + /// The built-in docs and the generic rule pack, chunked. + pub fn builtin() -> Knowledge { + let mut k = Knowledge::default(); + for (src, text) in BUILTIN_DOCS { + if src.ends_with(".yaml") { + k.chunks.extend(chunk_rule_pack(src, text)); + } else { + k.chunks.extend(chunk_markdown(src, text)); + } + } + k + } + + pub fn from_yaml(text: &str) -> Result { + serde_yaml::from_str(text).map_err(|e| e.to_string()) + } + + pub fn to_yaml(&self) -> String { + serde_yaml::to_string(self).unwrap_or_default() + } + + pub fn extend(&mut self, other: Knowledge) { + self.chunks.extend(other.chunks); + } + + /// Add the current report as knowledge: one chunk per rule (with its outcome) + /// and summary chunks for the model, storeys, types and QTO totals. + pub fn add_report(&mut self, report: &RunReport) { + let src = format!("report:{}", report.model.file_name); + let s = &report.summary; + self.chunks.push(Chunk { + source: src.clone(), + title: "Run summary".into(), + text: format!( + "File {} ({}), {} elements. Verdict {:?}, score {}. Errors {}, warnings {}, info {}. Rules: {} passed, {} failed, {} skipped, {} not applicable. Storeys: {}. Disciplines: {}. Element types: {}.", + report.model.file_name, + report.model.schema, + report.model.element_count, + s.verdict, + s.score, + s.errors, + s.warnings, + s.infos, + s.rules_passed, + s.rules_failed, + s.rules_skipped, + s.rules_not_applicable, + report.model.storeys.join(", "), + report.model.disciplines.join(", "), + report.model.type_counts.iter().map(|(t, n)| format!("{t} ({n})")).collect::>().join(", ") + ), + keywords: vec!["summary".into(), "verdict".into(), "score".into()], + }); + for r in &report.rules { + let mut text = format!( + "Rule {} [{}] — {}. Severity {}. Status {:?}. Elements checked {}, failures {}.", + r.rule_id, + r.category, + r.description, + r.severity.as_str(), + r.status, + r.elements_checked, + r.failures + ); + if let Some(reason) = &r.skipped_reason { + text.push_str(&format!(" Skipped because: {reason}.")); + } + let examples: Vec = report + .findings + .iter() + .filter(|f| f.rule_id == r.rule_id) + .take(5) + .map(|f| { + format!( + "{} {} ({}) in {}: {}", + f.ifc_type.clone().unwrap_or_default(), + f.name.clone().unwrap_or_default(), + f.global_id.clone().unwrap_or_default(), + f.storey.clone().unwrap_or_else(|| "-".into()), + f.message + ) + }) + .collect(); + if !examples.is_empty() { + text.push_str(" Examples: "); + text.push_str(&examples.join(" | ")); + } + self.chunks.push(Chunk { + source: src.clone(), + title: format!("Rule {}", r.rule_id), + text, + keywords: vec![r.rule_id.to_lowercase(), r.category.clone()], + }); + } + if !report.qto.rows.is_empty() { + let rows: Vec = report + .qto + .rows + .iter() + .take(60) + .map(|r| { + format!( + "{}: count {}, volume {:.3} m3, area {:.3} m2, length {:.3} m", + r.group.join(" / "), + r.count, + r.volume_m3, + r.area_m2, + r.length_m + ) + }) + .collect(); + self.chunks.push(Chunk { + source: src, + title: "Quantities".into(), + text: format!("Grouped by {}. {} Totals: count {}, volume {:.3} m3, area {:.3} m2, length {:.3} m.", report.qto.group_by.join(", "), rows.join("; "), report.qto.total_count, report.qto.total_volume_m3, report.qto.total_area_m2, report.qto.total_length_m), + keywords: vec!["qto".into(), "quantities".into(), "volume".into(), "area".into()], + }); + } + } + + /// Top-k chunks for a query by BM25 (k1 = 1.5, b = 0.75). Deterministic ties by index. + pub fn search(&self, query: &str, k: usize) -> Vec<(&Chunk, f64)> { + let q: Vec = tokenize(query); + if q.is_empty() || self.chunks.is_empty() { + return vec![]; + } + let docs: Vec> = self + .chunks + .iter() + .map(|c| { + let mut t = tokenize(&c.title); + t.extend(tokenize(&c.text)); + t.extend(c.keywords.iter().map(|k| k.to_lowercase())); + t + }) + .collect(); + let n = docs.len() as f64; + let avg = docs.iter().map(|d| d.len()).sum::() as f64 / n; + let mut df: HashMap<&str, usize> = HashMap::new(); + for d in &docs { + let mut seen = BTreeMap::new(); + for t in d { + seen.insert(t.as_str(), ()); + } + for t in seen.keys() { + *df.entry(t).or_default() += 1; + } + } + let (k1, b) = (1.5, 0.75); + let mut scored: Vec<(usize, f64)> = docs + .iter() + .enumerate() + .map(|(i, d)| { + let len = d.len() as f64; + let mut tf: HashMap<&str, f64> = HashMap::new(); + for t in d { + *tf.entry(t.as_str()).or_default() += 1.0; + } + let mut score = 0.0; + for term in &q { + let f = *tf.get(term.as_str()).unwrap_or(&0.0); + if f == 0.0 { + continue; + } + let dfi = *df.get(term.as_str()).unwrap_or(&0) as f64; + let idf = ((n - dfi + 0.5) / (dfi + 0.5) + 1.0).ln(); + score += idf * (f * (k1 + 1.0)) / (f + k1 * (1.0 - b + b * len / avg)); + } + (i, score) + }) + .filter(|(_, s)| *s > 0.0) + .collect(); + scored.sort_by(|a, b| { + b.1.partial_cmp(&a.1) + .unwrap_or(std::cmp::Ordering::Equal) + .then(a.0.cmp(&b.0)) + }); + scored + .into_iter() + .take(k) + .map(|(i, s)| (&self.chunks[i], s)) + .collect() + } +} + +/// One chunk per rule of a YAML rule pack. +pub fn chunk_rule_pack(source: &str, text: &str) -> Vec { + let Ok(pack) = verimodel_core::rules::RulePack::from_yaml(text) else { + return vec![]; + }; + pack.rules + .iter() + .map(|r| Chunk { + source: source.to_string(), + title: format!("Rule {} ({})", r.id, r.category), + text: format!( + "{} — {}. Severity {}. Check kind: {}. Scope types: {}. Fix hint: {}", + r.id, + r.description, + r.severity, + r.check.kind_name(), + if r.scope.ifc_types.is_empty() { + "all".to_string() + } else { + r.scope.ifc_types.join(", ") + }, + r.fix_hint.clone().unwrap_or_default() + ), + keywords: vec![ + r.id.to_lowercase(), + r.category.clone(), + r.check.kind_name().to_string(), + ], + }) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn builtin_knowledge_is_searchable() { + let k = Knowledge::builtin(); + assert!(k.chunks.len() > 40, "{}", k.chunks.len()); + let hits = k.search("duplicate GlobalId", 3); + assert!(!hits.is_empty()); + assert!( + hits[0].0.text.to_lowercase().contains("globalid"), + "{}", + hits[0].0.text + ); + let hits = k.search("far from origin tolerance", 3); + assert!(hits + .iter() + .any(|(c, _)| c.text.contains("far_from_origin_m"))); + } + + #[test] + fn yaml_roundtrip() { + let k = Knowledge { + chunks: vec![Chunk { + source: "a".into(), + title: "t".into(), + text: "hello world".into(), + keywords: vec!["x".into()], + }], + }; + let y = k.to_yaml(); + assert_eq!(Knowledge::from_yaml(&y).unwrap(), k); + } + + #[test] + fn markdown_chunking_keeps_heading_path() { + let c = chunk_markdown( + "f.md", + "# A\nintro\n## B\ntext b\n### C\ntext c\n## D\ntext d\n", + ); + let titles: Vec<_> = c.iter().map(|c| c.title.as_str()).collect(); + assert_eq!(titles, vec!["A", "A › B", "A › B › C", "A › D"]); + } +} diff --git a/crates/assistant/src/lib.rs b/crates/assistant/src/lib.rs new file mode 100644 index 0000000..3a95103 --- /dev/null +++ b/crates/assistant/src/lib.rs @@ -0,0 +1,72 @@ +//! # VeriModel assistant +//! +//! A small local language model (SLM) used as a **copilot for navigation, +//! explanation and configuration help**. It is read-only by construction: +//! +//! * It never takes part in a verdict. Pass/fail, scores, quantities and BCF +//! issues are computed by `verimodel-core` before the assistant exists. +//! * Its only input is text: the user's question, a few retrieved knowledge +//! chunks (built-in docs, imported documentation, the current report) and a +//! task-specific JSON schema. It has no tools, no file-system access and no +//! network access; the model download is a separate, explicit user action. +//! * Its output is parsed and validated against the task's schema and against +//! the current report (a filter may only name rule ids, storeys and types +//! that exist). Anything that does not validate is returned as plain text +//! marked as such, never applied silently. +//! * Generation is greedy (temperature 0), so the same question with the same +//! context gives the same answer. +//! +//! Module map: [`model`] (catalogue, download, status), [`backend`] (inference +//! trait + Candle implementation + a mock for tests), [`knowledge`] (BM25 +//! retrieval over YAML knowledge), [`tasks`] (prompts, schemas, validation), +//! [`convert`] (documentation → knowledge YAML). + +pub mod backend; +pub mod convert; +pub mod error; +pub mod knowledge; +pub mod model; +pub mod tasks; + +pub use backend::{Backend, GenOptions, MockBackend}; +pub use error::{AssistantError, AssistantResult}; +pub use knowledge::{Chunk, Knowledge}; +pub use model::{ModelSpec, ModelStatus, DEFAULT_MODEL}; +pub use tasks::{Answer, FilterSpec, ReportContext, Task}; + +/// The assistant: one backend + one knowledge base. +pub struct Assistant { + backend: Box, + knowledge: Knowledge, +} + +impl Assistant { + /// Build with any backend (tests use [`MockBackend`]). + pub fn with_backend(backend: Box, knowledge: Knowledge) -> Assistant { + Assistant { backend, knowledge } + } + + /// Load the installed model from `app_data` (see [`model::model_dir`]) with the Candle backend. + /// Returns `AssistantError::ModelNotInstalled` when no model is present. + pub fn load(app_data: &std::path::Path, knowledge: Knowledge) -> AssistantResult { + let backend = backend::load_default(app_data)?; + Ok(Assistant { backend, knowledge }) + } + + pub fn knowledge(&self) -> &Knowledge { + &self.knowledge + } + + pub fn knowledge_mut(&mut self) -> &mut Knowledge { + &mut self.knowledge + } + + pub fn backend_name(&self) -> &str { + self.backend.name() + } + + /// Run one task: retrieve context, prompt, generate, parse, validate. + pub fn run(&mut self, task: &Task) -> AssistantResult { + tasks::run(self.backend.as_mut(), &self.knowledge, task) + } +} diff --git a/crates/assistant/src/model.rs b/crates/assistant/src/model.rs new file mode 100644 index 0000000..5f2ee2a --- /dev/null +++ b/crates/assistant/src/model.rs @@ -0,0 +1,123 @@ +//! Model catalogue, on-disk layout, status and download. +//! +//! Models are NOT bundled with the installer. The user downloads one from the +//! Assistant panel (an explicit action, shown with size and license); it is +//! stored under `/assistant//` and verified by SHA-256. + +use std::path::{Path, PathBuf}; + +use serde::{Deserialize, Serialize}; + +use crate::error::AssistantResult; + +/// A downloadable model. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct ModelSpec { + /// Folder name, e.g. "qwen2.5-0.5b-instruct-q4_k_m". + pub id: String, + pub name: String, + /// "qwen2" | "llama" | "smollm" — selects the Candle model family and the chat template. + pub family: String, + pub gguf_url: String, + pub gguf_sha256: String, + pub gguf_size_bytes: u64, + pub tokenizer_url: String, + pub tokenizer_sha256: String, + pub license: String, + pub approx_ram_mb: u32, +} + +/// Default model: Qwen2.5-0.5B-Instruct, Q4_K_M (~470 MB, Apache-2.0). +pub static DEFAULT_MODEL: std::sync::LazyLock = std::sync::LazyLock::new(|| { + ModelSpec { + id: "qwen2.5-0.5b-instruct-q4_k_m".into(), + name: "Qwen2.5 0.5B Instruct (Q4_K_M)".into(), + family: "qwen2".into(), + gguf_url: "https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GGUF/resolve/main/qwen2.5-0.5b-instruct-q4_k_m.gguf".into(), + gguf_sha256: String::new(), // filled in by the implementer after verifying the download + gguf_size_bytes: 491_400_032, + tokenizer_url: "https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct/resolve/main/tokenizer.json".into(), + tokenizer_sha256: String::new(), + license: "Apache-2.0".into(), + approx_ram_mb: 700, +} +}); + +/// All models the UI may offer. +pub fn catalogue() -> Vec { + vec![DEFAULT_MODEL.clone()] +} + +/// Install state of a model. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct ModelStatus { + pub model_id: String, + pub name: String, + pub installed: bool, + pub model_dir: PathBuf, + pub gguf_path: PathBuf, + pub tokenizer_path: PathBuf, + pub gguf_size_bytes: u64, + pub license: String, + pub approx_ram_mb: u32, + /// Which inference backend this build has ("candle" or "none"). + pub backend: String, +} + +/// `/assistant/`. +pub fn model_dir(app_data: &Path, spec: &ModelSpec) -> PathBuf { + app_data.join("assistant").join(&spec.id) +} + +/// Status of the default model. +pub fn status(app_data: &Path) -> ModelStatus { + status_of(app_data, &DEFAULT_MODEL) +} + +pub fn status_of(app_data: &Path, spec: &ModelSpec) -> ModelStatus { + let dir = model_dir(app_data, spec); + let gguf = dir.join("model.gguf"); + let tok = dir.join("tokenizer.json"); + ModelStatus { + model_id: spec.id.clone(), + name: spec.name.clone(), + installed: gguf.is_file() && tok.is_file(), + model_dir: dir, + gguf_path: gguf, + tokenizer_path: tok, + gguf_size_bytes: spec.gguf_size_bytes, + license: spec.license.clone(), + approx_ram_mb: spec.approx_ram_mb, + backend: if cfg!(feature = "candle") { + "candle".into() + } else { + "none".into() + }, + } +} + +/// Download progress callback: (bytes_done, bytes_total_if_known). +pub type Progress<'a> = &'a mut dyn FnMut(u64, Option); + +/// Download `spec` into `app_data`, verify SHA-256 (when the spec declares one), +/// and return the status. STUB: to be implemented with `ureq` streaming to a +/// `.part` file renamed on success; never leaves a half file as installed. +pub fn download( + app_data: &Path, + spec: &ModelSpec, + progress: Progress<'_>, +) -> AssistantResult { + let _ = (app_data, spec, progress); + Err(crate::error::AssistantError::Download( + "not implemented yet".into(), + )) +} + +/// Remove an installed model. +pub fn remove(app_data: &Path, spec: &ModelSpec) -> AssistantResult<()> { + let dir = model_dir(app_data, spec); + if dir.is_dir() { + std::fs::remove_dir_all(&dir)?; + } + Ok(()) +} diff --git a/crates/assistant/src/tasks.rs b/crates/assistant/src/tasks.rs new file mode 100644 index 0000000..13315f3 --- /dev/null +++ b/crates/assistant/src/tasks.rs @@ -0,0 +1,122 @@ +//! Tasks: what the assistant can be asked, how it is prompted, and how its +//! answer is validated before anyone sees it. +//! +//! STUB: `run` to be implemented. Contract: +//! * Build messages: a system prompt stating the role and the JSON schema of the +//! expected answer, then up to `k` retrieved chunks (BM25 over the knowledge), +//! then the user content. Never include anything the user did not provide or +//! that is not in the knowledge base. +//! * Generate with `GenOptions::default()` (greedy), parse the first JSON +//! object in the output, deserialise into the task's answer type, validate +//! (see each variant), and on failure retry ONCE with the parser error +//! appended; if it still fails return `Answer::Text { text, structured: false }`. +//! * `Task::Filter`: answer `FilterSpec`; every `rule_id`, `storey`, `ifc_type`, +//! `severity` must be in `ReportContext` (case-insensitive match → canonical +//! value) else dropped and listed in `dropped`. +//! * `Task::Explain`: answer text (2–5 sentences, plain language, mentions the +//! element name/GlobalId and the fix). Input facts are the finding + rule. +//! * `Task::ConfigHelp`: answer `{ yaml, explanation }`; `yaml` is validated +//! with `verimodel_core::Config::from_yaml` → `valid`, `validation_error`. +//! * `Task::DraftRules`: requirement text (e.g. from converted documentation) +//! → a `required_psets` / `naming` / `classification` YAML fragment, validated +//! the same way. +//! * `Task::Ask`: free question → `Answer::Text` with the titles of the chunks +//! used as `sources`. + +use serde::{Deserialize, Serialize}; + +use verimodel_core::model::{Finding, RuleResult}; + +use crate::backend::Backend; +use crate::error::AssistantResult; +use crate::knowledge::Knowledge; + +/// Allowed values for filter answers: taken from the current report. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct ReportContext { + pub rule_ids: Vec, + pub storeys: Vec, + pub ifc_types: Vec, + /// "ERROR" | "WARNING" | "INFO" + pub severities: Vec, +} + +/// A UI filter the assistant proposes; the UI applies it only after the user confirms. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct FilterSpec { + #[serde(default)] + pub severity: Vec, + #[serde(default)] + pub rule_id: Option, + #[serde(default)] + pub storey: Option, + #[serde(default)] + pub ifc_type: Option, + #[serde(default)] + pub search: Option, + #[serde(default)] + pub explanation: String, + /// Values the model proposed that do not exist in the report (dropped). + #[serde(default)] + pub dropped: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(tag = "kind", rename_all = "snake_case")] +pub enum Task { + Filter { + question: String, + context: ReportContext, + }, + Explain { + finding: Finding, + rule: Option, + }, + ConfigHelp { + question: String, + current_yaml: Option, + }, + DraftRules { + requirements_text: String, + }, + Ask { + question: String, + }, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(tag = "kind", rename_all = "snake_case")] +pub enum Answer { + Filter { + filter: FilterSpec, + }, + Explanation { + text: String, + }, + ConfigSnippet { + yaml: String, + valid: bool, + validation_error: Option, + explanation: String, + }, + Text { + text: String, + sources: Vec, + structured: bool, + }, +} + +/// Number of retrieved chunks put in the prompt. +pub const RETRIEVE_K: usize = 4; + +/// Run a task against a backend with the given knowledge. +pub fn run( + backend: &mut dyn Backend, + knowledge: &Knowledge, + task: &Task, +) -> AssistantResult { + let _ = (backend, knowledge, task); + Err(crate::error::AssistantError::Generation( + "tasks not implemented yet".into(), + )) +} diff --git a/crates/cli/.gitkeep b/crates/cli/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml new file mode 100644 index 0000000..d1005ee --- /dev/null +++ b/crates/cli/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "verimodel-cli" +version.workspace = true +edition.workspace = true +license.workspace = true +description = "VeriModel command line: IFC QA gate, QTO and BCF export, headless." + +[[bin]] +name = "verimodel" +path = "src/main.rs" + +[dependencies] +verimodel-core = { path = "../core" } +verimodel-ifc-reader = { path = "../ifc_reader" } +verimodel-assistant = { path = "../assistant" } +clap.workspace = true +anyhow.workspace = true +serde_json.workspace = true +env_logger.workspace = true +log.workspace = true + +[dev-dependencies] +tempfile.workspace = true diff --git a/crates/cli/src/assistant_cmds.rs b/crates/cli/src/assistant_cmds.rs new file mode 100644 index 0000000..39b19b1 --- /dev/null +++ b/crates/cli/src/assistant_cmds.rs @@ -0,0 +1,468 @@ +//! `verimodel ask`, `verimodel assistant status|download` and `verimodel docs-to-yaml`. +//! +//! The assistant is an optional, local, read-only copilot. Nothing here changes a verdict, +//! a score or a quantity; `ask` only prints text. + +use std::io::Write; +use std::path::{Path, PathBuf}; + +use clap::{Args, Subcommand}; +use verimodel_assistant::model::{self, DEFAULT_MODEL}; +use verimodel_assistant::{Answer, Assistant, AssistantError, Knowledge, Task}; +use verimodel_core::model::RunReport; + +use crate::error::CliError; + +/// Same identifier as the desktop app, so the CLI and the app share one downloaded model. +const APP_IDENTIFIER: &str = "io.verimodel.desktop"; + +#[derive(Args, Debug)] +pub struct AppDataArg { + /// Folder that holds the downloaded model (/assistant//). Default: the desktop app's data folder. + #[arg(long, value_name = "DIR")] + pub app_data: Option, +} + +#[derive(Args, Debug)] +pub struct AskArgs { + /// Your question, in plain language. + #[arg(long, value_name = "TEXT")] + pub question: String, + #[command(flatten)] + pub data: AppDataArg, + /// report.json of a run; the assistant can then answer questions about that report. + #[arg(long, value_name = "FILE")] + pub report: Option, +} + +#[derive(Subcommand, Debug)] +pub enum AssistantCommand { + /// Show whether the model is installed, its size, license and RAM need. + Status(AppDataArg), + /// Download the model once (about 0.5 GB from Hugging Face) into the app data folder. + Download(AppDataArg), +} + +#[derive(Args, Debug)] +pub struct DocsToYamlArgs { + /// Files or folders to convert (.md .txt .yaml .json .docx .pdf). + #[arg(long = "in", value_name = "PATH", num_args = 1.., required = true)] + pub inputs: Vec, + /// knowledge.yaml to write. + #[arg(long, value_name = "FILE", default_value = "knowledge.yaml")] + pub out: PathBuf, +} + +// --------------------------------------------------------------------------------------------- +// Plain helpers (unit-tested) +// --------------------------------------------------------------------------------------------- + +/// The OS data folder of the desktop app. `env` looks up an environment variable. +/// `VERIMODEL_APP_DATA` overrides everything (handy for tests and portable installs). +pub fn default_app_data(env: &dyn Fn(&str) -> Option, os: &str) -> PathBuf { + if let Some(p) = env("VERIMODEL_APP_DATA").filter(|s| !s.trim().is_empty()) { + return PathBuf::from(p); + } + let home = env("HOME") + .or_else(|| env("USERPROFILE")) + .unwrap_or_else(|| ".".into()); + let base = match os { + "windows" => env("APPDATA") + .map(PathBuf::from) + .unwrap_or_else(|| PathBuf::from(&home).join("AppData").join("Roaming")), + "macos" => PathBuf::from(&home) + .join("Library") + .join("Application Support"), + _ => env("XDG_DATA_HOME") + .filter(|s| !s.trim().is_empty()) + .map(PathBuf::from) + .unwrap_or_else(|| PathBuf::from(&home).join(".local").join("share")), + }; + base.join(APP_IDENTIFIER) +} + +fn app_data_dir(arg: &AppDataArg) -> PathBuf { + arg.app_data + .clone() + .unwrap_or_else(|| default_app_data(&|k| std::env::var(k).ok(), std::env::consts::OS)) +} + +/// Text printed for an answer. +pub fn format_answer(answer: &Answer) -> String { + match answer { + Answer::Text { + text, + sources, + structured, + } => { + let mut out = String::new(); + if !structured { + out.push_str( + "Note: the assistant could not give a structured answer; shown as text.\n", + ); + } + out.push_str(text.trim()); + out.push('\n'); + if !sources.is_empty() { + out.push_str(&format!("\nSources: {}\n", sources.join("; "))); + } + out + } + Answer::Explanation { text } => format!("{}\n", text.trim()), + Answer::ConfigSnippet { + yaml, + valid, + validation_error, + explanation, + } => { + let mut out = format!("{}\n\n{}\n", explanation.trim(), yaml.trim_end()); + if *valid { + out.push_str("\n(valid project.yaml fragment)\n"); + } else { + out.push_str(&format!( + "\n(INVALID: {})\n", + validation_error + .clone() + .unwrap_or_else(|| "unknown problem".into()) + )); + } + out + } + Answer::Filter { filter } => { + let mut parts = Vec::new(); + if !filter.severity.is_empty() { + parts.push(format!("severity: {}", filter.severity.join(", "))); + } + for (k, v) in [ + ("rule", &filter.rule_id), + ("storey", &filter.storey), + ("type", &filter.ifc_type), + ("search", &filter.search), + ] { + if let Some(v) = v { + parts.push(format!("{k}: {v}")); + } + } + let mut out = format!( + "{}\nFilter: {}\n", + filter.explanation.trim(), + if parts.is_empty() { + "(none)".into() + } else { + parts.join(" | ") + } + ); + if !filter.dropped.is_empty() { + out.push_str(&format!( + "Ignored (not in this report): {}\n", + filter.dropped.join(", ") + )); + } + out + } + } +} + +/// Knowledge for the CLI: built-in docs plus, when given, the run report. +pub fn build_knowledge(report: Option<&RunReport>) -> Knowledge { + let mut k = Knowledge::builtin(); + if let Some(r) = report { + k.add_report(r); + } + k +} + +fn read_report(path: &Path) -> Result { + if !path.is_file() { + return Err(CliError::with_hint( + format!("Report not found: {}", path.display()), + "Use the report.json inside the out folder of a previous `verimodel check`.", + )); + } + let text = std::fs::read_to_string(path)?; + serde_json::from_str(&text).map_err(|e| { + CliError::with_hint( + format!("{} is not a VeriModel report.json: {e}", path.display()), + "Use the report.json written by `verimodel check`.", + ) + }) +} + +// --------------------------------------------------------------------------------------------- +// Commands +// --------------------------------------------------------------------------------------------- + +/// Ask a question. Fails with the plain-language hint (exit code 2) when the model is not installed. +pub fn ask( + app_data: &Path, + question: &str, + report: Option<&RunReport>, +) -> Result { + if !model::status(app_data).installed { + return Err(AssistantError::ModelNotInstalled.into()); + } + let mut assistant = Assistant::load(app_data, build_knowledge(report))?; + Ok(assistant.run(&Task::Ask { + question: question.to_string(), + })?) +} + +pub fn cmd_ask(a: AskArgs) -> Result { + if a.question.trim().is_empty() { + return Err(CliError::with_hint( + "The question is empty.", + "Use --question \"What does rule CL-001 check?\".", + )); + } + let report = match &a.report { + Some(p) => Some(read_report(p)?), + None => None, + }; + let answer = ask(&app_data_dir(&a.data), &a.question, report.as_ref())?; + print!("{}", format_answer(&answer)); + eprintln!( + "\nRead-only copilot. Verdicts, scores and quantities never come from the assistant." + ); + Ok(0) +} + +pub fn render_status(s: &model::ModelStatus) -> String { + let gb = s.gguf_size_bytes as f64 / 1_000_000_000.0; + format!( + "Model: {}\nInstalled: {}\nSize: {:.2} GB download\nLicense: {}\nRAM: about {} MB\nBackend: {}\nFolder: {}\n", + s.name, + if s.installed { "yes" } else { "no (run `verimodel assistant download`)" }, + gb, + s.license, + s.approx_ram_mb, + s.backend, + s.model_dir.display() + ) +} + +pub fn cmd_assistant(c: AssistantCommand) -> Result { + match c { + AssistantCommand::Status(d) => { + print!("{}", render_status(&model::status(&app_data_dir(&d)))); + Ok(0) + } + AssistantCommand::Download(d) => { + let dir = app_data_dir(&d); + let before = model::status(&dir); + if before.installed { + println!( + "The model is already installed in {}.", + before.model_dir.display() + ); + return Ok(0); + } + println!( + "Downloading {} ({:.2} GB, {}) from Hugging Face. This happens once.", + DEFAULT_MODEL.name, + DEFAULT_MODEL.gguf_size_bytes as f64 / 1e9, + DEFAULT_MODEL.license + ); + let mut last_pct = u64::MAX; + let mut progress = |done: u64, total: Option| { + let total = total.unwrap_or(DEFAULT_MODEL.gguf_size_bytes).max(1); + let pct = (done * 100 / total).min(100); + if pct != last_pct { + last_pct = pct; + eprint!( + "\r {pct:>3}% ({:.0} / {:.0} MB)", + done as f64 / 1e6, + total as f64 / 1e6 + ); + let _ = std::io::stderr().flush(); + } + }; + let status = model::download(&dir, &DEFAULT_MODEL, &mut progress)?; + eprintln!(); + print!("{}", render_status(&status)); + Ok(0) + } + } +} + +pub fn cmd_docs_to_yaml(a: DocsToYamlArgs) -> Result { + let r = verimodel_assistant::convert::convert_to_file(&a.inputs, &a.out)?; + println!("Files read: {}", r.files_read.len()); + for f in &r.files_read { + println!(" {f}"); + } + println!("Skipped: {}", r.skipped.len()); + for f in &r.skipped { + println!(" {f}"); + } + println!("Chunks: {}", r.knowledge.chunks.len()); + println!("Written: {}", a.out.display()); + Ok(0) +} + +#[cfg(test)] +mod tests { + use super::*; + use clap::Parser; + + fn env_of(pairs: &'static [(&'static str, &'static str)]) -> impl Fn(&str) -> Option { + move |k| { + pairs + .iter() + .find(|(n, _)| *n == k) + .map(|(_, v)| v.to_string()) + } + } + + #[test] + fn default_app_data_follows_each_os_convention() { + assert_eq!( + default_app_data(&env_of(&[("HOME", "/home/a")]), "linux"), + PathBuf::from("/home/a/.local/share/io.verimodel.desktop") + ); + assert_eq!( + default_app_data( + &env_of(&[("HOME", "/home/a"), ("XDG_DATA_HOME", "/x")]), + "linux" + ), + PathBuf::from("/x/io.verimodel.desktop") + ); + assert_eq!( + default_app_data(&env_of(&[("HOME", "/Users/a")]), "macos"), + PathBuf::from("/Users/a/Library/Application Support/io.verimodel.desktop") + ); + assert_eq!( + default_app_data(&env_of(&[("APPDATA", "C:\\R")]), "windows"), + PathBuf::from("C:\\R").join("io.verimodel.desktop") + ); + assert_eq!( + default_app_data( + &env_of(&[("VERIMODEL_APP_DATA", "/d"), ("HOME", "/h")]), + "linux" + ), + PathBuf::from("/d") + ); + } + + #[test] + fn ask_without_model_fails_with_the_plain_hint() { + let dir = tempfile::tempdir().unwrap(); + let e = ask(dir.path(), "what is IDS?", None).unwrap_err(); + let text = e.render(); + assert!( + text.starts_with("Error: The assistant model is not installed yet."), + "{text}" + ); + assert!(text.contains("Hint:") && text.contains("Download model")); + } + + #[test] + fn answers_are_printed_as_plain_text() { + let a = Answer::Text { + text: " Hello ".into(), + sources: vec!["docs/RULES.md".into(), "docs/IDS.md".into()], + structured: true, + }; + assert_eq!( + format_answer(&a), + "Hello\n\nSources: docs/RULES.md; docs/IDS.md\n" + ); + let a = Answer::Text { + text: "x".into(), + sources: vec![], + structured: false, + }; + assert!( + format_answer(&a).starts_with("Note: the assistant could not give a structured answer") + ); + let a = Answer::ConfigSnippet { + yaml: "a: 1\n".into(), + valid: false, + validation_error: Some("bad".into()), + explanation: "e".into(), + }; + assert!(format_answer(&a).contains("INVALID: bad")); + let f = verimodel_assistant::FilterSpec { + severity: vec!["ERROR".into()], + storey: Some("Level 1".into()), + dropped: vec!["Level 9".into()], + explanation: "ok".into(), + ..Default::default() + }; + let out = format_answer(&Answer::Filter { filter: f }); + assert!( + out.contains("severity: ERROR | storey: Level 1") + && out.contains("Ignored (not in this report): Level 9") + ); + } + + #[test] + fn knowledge_gets_the_report_chunks_only_when_given() { + let base = build_knowledge(None).chunks.len(); + let mut r = RunReport::default(); + r.model.file_name = "x.ifc".into(); + let with = build_knowledge(Some(&r)); + assert!(with.chunks.len() > base); + assert!(with.chunks.iter().any(|c| c.source == "report:x.ifc")); + } + + #[test] + fn parses_the_new_subcommands() { + use crate::{Cli, Command}; + let cli = Cli::try_parse_from([ + "verimodel", + "ask", + "--question", + "q", + "--app-data", + "/d", + "--report", + "r.json", + ]) + .unwrap(); + match cli.command { + Command::Ask(a) => assert_eq!( + (a.question.as_str(), a.data.app_data, a.report), + ( + "q", + Some(PathBuf::from("/d")), + Some(PathBuf::from("r.json")) + ) + ), + _ => panic!(), + } + let cli = Cli::try_parse_from([ + "verimodel", + "docs-to-yaml", + "--in", + "a.md", + "dir", + "--out", + "k.yaml", + ]) + .unwrap(); + match cli.command { + Command::DocsToYaml(a) => assert_eq!( + (a.inputs, a.out), + ( + vec![PathBuf::from("a.md"), PathBuf::from("dir")], + PathBuf::from("k.yaml") + ) + ), + _ => panic!(), + } + assert!(Cli::try_parse_from(["verimodel", "assistant", "status"]).is_ok()); + assert!( + Cli::try_parse_from(["verimodel", "assistant", "download", "--app-data", "/d"]).is_ok() + ); + assert!( + Cli::try_parse_from(["verimodel", "docs-to-yaml"]).is_err(), + "--in is required" + ); + } + + #[test] + fn missing_report_is_a_clean_error() { + let e = read_report(Path::new("/no/such/report.json")).unwrap_err(); + assert!(e.render().starts_with("Error: Report not found")); + } +} diff --git a/crates/cli/src/error.rs b/crates/cli/src/error.rs new file mode 100644 index 0000000..4d89c9f --- /dev/null +++ b/crates/cli/src/error.rs @@ -0,0 +1,118 @@ +//! Human-readable CLI errors: `Error: ...` and `Hint: ...`, never a Debug dump. + +use std::fmt; + +use verimodel_core::CoreError; +use verimodel_ifc_reader::ReaderError; + +/// Exit code for a failed gate (verdict FAIL). +pub const EXIT_FAIL: i32 = 1; +/// Exit code for bad input or an operational error. +pub const EXIT_ERROR: i32 = 2; +/// Exit code for a feature that is planned but not implemented yet (clash). +pub const EXIT_NOT_IMPLEMENTED: i32 = 3; + +/// An error the user can act on. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CliError { + pub message: String, + pub hint: Option, +} + +impl CliError { + pub fn new(message: impl Into) -> Self { + Self { + message: message.into(), + hint: None, + } + } + + pub fn with_hint(message: impl Into, hint: impl Into) -> Self { + let hint = hint.into(); + Self { + message: message.into(), + hint: if hint.trim().is_empty() { + None + } else { + Some(hint) + }, + } + } + + /// Text printed to stderr. + pub fn render(&self) -> String { + match &self.hint { + Some(h) => format!("Error: {}\nHint: {}", self.message, h), + None => format!("Error: {}", self.message), + } + } +} + +impl fmt::Display for CliError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.message) + } +} + +impl From for CliError { + fn from(e: ReaderError) -> Self { + log::debug!("reader error [{}]: {}", e.code, e.message); + CliError::with_hint(e.message, e.hint) + } +} + +impl From for CliError { + fn from(e: CoreError) -> Self { + let hint = match &e { + CoreError::Config(_) => "Check project.yaml. Run `verimodel validate-config --config ` or print the schema with `--schema`.", + CoreError::Io(_) => "Check that the file exists and that you have permission to read or write it.", + CoreError::RulePack(_) => "Check the custom rule pack file referenced from project.yaml.", + _ => "", + }; + CliError::with_hint(e.to_string(), hint) + } +} + +impl From for CliError { + fn from(e: verimodel_assistant::AssistantError) -> Self { + log::debug!("assistant error: {e:?}"); + CliError::with_hint(e.to_string(), e.hint()) + } +} + +impl From for CliError { + fn from(e: std::io::Error) -> Self { + CliError::with_hint( + format!("File problem: {e}"), + "Check the path and your permissions.", + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn renders_error_and_hint() { + let e = CliError::with_hint("boom", "try again"); + assert_eq!(e.render(), "Error: boom\nHint: try again"); + assert_eq!(CliError::new("boom").render(), "Error: boom"); + assert_eq!(CliError::with_hint("x", " ").hint, None); + } + + #[test] + fn assistant_error_keeps_its_plain_hint() { + let e: CliError = verimodel_assistant::AssistantError::ModelNotInstalled.into(); + assert!(e.message.contains("not installed")); + assert!(e.hint.as_deref().unwrap_or("").contains("Download")); + } + + #[test] + fn core_config_error_has_hint() { + let e: CliError = CoreError::Config("bad".into()).into(); + assert!(e.message.contains("bad")); + assert!(e.hint.is_some()); + assert!(!e.render().contains("Config(")); + } +} diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs new file mode 100644 index 0000000..fc8cedc --- /dev/null +++ b/crates/cli/src/main.rs @@ -0,0 +1,446 @@ +//! `verimodel` command line. +//! +//! Exit codes: 0 = PASS / PASS WITH WARNINGS (or a successful helper command), +//! 1 = verdict FAIL, 2 = error (bad input, missing file, missing IFC tooling), +//! 3 = feature planned but not implemented yet (`clash`). + +mod assistant_cmds; +mod error; +mod render; + +use std::path::{Path, PathBuf}; +use std::time::Instant; + +use clap::{Args, Parser, Subcommand}; +use verimodel_core::config::Config; +use verimodel_core::i18n::Strings; +use verimodel_core::model::Model; +use verimodel_core::run::{self, RunInputs, RunOutcome}; +use verimodel_ifc_reader::ReadOptions; + +use error::{CliError, EXIT_ERROR, EXIT_NOT_IMPLEMENTED}; + +const ABOUT: &str = "VeriModel \u{2014} IFC QA Gate + Quantity Takeoff + BCF Export"; + +#[derive(Parser, Debug)] +#[command(name = "verimodel", version = verimodel_core::VERSION, about = ABOUT, long_about = ABOUT)] +#[command( + after_help = "Exit codes: 0 pass (or pass with warnings), 1 fail, 2 error, 3 not implemented yet." +)] +struct Cli { + /// Print detailed logs to stderr (repeat for more: -vv). + #[arg(short, long, action = clap::ArgAction::Count, global = true)] + verbose: u8, + + #[command(subcommand)] + command: Command, +} + +#[derive(Subcommand, Debug)] +enum Command { + /// Check an IFC file against the rules, IDS and project settings; writes the out/ folder. + Check(CheckArgs), + /// Quantity takeoff: print the QTO table and write the outputs. + Qto(QtoArgs), + /// Clash detection between two models (planned for a later version). + Clash(ClashArgs), + /// Validate a project.yaml, or print its JSON schema. + ValidateConfig(ValidateArgs), + /// Show a quick file card of an IFC file (schema, units, storeys, element types). + Inspect(InspectArgs), + /// Check that Python, IfcOpenShell and IfcTester are installed. + Doctor, + /// Ask the optional local assistant a question (read-only copilot; never decides pass/fail). + Ask(assistant_cmds::AskArgs), + /// Manage the optional local assistant model: `status` or `download`. + #[command(subcommand)] + Assistant(assistant_cmds::AssistantCommand), + /// Convert project documentation (.md .txt .yaml .json .docx .pdf) into a knowledge.yaml for the assistant. + DocsToYaml(assistant_cmds::DocsToYamlArgs), +} + +#[derive(Args, Debug)] +struct CommonRun { + /// IFC file to read. + #[arg(long, value_name = "FILE")] + ifc: PathBuf, + /// project.yaml with requirements, tolerances and QTO settings (defaults are used if omitted). + #[arg(long, value_name = "FILE")] + config: Option, + /// Output folder (created if missing). + #[arg(long, value_name = "DIR", default_value = "./out")] + out: PathBuf, + /// Skip geometry (faster; geometry rules are then reported as skipped). + #[arg(long)] + no_geometry: bool, +} + +#[derive(Args, Debug)] +struct CheckArgs { + #[command(flatten)] + common: CommonRun, + /// buildingSMART IDS file to audit the model against. + #[arg(long, value_name = "FILE")] + ids: Option, + /// Print the full run outcome as JSON instead of the text summary. + #[arg(long)] + json: bool, +} + +#[derive(Args, Debug)] +struct QtoArgs { + #[command(flatten)] + common: CommonRun, +} + +#[derive(Args, Debug)] +struct ClashArgs { + /// First IFC file. + #[arg(long, value_name = "FILE")] + ifc_a: PathBuf, + /// Second IFC file. + #[arg(long, value_name = "FILE")] + ifc_b: PathBuf, + /// project.yaml with the clash sets. + #[arg(long, value_name = "FILE")] + config: Option, + /// Output folder. + #[arg(long, value_name = "DIR", default_value = "./out")] + out: PathBuf, +} + +#[derive(Args, Debug)] +struct ValidateArgs { + /// project.yaml to validate. + #[arg(long, value_name = "FILE")] + config: Option, + /// Print the JSON schema of project.yaml (for editor autocompletion). + #[arg(long)] + schema: bool, +} + +#[derive(Args, Debug)] +struct InspectArgs { + /// IFC file to inspect. + #[arg(long, value_name = "FILE")] + ifc: PathBuf, +} + +fn main() { + let cli = Cli::parse(); + init_logging(cli.verbose); + let code = match dispatch(cli.command) { + Ok(code) => code, + Err(e) => { + eprintln!("{}", e.render()); + EXIT_ERROR + } + }; + std::process::exit(code); +} + +fn init_logging(verbose: u8) { + let level = match verbose { + 0 => "warn", + 1 => "info", + _ => "debug", + }; + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or(level)) + .try_init(); +} + +fn dispatch(cmd: Command) -> Result { + match cmd { + Command::Check(a) => cmd_check(a), + Command::Qto(a) => cmd_qto(a), + Command::Clash(a) => cmd_clash(a), + Command::ValidateConfig(a) => cmd_validate(a), + Command::Inspect(a) => cmd_inspect(a), + Command::Doctor => cmd_doctor(), + Command::Ask(a) => assistant_cmds::cmd_ask(a), + Command::Assistant(c) => assistant_cmds::cmd_assistant(c), + Command::DocsToYaml(a) => assistant_cmds::cmd_docs_to_yaml(a), + } +} + +// --------------------------------------------------------------------------------------------- + +fn require_file(path: &Path, what: &str) -> Result<(), CliError> { + if path.is_file() { + Ok(()) + } else { + Err(CliError::with_hint( + format!("{what} not found: {}", path.display()), + "Check the path (it is relative to the folder you run the command from).", + )) + } +} + +/// Load the config and the directory relative paths inside it resolve against. +fn load_config(path: Option<&Path>) -> Result<(Config, Option), CliError> { + match path { + Some(p) => { + require_file(p, "Config file")?; + let cfg = Config::from_file(p)?; + let dir = match p.parent() { + Some(d) if !d.as_os_str().is_empty() => d.to_path_buf(), + _ => PathBuf::from("."), + }; + Ok((cfg, Some(dir))) + } + None => Ok((Config::default(), None)), + } +} + +/// Shared pipeline of `check` and `qto`: read, evaluate, write. +fn run_pipeline(common: &CommonRun, ids: Option<&PathBuf>) -> Result { + let started = Instant::now(); + require_file(&common.ifc, "IFC file")?; + let (config, config_dir) = load_config(common.config.as_deref())?; + // --ids wins; otherwise use requirements.ids_file from project.yaml (relative to the config). + let ids: Option = ids + .cloned() + .or_else(|| config.ids_path(config_dir.as_deref())); + if let Some(ids) = &ids { + require_file(ids, "IDS file")?; + log::info!("using IDS file {}", ids.display()); + } + let opts = ReadOptions { + ids_path: ids.clone(), + geometry: !common.no_geometry, + ..Default::default() + }; + log::info!("reading {}", common.ifc.display()); + let model = verimodel_ifc_reader::read_model(&common.ifc, &opts)?; + log::info!("read {} elements", model.elements.len()); + let inputs = RunInputs { + ifc_path: common.ifc.clone(), + ids_path: ids, + config_path: common.config.clone(), + config_dir, + out_dir: common.out.clone(), + started: Some(started), + }; + Ok(run::execute(&model, &config, &inputs)?) +} + +fn cmd_check(a: CheckArgs) -> Result { + let outcome = run_pipeline(&a.common, a.ids.as_ref())?; + if a.json { + let text = serde_json::to_string_pretty(&outcome) + .map_err(|e| CliError::new(format!("Cannot render JSON: {e}")))?; + println!("{text}"); + } else { + print!("{}", render::render_summary(&outcome)); + } + Ok(render::exit_code_for(outcome.report.summary.verdict)) +} + +fn cmd_qto(a: QtoArgs) -> Result { + let outcome = run_pipeline(&a.common, None)?; + print!("{}", render::render_qto(&outcome.report.qto)); + println!("\nOutput folder: {}", outcome.out_dir.display()); + for f in &outcome.files { + if f.name.starts_with("qto") { + println!(" {}", f.name); + } + } + // QTO is informational: a failing QA verdict does not make the takeoff fail. + Ok(0) +} + +fn cmd_clash(a: ClashArgs) -> Result { + require_file(&a.ifc_a, "First IFC file")?; + require_file(&a.ifc_b, "Second IFC file")?; + let (mut config, _) = load_config(a.config.as_deref())?; + // The user asked for clashes explicitly, so report "not implemented", not "disabled". + config.clash.enabled = true; + let strings = Strings::for_language(config.output.language); + let report = verimodel_core::clash::run( + &Model::default(), + Some(&Model::default()), + &config, + &strings, + ); + println!("{}", report.message); + if !report.implemented { + eprintln!("No clash results were produced. Exit code {EXIT_NOT_IMPLEMENTED} means 'not implemented yet'."); + return Ok(EXIT_NOT_IMPLEMENTED); + } + Ok(0) +} + +fn cmd_validate(a: ValidateArgs) -> Result { + if a.schema { + let schema = Config::json_schema(); + let text = serde_json::to_string_pretty(&schema) + .map_err(|e| CliError::new(format!("Cannot render schema: {e}")))?; + println!("{text}"); + return Ok(0); + } + let path = a.config.ok_or_else(|| { + CliError::with_hint( + "No config file given.", + "Use --config , or --schema to print the schema.", + ) + })?; + require_file(&path, "Config file")?; + Config::from_file(&path)?; + println!("OK: {} is a valid VeriModel configuration.", path.display()); + Ok(0) +} + +fn cmd_inspect(a: InspectArgs) -> Result { + require_file(&a.ifc, "IFC file")?; + let info = verimodel_ifc_reader::inspect(&a.ifc)?; + print!("{}", render::render_info(&info)); + Ok(0) +} + +fn cmd_doctor() -> Result { + match verimodel_ifc_reader::check_environment() { + Ok(env) => { + println!("Python: {} ({})", env.python, env.python_version); + println!("IfcOpenShell: {}", env.ifcopenshell_version); + if env.ifctester { + println!("IfcTester: installed (IDS checks available)"); + println!("\nEverything needed is installed."); + Ok(0) + } else { + println!("IfcTester: NOT installed (IDS checks unavailable)"); + println!("\nIFC reading works. To enable IDS checks run:\n pip install ifcopenshell ifctester"); + Ok(0) + } + } + Err(e) => { + let mut err = CliError::from(e); + let install = "Install the IFC tooling with: pip install ifcopenshell ifctester"; + err.hint = Some(match err.hint.take() { + Some(h) if !h.contains("pip install") => format!("{h} {install}"), + Some(h) => h, + None => install.to_string(), + }); + Err(err) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use clap::CommandFactory; + + #[test] + fn cli_definition_is_valid_and_says_what_it_is() { + Cli::command().debug_assert(); + let help = Cli::command().render_help().to_string(); + assert!(help.contains("VeriModel \u{2014} IFC QA Gate + Quantity Takeoff + BCF Export")); + for sub in [ + "check", + "qto", + "clash", + "validate-config", + "inspect", + "doctor", + "ask", + "assistant", + "docs-to-yaml", + ] { + assert!(help.contains(sub), "missing subcommand {sub}"); + } + } + + #[test] + fn parses_check_flags() { + let cli = Cli::try_parse_from([ + "verimodel", + "check", + "--ifc", + "a.ifc", + "--ids", + "b.ids", + "--config", + "p.yaml", + "--out", + "o", + "--no-geometry", + "--json", + ]) + .unwrap(); + match cli.command { + Command::Check(a) => { + assert!(a.json && a.common.no_geometry); + assert_eq!(a.common.out, PathBuf::from("o")); + assert_eq!(a.ids, Some(PathBuf::from("b.ids"))); + } + _ => panic!("wrong subcommand"), + } + } + + #[test] + fn default_out_is_dot_out() { + let cli = Cli::try_parse_from(["verimodel", "qto", "--ifc", "a.ifc"]).unwrap(); + match cli.command { + Command::Qto(a) => assert_eq!(a.common.out, PathBuf::from("./out")), + _ => panic!(), + } + } + + #[test] + fn missing_ifc_is_a_clean_error() { + let e = require_file(Path::new("/definitely/not/here.ifc"), "IFC file").unwrap_err(); + assert!(e.render().starts_with("Error: IFC file not found")); + assert!(e.render().contains("Hint:")); + } + + #[test] + fn config_dir_is_parent_of_config_file() { + let dir = tempfile::tempdir().unwrap(); + let p = dir.path().join("project.yaml"); + std::fs::write(&p, "project:\n name: Demo\n").unwrap(); + let (cfg, d) = load_config(Some(&p)).unwrap(); + assert_eq!(cfg.project.name, "Demo"); + assert_eq!(d.unwrap(), dir.path()); + } + + #[test] + fn invalid_config_gives_error_not_debug() { + let dir = tempfile::tempdir().unwrap(); + let p = dir.path().join("bad.yaml"); + std::fs::write(&p, "nonsense_key: 1\n").unwrap(); + let e = load_config(Some(&p)).unwrap_err(); + assert!(e.render().starts_with("Error: Configuration problem")); + } + + #[test] + fn clash_is_never_silent() { + let dir = tempfile::tempdir().unwrap(); + let a = dir.path().join("a.ifc"); + std::fs::write(&a, "x").unwrap(); + let code = cmd_clash(ClashArgs { + ifc_a: a.clone(), + ifc_b: a, + config: None, + out: dir.path().join("o"), + }) + .unwrap(); + assert_eq!(code, EXIT_NOT_IMPLEMENTED); + } + + #[test] + fn validate_schema_and_file() { + assert_eq!( + cmd_validate(ValidateArgs { + config: None, + schema: true + }) + .unwrap(), + 0 + ); + assert!(cmd_validate(ValidateArgs { + config: None, + schema: false + }) + .is_err()); + } +} diff --git a/crates/cli/src/render.rs b/crates/cli/src/render.rs new file mode 100644 index 0000000..94024be --- /dev/null +++ b/crates/cli/src/render.rs @@ -0,0 +1,355 @@ +//! Plain-text rendering of results. Pure functions so they can be unit-tested. + +use verimodel_core::model::{ModelInfo, QtoReport, RuleStatus, Summary, Verdict}; +use verimodel_core::run::RunOutcome; + +/// Exit code for a verdict: 0 for PASS / PASS WITH WARNINGS, 1 for FAIL. +pub fn exit_code_for(verdict: Option) -> i32 { + match verdict { + Some(Verdict::Pass) | Some(Verdict::PassWithWarnings) => 0, + Some(Verdict::Fail) | None => crate::error::EXIT_FAIL, + } +} + +fn plural(n: usize, one: &str, many: &str) -> String { + format!("{n} {}", if n == 1 { one } else { many }) +} + +/// Human readable run summary. +pub fn render_summary(outcome: &RunOutcome) -> String { + let r = &outcome.report; + let s: &Summary = &r.summary; + let verdict = s.verdict.map(|v| v.as_str()).unwrap_or("UNKNOWN"); + let mut out = String::new(); + out.push_str(&format!( + "{} {} - {}\n", + verimodel_core::TOOL_NAME, + verimodel_core::VERSION, + r.model.file_name + )); + out.push_str(&format!( + "Schema {}, {}\n\n", + r.model.schema, + plural(r.model.element_count, "element", "elements") + )); + out.push_str(&format!("Verdict: {verdict} Score: {}/100\n", s.score)); + if !s.verdict_rule.is_empty() { + out.push_str(&format!(" ({})\n", s.verdict_rule)); + } + out.push_str(&format!( + "Findings: {}, {}, {}\n", + plural(s.errors, "error", "errors"), + plural(s.warnings, "warning", "warnings"), + plural(s.infos, "info", "infos"), + )); + out.push_str(&format!( + "Rules: {} passed, {} failed, {} skipped ({} total)\n", + s.rules_passed, s.rules_failed, s.rules_skipped, s.rules_total + )); + + let failed: Vec<_> = r + .rules + .iter() + .filter(|x| x.status == RuleStatus::Fail) + .collect(); + if !failed.is_empty() { + out.push_str("\nFailed rules:\n"); + for x in failed.iter().take(15) { + out.push_str(&format!( + " [{}] {} - {} ({} on {} checked)\n", + x.severity.as_str(), + x.rule_id, + x.description, + plural(x.failures, "failure", "failures"), + x.elements_checked + )); + } + if failed.len() > 15 { + out.push_str(&format!( + " ... and {} more (see report.html)\n", + failed.len() - 15 + )); + } + } + let skipped: Vec<_> = r + .rules + .iter() + .filter(|x| x.status == RuleStatus::Skipped) + .collect(); + if !skipped.is_empty() { + out.push_str("\nSkipped rules (not counted as passed):\n"); + for x in skipped.iter().take(10) { + out.push_str(&format!( + " {} - {}\n", + x.rule_id, + x.skipped_reason + .clone() + .unwrap_or_else(|| "no reason given".into()) + )); + } + } + + out.push_str(&format!("\nOutput folder: {}\n", outcome.out_dir.display())); + for f in &outcome.files { + out.push_str(&format!(" {:<16} {:>10}\n", f.name, human_bytes(f.bytes))); + } + out +} + +/// Summary lines for `inspect`. +pub fn render_info(info: &ModelInfo) -> String { + let mut out = String::new(); + out.push_str(&format!("File: {}\n", info.file_name)); + out.push_str(&format!( + "Size: {}\n", + human_bytes(info.file_size_bytes) + )); + out.push_str(&format!("SHA-256: {}\n", info.sha256)); + out.push_str(&format!("Schema: {}\n", info.schema)); + if let Some(p) = &info.project_name { + out.push_str(&format!("Project: {p}\n")); + } + if let Some(t) = &info.authoring_tool { + out.push_str(&format!("Authored in: {t}\n")); + } + let u = &info.units; + out.push_str(&format!( + "Units: {} ({})\n", + u.length_unit + .clone() + .unwrap_or_else(|| "not declared".into()), + match u.system { + verimodel_core::model::UnitSystem::Metric => "metric", + verimodel_core::model::UnitSystem::Imperial => "imperial", + } + )); + out.push_str(&format!("Elements: {}\n", info.element_count)); + out.push_str(&format!( + "Storeys: {}\n", + if info.storeys.is_empty() { + "none found".to_string() + } else { + info.storeys.join(", ") + } + )); + out.push_str(&format!( + "Disciplines: {}\n", + if info.disciplines.is_empty() { + "unknown".to_string() + } else { + info.disciplines.join(", ") + } + )); + if !info.type_counts.is_empty() { + out.push_str("\nElement types:\n"); + let mut rows: Vec<(&String, &usize)> = info.type_counts.iter().collect(); + rows.sort_by(|a, b| b.1.cmp(a.1).then(a.0.cmp(b.0))); + for (t, n) in rows { + out.push_str(&format!(" {:<36} {:>7}\n", t, n)); + } + } + if !info.reader_warnings.is_empty() { + out.push_str("\nReader notes:\n"); + for w in &info.reader_warnings { + out.push_str(&format!(" - {w}\n")); + } + } + out +} + +/// Quantity takeoff as an aligned text table. +pub fn render_qto(q: &QtoReport) -> String { + let mut headers: Vec = q.group_by.clone(); + if headers.is_empty() { + headers.push("group".into()); + } + let n_group = headers.len(); + let has_cost = q.rows.iter().any(|r| r.cost.is_some()); + for h in ["count", "volume m3", "area m2", "length m"] { + headers.push(h.into()); + } + if has_cost { + headers.push( + format!("cost {}", q.currency.clone().unwrap_or_default()) + .trim() + .to_string(), + ); + } + let mut rows: Vec> = Vec::new(); + for r in &q.rows { + let mut cells: Vec = (0..n_group) + .map(|i| r.group.get(i).cloned().unwrap_or_default()) + .collect(); + cells.push(r.count.to_string()); + cells.push(num(r.volume_m3)); + cells.push(num(r.area_m2)); + cells.push(num(r.length_m)); + if has_cost { + cells.push( + r.cost + .as_ref() + .map(|c| format!("{:.2}", c.amount)) + .unwrap_or_else(|| "-".into()), + ); + } + rows.push(cells); + } + let mut total: Vec = vec![String::new(); n_group]; + total[0] = "TOTAL".into(); + total.push(q.total_count.to_string()); + total.push(num(q.total_volume_m3)); + total.push(num(q.total_area_m2)); + total.push(num(q.total_length_m)); + if has_cost { + total.push( + q.total_cost + .map(|c| format!("{c:.2}")) + .unwrap_or_else(|| "-".into()), + ); + } + + let ncol = headers.len(); + let mut widths: Vec = headers.iter().map(|h| h.chars().count()).collect(); + for row in rows.iter().chain(std::iter::once(&total)) { + for (i, c) in row.iter().enumerate() { + widths[i] = widths[i].max(c.chars().count()); + } + } + let fmt_row = |row: &[String]| -> String { + let mut line = String::new(); + for i in 0..ncol { + let c = &row[i]; + let pad = widths[i].saturating_sub(c.chars().count()); + if i < n_group { + line.push_str(c); + line.push_str(&" ".repeat(pad)); + } else { + line.push_str(&" ".repeat(pad)); + line.push_str(c); + } + if i + 1 < ncol { + line.push_str(" "); + } + } + line.trim_end().to_string() + }; + let mut out = String::new(); + out.push_str("Quantity takeoff\n"); + out.push_str(&fmt_row(&headers)); + out.push('\n'); + out.push_str(&"-".repeat(widths.iter().sum::() + 2 * (ncol - 1))); + out.push('\n'); + for r in &rows { + out.push_str(&fmt_row(r)); + out.push('\n'); + } + out.push_str(&"-".repeat(widths.iter().sum::() + 2 * (ncol - 1))); + out.push('\n'); + out.push_str(&fmt_row(&total)); + out.push('\n'); + if q.elements_without_quantities > 0 { + out.push_str(&format!( + "\n{} elements have no usable quantities.\n", + q.elements_without_quantities + )); + } + if !q.method.is_empty() { + out.push_str( + "\nThe method (how each quantity was taken) is written in report.html and qto.json.\n", + ); + } + out +} + +fn num(v: f64) -> String { + format!("{v:.3}") +} + +/// 1.2 KB style size. +pub fn human_bytes(b: u64) -> String { + const KB: f64 = 1024.0; + let f = b as f64; + if f < KB { + format!("{b} B") + } else if f < KB * KB { + format!("{:.1} KB", f / KB) + } else if f < KB * KB * KB { + format!("{:.1} MB", f / KB / KB) + } else { + format!("{:.2} GB", f / KB / KB / KB) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use verimodel_core::model::{CostLine, QtoRow}; + + #[test] + fn exit_codes_follow_verdict() { + assert_eq!(exit_code_for(Some(Verdict::Pass)), 0); + assert_eq!(exit_code_for(Some(Verdict::PassWithWarnings)), 0); + assert_eq!(exit_code_for(Some(Verdict::Fail)), 1); + } + + #[test] + fn bytes_are_human() { + assert_eq!(human_bytes(12), "12 B"); + assert_eq!(human_bytes(2048), "2.0 KB"); + assert_eq!(human_bytes(3 * 1024 * 1024), "3.0 MB"); + } + + #[test] + fn qto_table_has_columns_totals_and_cost() { + let q = QtoReport { + group_by: vec!["type".into(), "storey".into()], + rows: vec![QtoRow { + group: vec!["IfcWall".into(), "Level 1".into()], + count: 3, + volume_m3: 1.5, + area_m2: 10.0, + cost: Some(CostLine { + amount: 150.0, + ..Default::default() + }), + ..Default::default() + }], + total_count: 3, + total_volume_m3: 1.5, + total_area_m2: 10.0, + total_cost: Some(150.0), + currency: Some("EUR".into()), + method: "sum of base quantities".into(), + ..Default::default() + }; + let t = render_qto(&q); + assert!(t.contains("type")); + assert!(t.contains("storey")); + assert!(t.contains("IfcWall")); + assert!(t.contains("1.500")); + assert!(t.contains("cost EUR")); + assert!(t.contains("TOTAL")); + assert!(t.contains("method")); + } + + #[test] + fn qto_table_without_rows_still_renders() { + let t = render_qto(&QtoReport::default()); + assert!(t.contains("TOTAL")); + } + + #[test] + fn info_lists_types_sorted_by_count() { + let mut info = ModelInfo { + file_name: "a.ifc".into(), + schema: "IFC4".into(), + element_count: 5, + ..Default::default() + }; + info.type_counts.insert("IfcDoor".into(), 1); + info.type_counts.insert("IfcWall".into(), 4); + let t = render_info(&info); + assert!(t.find("IfcWall").unwrap() < t.find("IfcDoor").unwrap()); + assert!(t.contains("Schema: IFC4")); + } +} diff --git a/crates/core/.gitkeep b/crates/core/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml new file mode 100644 index 0000000..1776b0c --- /dev/null +++ b/crates/core/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "verimodel-core" +version.workspace = true +edition.workspace = true +license.workspace = true +description = "VeriModel engine: rule engine, QTO, BCF, report, audit. Pure Rust, no IFC dependency." + +[lib] +name = "verimodel_core" +path = "src/lib.rs" + +[dependencies] +serde.workspace = true +serde_json.workspace = true +serde_yaml.workspace = true +schemars.workspace = true +thiserror.workspace = true +regex.workspace = true +sha2.workspace = true +hex.workspace = true +chrono.workspace = true +csv.workspace = true +zip.workspace = true +quick-xml.workspace = true +rust_xlsxwriter.workspace = true +uuid.workspace = true +indexmap.workspace = true +log.workspace = true +html-escape.workspace = true + +[dev-dependencies] +tempfile.workspace = true diff --git a/crates/core/data/disciplines.yaml b/crates/core/data/disciplines.yaml new file mode 100644 index 0000000..5f18d6b --- /dev/null +++ b/crates/core/data/disciplines.yaml @@ -0,0 +1,7 @@ +# Discipline inference by IFC entity type (data, not code). An element counts for a +# discipline when its type or any supertype appears in the list. Several +# disciplines may match the same model; the file card lists all of them. +architecture: [IfcWall, IfcCurtainWall, IfcDoor, IfcWindow, IfcRoof, IfcStair, IfcStairFlight, IfcRamp, IfcRampFlight, IfcRailing, IfcCovering, IfcFurnishingElement, IfcSpace, IfcShadingDevice, IfcChimney, IfcBuildingElementProxy] +structure: [IfcBeam, IfcColumn, IfcFooting, IfcPile, IfcMember, IfcPlate, IfcReinforcingElement, IfcSlab, IfcStructuralItem, IfcStructuralActivity, IfcTendon, IfcTendonAnchor] +mep: [IfcDistributionElement, IfcDistributionFlowElement, IfcDistributionControlElement, IfcFlowSegment, IfcFlowFitting, IfcFlowTerminal, IfcFlowController, IfcFlowMovingDevice, IfcFlowStorageDevice, IfcFlowTreatmentDevice, IfcEnergyConversionDevice, IfcElectricalElement, IfcDistributionPort] +civil: [IfcRoad, IfcBridge, IfcRailway, IfcMarineFacility, IfcAlignment, IfcEarthworksElement, IfcPavement, IfcKerb, IfcCourse, IfcGeotechnicalElement, IfcSign, IfcSignal, IfcTrackElement, IfcMooringDevice, IfcNavigationElement, IfcBridgePart, IfcRoadPart, IfcRailwayPart, IfcMarinePart, IfcFacility, IfcFacilityPart, IfcCivilElement, IfcGeographicElement] diff --git a/crates/core/data/i18n/en.json b/crates/core/data/i18n/en.json new file mode 100644 index 0000000..fad120f --- /dev/null +++ b/crates/core/data/i18n/en.json @@ -0,0 +1,110 @@ +{ + "report.title": "VeriModel quality report", + "report.subtitle": "Your model does not pass unless it proves it passes.", + "report.summary": "Summary", + "report.score": "Score", + "report.verdict": "Verdict", + "report.verdict_rule": "How the verdict is decided", + "report.elements_checked": "Elements checked", + "report.errors": "Errors", + "report.warnings": "Warnings", + "report.infos": "Info", + "report.rules": "Checks", + "report.rules_passed": "Passed", + "report.rules_failed": "Failed", + "report.rules_skipped": "Skipped", + "report.rules_not_applicable": "Not applicable", + "report.failures": "Failures", + "report.qto": "Quantities", + "report.ids": "IDS requirements", + "report.clash": "Clash detection", + "report.model": "Model", + "report.file": "File", + "report.schema": "Schema", + "report.units": "Units", + "report.sha256": "SHA-256", + "report.storeys": "Storeys", + "report.disciplines": "Disciplines", + "report.authoring_tool": "Authoring tool", + "report.config": "Configuration used", + "report.rule_id": "Rule", + "report.category": "Category", + "report.description": "Description", + "report.severity": "Severity", + "report.status": "Status", + "report.checked": "Checked", + "report.failures_count": "Failures", + "report.reason": "Reason", + "report.global_id": "GlobalId", + "report.ifc_type": "Type", + "report.name": "Name", + "report.storey": "Storey", + "report.message": "Problem", + "report.expected": "Expected", + "report.actual": "Actual", + "report.fix_hint": "How to fix", + "report.source": "Source", + "report.group": "Group", + "report.count": "Count", + "report.volume": "Volume (m³)", + "report.area": "Area (m²)", + "report.length": "Length (m)", + "report.weight": "Weight (kg)", + "report.cost": "Cost", + "report.rate": "Rate", + "report.rate_source": "Rate source", + "report.total": "Total", + "report.method": "How totals were computed", + "report.samples": "Hand-check samples", + "report.quantity_source": "Source", + "report.source.base_quantity": "Base quantity (IfcElementQuantity)", + "report.source.geometry": "Computed from geometry", + "report.source.none": "Not available", + "report.no_failures": "No failures. The model passed every check that ran.", + "report.no_quantities": "No quantities could be extracted.", + "report.ids_specification": "Specification", + "report.ids_requirement": "Requirement", + "report.ids_applicable": "Applicable elements", + "report.generated_by": "Generated by", + "report.bcf_link": "Issues are also exported as BCF (issues.bcfzip) for any BCF-compatible tool.", + "report.skipped_note": "Skipped checks could not run (reason shown) and are never counted as passed.", + "status.PASS": "PASS", + "status.FAIL": "FAIL", + "status.SKIPPED": "SKIPPED", + "status.NOT_APPLICABLE": "N/A", + "verdict.PASS": "PASS", + "verdict.PASS_WITH_WARNINGS": "PASS WITH WARNINGS", + "verdict.FAIL": "FAIL", + "severity.ERROR": "Error", + "severity.WARNING": "Warning", + "severity.INFO": "Info", + "bcf.title": "[{rule}] {message}", + "bcf.description": "Rule: {rule} — {description}\nElement: {type} '{name}' ({global_id})\nStorey: {storey}\nExpected: {expected}\nActual: {actual}\nHow to fix: {fix_hint}", + "bcf.topic_type": "Issue", + "bcf.status_open": "Open", + "bcf.priority.ERROR": "High", + "bcf.priority.WARNING": "Normal", + "bcf.priority.INFO": "Low", + "clash.not_implemented": "Clash detection is planned for a later version. The configuration and the CLI command are in place; no clashes were computed in this run.", + "clash.disabled": "Clash detection is disabled in project.yaml (clash.enabled: false).", + "report.unit": "Unit", + "report.amount": "Amount", + "report.rate_code": "Rate code", + "report.classification": "Classification", + "report.material": "Material", + "report.predefined_type": "Predefined type", + "report.type_name": "Type name", + "report.quantity_sets": "Quantity sets", + "report.elements_without_quantities": "Elements without any quantity", + "report.failures_truncated": "Showing the first {shown} of {total} failures. The other {more} are listed in failures.csv.", + "report.filter_placeholder": "Filter failures (GlobalId, type, name, rule…)", + "report.filter_all_severities": "All severities", + "report.filter_count": "{shown} of {total} rows shown", + "report.ids_result": "Result", + "report.ids_failed_entities": "Failed elements", + "report.ids_summary": "{passed} of {total} specifications passed.", + "report.project": "Project", + "report.element_count": "Elements in file", + "report.reader_warnings": "Reader warnings", + "report.no_rules": "No checks ran." +} diff --git a/crates/core/data/i18n/es.json b/crates/core/data/i18n/es.json new file mode 100644 index 0000000..559eecb --- /dev/null +++ b/crates/core/data/i18n/es.json @@ -0,0 +1,110 @@ +{ + "report.title": "Informe de calidad VeriModel", + "report.subtitle": "Tu modelo no pasa a menos que demuestre que pasa.", + "report.summary": "Resumen", + "report.score": "Puntuación", + "report.verdict": "Veredicto", + "report.verdict_rule": "Cómo se decide el veredicto", + "report.elements_checked": "Elementos comprobados", + "report.errors": "Errores", + "report.warnings": "Avisos", + "report.infos": "Información", + "report.rules": "Comprobaciones", + "report.rules_passed": "Superadas", + "report.rules_failed": "Fallidas", + "report.rules_skipped": "Omitidas", + "report.rules_not_applicable": "No aplicables", + "report.failures": "Fallos", + "report.qto": "Mediciones", + "report.ids": "Requisitos IDS", + "report.clash": "Detección de colisiones", + "report.model": "Modelo", + "report.file": "Archivo", + "report.schema": "Esquema", + "report.units": "Unidades", + "report.sha256": "SHA-256", + "report.storeys": "Plantas", + "report.disciplines": "Disciplinas", + "report.authoring_tool": "Herramienta de autoría", + "report.config": "Configuración utilizada", + "report.rule_id": "Regla", + "report.category": "Categoría", + "report.description": "Descripción", + "report.severity": "Severidad", + "report.status": "Estado", + "report.checked": "Comprobados", + "report.failures_count": "Fallos", + "report.reason": "Motivo", + "report.global_id": "GlobalId", + "report.ifc_type": "Tipo", + "report.name": "Nombre", + "report.storey": "Planta", + "report.message": "Problema", + "report.expected": "Esperado", + "report.actual": "Encontrado", + "report.fix_hint": "Cómo corregirlo", + "report.source": "Origen", + "report.group": "Grupo", + "report.count": "Cantidad", + "report.volume": "Volumen (m³)", + "report.area": "Área (m²)", + "report.length": "Longitud (m)", + "report.weight": "Peso (kg)", + "report.cost": "Coste", + "report.rate": "Precio unitario", + "report.rate_source": "Origen del precio", + "report.total": "Total", + "report.method": "Cómo se calcularon los totales", + "report.samples": "Muestras para comprobación manual", + "report.quantity_source": "Origen", + "report.source.base_quantity": "Cantidad base (IfcElementQuantity)", + "report.source.geometry": "Calculado a partir de la geometría", + "report.source.none": "No disponible", + "report.no_failures": "Sin fallos. El modelo superó todas las comprobaciones ejecutadas.", + "report.no_quantities": "No se pudieron extraer cantidades.", + "report.ids_specification": "Especificación", + "report.ids_requirement": "Requisito", + "report.ids_applicable": "Elementos aplicables", + "report.generated_by": "Generado por", + "report.bcf_link": "Los fallos también se exportan como BCF (issues.bcfzip) para cualquier herramienta compatible con BCF.", + "report.skipped_note": "Las comprobaciones omitidas no pudieron ejecutarse (se indica el motivo) y nunca cuentan como superadas.", + "status.PASS": "SUPERADA", + "status.FAIL": "FALLIDA", + "status.SKIPPED": "OMITIDA", + "status.NOT_APPLICABLE": "N/A", + "verdict.PASS": "APROBADO", + "verdict.PASS_WITH_WARNINGS": "APROBADO CON AVISOS", + "verdict.FAIL": "NO APROBADO", + "severity.ERROR": "Error", + "severity.WARNING": "Aviso", + "severity.INFO": "Información", + "bcf.title": "[{rule}] {message}", + "bcf.description": "Regla: {rule} — {description}\nElemento: {type} '{name}' ({global_id})\nPlanta: {storey}\nEsperado: {expected}\nEncontrado: {actual}\nCómo corregirlo: {fix_hint}", + "bcf.topic_type": "Incidencia", + "bcf.status_open": "Abierta", + "bcf.priority.ERROR": "Alta", + "bcf.priority.WARNING": "Normal", + "bcf.priority.INFO": "Baja", + "clash.not_implemented": "La detección de colisiones está prevista para una versión posterior. La configuración y el comando CLI existen; en esta ejecución no se calcularon colisiones.", + "clash.disabled": "La detección de colisiones está desactivada en project.yaml (clash.enabled: false).", + "report.unit": "Unidad", + "report.amount": "Importe", + "report.rate_code": "Código de precio", + "report.classification": "Clasificación", + "report.material": "Material", + "report.predefined_type": "Tipo predefinido", + "report.type_name": "Nombre de tipo", + "report.quantity_sets": "Conjuntos de cantidades", + "report.elements_without_quantities": "Elementos sin ninguna cantidad", + "report.failures_truncated": "Se muestran los primeros {shown} de {total} fallos. Los {more} restantes están en failures.csv.", + "report.filter_placeholder": "Filtrar fallos (GlobalId, tipo, nombre, regla…)", + "report.filter_all_severities": "Todas las severidades", + "report.filter_count": "{shown} de {total} filas visibles", + "report.ids_result": "Resultado", + "report.ids_failed_entities": "Elementos que fallan", + "report.ids_summary": "{passed} de {total} especificaciones superadas.", + "report.project": "Proyecto", + "report.element_count": "Elementos en el archivo", + "report.reader_warnings": "Avisos de lectura", + "report.no_rules": "No se ejecutó ninguna comprobación." +} diff --git a/crates/core/data/report.css b/crates/core/data/report.css new file mode 100644 index 0000000..868b596 --- /dev/null +++ b/crates/core/data/report.css @@ -0,0 +1,88 @@ +/* VeriModel report.html stylesheet. Inlined into the report at build time: + the report is a single self-contained file (no CDN, no web fonts). */ +:root { + --ink: #1d2330; + --muted: #5b6475; + --line: #e2e6ee; + --soft: #f6f8fb; + --paper: #ffffff; + --error: #b42318; + --error-bg: #fdecea; + --warning: #9a6700; + --warning-bg: #fff4d6; + --pass: #1a7f37; + --pass-bg: #e6f4ea; + --info: #57606a; + --info-bg: #eef0f3; +} +* { box-sizing: border-box; } +html { -webkit-text-size-adjust: 100%; } +body { + margin: 0; + background: var(--soft); + color: var(--ink); + font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; + font-size: 15px; + line-height: 1.5; +} +main { max-width: 1240px; margin: 0 auto; padding: 40px 32px 64px; } +header.top { margin-bottom: 32px; } +header.top h1 { font-size: 28px; margin: 0 0 4px; letter-spacing: -0.01em; } +header.top .tagline { color: var(--muted); margin: 0 0 24px; font-style: italic; } +section { background: var(--paper); border: 1px solid var(--line); border-radius: 10px; padding: 24px 28px; margin: 0 0 28px; } +section h2 { font-size: 19px; margin: 0 0 16px; } +section h3 { font-size: 16px; margin: 28px 0 12px; } +p.note { color: var(--muted); margin: 12px 0 0; font-size: 14px; } +dl.facts { display: grid; grid-template-columns: max-content 1fr; gap: 6px 24px; margin: 0; } +dl.facts dt { color: var(--muted); } +dl.facts dd { margin: 0; overflow-wrap: anywhere; } +.mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; font-size: 13px; } +.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 16px; } +.card { border: 1px solid var(--line); border-radius: 10px; padding: 16px 18px; background: var(--paper); } +.card .label { color: var(--muted); font-size: 13px; text-transform: uppercase; letter-spacing: 0.04em; } +.card .value { font-size: 28px; font-weight: 650; margin-top: 4px; font-variant-numeric: tabular-nums; } +.card.score .value { font-size: 44px; line-height: 1.1; } +.card.verdict .value { font-size: 18px; margin-top: 10px; } +.card.errors .value { color: var(--error); } +.card.warnings .value { color: var(--warning); } +.card.infos .value { color: var(--info); } +.verdict-rule { margin: 20px 0 0; padding: 14px 18px; background: var(--soft); border-left: 4px solid var(--line); border-radius: 6px; } +.verdict-rule strong { display: block; margin-bottom: 4px; } +.badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 12px; font-weight: 650; letter-spacing: 0.03em; white-space: nowrap; border: 1px solid transparent; } +.badge.big { font-size: 16px; padding: 6px 16px; } +.b-error, .b-fail { color: var(--error); background: var(--error-bg); border-color: #f4c7c3; } +.b-warning, .b-pww { color: var(--warning); background: var(--warning-bg); border-color: #f0d68a; } +.b-pass { color: var(--pass); background: var(--pass-bg); border-color: #b7dfc2; } +.b-info, .b-skipped, .b-na, .b-none { color: var(--info); background: var(--info-bg); border-color: #d5d9df; } +.table-wrap { overflow-x: auto; } +table { width: 100%; border-collapse: collapse; font-size: 14px; } +th, td { text-align: left; vertical-align: top; padding: 8px 10px; border-bottom: 1px solid var(--line); } +th { background: var(--soft); font-weight: 600; color: var(--muted); font-size: 13px; position: sticky; top: 0; } +td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; } +tr.total td { font-weight: 650; border-top: 2px solid var(--ink); background: var(--soft); } +td.gid { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12.5px; white-space: nowrap; } +td.hint { color: var(--muted); } +.src { color: var(--muted); font-size: 12px; white-space: normal; } +blockquote { margin: 6px 0; padding: 4px 12px; border-left: 3px solid var(--line); color: var(--ink); } +.filters { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; margin: 0 0 14px; } +.filters input, .filters select { font: inherit; padding: 6px 10px; border: 1px solid var(--line); border-radius: 6px; background: var(--paper); color: var(--ink); } +.filters input { flex: 1 1 280px; } +.filters .count { color: var(--muted); font-size: 13px; } +.method { white-space: pre-wrap; background: var(--soft); padding: 14px 18px; border-radius: 6px; margin: 0; font-size: 14px; } +.empty { color: var(--muted); font-style: italic; } +footer { color: var(--muted); font-size: 13px; text-align: center; margin-top: 40px; } +footer p { margin: 4px 0; } +@media (max-width: 720px) { + main { padding: 20px 14px 40px; } + section { padding: 18px 16px; } +} +@media print { + body { background: #fff; font-size: 11pt; } + main { max-width: none; padding: 0; } + section { border: none; padding: 0; margin: 0 0 18pt; break-inside: auto; } + .filters { display: none; } + th { position: static; } + tr { break-inside: avoid; } + .badge { border-color: currentColor; } + a { color: inherit; text-decoration: none; } +} diff --git a/crates/core/rule_packs/generic.yaml b/crates/core/rule_packs/generic.yaml new file mode 100644 index 0000000..7b81b87 --- /dev/null +++ b/crates/core/rule_packs/generic.yaml @@ -0,0 +1,170 @@ +# VeriModel built-in generic rule pack. +# +# This file is DATA, not code: it is the default set of checks applied to any +# IFC model when project.yaml does not name a custom pack. Every rule can be +# disabled from project.yaml (checks.rules / checks.categories) and every +# threshold is read from project.yaml through "$config." references. +# +# Rule anatomy: +# id stable identifier shown in reports and BCF titles +# category identity | spatial | properties | geometry | classification | naming | sanity | schema +# severity error | warning | info +# scope which elements the rule looks at (IFC type or supertype, exclusions, filters) +# check one of the engine's check kinds plus its parameters +# fix_hint plain-language advice for the modeller +# enabled_if optional "$config." gate +name: generic +version: 1 +description: Generic quality gate for any IFC model (IFC2x3 / IFC4 / IFC4.3), any discipline. +rules: + # --- A. Identity & uniqueness --------------------------------------------- + - id: ID-001 + category: identity + description: Every element must have a unique GlobalId + severity: error + scope: { ifc_types: [IfcProduct], include_spatial: true } + check: { kind: unique_global_id } + fix_hint: Regenerate the GlobalId of the duplicated element in the authoring tool, or remove the duplicate copy. + + - id: ID-002 + category: identity + description: Every GlobalId must be a valid 22-character IFC identifier + severity: error + scope: { ifc_types: [IfcProduct], include_spatial: true } + check: { kind: valid_global_id } + fix_hint: Re-export the model; a malformed GlobalId usually comes from a hand-edited or truncated file. + + - id: ID-003 + category: identity + description: Element names must be unique within the same type and storey + severity: warning + scope: { ifc_types: [IfcElement] } + check: { kind: unique_name } + fix_hint: Give each element a distinct name (type + number), or disable this rule in project.yaml if names are intentionally shared. + + # --- B. Spatial hierarchy ------------------------------------------------ + - id: SP-001 + category: spatial + description: Every element must be contained in a spatial structure element (storey, space, site, facility part) + severity: error + scope: { ifc_types: [IfcElement], exclude_types: [IfcFeatureElement, IfcVirtualElement] } + check: { kind: contained_in_spatial_structure } + fix_hint: Assign the element to a level / storey in the authoring tool before exporting. + + - id: SP-002 + category: spatial + description: The container of every element must exist in the spatial hierarchy + severity: error + scope: { ifc_types: [IfcElement] } + check: { kind: container_exists } + fix_hint: The element points to a storey that is not aggregated into a building or site; fix the level hierarchy. + + - id: SP-003 + category: spatial + description: The model must declare a site, a building or facility, and at least one storey or facility part + severity: warning + scope: { include_spatial: true } + check: + kind: spatial_hierarchy + require: + - [IfcSite] + - [IfcBuilding, IfcFacility, IfcBridge, IfcRoad, IfcRailway, IfcMarineFacility] + - [IfcBuildingStorey, IfcFacilityPart, IfcBridgePart, IfcRoadPart, IfcRailwayPart, IfcMarinePart] + fix_hint: Export with the full Site > Building > Storey (or Facility > Facility Part) structure enabled. + + - id: SP-004 + category: spatial + description: Elements must not be far from the project origin + severity: warning + scope: { ifc_types: [IfcElement] } + check: { kind: distance_from_origin, max_m: "$config.tolerances.far_from_origin_m" } + fix_hint: Move the model close to the origin or set the shared coordinates correctly; far geometry causes precision problems in viewers. + + # --- D. Properties & data completeness -------------------------------------- + - id: PR-001 + category: properties + description: Properties that exist must carry a value (no empty or null values) + severity: warning + scope: { ifc_types: [IfcElement] } + check: { kind: no_empty_properties } + fix_hint: Fill in the empty property or remove it from the export mapping. + + # --- E. Geometry health ----------------------------------------------------- + - id: GEO-001 + category: geometry + description: Physical elements must have a geometric representation + severity: warning + scope: { ifc_types: [IfcElement], exclude_types: [IfcFeatureElement, IfcVirtualElement, IfcAnnotation] } + check: { kind: has_geometry } + fix_hint: The element has no 3D body; check that its geometry is not hidden or filtered out of the export. + + - id: GEO-002 + category: geometry + description: Elements with a representation must produce a non-degenerate shape (volume or area above tolerance) + severity: error + scope: { ifc_types: [IfcElement], exclude_types: [IfcFeatureElement, IfcVirtualElement, IfcAnnotation] } + check: + kind: non_degenerate_geometry + min_volume_m3: "$config.tolerances.geometry.min_volume_m3" + min_area_m2: "$config.tolerances.geometry.min_area_m2" + fix_hint: The element's solid collapsed to zero volume (for example a wall with zero thickness or height). Fix the geometry in the authoring tool. + + - id: GEO-003 + category: geometry + description: Element bounding boxes must stay within the configured project bounds + severity: warning + scope: { ifc_types: [IfcElement] } + check: { kind: bbox_within_bounds, max_extent_m: "$config.tolerances.geometry.max_extent_m" } + fix_hint: An element larger than the whole project usually means a unit mismatch or a stray stretched solid. + + # --- F. Classification & naming ------------------------------------------- + - id: CL-001 + category: classification + description: Elements must carry a classification reference from the configured system + severity: error + enabled_if: "$config.classification.required" + scope: { ifc_types: [IfcElement] } + check: { kind: classification_exists, system: "$config.project.classification_system" } + fix_hint: Assign a classification code (Uniclass, OmniClass, CCI, DIN 276...) to the element or its type. + + - id: CL-002 + category: classification + description: Classification codes must belong to the configured classification list or pattern + severity: warning + scope: { ifc_types: [IfcElement] } + check: { kind: classification_code_allowed } + fix_hint: Use a code from the project's classification table (classification.allowed_codes / allowed_codes_file / code_pattern in project.yaml). + + - id: NAM-001 + category: naming + description: Element names must follow the project naming convention + severity: warning + scope: { ifc_types: [IfcElement] } + check: { kind: name_matches } + fix_hint: Rename the element according to the pattern defined in naming.patterns of project.yaml. + + # --- G. Type-specific sanity (quantity driven) ----------------------------- + - id: QT-001 + category: sanity + description: Elements that report a volume must report a positive volume + severity: warning + scope: { ifc_types: [IfcElement], exclude_types: [IfcFeatureElement, IfcVirtualElement, IfcAnnotation] } + check: { kind: quantity_positive, quantity: volume, min: "$config.tolerances.geometry.min_volume_m3" } + fix_hint: A zero volume means the base quantity or the solid is wrong; re-export quantities or fix the geometry. + + - id: QT-002 + category: sanity + description: Elements that report an area must report a positive area + severity: warning + scope: { ifc_types: [IfcElement], exclude_types: [IfcFeatureElement, IfcVirtualElement, IfcAnnotation] } + check: { kind: quantity_positive, quantity: area, min: "$config.tolerances.geometry.min_area_m2" } + fix_hint: A zero area usually means a collapsed surface or a wrong quantity export. + + # --- Schema ------------------------------------------------------------------- + - id: SCH-001 + category: schema + description: The IFC schema of the file must be one the project accepts + severity: error + scope: { include_spatial: true } + check: { kind: schema_allowed } + fix_hint: Export in one of the schemas listed in project.ifc_versions, or add this schema to the list. diff --git a/crates/core/src/audit.rs b/crates/core/src/audit.rs new file mode 100644 index 0000000..265aa62 --- /dev/null +++ b/crates/core/src/audit.rs @@ -0,0 +1,51 @@ +//! Append-only audit log (`audit.log`): one line per event, never rewritten. + +use std::io::Write; +use std::path::{Path, PathBuf}; + +use crate::error::CoreResult; + +/// Writer for `audit.log`. Each line: `\t\t
`. +pub struct AuditLog { + path: PathBuf, +} + +impl AuditLog { + pub fn open(dir: &Path) -> CoreResult { + std::fs::create_dir_all(dir)?; + Ok(AuditLog { + path: dir.join("audit.log"), + }) + } + + pub fn path(&self) -> &Path { + &self.path + } + + /// Append one event. Errors are returned, never swallowed, so a run cannot silently lose its trail. + pub fn record(&self, event: &str, details: &str) -> CoreResult<()> { + let mut f = std::fs::OpenOptions::new() + .create(true) + .append(true) + .open(&self.path)?; + let ts = chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Millis, true); + writeln!(f, "{ts}\t{event}\t{}", details.replace('\n', " "))?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn appends_lines() { + let dir = tempfile::tempdir().unwrap(); + let log = AuditLog::open(dir.path()).unwrap(); + log.record("start", "a").unwrap(); + log.record("end", "b\nc").unwrap(); + let text = std::fs::read_to_string(log.path()).unwrap(); + let lines: Vec<_> = text.lines().collect(); + assert_eq!(lines.len(), 2); + assert!(lines[1].ends_with("end\tb c")); + } +} diff --git a/crates/core/src/bcf.rs b/crates/core/src/bcf.rs new file mode 100644 index 0000000..89ae955 --- /dev/null +++ b/crates/core/src/bcf.rs @@ -0,0 +1,1488 @@ +//! BCF writer (BIM Collaboration Format) and the matching `issues.csv`. +//! +//! * [`write_bcfzip`] writes a BCF 2.1 (`output.bcf_version == "2.1"`, the +//! default) or BCF 3.0 (`"3.0"`) archive following the buildingSMART +//! BCF-XML schemas (`release_2_1` / `release_3_0`): +//! - `bcf.version` at the root (identical in content to the official file), +//! - BCF 3.0 only: `extensions.xml` (required by 3.0) listing every topic +//! type, status, priority, label and user used in the archive, +//! - one folder per topic named after the lowercase topic GUID, holding +//! `markup.bcf` and, when there is something to show, `viewpoint.bcfv`. +//! +//! One topic is written per ERROR or WARNING finding (INFO is skipped), in +//! the order of `report.findings` (already sorted by the engine). +//! No snapshots are written: VeriModel has no renderer, and a viewpoint +//! never references a snapshot file that does not exist. +//! * [`write_issues_csv`] writes one RFC 4180 row per BCF topic, with the +//! same topic GUIDs, titles and descriptions as the archive. +//! +//! Determinism: topic GUIDs are UUID v5 values derived from the IFC SHA-256, +//! rule id, GlobalId and message, so re-running on the same file yields the +//! same GUIDs. Zip entries use a fixed timestamp, fixed permissions and a +//! fixed order, so two archives of the same report differ only in the +//! `CreationDate` of the topics (the real UTC time of the export). +//! +//! Camera: when the related element has a bounding box, the viewpoint holds +//! a perspective camera looking at the box centre from the south-west and +//! above, far enough away for the whole box to fit in a 60 degree field of +//! view. Without element geometry, BCF 2.1 viewpoints carry only the +//! component selection (the camera is optional in 2.1). BCF 3.0 requires a +//! camera in every viewpoint, so 3.0 falls back to framing the bounding box +//! of the whole model, and writes no viewpoint when the model has no +//! geometry at all. + +use std::collections::{BTreeSet, HashMap}; +use std::io::{Cursor, Write}; +use std::path::Path; + +use chrono::{DateTime, Utc}; +use uuid::Uuid; +use zip::write::SimpleFileOptions; +use zip::{CompressionMethod, ZipWriter}; + +use crate::config::{Config, Language}; +use crate::error::{CoreError, CoreResult}; +use crate::i18n::Strings; +use crate::model::{ + format_number, Element, Finding, Geometry, Model, RuleResult, RunReport, Severity, +}; + +/// Numbers reported after writing a BCF file. +#[derive(Debug, Clone, Default, PartialEq, serde::Serialize, serde::Deserialize)] +pub struct BcfStats { + /// Number of topics written (one per ERROR/WARNING finding). + pub topics: usize, + /// Number of topics that carry a `viewpoint.bcfv` file. + pub with_viewpoint: usize, + /// BCF version actually written ("2.1" or "3.0"). + pub version: String, +} + +/// Write `issues.bcfzip`. +pub fn write_bcfzip( + report: &RunReport, + model: &Model, + config: &Config, + out_path: &Path, +) -> CoreResult { + let (bytes, stats) = build_bcfzip(report, model, config, Utc::now())?; + std::fs::write(out_path, bytes) + .map_err(|e| CoreError::Io(format!("cannot write {}: {e}", out_path.display())))?; + Ok(stats) +} + +/// Write `issues.csv` (one row per ERROR/WARNING finding, i.e. one row per BCF topic). +/// +/// Columns: severity, rule_id, topic_guid, global_id, ifc_type, name, storey, +/// title, description, expected, actual, fix_hint. The language of title and +/// description is `output.language` of the configuration embedded in the report. +pub fn write_issues_csv(report: &RunReport, out_path: &Path) -> CoreResult { + let strings = Strings::for_language(report_language(report)); + let issues = collect_issues(report, &strings); + let mut wtr = csv::WriterBuilder::new() + .terminator(csv::Terminator::CRLF) + .from_writer(Vec::new()); + let csv_err = |e: csv::Error| CoreError::Report(format!("cannot write issues.csv: {e}")); + wtr.write_record([ + "severity", + "rule_id", + "topic_guid", + "global_id", + "ifc_type", + "name", + "storey", + "title", + "description", + "expected", + "actual", + "fix_hint", + ]) + .map_err(csv_err)?; + for issue in &issues { + let f = issue.finding; + let opt = |o: &Option| o.clone().unwrap_or_default(); + wtr.write_record([ + f.severity.as_str().to_string(), + f.rule_id.clone(), + issue.guid.to_string(), + opt(&f.global_id), + opt(&f.ifc_type), + opt(&f.name), + opt(&f.storey), + issue.title.clone(), + issue.description.clone(), + opt(&f.expected), + opt(&f.actual), + opt(&f.fix_hint), + ]) + .map_err(csv_err)?; + } + let bytes = wtr + .into_inner() + .map_err(|e| CoreError::Report(format!("cannot write issues.csv: {e}")))?; + std::fs::write(out_path, bytes) + .map_err(|e| CoreError::Io(format!("cannot write {}: {e}", out_path.display())))?; + Ok(issues.len()) +} + +// --------------------------------------------------------------------------- +// Version handling +// --------------------------------------------------------------------------- + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum BcfVersion { + V21, + V30, +} + +impl BcfVersion { + /// Parse `output.bcf_version`. Unknown values fall back to 2.1 with a warning. + fn from_config(value: &str) -> BcfVersion { + match value.trim() { + "2.1" | "2.1.0" | "21" => BcfVersion::V21, + "3.0" | "3" | "3.0.0" | "30" => BcfVersion::V30, + other => { + log::warn!("output.bcf_version '{other}' is not supported (use \"2.1\" or \"3.0\"); writing BCF 2.1"); + BcfVersion::V21 + } + } + } + + fn as_str(&self) -> &'static str { + match self { + BcfVersion::V21 => "2.1", + BcfVersion::V30 => "3.0", + } + } +} + +// --------------------------------------------------------------------------- +// Issues: the shared, language-resolved view of the findings exported as topics +// --------------------------------------------------------------------------- + +/// One BCF topic to write (also one row of `issues.csv`). +struct Issue<'a> { + finding: &'a Finding, + guid: Uuid, + title: String, + description: String, + priority: String, + labels: Vec, +} + +/// Placeholder for unknown values in titles and descriptions. +const NONE: &str = "-"; +/// Titles longer than this (in characters) are shortened; the description keeps the full text. +const MAX_TITLE_CHARS: usize = 250; + +/// Namespace of the deterministic topic GUIDs. +fn topic_namespace() -> Uuid { + Uuid::new_v5(&Uuid::NAMESPACE_URL, b"urn:verimodel:bcf:topic") +} + +/// Deterministic topic GUID: UUID v5 of (IFC SHA-256, rule id, GlobalId, message). +/// `occurrence` > 0 disambiguates identical findings (e.g. duplicated GlobalIds). +fn topic_guid(ifc_sha256: &str, finding: &Finding, occurrence: usize) -> Uuid { + let mut name = format!( + "{}\n{}\n{}\n{}", + ifc_sha256, + finding.rule_id, + finding.global_id.as_deref().unwrap_or(""), + finding.message + ); + if occurrence > 0 { + name.push_str(&format!("\n#{occurrence}")); + } + Uuid::new_v5(&topic_namespace(), name.as_bytes()) +} + +/// Viewpoint GUID, derived from the topic GUID. +fn viewpoint_guid(topic: &Uuid) -> Uuid { + Uuid::new_v5(topic, b"viewpoint") +} + +/// Language recorded in the report's effective configuration (`output.language`). +fn report_language(report: &RunReport) -> Language { + report + .config + .get("output") + .and_then(|o| o.get("language")) + .and_then(|l| serde_json::from_value::(l.clone()).ok()) + .unwrap_or_default() +} + +/// Substitute `{key}` placeholders in one pass (values are never re-scanned, +/// so a message containing `{name}` stays intact). +fn fill_template(template: &str, args: &[(&str, &str)]) -> String { + let mut out = String::with_capacity(template.len() + 64); + let mut rest = template; + while let Some(start) = rest.find('{') { + out.push_str(&rest[..start]); + let after = &rest[start + 1..]; + match after.find('}') { + Some(end) => { + let key = &after[..end]; + match args.iter().find(|(k, _)| *k == key) { + Some((_, v)) => out.push_str(v), + None => { + out.push('{'); + out.push_str(key); + out.push('}'); + } + } + rest = &after[end + 1..]; + } + None => { + out.push_str(&rest[start..]); + rest = ""; + } + } + } + out.push_str(rest); + out +} + +fn shorten(text: &str, max_chars: usize) -> String { + if text.chars().count() <= max_chars { + return text.to_string(); + } + let mut s: String = text.chars().take(max_chars.saturating_sub(1)).collect(); + s.push('…'); + s +} + +/// Findings exported as topics, in report order, with their GUIDs and texts. +fn collect_issues<'a>(report: &'a RunReport, strings: &Strings) -> Vec> { + let rules: HashMap<&str, &RuleResult> = report + .rules + .iter() + .map(|r| (r.rule_id.as_str(), r)) + .collect(); + let generated_by = format!( + "{} {} {}", + strings.get("report.generated_by"), + report.tool.name, + report.tool.version + ); + let mut seen: HashMap = HashMap::new(); + let mut out = Vec::new(); + for f in report + .findings + .iter() + .filter(|f| f.severity != Severity::Info) + { + let base = topic_guid(&report.model.sha256, f, 0); + let n = seen.entry(base).or_insert(0); + let guid = if *n == 0 { + base + } else { + topic_guid(&report.model.sha256, f, *n) + }; + *n += 1; + + let rule = rules.get(f.rule_id.as_str()).copied(); + let rule_description = rule + .map(|r| r.description.as_str()) + .filter(|d| !d.trim().is_empty()) + .unwrap_or(&f.message); + let or_none = |o: &Option| { + o.as_deref() + .filter(|s| !s.trim().is_empty()) + .unwrap_or(NONE) + .to_string() + }; + + let title = shorten( + &fill_template( + &strings.get("bcf.title"), + &[("rule", &f.rule_id), ("message", &f.message)], + ), + MAX_TITLE_CHARS, + ); + let body = fill_template( + &strings.get("bcf.description"), + &[ + ("rule", &f.rule_id), + ("description", rule_description), + ("message", &f.message), + ("type", &or_none(&f.ifc_type)), + ("name", &or_none(&f.name)), + ("global_id", &or_none(&f.global_id)), + ("storey", &or_none(&f.storey)), + ("expected", &or_none(&f.expected)), + ("actual", &or_none(&f.actual)), + ("fix_hint", &or_none(&f.fix_hint)), + ], + ); + let description = format!("{body}\n\n{generated_by}"); + let priority = strings.get(&format!("bcf.priority.{}", f.severity.as_str())); + + let mut labels: Vec = Vec::new(); + for l in [ + Some(report.tool.name.as_str()), + rule.map(|r| r.category.as_str()), + Some(f.rule_id.as_str()), + ] + .into_iter() + .flatten() + { + let l = l.trim(); + if !l.is_empty() && !labels.iter().any(|x| x == l) { + labels.push(l.to_string()); + } + } + out.push(Issue { + finding: f, + guid, + title, + description, + priority, + labels, + }); + } + out +} + +// --------------------------------------------------------------------------- +// Geometry -> camera +// --------------------------------------------------------------------------- + +/// Field of view written in viewpoints (degrees). BCF 2.1 restricts it to 45..=60. +const FIELD_OF_VIEW_DEG: f64 = 60.0; +/// Aspect ratio written in BCF 3.0 viewpoints (required there). With 1.0 the +/// horizontal (2.1) and vertical (3.0) field of view are the same angle. +const ASPECT_RATIO: f64 = 1.0; +/// Minimum radius framed around an element, so tiny or flat boxes stay readable (metres). +const MIN_FRAME_RADIUS_M: f64 = 0.5; + +#[derive(Debug, Clone, Copy, PartialEq)] +struct Camera { + position: [f64; 3], + direction: [f64; 3], + up: [f64; 3], +} + +fn is_valid_bbox(g: &Geometry) -> bool { + g.bbox_min + .iter() + .chain(g.bbox_max.iter()) + .all(|v| v.is_finite()) + && (0..3).all(|i| g.bbox_max[i] >= g.bbox_min[i]) +} + +/// Perspective camera framing a bounding box: looks at the centre from the +/// south-west and above (direction (1, 1, -1)), at the distance where the +/// box's bounding sphere fits in the field of view. +fn camera_for_bbox(min: [f64; 3], max: [f64; 3]) -> Option { + let g = Geometry { + bbox_min: min, + bbox_max: max, + ..Default::default() + }; + if !is_valid_bbox(&g) { + return None; + } + let c = g.centre(); + let e = g.extent(); + let radius = (0.5 * (e[0] * e[0] + e[1] * e[1] + e[2] * e[2]).sqrt()).max(MIN_FRAME_RADIUS_M); + let half_fov = (FIELD_OF_VIEW_DEG / 2.0).to_radians(); + let distance = radius / half_fov.sin() * 1.1; + let k = 1.0 / 3f64.sqrt(); + let direction = [k, k, -k]; + let position = [ + c[0] - direction[0] * distance, + c[1] - direction[1] * distance, + c[2] - direction[2] * distance, + ]; + // World Z projected onto the view plane: (0,0,1) - (z.d) d, normalised = (1,1,2)/sqrt(6). + let u = 1.0 / 6f64.sqrt(); + let up = [u, u, 2.0 * u]; + if position.iter().all(|v| v.is_finite()) { + Some(Camera { + position, + direction, + up, + }) + } else { + None + } +} + +/// Union of all element bounding boxes (used as the BCF 3.0 fallback camera). +fn model_bbox(model: &Model) -> Option<([f64; 3], [f64; 3])> { + let mut acc: Option<([f64; 3], [f64; 3])> = None; + for g in model + .elements + .iter() + .filter_map(|e| e.geometry.as_ref()) + .filter(|g| is_valid_bbox(g)) + { + acc = Some(match acc { + None => (g.bbox_min, g.bbox_max), + Some((mn, mx)) => ( + [ + mn[0].min(g.bbox_min[0]), + mn[1].min(g.bbox_min[1]), + mn[2].min(g.bbox_min[2]), + ], + [ + mx[0].max(g.bbox_max[0]), + mx[1].max(g.bbox_max[1]), + mx[2].max(g.bbox_max[2]), + ], + ), + }); + } + acc +} + +/// True when `id` is a syntactically valid IfcGuid (22 chars of the IFC base64 alphabet), +/// the only form the BCF schemas accept in `IfcGuid` attributes. +fn is_ifc_guid(id: &str) -> bool { + id.len() == 22 + && id + .bytes() + .all(|b| b.is_ascii_alphanumeric() || b == b'_' || b == b'$') +} + +// --------------------------------------------------------------------------- +// Minimal XML writer (escaped, indented, deterministic) +// --------------------------------------------------------------------------- + +/// Drop characters that XML 1.0 does not allow (control characters other than tab/newline/CR). +fn xml_clean(s: &str) -> impl Iterator + '_ { + s.chars().filter(|&c| { + matches!(c, '\t' | '\n' | '\r') || (c >= ' ' && c != '\u{FFFE}' && c != '\u{FFFF}') + }) +} + +fn escape_text(s: &str) -> String { + let mut out = String::with_capacity(s.len()); + for c in xml_clean(s) { + match c { + '&' => out.push_str("&"), + '<' => out.push_str("<"), + '>' => out.push_str(">"), + '\r' => out.push_str(" "), + c => out.push(c), + } + } + out +} + +fn escape_attr(s: &str) -> String { + let mut out = String::with_capacity(s.len()); + for c in xml_clean(s) { + match c { + '&' => out.push_str("&"), + '<' => out.push_str("<"), + '>' => out.push_str(">"), + '"' => out.push_str("""), + '\'' => out.push_str("'"), + '\t' => out.push_str(" "), + '\n' => out.push_str(" "), + '\r' => out.push_str(" "), + c => out.push(c), + } + } + out +} + +struct Xml { + out: String, + depth: usize, +} + +impl Xml { + fn new() -> Self { + Xml { + out: String::from("\n"), + depth: 0, + } + } + + fn indent(&mut self) { + for _ in 0..self.depth { + self.out.push_str(" "); + } + } + + fn tag(&mut self, name: &str, attrs: &[(&str, &str)], self_closing: bool) { + self.indent(); + self.out.push('<'); + self.out.push_str(name); + for (k, v) in attrs { + self.out.push(' '); + self.out.push_str(k); + self.out.push_str("=\""); + self.out.push_str(&escape_attr(v)); + self.out.push('"'); + } + self.out.push_str(if self_closing { "/>\n" } else { ">\n" }); + } + + fn open(&mut self, name: &str, attrs: &[(&str, &str)]) { + self.tag(name, attrs, false); + self.depth += 1; + } + + fn empty(&mut self, name: &str, attrs: &[(&str, &str)]) { + self.tag(name, attrs, true); + } + + fn close(&mut self, name: &str) { + self.depth -= 1; + self.indent(); + self.out.push_str("\n"); + } + + fn leaf(&mut self, name: &str, text: &str) { + self.indent(); + self.out.push('<'); + self.out.push_str(name); + self.out.push('>'); + self.out.push_str(&escape_text(text)); + self.out.push_str("\n"); + } + + fn point(&mut self, name: &str, p: [f64; 3]) { + self.open(name, &[]); + self.leaf("X", &format_coord(p[0])); + self.leaf("Y", &format_coord(p[1])); + self.leaf("Z", &format_coord(p[2])); + self.close(name); + } + + fn finish(self) -> String { + self.out + } +} + +/// Coordinates with 9 decimals (sub-micrometre), trailing zeros trimmed, never "-0". +fn format_coord(v: f64) -> String { + let s = format!("{v:.9}"); + let s = s.trim_end_matches('0').trim_end_matches('.'); + if s == "-0" { + "0".to_string() + } else { + s.to_string() + } +} + +// --------------------------------------------------------------------------- +// Documents +// --------------------------------------------------------------------------- + +fn version_xml(version: BcfVersion) -> String { + // Same content as the official `bcf.version` of each release (the 3.0 element + // is written self-closing: its schema allows no content, not even whitespace). + match version { + BcfVersion::V21 => concat!( + "\n", + "\n", + " 2.1\n", + "\n" + ) + .to_string(), + BcfVersion::V30 => concat!( + "\n", + "\n" + ) + .to_string(), + } +} + +/// BCF 3.0 `extensions.xml`: every value used by the topics, sorted. +fn extensions_xml(issues: &[Issue], topic_type: &str, status: &str, author: &str) -> String { + let priorities: BTreeSet<&str> = issues.iter().map(|i| i.priority.as_str()).collect(); + let labels: BTreeSet<&str> = issues + .iter() + .flat_map(|i| i.labels.iter().map(|l| l.as_str())) + .collect(); + let mut x = Xml::new(); + x.open("Extensions", &[]); + x.open("TopicTypes", &[]); + x.leaf("TopicType", topic_type); + x.close("TopicTypes"); + x.open("TopicStatuses", &[]); + x.leaf("TopicStatus", status); + x.close("TopicStatuses"); + if !priorities.is_empty() { + x.open("Priorities", &[]); + for p in priorities { + x.leaf("Priority", p); + } + x.close("Priorities"); + } + if !labels.is_empty() { + x.open("TopicLabels", &[]); + for l in labels { + x.leaf("TopicLabel", l); + } + x.close("TopicLabels"); + } + x.open("Users", &[]); + x.leaf("User", author); + x.close("Users"); + x.close("Extensions"); + x.finish() +} + +/// Shared, per-archive values for markup files. +struct MarkupContext<'a> { + version: BcfVersion, + file_name: Option<&'a str>, + project_guid: Option<&'a str>, + topic_type: &'a str, + status: &'a str, + author: &'a str, + creation_date: &'a str, +} + +fn markup_xml( + ctx: &MarkupContext, + issue: &Issue, + index: usize, + element: Option<&Element>, + viewpoint: Option<&Uuid>, +) -> String { + let v30 = ctx.version == BcfVersion::V30; + let guid = issue.guid.to_string(); + let mut x = Xml::new(); + x.open("Markup", &[]); + + // Header: the IFC file the topic refers to. + if let Some(file_name) = ctx.file_name { + let spatial = element + .and_then(|e| e.container.as_ref()) + .map(|c| c.global_id.as_str()) + .filter(|g| is_ifc_guid(g)); + let mut attrs: Vec<(&str, &str)> = Vec::new(); + if let Some(p) = ctx.project_guid { + attrs.push(("IfcProject", p)); + } + if let Some(s) = spatial { + attrs.push(("IfcSpatialStructureElement", s)); + } + attrs.push((if v30 { "IsExternal" } else { "isExternal" }, "true")); + x.open("Header", &[]); + if v30 { + x.open("Files", &[]); + } + x.open("File", &attrs); + x.leaf("Filename", file_name); + x.close("File"); + if v30 { + x.close("Files"); + } + x.close("Header"); + } + + x.open( + "Topic", + &[ + ("Guid", &guid), + ("TopicType", ctx.topic_type), + ("TopicStatus", ctx.status), + ], + ); + x.leaf("Title", &issue.title); + x.leaf("Priority", &issue.priority); + if v30 { + // `Index` is deprecated in 3.0; topic order is the archive order. + x.open("Labels", &[]); + for l in &issue.labels { + x.leaf("Label", l); + } + x.close("Labels"); + } else { + x.leaf("Index", &index.to_string()); + for l in &issue.labels { + x.leaf("Labels", l); + } + } + x.leaf("CreationDate", ctx.creation_date); + x.leaf("CreationAuthor", ctx.author); + x.leaf("Description", &issue.description); + if v30 { + if let Some(vp) = viewpoint { + x.open("Viewpoints", &[]); + x.open("ViewPoint", &[("Guid", &vp.to_string())]); + x.leaf("Viewpoint", VIEWPOINT_FILE); + x.close("ViewPoint"); + x.close("Viewpoints"); + } + x.close("Topic"); + } else { + x.close("Topic"); + if let Some(vp) = viewpoint { + x.open("Viewpoints", &[("Guid", &vp.to_string())]); + x.leaf("Viewpoint", VIEWPOINT_FILE); + x.close("Viewpoints"); + } + } + x.close("Markup"); + x.finish() +} + +fn viewpoint_xml( + version: BcfVersion, + guid: &Uuid, + ifc_guid: Option<&str>, + camera: Option<&Camera>, +) -> String { + let mut x = Xml::new(); + x.open("VisualizationInfo", &[("Guid", &guid.to_string())]); + if let Some(g) = ifc_guid { + x.open("Components", &[]); + x.open("Selection", &[]); + x.empty("Component", &[("IfcGuid", g)]); + x.close("Selection"); + // Everything stays visible; the related element is selected. + x.empty("Visibility", &[("DefaultVisibility", "true")]); + x.close("Components"); + } + if let Some(c) = camera { + x.open("PerspectiveCamera", &[]); + x.point("CameraViewPoint", c.position); + x.point("CameraDirection", c.direction); + x.point("CameraUpVector", c.up); + x.leaf("FieldOfView", &format_number(FIELD_OF_VIEW_DEG)); + if version == BcfVersion::V30 { + x.leaf("AspectRatio", &format_number(ASPECT_RATIO)); + } + x.close("PerspectiveCamera"); + } + x.close("VisualizationInfo"); + x.finish() +} + +const VIEWPOINT_FILE: &str = "viewpoint.bcfv"; + +/// Index of elements by GlobalId (elements sharing a GlobalId keep model order). +fn element_index(model: &Model) -> HashMap<&str, Vec<&Element>> { + let mut map: HashMap<&str, Vec<&Element>> = HashMap::new(); + for e in &model.elements { + map.entry(e.global_id.as_str()).or_default().push(e); + } + map +} + +fn find_element<'m>(index: &HashMap<&str, Vec<&'m Element>>, f: &Finding) -> Option<&'m Element> { + let candidates = index.get(f.global_id.as_deref()?)?; + match f.step_id { + Some(step) => candidates + .iter() + .find(|e| e.step_id == step) + .or_else(|| candidates.first()) + .copied(), + None => candidates.first().copied(), + } +} + +/// GlobalId of the IfcProject, when the reader exposed it and it is a valid IfcGuid. +fn project_guid(model: &Model) -> Option<&str> { + let from_elements = model + .elements + .iter() + .find(|e| e.ifc_type.eq_ignore_ascii_case("IfcProject")) + .map(|e| e.global_id.as_str()); + let from_tree = || { + model + .info + .spatial_tree + .iter() + .flat_map(|n| n.walk()) + .find(|n| n.ifc_type.eq_ignore_ascii_case("IfcProject")) + .map(|n| n.global_id.as_str()) + }; + from_elements.or_else(from_tree).filter(|g| is_ifc_guid(g)) +} + +/// Build the whole archive in memory. `now` is the topics' CreationDate. +fn build_bcfzip( + report: &RunReport, + model: &Model, + config: &Config, + now: DateTime, +) -> CoreResult<(Vec, BcfStats)> { + let version = BcfVersion::from_config(&config.output.bcf_version); + let strings = Strings::for_language(config.output.language); + let issues = collect_issues(report, &strings); + + let topic_type = non_blank(strings.get("bcf.topic_type"), "Issue"); + let status = non_blank(strings.get("bcf.status_open"), "Open"); + let author = non_blank( + config.output.bcf_author.clone(), + &crate::config::OutputSection::default().bcf_author, + ); + let creation_date = now.format("%Y-%m-%dT%H:%M:%SZ").to_string(); + let file_name = Some(report.model.file_name.as_str()).filter(|s| !s.trim().is_empty()); + let ctx = MarkupContext { + version, + file_name, + project_guid: project_guid(model), + topic_type: &topic_type, + status: &status, + author: &author, + creation_date: &creation_date, + }; + + let index = element_index(model); + let fallback_camera = match version { + BcfVersion::V30 => model_bbox(model).and_then(|(mn, mx)| camera_for_bbox(mn, mx)), + BcfVersion::V21 => None, + }; + + let fixed_time = zip::DateTime::from_date_and_time(2000, 1, 1, 0, 0, 0) + .map_err(|e| CoreError::Bcf(format!("invalid zip timestamp: {e}")))?; + let file_opts = SimpleFileOptions::default() + .compression_method(CompressionMethod::Deflated) + .last_modified_time(fixed_time) + .unix_permissions(0o644); + let dir_opts = SimpleFileOptions::default() + .compression_method(CompressionMethod::Stored) + .last_modified_time(fixed_time) + .unix_permissions(0o755); + + let zip_err = + |e: zip::result::ZipError| CoreError::Bcf(format!("cannot write the BCF archive: {e}")); + let io_err = |e: std::io::Error| CoreError::Bcf(format!("cannot write the BCF archive: {e}")); + + let mut zip = ZipWriter::new(Cursor::new(Vec::new())); + zip.start_file("bcf.version", file_opts).map_err(zip_err)?; + zip.write_all(version_xml(version).as_bytes()) + .map_err(io_err)?; + if version == BcfVersion::V30 { + zip.start_file("extensions.xml", file_opts) + .map_err(zip_err)?; + zip.write_all(extensions_xml(&issues, &topic_type, &status, &author).as_bytes()) + .map_err(io_err)?; + } + + let mut with_viewpoint = 0; + for (i, issue) in issues.iter().enumerate() { + let element = find_element(&index, issue.finding); + let ifc_guid = issue + .finding + .global_id + .as_deref() + .filter(|g| is_ifc_guid(g)); + let element_camera = element + .and_then(|e| e.geometry.as_ref()) + .and_then(|g| camera_for_bbox(g.bbox_min, g.bbox_max)); + let camera = element_camera.or(fallback_camera); + let has_viewpoint = match version { + // 2.1: camera optional, a component-only viewpoint is valid. + BcfVersion::V21 => camera.is_some() || ifc_guid.is_some(), + // 3.0: a viewpoint must have a camera. + BcfVersion::V30 => camera.is_some(), + }; + let vp_guid = has_viewpoint.then(|| viewpoint_guid(&issue.guid)); + + let folder = issue.guid.to_string(); + zip.add_directory(format!("{folder}/"), dir_opts) + .map_err(zip_err)?; + zip.start_file(format!("{folder}/markup.bcf"), file_opts) + .map_err(zip_err)?; + zip.write_all(markup_xml(&ctx, issue, i + 1, element, vp_guid.as_ref()).as_bytes()) + .map_err(io_err)?; + if let Some(vp) = &vp_guid { + zip.start_file(format!("{folder}/{VIEWPOINT_FILE}"), file_opts) + .map_err(zip_err)?; + zip.write_all(viewpoint_xml(version, vp, ifc_guid, camera.as_ref()).as_bytes()) + .map_err(io_err)?; + with_viewpoint += 1; + } + } + let bytes = zip.finish().map_err(zip_err)?.into_inner(); + Ok(( + bytes, + BcfStats { + topics: issues.len(), + with_viewpoint, + version: version.as_str().to_string(), + }, + )) +} + +fn non_blank(value: String, fallback: &str) -> String { + if value.trim().is_empty() { + fallback.to_string() + } else { + value + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::model::{RuleSource, RuleStatus, SpatialRef}; + use quick_xml::events::Event; + use std::io::Read; + + const WALL_A: &str = "2O2Fr$t4X7Zf8NOew3FLOH"; + const WALL_B: &str = "1hOSvn6df7F8_7GcBWlRGQ"; + + fn finding(rule: &str, sev: Severity, gid: Option<&str>, msg: &str) -> Finding { + Finding { + rule_id: rule.into(), + severity: sev, + global_id: gid.map(Into::into), + step_id: None, + ifc_type: gid.map(|_| "IfcWall".into()), + name: gid.map(|_| "Wall & \"B\"".into()), + storey: Some("Level 1".into()), + message: msg.into(), + expected: Some("Pset_WallCommon.FireRating".into()), + actual: Some("missing".into()), + fix_hint: Some("Add the property".into()), + source: RuleSource::RulePack { + pack: "generic".into(), + }, + } + } + + fn rule(id: &str, sev: Severity) -> RuleResult { + RuleResult { + rule_id: id.into(), + category: "properties".into(), + description: format!("Description of {id}"), + severity: sev, + status: RuleStatus::Fail, + elements_checked: 2, + failures: 1, + skipped_reason: None, + source: RuleSource::RulePack { + pack: "generic".into(), + }, + } + } + + fn sample() -> (RunReport, Model) { + let model = Model { + info: crate::model::ModelInfo { + file_name: "sample.ifc".into(), + sha256: "ab".repeat(32), + ..Default::default() + }, + elements: vec![ + Element { + global_id: WALL_A.into(), + ifc_type: "IfcWall".into(), + container: Some(SpatialRef { + global_id: "3hOSvn6df7F8_7GcBWlRGQ".into(), + ifc_type: "IfcBuildingStorey".into(), + name: None, + }), + geometry: Some(Geometry { + bbox_min: [0.0, 0.0, 0.0], + bbox_max: [4.0, 0.2, 3.0], + ..Default::default() + }), + ..Default::default() + }, + Element { + global_id: WALL_B.into(), + ifc_type: "IfcWall".into(), + ..Default::default() + }, + ], + ids_results: None, + }; + let mut report = RunReport { + model: model.info.clone(), + config: Config::default().to_json_value(), + rules: vec![ + rule("PS-001", Severity::Error), + rule("NM-002", Severity::Warning), + rule("IN-003", Severity::Info), + ], + findings: vec![ + finding( + "PS-001", + Severity::Error, + Some(WALL_A), + "FireRating is missing", + ), + finding( + "NM-002", + Severity::Warning, + Some(WALL_B), + "Name does not match {pattern}", + ), + finding("IN-003", Severity::Info, Some(WALL_A), "Just information"), + finding("PS-001", Severity::Error, None, "Model has no IfcSite"), + ], + ..Default::default() + }; + report.normalise(); + (report, model) + } + + fn fixed_now() -> DateTime { + DateTime::parse_from_rfc3339("2026-01-02T03:04:05Z") + .unwrap() + .with_timezone(&Utc) + } + + fn entries(bytes: &[u8]) -> Vec<(String, String)> { + let mut zip = zip::ZipArchive::new(Cursor::new(bytes.to_vec())).unwrap(); + (0..zip.len()) + .map(|i| { + let mut f = zip.by_index(i).unwrap(); + let mut s = String::new(); + f.read_to_string(&mut s).unwrap(); + (f.name().to_string(), s) + }) + .collect() + } + + /// (local name, text, attributes) of one parsed XML element. + type XmlNode = (String, String, Vec<(String, String)>); + + /// Parse an XML document and return (element local name, text) pairs plus attributes, failing on malformed XML. + fn parse(xml: &str) -> Vec { + let mut reader = quick_xml::Reader::from_str(xml); + let mut stack: Vec = Vec::new(); + let mut out = Vec::new(); + loop { + match reader.read_event().expect("well-formed XML") { + Event::Start(e) => { + let attrs = e + .attributes() + .map(|a| { + let a = a.unwrap(); + ( + String::from_utf8(a.key.as_ref().to_vec()).unwrap(), + a.unescape_value().unwrap().to_string(), + ) + }) + .collect(); + stack.push(( + String::from_utf8(e.local_name().as_ref().to_vec()).unwrap(), + String::new(), + attrs, + )); + } + Event::Empty(e) => { + let attrs = e + .attributes() + .map(|a| { + let a = a.unwrap(); + ( + String::from_utf8(a.key.as_ref().to_vec()).unwrap(), + a.unescape_value().unwrap().to_string(), + ) + }) + .collect(); + out.push(( + String::from_utf8(e.local_name().as_ref().to_vec()).unwrap(), + String::new(), + attrs, + )); + } + Event::Text(t) => { + if let Some(top) = stack.last_mut() { + top.1.push_str(&t.unescape().unwrap()); + } + } + Event::End(_) => out.push(stack.pop().unwrap()), + Event::Eof => break, + _ => {} + } + } + assert!(stack.is_empty()); + out + } + + fn text_of(doc: &[XmlNode], name: &str) -> Option { + doc.iter() + .find(|(n, _, _)| n == name) + .map(|(_, t, _)| t.clone()) + } + + fn attr_of(doc: &[XmlNode], name: &str, attr: &str) -> Option { + doc.iter() + .find(|(n, _, _)| n == name) + .and_then(|(_, _, a)| a.iter().find(|(k, _)| k == attr).map(|(_, v)| v.clone())) + } + + #[test] + fn bcf21_archive_structure() { + let (report, model) = sample(); + let (bytes, stats) = + build_bcfzip(&report, &model, &Config::default(), fixed_now()).unwrap(); + assert_eq!(stats.version, "2.1"); + assert_eq!(stats.topics, 3, "INFO findings are skipped"); + let files = entries(&bytes); + assert_eq!(files[0].0, "bcf.version"); + let version = parse(&files[0].1); + assert_eq!( + attr_of(&version, "Version", "VersionId").as_deref(), + Some("2.1") + ); + assert_eq!(text_of(&version, "DetailedVersion").as_deref(), Some("2.1")); + + let folders: BTreeSet<&str> = files + .iter() + .filter(|(n, _)| n.ends_with('/')) + .map(|(n, _)| n.as_str()) + .collect(); + assert_eq!(folders.len(), 3); + let markups: Vec<&(String, String)> = files + .iter() + .filter(|(n, _)| n.ends_with("/markup.bcf")) + .collect(); + assert_eq!(markups.len(), 3); + + // Report order: errors first, model-level (no GlobalId) before element findings. + // Second topic: the error on WALL_A, which has geometry. + let first = &markups[1]; + let folder = first.0.trim_end_matches("/markup.bcf"); + let doc = parse(&first.1); + assert_eq!(attr_of(&doc, "Topic", "Guid").as_deref(), Some(folder)); + assert_eq!( + attr_of(&doc, "Topic", "TopicType").as_deref(), + Some("Issue") + ); + assert_eq!( + attr_of(&doc, "Topic", "TopicStatus").as_deref(), + Some("Open") + ); + assert_eq!( + text_of(&doc, "Title").as_deref(), + Some("[PS-001] FireRating is missing") + ); + assert_eq!(text_of(&doc, "Priority").as_deref(), Some("High")); + assert_eq!(text_of(&doc, "Index").as_deref(), Some("2")); + assert_eq!( + text_of(&doc, "CreationDate").as_deref(), + Some("2026-01-02T03:04:05Z") + ); + assert_eq!( + text_of(&doc, "CreationAuthor").as_deref(), + Some("verimodel@local") + ); + assert_eq!(text_of(&doc, "Filename").as_deref(), Some("sample.ifc")); + assert_eq!( + attr_of(&doc, "File", "IfcSpatialStructureElement").as_deref(), + Some("3hOSvn6df7F8_7GcBWlRGQ") + ); + let desc = text_of(&doc, "Description").unwrap(); + assert!(desc.contains("Description of PS-001"), "{desc}"); + assert!( + desc.contains("Wall & \"B\""), + "escaping round-trips: {desc}" + ); + assert!( + desc.contains(&format!("VeriModel {}", crate::VERSION)), + "{desc}" + ); + let labels: Vec = doc + .iter() + .filter(|(n, _, _)| n == "Labels") + .map(|(_, t, _)| t.clone()) + .collect(); + assert_eq!(labels, vec!["VeriModel", "properties", "PS-001"]); + assert_eq!( + text_of(&doc, "Viewpoint").as_deref(), + Some("viewpoint.bcfv") + ); + assert!(!first.1.contains("Snapshot")); + + let vp = files + .iter() + .find(|(n, _)| *n == format!("{folder}/viewpoint.bcfv")) + .expect("viewpoint"); + let vdoc = parse(&vp.1); + assert_eq!( + attr_of(&vdoc, "Component", "IfcGuid").as_deref(), + Some(WALL_A) + ); + assert_eq!( + attr_of(&vdoc, "Visibility", "DefaultVisibility").as_deref(), + Some("true") + ); + assert_eq!(text_of(&vdoc, "FieldOfView").as_deref(), Some("60")); + assert_eq!( + attr_of(&vdoc, "VisualizationInfo", "Guid"), + attr_of(&doc, "Viewpoints", "Guid") + ); + + // First topic: model-level error (no GlobalId) -> no viewpoint at all in 2.1. + assert_eq!( + text_of(&parse(&markups[0].1), "Title").as_deref(), + Some("[PS-001] Model has no IfcSite") + ); + let model_folder = markups[0].0.trim_end_matches("/markup.bcf"); + assert!(!files + .iter() + .any(|(n, _)| *n == format!("{model_folder}/viewpoint.bcfv"))); + assert!(!markups[0].1.contains(" component-only viewpoint. + let third = parse(&markups[2].1); + assert_eq!( + text_of(&third, "Title").as_deref(), + Some("[NM-002] Name does not match {pattern}") + ); + assert_eq!(text_of(&third, "Priority").as_deref(), Some("Normal")); + let third_folder = markups[2].0.trim_end_matches("/markup.bcf"); + let vp3 = files + .iter() + .find(|(n, _)| *n == format!("{third_folder}/viewpoint.bcfv")) + .expect("component-only viewpoint"); + assert!(!vp3.1.contains("PerspectiveCamera")); + assert!(vp3.1.contains(WALL_B)); + assert_eq!(stats.with_viewpoint, 2); + } + + #[test] + fn camera_frames_the_box() { + let c = camera_for_bbox([0.0, 0.0, 0.0], [4.0, 0.2, 3.0]).unwrap(); + let centre = [2.0, 0.1, 1.5]; + // The camera looks at the centre. + let to_centre = [ + centre[0] - c.position[0], + centre[1] - c.position[1], + centre[2] - c.position[2], + ]; + let len = (to_centre.iter().map(|v| v * v).sum::()).sqrt(); + for (t, d) in to_centre.iter().zip(c.direction.iter()) { + assert!((t / len - d).abs() < 1e-9); + } + // Up is perpendicular to the direction. + let dot: f64 = (0..3).map(|i| c.up[i] * c.direction[i]).sum(); + assert!(dot.abs() < 1e-9); + // Far enough for the bounding sphere (radius ~2.5 m) to fit a 60 degree view. + assert!(len > 2.5 / (30f64.to_radians().sin())); + assert!(camera_for_bbox([0.0, 0.0, f64::NAN], [1.0, 1.0, 1.0]).is_none()); + } + + #[test] + fn guids_are_deterministic_and_only_dates_change() { + let (report, model) = sample(); + let cfg = Config::default(); + let (a, _) = build_bcfzip(&report, &model, &cfg, fixed_now()).unwrap(); + let (b, _) = build_bcfzip(&report, &model, &cfg, fixed_now()).unwrap(); + assert_eq!(a, b, "same input and same clock must give identical bytes"); + + let later = DateTime::parse_from_rfc3339("2027-06-07T08:09:10Z") + .unwrap() + .with_timezone(&Utc); + let (c, _) = build_bcfzip(&report, &model, &cfg, later).unwrap(); + let ea = entries(&a); + let ec = entries(&c); + assert_eq!(ea.len(), ec.len()); + for ((na, ta), (nc, tc)) in ea.iter().zip(ec.iter()) { + assert_eq!(na, nc, "entry names and order are stable"); + let normalised = tc.replace("2027-06-07T08:09:10Z", "2026-01-02T03:04:05Z"); + assert_eq!(ta, &normalised, "only CreationDate differs in {na}"); + } + + // The public writer also works end to end. + let dir = tempfile::tempdir().unwrap(); + let p1 = dir.path().join("a.bcfzip"); + let stats = write_bcfzip(&report, &model, &cfg, &p1).unwrap(); + assert_eq!(stats.topics, 3); + let names: Vec = entries(&std::fs::read(&p1).unwrap()) + .into_iter() + .map(|(n, _)| n) + .collect(); + assert_eq!(names, ea.iter().map(|(n, _)| n.clone()).collect::>()); + } + + #[test] + fn duplicate_findings_get_distinct_guids() { + let (mut report, model) = sample(); + let dup = report.findings[0].clone(); + report.findings.push(dup); + report.normalise(); + let strings = Strings::for_language(Language::En); + let issues = collect_issues(&report, &strings); + let guids: BTreeSet = issues.iter().map(|i| i.guid).collect(); + assert_eq!(guids.len(), issues.len()); + assert!(build_bcfzip(&report, &model, &Config::default(), fixed_now()).is_ok()); + // GUIDs do not depend on the clock or on the output language. + let es = collect_issues(&report, &Strings::for_language(Language::Es)); + assert_eq!( + issues.iter().map(|i| i.guid).collect::>(), + es.iter().map(|i| i.guid).collect::>() + ); + assert_eq!(issues[0].guid.get_version_num(), 5); + } + + #[test] + fn empty_report_gives_valid_archive_without_topics() { + let report = RunReport::default(); + let model = Model::default(); + let dir = tempfile::tempdir().unwrap(); + let p = dir.path().join("empty.bcfzip"); + let stats = write_bcfzip(&report, &model, &Config::default(), &p).unwrap(); + assert_eq!( + stats, + BcfStats { + topics: 0, + with_viewpoint: 0, + version: "2.1".into() + } + ); + let files = entries(&std::fs::read(&p).unwrap()); + assert_eq!(files.len(), 1); + assert_eq!(files[0].0, "bcf.version"); + parse(&files[0].1); + } + + #[test] + fn bcf30_archive_structure() { + let (report, model) = sample(); + let mut cfg = Config::default(); + cfg.output.bcf_version = "3.0".into(); + let (bytes, stats) = build_bcfzip(&report, &model, &cfg, fixed_now()).unwrap(); + assert_eq!(stats.version, "3.0"); + assert_eq!(stats.topics, 3); + // The model has geometry, so every topic gets a camera (model-wide fallback). + assert_eq!(stats.with_viewpoint, 3); + let files = entries(&bytes); + assert_eq!(files[0].0, "bcf.version"); + assert_eq!( + attr_of(&parse(&files[0].1), "Version", "VersionId").as_deref(), + Some("3.0") + ); + assert_eq!(files[1].0, "extensions.xml"); + let ext = parse(&files[1].1); + assert_eq!(text_of(&ext, "TopicType").as_deref(), Some("Issue")); + assert!(ext + .iter() + .any(|(n, t, _)| n == "TopicLabel" && t == "PS-001")); + let markup = files + .iter() + .find(|(n, _)| n.ends_with("/markup.bcf")) + .unwrap(); + let doc = parse(&markup.1); + assert!(doc.iter().any(|(n, _, _)| n == "Files")); + assert!(doc.iter().any(|(n, t, _)| n == "Label" && t == "PS-001")); + assert!(attr_of(&doc, "ViewPoint", "Guid").is_some()); + assert!(text_of(&doc, "Index").is_none()); + let vp = files + .iter() + .find(|(n, _)| n.ends_with("/viewpoint.bcfv")) + .unwrap(); + assert_eq!(text_of(&parse(&vp.1), "AspectRatio").as_deref(), Some("1")); + + // Without any geometry, 3.0 writes no viewpoint (a camera is mandatory there). + let mut bare = model.clone(); + for e in &mut bare.elements { + e.geometry = None; + } + let (_, stats) = build_bcfzip(&report, &bare, &cfg, fixed_now()).unwrap(); + assert_eq!(stats.with_viewpoint, 0); + } + + #[test] + fn unknown_version_falls_back_to_21() { + assert_eq!(BcfVersion::from_config("1.0"), BcfVersion::V21); + assert_eq!(BcfVersion::from_config(" 3.0 "), BcfVersion::V30); + } + + #[test] + fn issues_csv_matches_topics() { + let (report, _) = sample(); + let dir = tempfile::tempdir().unwrap(); + let p = dir.path().join("issues.csv"); + let n = write_issues_csv(&report, &p).unwrap(); + assert_eq!(n, 3); + let first = std::fs::read(&p).unwrap(); + write_issues_csv(&report, &p).unwrap(); + assert_eq!(first, std::fs::read(&p).unwrap(), "deterministic"); + let mut rdr = csv::Reader::from_reader(first.as_slice()); + let headers: Vec = rdr.headers().unwrap().iter().map(String::from).collect(); + assert_eq!( + headers, + [ + "severity", + "rule_id", + "topic_guid", + "global_id", + "ifc_type", + "name", + "storey", + "title", + "description", + "expected", + "actual", + "fix_hint" + ] + ); + let rows: Vec = rdr.records().map(|r| r.unwrap()).collect(); + assert_eq!(rows.len(), 3); + assert_eq!(&rows[0][0], "ERROR"); + assert_eq!(&rows[1][7], "[PS-001] FireRating is missing"); + assert!( + rows[0][8].contains('\n'), + "multi-line description is quoted" + ); + let strings = Strings::for_language(Language::En); + let issues = collect_issues(&report, &strings); + for (row, issue) in rows.iter().zip(issues.iter()) { + assert_eq!(&row[2], issue.guid.to_string()); + } + } + + #[test] + fn template_and_escaping_helpers() { + assert_eq!( + fill_template( + "[{rule}] {message}", + &[("rule", "R"), ("message", "{rule} x")] + ), + "[R] {rule} x" + ); + assert_eq!(fill_template("a {unknown} b {", &[]), "a {unknown} b {"); + assert_eq!(escape_text("a&\u{1}c"), "a<b>&c"); + assert_eq!(escape_attr("\"x'\n"), ""x' "); + assert!(is_ifc_guid(WALL_A)); + assert!(!is_ifc_guid("not-a-guid")); + assert_eq!(shorten("abcdef", 4), "abc…"); + assert_eq!(format_coord(0.5773502691896258), "0.577350269"); + assert_eq!(format_coord(-0.0000000001), "0"); + assert_eq!(format_coord(2.0), "2"); + } + + /// Writes sample archives for external validation when VERIMODEL_BCF_SAMPLE_DIR is set. + #[test] + fn write_samples_for_external_validation() { + let Ok(dir) = std::env::var("VERIMODEL_BCF_SAMPLE_DIR") else { + return; + }; + let (report, model) = sample(); + let mut cfg = Config::default(); + write_bcfzip( + &report, + &model, + &cfg, + &Path::new(&dir).join("sample21.bcfzip"), + ) + .unwrap(); + cfg.output.bcf_version = "3.0".into(); + write_bcfzip( + &report, + &model, + &cfg, + &Path::new(&dir).join("sample30.bcfzip"), + ) + .unwrap(); + write_bcfzip( + &RunReport::default(), + &Model::default(), + &Config::default(), + &Path::new(&dir).join("empty21.bcfzip"), + ) + .unwrap(); + } +} diff --git a/crates/core/src/clash.rs b/crates/core/src/clash.rs new file mode 100644 index 0000000..324ed9a --- /dev/null +++ b/crates/core/src/clash.rs @@ -0,0 +1,52 @@ +//! Clash detection — phase 2. +//! +//! The configuration (`clash.*`), the CLI command and the report section exist +//! so the feature can be added without changing any interface. Until the +//! geometry-level implementation lands, `run` returns an explicit +//! "not yet implemented" message: never a silent no-op. + +use crate::config::Config; +use crate::i18n::Strings; +use crate::model::{ClashReport, Model}; + +/// Run clash detection between the configured sets. +pub fn run( + model_a: &Model, + model_b: Option<&Model>, + config: &Config, + strings: &Strings, +) -> ClashReport { + let _ = (model_a, model_b); + if !config.clash.enabled { + return ClashReport { + enabled: false, + implemented: false, + message: strings.get("clash.disabled"), + clashes: vec![], + }; + } + ClashReport { + enabled: true, + implemented: false, + message: strings.get("clash.not_implemented"), + clashes: vec![], + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn disabled_and_not_implemented_are_explicit() { + let s = Strings::for_language(crate::config::Language::En); + let m = Model::default(); + let r = run(&m, None, &Config::default(), &s); + assert!(!r.enabled); + assert!(!r.message.is_empty()); + let mut c = Config::default(); + c.clash.enabled = true; + let r2 = run(&m, None, &c, &s); + assert!(r2.enabled && !r2.implemented); + assert!(r2.message.to_lowercase().contains("later version")); + } +} diff --git a/crates/core/src/config.rs b/crates/core/src/config.rs new file mode 100644 index 0000000..84692e8 --- /dev/null +++ b/crates/core/src/config.rs @@ -0,0 +1,472 @@ +//! `project.yaml` configuration: everything project specific lives here. +//! +//! The struct derives a JSON schema (`schemars`) so the CLI can validate a +//! file and the UI can render a form. Every field has a default so a first +//! run needs zero configuration. + +use std::collections::BTreeMap; +use std::path::{Path, PathBuf}; + +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::error::{CoreError, CoreResult}; + +/// UI / report language. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)] +#[serde(rename_all = "lowercase")] +pub enum Language { + #[default] + En, + Es, +} + +impl Language { + pub fn code(&self) -> &'static str { + match self { + Language::En => "en", + Language::Es => "es", + } + } +} + +/// Display unit preference. `Auto` follows the IFC file. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)] +#[serde(rename_all = "lowercase")] +pub enum UnitPreference { + #[default] + Auto, + Metric, + Imperial, +} + +/// Top-level `project.yaml`. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, Default)] +#[serde(default, deny_unknown_fields)] +pub struct Config { + pub project: ProjectSection, + pub requirements: RequirementsSection, + pub tolerances: TolerancesSection, + pub qto: QtoSection, + pub clash: ClashSection, + pub output: OutputSection, + /// Per-rule and per-category toggles. Keys are rule ids ("ID-001") or + /// category names ("geometry"). `false` disables. + pub checks: ChecksSection, + /// Naming conventions: IFC type (or ancestor) -> regex the Name must match. + pub naming: NamingSection, + /// Classification settings. + pub classification: ClassificationSection, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[serde(default, deny_unknown_fields)] +pub struct ProjectSection { + pub name: String, + pub language: Language, + pub units: UnitPreference, + /// Name of the classification system expected ("Uniclass", "OmniClass", "CCI", "DIN276", "none"). + pub classification_system: String, + /// Accepted schemas. Empty = accept any. + pub ifc_versions: Vec, +} + +impl Default for ProjectSection { + fn default() -> Self { + Self { + name: "Generic Project".into(), + language: Language::En, + units: UnitPreference::Auto, + classification_system: "none".into(), + ifc_versions: vec!["IFC2X3".into(), "IFC4".into(), "IFC4X3".into()], + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[serde(default, deny_unknown_fields)] +pub struct RequirementsSection { + /// Optional IDS file (relative to the config file). + pub ids_file: Option, + /// "generic" (built-in) or a path to a custom rule pack YAML. + pub rule_pack: String, + /// Property sets / properties that must exist. Each entry generates a rule. + pub required_psets: Vec, +} + +impl Default for RequirementsSection { + fn default() -> Self { + Self { + ids_file: None, + rule_pack: "generic".into(), + required_psets: vec![], + } + } +} + +/// A required property set, optionally with required properties inside it. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, Default)] +#[serde(default, deny_unknown_fields)] +pub struct RequiredPset { + /// Pset name, e.g. "Pset_WallCommon". + pub pset: String, + /// Which elements it applies to (IFC type or ancestor, e.g. "IfcWall", "IfcElement"). Empty = all elements. + pub applies_to: Vec, + /// Required property names inside the pset. Empty = only the pset must exist. + pub properties: Vec, + /// Severity of a missing pset/property. Default: error. + pub severity: Option, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[serde(default, deny_unknown_fields)] +pub struct TolerancesSection { + pub clash_hard_mm: f64, + pub clash_clearance_mm: f64, + /// Elements whose bounding box centre is farther than this from the origin are flagged. + pub far_from_origin_m: f64, + pub geometry: GeometryTolerances, +} + +impl Default for TolerancesSection { + fn default() -> Self { + Self { + clash_hard_mm: 10.0, + clash_clearance_mm: 50.0, + far_from_origin_m: 10_000.0, + geometry: GeometryTolerances::default(), + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[serde(default, deny_unknown_fields)] +pub struct GeometryTolerances { + /// Volumes below this are considered zero / degenerate. + pub min_volume_m3: f64, + /// Areas below this are considered zero / degenerate. + pub min_area_m2: f64, + /// Elements whose bounding box extent exceeds this are flagged as outside project bounds. + pub max_extent_m: f64, +} + +impl Default for GeometryTolerances { + fn default() -> Self { + Self { + min_volume_m3: 0.000001, + min_area_m2: 0.000001, + max_extent_m: 5_000.0, + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[serde(default, deny_unknown_fields)] +pub struct QtoSection { + /// Any combination of "type", "storey", "classification", "material", "predefined_type", "type_name". + pub group_by: Vec, + /// Optional unit rates CSV (code, description, unit, rate, currency, match_type, match_storey, match_classification). + pub unit_rates_file: Option, + pub currency: String, + /// Number of hand-check samples shown in the report. + pub sample_count: usize, +} + +impl Default for QtoSection { + fn default() -> Self { + Self { + group_by: vec!["type".into(), "storey".into()], + unit_rates_file: None, + currency: "EUR".into(), + sample_count: 5, + } + } +} + +/// Element filter used by clash sets and rule scopes. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, Default)] +#[serde(default, deny_unknown_fields)] +pub struct ElementFilter { + /// IFC type or ancestor, e.g. "IfcPipeSegment". + pub ifc_type: Option, + /// Regex on element Name. + pub name_pattern: Option, + /// Storey name. + pub storey: Option, + /// Required property value: pset.property = value. + pub property_equals: BTreeMap, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, Default)] +#[serde(default, deny_unknown_fields)] +pub struct ClashSection { + pub enabled: bool, + pub set_a_filter: ElementFilter, + pub set_b_filter: ElementFilter, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +#[serde(default, deny_unknown_fields)] +pub struct OutputSection { + pub language: Language, + pub include_3d_snapshot: bool, + /// BCF version to write: "2.1" (default) or "3.0". + pub bcf_version: String, + /// Author recorded in BCF topics. + pub bcf_author: String, +} + +impl Default for OutputSection { + fn default() -> Self { + Self { + language: Language::En, + include_3d_snapshot: true, + bcf_version: "2.1".into(), + bcf_author: "verimodel@local".into(), + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, Default)] +#[serde(default, deny_unknown_fields)] +pub struct ChecksSection { + /// Rule id -> enabled. Missing = enabled. + pub rules: BTreeMap, + /// Category -> enabled. Missing = enabled. + pub categories: BTreeMap, + /// Duplicate-name check scope: ["type", "storey"] (default) or ["type"]. + pub unique_name_within: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, Default)] +#[serde(default, deny_unknown_fields)] +pub struct NamingSection { + /// IFC type (or ancestor) -> regex. E.g. {"IfcWall": "^W-[0-9]{3}$"}. + pub patterns: BTreeMap, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema, Default)] +#[serde(default, deny_unknown_fields)] +pub struct ClassificationSection { + /// Require every element in scope to carry a classification. + pub required: bool, + /// Which elements must be classified. Empty = all non-spatial elements. + pub applies_to: Vec, + /// Allowed codes, inline. + pub allowed_codes: Vec, + /// Allowed codes from a file (one code per line, or CSV with `code` column), relative to config. + pub allowed_codes_file: Option, + /// Regex that codes must match (e.g. "^[A-Z][a-z]_[0-9]{2}(_[0-9]{2})*$" for Uniclass). + pub code_pattern: Option, +} + +impl ChecksSection { + /// Whether a rule is enabled given its id and category. + pub fn is_enabled(&self, rule_id: &str, category: &str) -> bool { + if let Some(v) = self.rules.get(rule_id) { + return *v; + } + self.categories.get(category).copied().unwrap_or(true) + } +} + +impl Config { + /// Parse YAML text. Unknown fields are errors so typos never silently disable a rule. + pub fn from_yaml(text: &str) -> CoreResult { + let cfg: Config = + serde_yaml::from_str(text).map_err(|e| CoreError::Config(e.to_string()))?; + cfg.validate()?; + Ok(cfg) + } + + /// Read and parse a `project.yaml` file. + pub fn from_file(path: &Path) -> CoreResult { + let text = std::fs::read_to_string(path) + .map_err(|e| CoreError::Io(format!("cannot read config {}: {e}", path.display())))?; + Config::from_yaml(&text) + } + + /// Serialise back to YAML (used to write the effective config into `out/`). + pub fn to_yaml(&self) -> CoreResult { + serde_yaml::to_string(self).map_err(|e| CoreError::Config(e.to_string())) + } + + /// Effective config as JSON (embedded in report.json). + pub fn to_json_value(&self) -> serde_json::Value { + serde_json::to_value(self).unwrap_or(serde_json::Value::Null) + } + + /// Semantic validation beyond the schema. Returns a list of plain-language problems. + pub fn validate(&self) -> CoreResult<()> { + let mut problems = Vec::new(); + let allowed_groups = [ + "type", + "storey", + "classification", + "material", + "predefined_type", + "type_name", + ]; + for g in &self.qto.group_by { + if !allowed_groups.contains(&g.as_str()) { + problems.push(format!( + "qto.group_by contains '{g}', expected one of {}", + allowed_groups.join(", ") + )); + } + } + if self.qto.group_by.is_empty() { + problems.push("qto.group_by must contain at least one key".into()); + } + if self.tolerances.far_from_origin_m <= 0.0 { + problems.push("tolerances.far_from_origin_m must be > 0".into()); + } + if self.tolerances.geometry.min_volume_m3 < 0.0 { + problems.push("tolerances.geometry.min_volume_m3 must be >= 0".into()); + } + if !matches!(self.output.bcf_version.as_str(), "2.1" | "3.0") { + problems.push(format!( + "output.bcf_version must be '2.1' or '3.0', got '{}'", + self.output.bcf_version + )); + } + for (t, p) in &self.naming.patterns { + if let Err(e) = regex::Regex::new(p) { + problems.push(format!("naming.patterns['{t}'] is not a valid regex: {e}")); + } + } + if let Some(p) = &self.classification.code_pattern { + if let Err(e) = regex::Regex::new(p) { + problems.push(format!( + "classification.code_pattern is not a valid regex: {e}" + )); + } + } + for rp in &self.requirements.required_psets { + if rp.pset.trim().is_empty() { + problems.push("requirements.required_psets: 'pset' must not be empty".into()); + } + if let Some(s) = &rp.severity { + if s.parse::().is_err() { + problems.push(format!( + "requirements.required_psets['{}'].severity '{s}' is invalid", + rp.pset + )); + } + } + } + for w in &self.checks.unique_name_within { + if !matches!(w.as_str(), "type" | "storey") { + problems.push(format!( + "checks.unique_name_within contains '{w}', expected 'type' or 'storey'" + )); + } + } + if problems.is_empty() { + Ok(()) + } else { + Err(CoreError::Config(problems.join("; "))) + } + } + + /// JSON schema of the configuration, for `validate-config` and the UI form. + pub fn json_schema() -> serde_json::Value { + serde_json::to_value(schemars::schema_for!(Config)).unwrap_or(serde_json::Value::Null) + } + + /// Resolve a path declared in the config relative to the config file's directory. + pub fn resolve_path(config_dir: Option<&Path>, declared: &str) -> PathBuf { + let p = Path::new(declared); + if p.is_absolute() { + return p.to_path_buf(); + } + match config_dir { + Some(d) => d.join(p), + None => p.to_path_buf(), + } + } + + /// The IDS file declared in `requirements.ids_file`, resolved against the config directory. + pub fn ids_path(&self, config_dir: Option<&Path>) -> Option { + self.requirements + .ids_file + .as_deref() + .filter(|s| !s.trim().is_empty()) + .map(|f| Config::resolve_path(config_dir, f)) + } + + /// Look up a dotted path ("tolerances.far_from_origin_m") in the config. + pub fn lookup(&self, dotted: &str) -> Option { + let mut cur = self.to_json_value(); + for part in dotted.split('.') { + cur = cur.get(part)?.clone(); + } + Some(cur) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty_yaml_gives_defaults() { + let c = Config::from_yaml("{}").unwrap(); + assert_eq!(c.project.name, "Generic Project"); + assert_eq!(c.qto.group_by, vec!["type", "storey"]); + assert_eq!(c.tolerances.far_from_origin_m, 10_000.0); + } + + #[test] + fn unknown_field_is_rejected() { + let err = Config::from_yaml("project:\n nmae: x\n").unwrap_err(); + assert!(err.to_string().contains("nmae"), "{err}"); + } + + #[test] + fn invalid_group_by_is_rejected() { + let err = Config::from_yaml("qto:\n group_by: [colour]\n").unwrap_err(); + assert!(err.to_string().contains("group_by")); + } + + #[test] + fn invalid_regex_is_rejected() { + let err = Config::from_yaml("naming:\n patterns:\n IfcWall: '['\n").unwrap_err(); + assert!(err.to_string().contains("regex")); + } + + #[test] + fn checks_toggle_resolution() { + let c = Config::from_yaml( + "checks:\n rules:\n GEO-001: false\n categories:\n naming: false\n", + ) + .unwrap(); + assert!(!c.checks.is_enabled("GEO-001", "geometry")); + assert!(c.checks.is_enabled("GEO-002", "geometry")); + assert!(!c.checks.is_enabled("NAM-001", "naming")); + } + + #[test] + fn lookup_dotted_path() { + let c = Config::default(); + assert_eq!( + c.lookup("tolerances.far_from_origin_m"), + Some(serde_json::json!(10000.0)) + ); + assert_eq!(c.lookup("nope.x"), None); + } + + #[test] + fn roundtrip_yaml() { + let c = Config::default(); + let y = c.to_yaml().unwrap(); + let back = Config::from_yaml(&y).unwrap(); + assert_eq!(c, back); + } + + #[test] + fn schema_is_generated() { + let s = Config::json_schema(); + assert!(s.get("properties").is_some()); + } +} diff --git a/crates/core/src/disciplines.rs b/crates/core/src/disciplines.rs new file mode 100644 index 0000000..ce229a1 --- /dev/null +++ b/crates/core/src/disciplines.rs @@ -0,0 +1,41 @@ +//! Discipline inference from entity types, driven by `data/disciplines.yaml`. + +use std::collections::BTreeMap; + +use crate::model::Element; + +const DISCIPLINES_YAML: &str = include_str!("../data/disciplines.yaml"); + +fn table() -> BTreeMap> { + serde_yaml::from_str(DISCIPLINES_YAML).expect("built-in disciplines.yaml must be valid") +} + +/// Disciplines present in the element list, in alphabetical order. +pub fn detect(elements: &[Element]) -> Vec { + let t = table(); + let mut out = Vec::new(); + for (discipline, types) in t { + if elements.iter().any(|e| types.iter().any(|t| e.is_a(t))) { + out.push(discipline); + } + } + out +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn detects_by_ancestor() { + let e = Element { + ifc_type: "IfcDuctSegment".into(), + ancestors: vec![ + "IfcFlowSegment".into(), + "IfcDistributionFlowElement".into(), + "IfcDistributionElement".into(), + ], + ..Default::default() + }; + assert_eq!(detect(&[e]), vec!["mep".to_string()]); + } +} diff --git a/crates/core/src/error.rs b/crates/core/src/error.rs new file mode 100644 index 0000000..aa5d6e0 --- /dev/null +++ b/crates/core/src/error.rs @@ -0,0 +1,35 @@ +//! Error type of the core crate. Messages are plain language: the UI shows them verbatim. + +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum CoreError { + #[error("Configuration problem: {0}")] + Config(String), + #[error("Rule pack problem: {0}")] + RulePack(String), + #[error("File problem: {0}")] + Io(String), + #[error("Report problem: {0}")] + Report(String), + #[error("BCF problem: {0}")] + Bcf(String), + #[error("Quantity takeoff problem: {0}")] + Qto(String), + #[error("{0}")] + Other(String), +} + +pub type CoreResult = Result; + +impl From for CoreError { + fn from(e: std::io::Error) -> Self { + CoreError::Io(e.to_string()) + } +} + +impl From for CoreError { + fn from(e: serde_json::Error) -> Self { + CoreError::Report(e.to_string()) + } +} diff --git a/crates/core/src/hash.rs b/crates/core/src/hash.rs new file mode 100644 index 0000000..cd8ef9b --- /dev/null +++ b/crates/core/src/hash.rs @@ -0,0 +1,46 @@ +//! SHA-256 helpers used for the run ledger. + +use std::io::Read; +use std::path::Path; + +use sha2::{Digest, Sha256}; + +use crate::error::CoreResult; + +/// SHA-256 of a byte slice, lowercase hex. +pub fn sha256_bytes(bytes: &[u8]) -> String { + hex::encode(Sha256::digest(bytes)) +} + +/// SHA-256 of a file, streamed (never loads the whole file into memory). +pub fn sha256_file(path: &Path) -> CoreResult { + let mut f = std::fs::File::open(path)?; + let mut hasher = Sha256::new(); + let mut buf = vec![0u8; 1 << 20]; + loop { + let n = f.read(&mut buf)?; + if n == 0 { + break; + } + hasher.update(&buf[..n]); + } + Ok(hex::encode(hasher.finalize())) +} + +/// First 12 hex chars, for file cards. +pub fn short(hash: &str) -> String { + hash.chars().take(12).collect() +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn known_vector() { + assert_eq!( + sha256_bytes(b"abc"), + "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" + ); + assert_eq!(short(&sha256_bytes(b"abc")), "ba7816bf8f01"); + } +} diff --git a/crates/core/src/i18n.rs b/crates/core/src/i18n.rs new file mode 100644 index 0000000..0630639 --- /dev/null +++ b/crates/core/src/i18n.rs @@ -0,0 +1,65 @@ +//! Report-language strings. The UI has its own i18n JSON (frontend/i18n); +//! this module serves the generated documents (report.html, BCF titles). +//! Strings live in `data/i18n/.json`, never in code. + +use std::collections::BTreeMap; + +use crate::config::Language; + +const EN: &str = include_str!("../data/i18n/en.json"); +const ES: &str = include_str!("../data/i18n/es.json"); + +/// A loaded string table. +#[derive(Debug, Clone)] +pub struct Strings { + table: BTreeMap, + fallback: BTreeMap, +} + +impl Strings { + pub fn for_language(lang: Language) -> Strings { + let en: BTreeMap = serde_json::from_str(EN).expect("en.json must be valid"); + let table = match lang { + Language::En => en.clone(), + Language::Es => serde_json::from_str(ES).expect("es.json must be valid"), + }; + Strings { + table, + fallback: en, + } + } + + /// Look up a key; falls back to English, then to the key itself (never panics, never empty). + pub fn get(&self, key: &str) -> String { + self.table + .get(key) + .or_else(|| self.fallback.get(key)) + .cloned() + .unwrap_or_else(|| key.to_string()) + } + + /// Look up and substitute `{name}` placeholders. + pub fn fmt(&self, key: &str, args: &[(&str, &str)]) -> String { + let mut s = self.get(key); + for (k, v) in args { + s = s.replace(&format!("{{{k}}}"), v); + } + s + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn both_languages_load_and_share_keys() { + let en: BTreeMap = serde_json::from_str(EN).unwrap(); + let es: BTreeMap = serde_json::from_str(ES).unwrap(); + for k in en.keys() { + assert!(es.contains_key(k), "es.json is missing key {k}"); + } + let s = Strings::for_language(Language::Es); + assert_ne!(s.get("report.title"), "report.title"); + assert_eq!(s.get("does.not.exist"), "does.not.exist"); + } +} diff --git a/crates/core/src/ids.rs b/crates/core/src/ids.rs new file mode 100644 index 0000000..ab7c143 --- /dev/null +++ b/crates/core/src/ids.rs @@ -0,0 +1,621 @@ +//! IDS (Information Delivery Specification) integration. +//! +//! The IDS engine (IfcTester, driven by the reader) returns facts in +//! [`IdsResults`]. This module turns them into rules and findings so IDS +//! requirements show up in the same tables as rule-pack checks, quoting the +//! requirement verbatim. +//! +//! * [`evaluate`] produces one [`RuleResult`] per (specification, requirement) +//! pair with rule id `IDS--` (1-based, two digits), and one +//! [`Finding`] per failed entity whose `expected` field quotes the +//! requirement text. Severity: ERROR for every specification. In IDS 1.0 the +//! cardinality (`required` / `optional` / `prohibited`) only governs whether +//! applicable entities must, may or must not exist; a requirement that fails +//! on an applicable entity is always a failure. +//! A specification without requirements becomes a single rule +//! `IDS--00` so its verdict is never lost. +//! * [`read_metadata`] reads the `.ids` XML header (title, author, version, +//! date) and counts the specifications, matching local names so any +//! namespace prefix works. + +use std::path::Path; + +use quick_xml::events::Event; +use quick_xml::Reader; + +use crate::error::{CoreError, CoreResult}; +use crate::model::{ + Finding, IdsReport, IdsRequirementResult, IdsResults, IdsSpecificationResult, RuleResult, + RuleSource, RuleStatus, Severity, +}; + +/// Rules + findings derived from an IDS audit. +#[derive(Debug, Clone, Default)] +pub struct IdsEvaluation { + pub rules: Vec, + pub findings: Vec, + pub report: IdsReport, +} + +/// Metadata from the IDS file header. +#[derive(Debug, Clone, Default, PartialEq, serde::Serialize, serde::Deserialize)] +pub struct IdsMetadata { + pub title: Option, + pub author: Option, + pub version: Option, + pub date: Option, + pub specification_count: usize, +} + +/// Rule category of every IDS-derived rule. +pub const IDS_CATEGORY: &str = "ids"; + +/// Severity of the rules derived from a specification. IDS 1.0 cardinality +/// ("required" / "optional" / "prohibited") says whether applicable entities +/// must, may or must not exist; it never downgrades a failed requirement, so +/// every IDS rule is an ERROR. +fn severity_for(cardinality: Option<&str>) -> Severity { + let _ = cardinality; + Severity::Error +} + +fn status_for(passed: bool, applicable_count: usize) -> RuleStatus { + match (passed, applicable_count) { + (true, 0) => RuleStatus::NotApplicable, + (true, _) => RuleStatus::Pass, + (false, _) => RuleStatus::Fail, + } +} + +fn fix_hint_for(spec: &IdsSpecificationResult) -> String { + spec.instructions + .as_deref() + .map(str::trim) + .filter(|s| !s.is_empty()) + .map(String::from) + .unwrap_or_else(|| format!("See IDS specification '{}'.", spec.name)) +} + +fn non_empty(s: &str) -> Option { + let t = s.trim(); + (!t.is_empty()).then(|| t.to_string()) +} + +/// Text describing a specification that has no requirements (its applicability). +fn applicability_text(spec: &IdsSpecificationResult) -> String { + let parts: Vec<&str> = spec + .applicability + .iter() + .map(|s| s.trim()) + .filter(|s| !s.is_empty()) + .collect(); + if parts.is_empty() { + spec.description + .as_deref() + .map(str::trim) + .filter(|s| !s.is_empty()) + .unwrap_or("applicability") + .to_string() + } else { + parts.join("; ") + } +} + +/// Message of a model-level finding, used when a requirement failed but the +/// IDS engine named no failing entity (e.g. a required specification with +/// no applicable element at all). +fn model_level_message(spec: &IdsSpecificationResult, requirement_text: &str) -> String { + if spec.applicable_count == 0 { + let card = spec.cardinality.as_deref().unwrap_or("required"); + format!( + "Specification '{}' is {card} but no applicable element was found", + spec.name + ) + } else { + format!("Requirement not met: {requirement_text}") + } +} + +/// Rule + findings of one (specification, requirement) pair. +fn evaluate_requirement( + rule_id: String, + spec: &IdsSpecificationResult, + requirement_text: &str, + passed: bool, + failed: &[crate::model::IdsFailedEntity], +) -> (RuleResult, Vec) { + let severity = severity_for(spec.cardinality.as_deref()); + let source = RuleSource::Ids { + specification: spec.name.clone(), + requirement: requirement_text.to_string(), + }; + let fix_hint = fix_hint_for(spec); + let mut findings: Vec = failed + .iter() + .map(|fe| { + let reason = non_empty(&fe.reason); + Finding { + rule_id: rule_id.clone(), + severity, + global_id: non_empty(&fe.global_id), + step_id: None, + ifc_type: non_empty(&fe.ifc_type), + name: fe.name.as_deref().and_then(non_empty), + storey: None, + message: reason + .clone() + .unwrap_or_else(|| requirement_text.to_string()), + expected: Some(requirement_text.to_string()), + actual: reason, + fix_hint: Some(fix_hint.clone()), + source: source.clone(), + } + }) + .collect(); + if !passed && findings.is_empty() { + findings.push(Finding { + rule_id: rule_id.clone(), + severity, + global_id: None, + step_id: None, + ifc_type: None, + name: None, + storey: None, + message: model_level_message(spec, requirement_text), + expected: Some(requirement_text.to_string()), + actual: None, + fix_hint: Some(fix_hint.clone()), + source: source.clone(), + }); + } + findings.sort_by(|a, b| { + a.global_id + .cmp(&b.global_id) + .then_with(|| a.message.cmp(&b.message)) + }); + + let rule = RuleResult { + rule_id, + category: IDS_CATEGORY.to_string(), + description: format!("{}: {}", spec.name, requirement_text), + severity, + status: status_for(passed, spec.applicable_count), + elements_checked: spec.applicable_count, + failures: findings.len(), + skipped_reason: None, + source, + }; + (rule, findings) +} + +/// Convert IDS engine results into rules and findings. +pub fn evaluate(results: &IdsResults) -> IdsEvaluation { + let mut rules = Vec::new(); + let mut findings = Vec::new(); + for (i, spec) in results.specifications.iter().enumerate() { + if spec.requirements.is_empty() { + // No requirement: the specification's own verdict (e.g. a prohibited + // applicability) is the only thing to report. + let text = applicability_text(spec); + let (r, f) = evaluate_requirement( + format!("IDS-{:02}-00", i + 1), + spec, + &text, + spec.passed, + &[], + ); + rules.push(r); + findings.extend(f); + continue; + } + for (j, req) in spec.requirements.iter().enumerate() { + let IdsRequirementResult { + description, + passed, + failed_entities, + .. + } = req; + let (r, f) = evaluate_requirement( + format!("IDS-{:02}-{:02}", i + 1, j + 1), + spec, + description, + *passed, + failed_entities, + ); + rules.push(r); + findings.extend(f); + } + } + let report = IdsReport { + ids_file: results.ids_file.clone(), + title: results.title.clone(), + specifications_total: results.specifications.len(), + specifications_passed: results.specifications.iter().filter(|s| s.passed).count(), + specifications: results.specifications.clone(), + }; + IdsEvaluation { + rules, + findings, + report, + } +} + +/// Parse the header of an `.ids` file. +pub fn read_metadata(path: &Path) -> CoreResult { + let text = std::fs::read_to_string(path) + .map_err(|e| CoreError::Io(format!("cannot read IDS file {}: {e}", path.display())))?; + parse_metadata(&text).map_err(|msg| { + CoreError::Config(format!("IDS file {} is not valid: {msg}", path.display())) + }) +} + +/// Parse IDS 1.0 metadata from XML text. Element names are matched on their +/// local name so `ids:info`, `info` or any other prefix are all accepted. +fn parse_metadata(xml: &str) -> Result { + let mut reader = Reader::from_str(xml); + reader.config_mut().trim_text(true); + let mut meta = IdsMetadata::default(); + // Local names of the currently open elements. + let mut stack: Vec = Vec::new(); + let mut text = String::new(); + let mut root_seen = false; + + loop { + let event = reader + .read_event() + .map_err(|e| format!("XML error at byte {}: {e}", reader.buffer_position()))?; + match event { + Event::Start(e) => { + let name = String::from_utf8_lossy(e.local_name().as_ref()).into_owned(); + if stack.is_empty() { + if root_seen || name != "ids" { + return Err(format!("root element is '{name}', expected 'ids'")); + } + root_seen = true; + } + if is_specification(&stack, &name) { + meta.specification_count += 1; + } + stack.push(name); + text.clear(); + } + Event::Empty(e) => { + let name = String::from_utf8_lossy(e.local_name().as_ref()).into_owned(); + if stack.is_empty() { + return Err(format!( + "root element is '{name}' and empty, expected an 'ids' document" + )); + } + if is_specification(&stack, &name) { + meta.specification_count += 1; + } + } + Event::Text(t) => { + let s = t.unescape().map_err(|e| format!("XML error: {e}"))?; + text.push_str(&s); + } + Event::CData(c) => text.push_str(&String::from_utf8_lossy(&c.into_inner())), + Event::End(_) => { + let name = stack.pop().unwrap_or_default(); + if stack.len() == 2 && stack[0] == "ids" && stack[1] == "info" { + let value = non_empty(&text); + match name.as_str() { + "title" => meta.title = value, + "author" => meta.author = value, + "version" => meta.version = value, + "date" => meta.date = value, + _ => {} + } + } + text.clear(); + } + Event::Eof => break, + _ => {} + } + } + if !root_seen { + return Err("no 'ids' root element found".into()); + } + if !stack.is_empty() { + return Err(format!( + "the document ends before '{}' is closed", + stack.last().map(String::as_str).unwrap_or("") + )); + } + Ok(meta) +} + +/// True when an element named `name`, opened under `stack`, is `ids/specifications/specification`. +fn is_specification(stack: &[String], name: &str) -> bool { + name == "specification" && stack.len() == 2 && stack[0] == "ids" && stack[1] == "specifications" +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::model::IdsFailedEntity; + + const SAMPLE_IDS: &str = r#" + + + Fire safety & walls + ACME + 1.2 + Demo requirements + bim@example.com + 2025-03-01 + QA + Design + + + + + IFCWALL + + + + Pset_WallCommon + FireRating + + + + + + IFCDOOR + + + Name + + + +"#; + + #[test] + fn reads_prefixed_metadata() { + let m = parse_metadata(SAMPLE_IDS).unwrap(); + assert_eq!( + m, + IdsMetadata { + title: Some("Fire safety & walls".into()), + author: Some("bim@example.com".into()), + version: Some("1.2".into()), + date: Some("2025-03-01".into()), + specification_count: 2, + } + ); + } + + #[test] + fn reads_unprefixed_metadata_from_file() { + let xml = SAMPLE_IDS + .replace("ids:", "") + .replace("xmlns:ids=", "xmlns="); + let dir = tempfile::tempdir().unwrap(); + let p = dir.path().join("x.ids"); + std::fs::write(&p, xml).unwrap(); + let m = read_metadata(&p).unwrap(); + assert_eq!(m.title.as_deref(), Some("Fire safety & walls")); + assert_eq!(m.specification_count, 2); + } + + #[test] + fn rejects_non_ids_and_broken_xml() { + assert!(parse_metadata("").is_err()); + assert!(parse_metadata("").is_err()); + assert!( + parse_metadata("").is_err(), + "truncated document" + ); + assert!(parse_metadata("x</wrong></info></ids>").is_err()); + let dir = tempfile::tempdir().unwrap(); + assert!(matches!( + read_metadata(&dir.path().join("missing.ids")), + Err(CoreError::Io(_)) + )); + // Missing header fields are simply None. + let m = + parse_metadata("<ids><info><title>Only title") + .unwrap(); + assert_eq!(m.title.as_deref(), Some("Only title")); + assert_eq!(m.author, None); + assert_eq!(m.specification_count, 0); + } + + fn results() -> IdsResults { + IdsResults { + ids_file: "fire.ids".into(), + title: Some("Fire safety".into()), + specifications: vec![ + IdsSpecificationResult { + name: "Walls have a fire rating".into(), + instructions: Some( + "Fill Pset_WallCommon.FireRating in the authoring tool.".into(), + ), + cardinality: Some("required".into()), + applicable_count: 3, + passed: false, + requirements: vec![ + IdsRequirementResult { + description: + "FireRating data shall be provided in the dataset Pset_WallCommon" + .into(), + facet: "property".into(), + passed: false, + failed_entities: vec![ + IdsFailedEntity { + global_id: "2O2Fr$t4X7Zf8NOew3FLOH".into(), + ifc_type: "IfcWall".into(), + name: Some("W-02".into()), + reason: + "The property set does not contain the required property" + .into(), + }, + IdsFailedEntity { + global_id: "1hOSvn6df7F8_7GcBWlRGQ".into(), + ifc_type: "IfcWall".into(), + name: None, + reason: String::new(), + }, + ], + }, + IdsRequirementResult { + description: "Name shall be provided".into(), + facet: "attribute".into(), + passed: true, + failed_entities: vec![], + }, + ], + ..Default::default() + }, + IdsSpecificationResult { + name: "Doors are named".into(), + cardinality: Some("optional".into()), + applicable_count: 0, + passed: true, + requirements: vec![IdsRequirementResult { + description: "Name shall be provided".into(), + passed: true, + ..Default::default() + }], + ..Default::default() + }, + IdsSpecificationResult { + name: "No proxies".into(), + cardinality: Some("prohibited".into()), + applicable_count: 1, + applicability: vec!["All IfcBuildingElementProxy data".into()], + passed: false, + requirements: vec![], + ..Default::default() + }, + ], + } + } + + #[test] + fn evaluate_builds_rules_and_findings() { + let ev = evaluate(&results()); + let ids: Vec<&str> = ev.rules.iter().map(|r| r.rule_id.as_str()).collect(); + assert_eq!(ids, ["IDS-01-01", "IDS-01-02", "IDS-02-01", "IDS-03-00"]); + + let r = &ev.rules[0]; + assert_eq!(r.category, "ids"); + assert_eq!(r.description, "Walls have a fire rating: FireRating data shall be provided in the dataset Pset_WallCommon"); + assert_eq!(r.severity, Severity::Error); + assert_eq!(r.status, RuleStatus::Fail); + assert_eq!(r.elements_checked, 3); + assert_eq!(r.failures, 2); + assert_eq!( + r.source, + RuleSource::Ids { + specification: "Walls have a fire rating".into(), + requirement: "FireRating data shall be provided in the dataset Pset_WallCommon" + .into() + } + ); + assert_eq!(ev.rules[1].status, RuleStatus::Pass); + assert_eq!(ev.rules[2].status, RuleStatus::NotApplicable); + assert_eq!( + ev.rules[2].severity, + Severity::Error, + "optional specs still fail as errors" + ); + assert_eq!( + ev.rules[3].severity, + Severity::Error, + "prohibited specs fail as errors" + ); + assert_eq!(ev.rules[3].status, RuleStatus::Fail); + + // Findings: two failed walls (sorted by GlobalId) + one model-level finding for the prohibited spec. + assert_eq!(ev.findings.len(), 3); + let f0 = &ev.findings[0]; + assert_eq!(f0.global_id.as_deref(), Some("1hOSvn6df7F8_7GcBWlRGQ")); + assert_eq!( + f0.message, "FireRating data shall be provided in the dataset Pset_WallCommon", + "empty reason falls back to the requirement" + ); + assert_eq!(f0.actual, None); + let f1 = &ev.findings[1]; + assert_eq!(f1.name.as_deref(), Some("W-02")); + assert_eq!(f1.ifc_type.as_deref(), Some("IfcWall")); + assert_eq!( + f1.message, + "The property set does not contain the required property" + ); + assert_eq!( + f1.expected.as_deref(), + Some("FireRating data shall be provided in the dataset Pset_WallCommon") + ); + assert_eq!( + f1.actual.as_deref(), + Some("The property set does not contain the required property") + ); + assert_eq!( + f1.fix_hint.as_deref(), + Some("Fill Pset_WallCommon.FireRating in the authoring tool.") + ); + let f2 = &ev.findings[2]; + assert_eq!(f2.rule_id, "IDS-03-00"); + assert_eq!(f2.global_id, None); + assert_eq!( + f2.fix_hint.as_deref(), + Some("See IDS specification 'No proxies'.") + ); + assert_eq!( + f2.expected.as_deref(), + Some("All IfcBuildingElementProxy data") + ); + + assert_eq!(ev.report.ids_file, "fire.ids"); + assert_eq!(ev.report.title.as_deref(), Some("Fire safety")); + assert_eq!(ev.report.specifications_total, 3); + assert_eq!(ev.report.specifications_passed, 1); + assert_eq!(ev.report.specifications.len(), 3); + + // Deterministic. + let again = evaluate(&results()); + assert_eq!(ev.rules, again.rules); + assert_eq!(ev.findings, again.findings); + } + + #[test] + fn failed_requirement_without_entities_is_reported() { + let res = IdsResults { + ids_file: "x.ids".into(), + specifications: vec![IdsSpecificationResult { + name: "Spaces exist".into(), + cardinality: None, + applicable_count: 0, + passed: false, + requirements: vec![IdsRequirementResult { + description: "Name shall be provided".into(), + passed: false, + ..Default::default() + }], + ..Default::default() + }], + ..Default::default() + }; + let ev = evaluate(&res); + assert_eq!(ev.rules[0].status, RuleStatus::Fail); + assert_eq!(ev.rules[0].severity, Severity::Error); + assert_eq!(ev.rules[0].failures, 1); + assert_eq!(ev.findings.len(), 1); + assert!( + ev.findings[0].message.contains("no applicable element"), + "{}", + ev.findings[0].message + ); + } + + #[test] + fn empty_results() { + let ev = evaluate(&IdsResults::default()); + assert!(ev.rules.is_empty()); + assert!(ev.findings.is_empty()); + assert_eq!(ev.report.specifications_total, 0); + } +} diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs new file mode 100644 index 0000000..1597000 --- /dev/null +++ b/crates/core/src/lib.rs @@ -0,0 +1,45 @@ +//! # VeriModel core +//! +//! Pure Rust engine: rule engine, quantity takeoff, BCF writer, report +//! writers, audit ledger and configuration. It never touches an IFC file: +//! the `verimodel-ifc-reader` crate produces a [`model::Model`] and this crate +//! turns it into verdicts and outputs. Everything here is unit-testable with +//! synthetic structs. +//! +//! Module map: +//! * [`model`] — shared facts/verdict types (`Element`, `Finding`, `RunReport`, ...) +//! * [`config`] — `project.yaml` +//! * [`rules`] — pluggable rule engine (rule packs are YAML data) +//! * [`score`] — score and verdict formula +//! * [`ids`] — turns IDS engine results into rules/findings, quoting requirements +//! * [`qto`] — quantity takeoff aggregation and cost estimate +//! * [`bcf`] — BCF 2.1 / 3.0 writer +//! * [`report`] — report.html / report.json / failures.csv / qto.csv / qto.xlsx +//! * [`clash`] — clash detection (phase 2 placeholder) +//! * [`run`] — orchestrates one run and writes the `out/` folder +//! * [`audit`], [`hash`], [`disciplines`], [`i18n`] — support + +pub mod audit; +pub mod bcf; +pub mod clash; +pub mod config; +pub mod disciplines; +pub mod error; +pub mod hash; +pub mod i18n; +pub mod ids; +pub mod model; +pub mod qto; +pub mod report; +pub mod rules; +pub mod run; +pub mod score; + +pub use config::Config; +pub use error::{CoreError, CoreResult}; +pub use model::{Model, RunReport}; + +/// Product name, used in window titles, reports and BCF metadata. +pub const TOOL_NAME: &str = "VeriModel"; +/// Crate version (same number for CLI, desktop app and installers). +pub const VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/crates/core/src/model.rs b/crates/core/src/model.rs new file mode 100644 index 0000000..5b14ec8 --- /dev/null +++ b/crates/core/src/model.rs @@ -0,0 +1,891 @@ +//! Shared data model of VeriModel. +//! +//! Everything in this module is **facts** (what the IFC reader found) or +//! **verdicts** (what the engine decided). The reader fills [`Model`]; the +//! engine produces [`RunReport`]. Nothing here is project specific: element +//! types, property names and storeys are whatever the file contains. +//! +//! All numeric quantities in [`Element`] are expressed in SI base units +//! (metres, square metres, cubic metres, kilograms) regardless of the units +//! declared by the IFC file. The reader is responsible for the conversion and +//! records the original unit system in [`ModelUnits`] so the UI can convert +//! back for display. + +use std::collections::BTreeMap; + +use serde::{Deserialize, Serialize}; + +/// A property value as found in an IFC property set. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(untagged)] +pub enum PropValue { + Bool(bool), + Number(f64), + Text(String), + List(Vec), + Null, +} + +impl PropValue { + /// True when the value carries no information (null, empty string or empty list). + pub fn is_empty(&self) -> bool { + match self { + PropValue::Null => true, + PropValue::Text(s) => s.trim().is_empty(), + PropValue::List(l) => l.is_empty(), + _ => false, + } + } + + /// Human readable rendering used in reports ("expected vs actual"). + pub fn display(&self) -> String { + match self { + PropValue::Bool(b) => b.to_string(), + PropValue::Number(n) => format_number(*n), + PropValue::Text(s) => s.clone(), + PropValue::List(l) => l.iter().map(|v| v.display()).collect::>().join(", "), + PropValue::Null => "".to_string(), + } + } + + /// Name of the JSON-ish data type, used by data-type checks. + pub fn type_name(&self) -> &'static str { + match self { + PropValue::Bool(_) => "boolean", + PropValue::Number(_) => "number", + PropValue::Text(_) => "string", + PropValue::List(_) => "list", + PropValue::Null => "null", + } + } +} + +/// Deterministic number formatting (no locale, trailing zeros trimmed). +pub fn format_number(n: f64) -> String { + if n.fract() == 0.0 && n.abs() < 1e15 { + format!("{}", n as i64) + } else { + let s = format!("{:.6}", n); + s.trim_end_matches('0').trim_end_matches('.').to_string() + } +} + +/// Property sets: pset name -> property name -> value. +pub type PropertySets = BTreeMap>; + +/// Quantity sets: qset name -> quantity name -> value (SI units). +pub type QuantitySets = BTreeMap>; + +/// A classification reference attached to an element. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct Classification { + /// Classification system name as declared in the file (e.g. "Uniclass 2015"), if any. + #[serde(default)] + pub system: Option, + /// Classification code / identification (e.g. "Ss_25_10_30"). + #[serde(default)] + pub code: Option, + /// Human readable name of the classification item. + #[serde(default)] + pub name: Option, +} + +/// Reference to a spatial container (site, building, storey, space, ...). +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct SpatialRef { + pub global_id: String, + pub ifc_type: String, + #[serde(default)] + pub name: Option, +} + +/// Geometry facts for one element, computed by the reader's geometry kernel. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct Geometry { + /// Axis-aligned bounding box minimum corner in world coordinates (metres). + pub bbox_min: [f64; 3], + /// Axis-aligned bounding box maximum corner in world coordinates (metres). + pub bbox_max: [f64; 3], + /// Mesh volume in cubic metres, if the shape is closed. + #[serde(default)] + pub volume_m3: Option, + /// Mesh surface area in square metres. + #[serde(default)] + pub area_m2: Option, + /// Number of triangles in the tessellated shape (0 means degenerate). + #[serde(default)] + pub triangle_count: u64, +} + +impl Geometry { + /// Distance from the world origin to the bounding box centre (metres). + pub fn distance_from_origin_m(&self) -> f64 { + let c = self.centre(); + (c[0] * c[0] + c[1] * c[1] + c[2] * c[2]).sqrt() + } + + pub fn centre(&self) -> [f64; 3] { + [ + (self.bbox_min[0] + self.bbox_max[0]) / 2.0, + (self.bbox_min[1] + self.bbox_max[1]) / 2.0, + (self.bbox_min[2] + self.bbox_max[2]) / 2.0, + ] + } + + pub fn extent(&self) -> [f64; 3] { + [ + self.bbox_max[0] - self.bbox_min[0], + self.bbox_max[1] - self.bbox_min[1], + self.bbox_max[2] - self.bbox_min[2], + ] + } +} + +/// One IFC product (element or spatial element) as read from the file. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct Element { + /// IfcRoot.GlobalId exactly as found (may be invalid or duplicated: that is what checks are for). + pub global_id: String, + /// STEP instance id (#123) so a coordinator can locate the line in the file. + #[serde(default)] + pub step_id: i64, + /// Entity type, e.g. "IfcWall". + pub ifc_type: String, + /// Entity supertypes from most specific to IfcRoot, e.g. ["IfcWall","IfcBuildingElement","IfcElement","IfcProduct",...]. + /// Lets rules target abstract types ("IfcElement") without hardcoding a type list in Rust. + #[serde(default)] + pub ancestors: Vec, + #[serde(default)] + pub predefined_type: Option, + #[serde(default)] + pub name: Option, + #[serde(default)] + pub description: Option, + #[serde(default)] + pub object_type: Option, + #[serde(default)] + pub tag: Option, + /// Name of the IfcTypeObject this element is typed by. + #[serde(default)] + pub type_name: Option, + /// Name of the containing IfcBuildingStorey (resolved through nested spaces). + #[serde(default)] + pub storey: Option, + /// Direct spatial container (via IfcRelContainedInSpatialStructure or IfcRelAggregates for spatial elements). + #[serde(default)] + pub container: Option, + #[serde(default)] + pub psets: PropertySets, + #[serde(default)] + pub quantities: QuantitySets, + #[serde(default)] + pub classifications: Vec, + #[serde(default)] + pub materials: Vec, + /// True when the entity has an IfcProductRepresentation. + #[serde(default)] + pub has_representation: bool, + /// Geometry facts; `None` when the kernel could not build a shape or when there is no representation. + #[serde(default)] + pub geometry: Option, +} + +impl Element { + /// Whether the element is of the given type or inherits from it. + pub fn is_a(&self, ifc_type: &str) -> bool { + self.ifc_type.eq_ignore_ascii_case(ifc_type) + || self + .ancestors + .iter() + .any(|a| a.eq_ignore_ascii_case(ifc_type)) + } + + /// True for spatial structure elements (site, building, storey, space, facility parts...). + pub fn is_spatial(&self) -> bool { + self.is_a("IfcSpatialElement") || self.is_a("IfcSpatialStructureElement") + } + + /// Look up a property across all psets (`pset` may be `None` to search every set). + pub fn property(&self, pset: Option<&str>, name: &str) -> Option<&PropValue> { + match pset { + Some(p) => self.psets.get(p).and_then(|s| s.get(name)), + None => self.psets.values().find_map(|s| s.get(name)), + } + } + + /// Look up a quantity by name across all quantity sets (first match in sorted set order). + pub fn quantity(&self, name: &str) -> Option { + self.quantities.values().find_map(|s| s.get(name).copied()) + } + + /// Best effort volume in m³: explicit base quantity first, geometry fallback second. + pub fn volume_m3(&self) -> Option<(f64, QuantitySource)> { + for key in ["NetVolume", "GrossVolume", "Volume"] { + if let Some(v) = self.quantity(key) { + return Some((v, QuantitySource::BaseQuantity)); + } + } + self.geometry + .as_ref() + .and_then(|g| g.volume_m3) + .map(|v| (v, QuantitySource::Geometry)) + } + + /// Best effort area in m²: explicit base quantity first, geometry fallback second. + pub fn area_m2(&self) -> Option<(f64, QuantitySource)> { + for key in [ + "NetArea", + "GrossArea", + "NetSideArea", + "GrossSideArea", + "NetFloorArea", + "GrossFloorArea", + "OuterSurfaceArea", + "Area", + ] { + if let Some(v) = self.quantity(key) { + return Some((v, QuantitySource::BaseQuantity)); + } + } + self.geometry + .as_ref() + .and_then(|g| g.area_m2) + .map(|v| (v, QuantitySource::Geometry)) + } + + /// Best effort length in m: explicit base quantity first, longest bbox extent second. + pub fn length_m(&self) -> Option<(f64, QuantitySource)> { + for key in ["Length", "NetLength", "GrossLength", "Height", "Depth"] { + if let Some(v) = self.quantity(key) { + return Some((v, QuantitySource::BaseQuantity)); + } + } + self.geometry.as_ref().map(|g| { + let e = g.extent(); + (e[0].max(e[1]).max(e[2]), QuantitySource::Geometry) + }) + } + + /// Weight in kg when a base quantity provides it. + pub fn weight_kg(&self) -> Option<(f64, QuantitySource)> { + for key in ["NetWeight", "GrossWeight", "Weight"] { + if let Some(v) = self.quantity(key) { + return Some((v, QuantitySource::BaseQuantity)); + } + } + None + } +} + +/// Where a quantity came from, so every QTO row is auditable. +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize, Default, +)] +#[serde(rename_all = "snake_case")] +pub enum QuantitySource { + /// IfcElementQuantity / BaseQuantities present in the file. + BaseQuantity, + /// Computed from the tessellated geometry by the reader. + Geometry, + /// No value available. + #[default] + None, +} + +impl QuantitySource { + pub fn label(&self) -> &'static str { + match self { + QuantitySource::BaseQuantity => "base_quantity", + QuantitySource::Geometry => "geometry", + QuantitySource::None => "none", + } + } +} + +/// Unit system detected in the file. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[serde(rename_all = "lowercase")] +pub enum UnitSystem { + #[default] + Metric, + Imperial, +} + +/// Units declared by the IFC file (IfcUnitAssignment). +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct ModelUnits { + /// Length unit name as declared, e.g. "MILLIMETRE", "METRE", "INCH", "FOOT". + #[serde(default)] + pub length_unit: Option, + /// Multiply a length in file units by this factor to get metres. + #[serde(default = "one")] + pub length_to_m: f64, + #[serde(default)] + pub area_unit: Option, + #[serde(default = "one")] + pub area_to_m2: f64, + #[serde(default)] + pub volume_unit: Option, + #[serde(default = "one")] + pub volume_to_m3: f64, + #[serde(default)] + pub system: UnitSystem, +} + +fn one() -> f64 { + 1.0 +} + +/// A node of the spatial structure tree (site > building > storey > space, or IFC4.3 facilities). +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct SpatialNode { + pub global_id: String, + pub ifc_type: String, + #[serde(default)] + pub name: Option, + /// Elevation in metres for storeys, if declared. + #[serde(default)] + pub elevation_m: Option, + #[serde(default)] + pub children: Vec, +} + +impl SpatialNode { + /// Depth-first iterator over all nodes including self. + pub fn walk(&self) -> Vec<&SpatialNode> { + let mut out = vec![self]; + for c in &self.children { + out.extend(c.walk()); + } + out + } +} + +/// File-level facts from the STEP header and the IFC project. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct ModelInfo { + pub file_name: String, + pub file_size_bytes: u64, + pub sha256: String, + /// Schema identifier as declared in FILE_SCHEMA, normalised: "IFC2X3", "IFC4", "IFC4X3". + pub schema: String, + /// Model View Definition from FILE_DESCRIPTION, if any. + #[serde(default)] + pub mvd: Option, + /// Originating application from the header. + #[serde(default)] + pub authoring_tool: Option, + #[serde(default)] + pub project_name: Option, + #[serde(default)] + pub units: ModelUnits, + pub element_count: usize, + /// Spatial tree roots (usually one IfcSite or IfcProject children). + #[serde(default)] + pub spatial_tree: Vec, + /// Count of products by entity type, sorted by type name. + #[serde(default)] + pub type_counts: BTreeMap, + /// Storey names in elevation order. + #[serde(default)] + pub storeys: Vec, + /// Disciplines inferred from entity types (data-driven, see data/disciplines.yaml). + #[serde(default)] + pub disciplines: Vec, + /// Non-fatal reader warnings (e.g. geometry failures) in plain language. + #[serde(default)] + pub reader_warnings: Vec, + /// Whether the reader could run the geometry kernel. + #[serde(default)] + pub geometry_available: bool, +} + +/// The whole input to the engine: facts about one IFC file. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct Model { + pub info: ModelInfo, + pub elements: Vec, + /// Raw IDS audit results from the reader (when an IDS file was given). + #[serde(default)] + pub ids_results: Option, +} + +impl Model { + /// Elements sorted by GlobalId then step id, so every consumer iterates deterministically. + pub fn sort_elements(&mut self) { + self.elements.sort_by(|a, b| { + a.global_id + .cmp(&b.global_id) + .then(a.step_id.cmp(&b.step_id)) + }); + } + + pub fn element_by_id(&self, global_id: &str) -> Option<&Element> { + self.elements.iter().find(|e| e.global_id == global_id) + } + + /// Every GlobalId of a spatial structure node, for containment checks. + pub fn spatial_ids(&self) -> std::collections::BTreeSet { + let mut set = std::collections::BTreeSet::new(); + for root in &self.info.spatial_tree { + for n in root.walk() { + set.insert(n.global_id.clone()); + } + } + set + } +} + +// --------------------------------------------------------------------------- +// IDS results as produced by the reader (facts, no verdict yet). +// --------------------------------------------------------------------------- + +/// IDS audit results for one IDS file, as reported by the IDS engine. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct IdsResults { + pub ids_file: String, + #[serde(default)] + pub title: Option, + #[serde(default)] + pub specifications: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct IdsSpecificationResult { + pub name: String, + #[serde(default)] + pub description: Option, + #[serde(default)] + pub instructions: Option, + /// Plain text description of the applicability facets ("All IfcWall entities ..."). + #[serde(default)] + pub applicability: Vec, + /// "required" | "optional" | "prohibited" (IDS 1.0 cardinality). + #[serde(default)] + pub cardinality: Option, + /// Number of applicable entities found. + #[serde(default)] + pub applicable_count: usize, + /// Whether the whole specification passed. + pub passed: bool, + #[serde(default)] + pub requirements: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct IdsRequirementResult { + /// Plain-language requirement text, quoted verbatim in reports. + pub description: String, + /// Facet type: "entity" | "attribute" | "property" | "classification" | "material" | "partOf". + #[serde(default)] + pub facet: String, + pub passed: bool, + #[serde(default)] + pub failed_entities: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct IdsFailedEntity { + pub global_id: String, + #[serde(default)] + pub ifc_type: String, + #[serde(default)] + pub name: Option, + /// Reason given by the IDS engine ("property FireRating is missing"). + #[serde(default)] + pub reason: String, +} + +// --------------------------------------------------------------------------- +// Verdicts +// --------------------------------------------------------------------------- + +/// Severity of a finding. Ordering: Error > Warning > Info. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] +#[serde(rename_all = "UPPERCASE")] +pub enum Severity { + Error, + Warning, + Info, +} + +impl Severity { + pub fn as_str(&self) -> &'static str { + match self { + Severity::Error => "ERROR", + Severity::Warning => "WARNING", + Severity::Info => "INFO", + } + } +} + +impl std::str::FromStr for Severity { + type Err = String; + fn from_str(s: &str) -> Result { + match s.to_ascii_lowercase().as_str() { + "error" => Ok(Severity::Error), + "warning" | "warn" => Ok(Severity::Warning), + "info" => Ok(Severity::Info), + other => Err(format!( + "unknown severity '{other}' (expected error|warning|info)" + )), + } + } +} + +/// Outcome of one rule over the whole model. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[serde(rename_all = "UPPERCASE")] +pub enum RuleStatus { + Pass, + Fail, + /// The rule could not run (e.g. geometry kernel unavailable). Never counted as PASS. + Skipped, + /// The rule applied to zero elements. + NotApplicable, +} + +/// Where a rule came from. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(tag = "kind", rename_all = "snake_case")] +pub enum RuleSource { + /// Built-in or custom rule pack (YAML). + RulePack { pack: String }, + /// Generated from `requirements.required_psets` in project.yaml. + ProjectConfig, + /// buildingSMART IDS specification. + Ids { + specification: String, + requirement: String, + }, +} + +/// One failure: one element (or the model as a whole) failing one rule. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Finding { + pub rule_id: String, + pub severity: Severity, + /// `None` for model-level findings (e.g. missing spatial hierarchy). + #[serde(default)] + pub global_id: Option, + #[serde(default)] + pub step_id: Option, + #[serde(default)] + pub ifc_type: Option, + #[serde(default)] + pub name: Option, + #[serde(default)] + pub storey: Option, + /// What went wrong, in plain language. + pub message: String, + #[serde(default)] + pub expected: Option, + #[serde(default)] + pub actual: Option, + #[serde(default)] + pub fix_hint: Option, + pub source: RuleSource, +} + +/// Per-rule summary. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct RuleResult { + pub rule_id: String, + pub category: String, + pub description: String, + pub severity: Severity, + pub status: RuleStatus, + /// Elements the rule was applied to. + pub elements_checked: usize, + /// Number of findings produced by the rule. + pub failures: usize, + /// Plain-language reason when `status == Skipped`. + #[serde(default)] + pub skipped_reason: Option, + pub source: RuleSource, +} + +/// Overall verdict. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum Verdict { + Pass, + PassWithWarnings, + Fail, +} + +impl Verdict { + pub fn as_str(&self) -> &'static str { + match self { + Verdict::Pass => "PASS", + Verdict::PassWithWarnings => "PASS WITH WARNINGS", + Verdict::Fail => "FAIL", + } + } +} + +/// Headline numbers for the review screen. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct Summary { + /// 0..=100. See [`crate::score`] for the documented formula. + pub score: u8, + pub verdict: Option, + /// Distinct elements evaluated by at least one rule. + pub elements_checked: usize, + /// Sum over rules of elements evaluated (the denominator of the score). + pub element_checks: usize, + pub errors: usize, + pub warnings: usize, + pub infos: usize, + pub rules_total: usize, + pub rules_passed: usize, + pub rules_failed: usize, + pub rules_skipped: usize, + pub rules_not_applicable: usize, + /// Plain-language statement of the verdict rule, shown in the UI. + pub verdict_rule: String, +} + +/// One row of the quantity takeoff. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct QtoRow { + /// Group key values in `group_by` order (e.g. ["IfcWall", "Level 1", "Ss_25"]). + pub group: Vec, + pub count: usize, + pub volume_m3: f64, + pub area_m2: f64, + pub length_m: f64, + pub weight_kg: f64, + /// How many elements of the group had each quantity from base quantities vs geometry vs none. + pub volume_sources: BTreeMap, + pub area_sources: BTreeMap, + pub length_sources: BTreeMap, + /// Cost line when a unit rate matched this group. + #[serde(default)] + pub cost: Option, +} + +/// Cost estimate for a QTO row. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct CostLine { + pub rate_code: String, + pub rate_description: String, + /// Unit the rate applies to: "m3" | "m2" | "m" | "kg" | "nr". + pub unit: String, + pub rate: f64, + pub quantity: f64, + pub amount: f64, + pub currency: String, + /// File the rate came from. + pub source: String, +} + +/// A hand-check sample so a reader can verify the QTO by hand. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct QtoSample { + pub global_id: String, + pub ifc_type: String, + #[serde(default)] + pub name: Option, + #[serde(default)] + pub storey: Option, + #[serde(default)] + pub volume_m3: Option, + pub volume_source: QuantitySource, + #[serde(default)] + pub area_m2: Option, + pub area_source: QuantitySource, + #[serde(default)] + pub length_m: Option, + pub length_source: QuantitySource, + /// Quantity set names found on the element. + pub quantity_sets: Vec, +} + +/// Quantity takeoff section of the report. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct QtoReport { + /// Grouping keys used, e.g. ["type", "storey"]. + pub group_by: Vec, + pub rows: Vec, + pub total_count: usize, + pub total_volume_m3: f64, + pub total_area_m2: f64, + pub total_length_m: f64, + pub total_weight_kg: f64, + #[serde(default)] + pub total_cost: Option, + #[serde(default)] + pub currency: Option, + /// Elements with no usable quantity at all. + pub elements_without_quantities: usize, + /// Plain-language explanation of how totals were computed. + pub method: String, + pub samples: Vec, +} + +/// Clash detection section (phase 2). Present so the report shape is stable. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct ClashReport { + pub enabled: bool, + pub implemented: bool, + pub message: String, + #[serde(default)] + pub clashes: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct Clash { + pub global_id_a: String, + pub global_id_b: String, + /// "hard" | "clearance" | "duplicate" + pub clash_type: String, + pub distance_m: f64, + pub location: [f64; 3], +} + +/// IDS section of the report: what the IDS engine said, quoted. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct IdsReport { + pub ids_file: String, + #[serde(default)] + pub title: Option, + pub specifications_total: usize, + pub specifications_passed: usize, + pub specifications: Vec, +} + +/// Tool identity recorded in every output. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ToolInfo { + pub name: String, + pub version: String, +} + +impl Default for ToolInfo { + fn default() -> Self { + Self { + name: crate::TOOL_NAME.to_string(), + version: crate::VERSION.to_string(), + } + } +} + +/// The complete, deterministic result of one run. Serialised as `report.json`. +/// +/// Must not contain timestamps or durations: those live in `run.json` so that +/// `report.json` is byte-for-byte reproducible. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct RunReport { + pub tool: ToolInfo, + pub model: ModelInfo, + /// The effective configuration used for this run (serialised project.yaml). + pub config: serde_json::Value, + pub summary: Summary, + pub rules: Vec, + pub findings: Vec, + pub qto: QtoReport, + pub ids: Option, + pub clash: ClashReport, +} + +impl RunReport { + /// Sort rules and findings so output is deterministic regardless of evaluation order. + pub fn normalise(&mut self) { + self.rules.sort_by(|a, b| a.rule_id.cmp(&b.rule_id)); + self.findings.sort_by(|a, b| { + a.severity + .cmp(&b.severity) + .then_with(|| a.rule_id.cmp(&b.rule_id)) + .then_with(|| a.global_id.cmp(&b.global_id)) + .then_with(|| a.message.cmp(&b.message)) + }); + } +} + +/// Run ledger: reproducibility and audit data. Serialised as `run.json`. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +pub struct RunLedger { + pub tool: ToolInfo, + /// ISO-8601 UTC timestamp. + pub timestamp: String, + pub duration_ms: u64, + pub ifc_file: String, + pub ifc_sha256: String, + #[serde(default)] + pub ids_file: Option, + #[serde(default)] + pub ids_sha256: Option, + #[serde(default)] + pub config_file: Option, + pub config_sha256: String, + #[serde(default)] + pub rates_file: Option, + #[serde(default)] + pub rates_sha256: Option, + pub schema: String, + pub element_count: usize, + pub score: u8, + pub verdict: Option, + pub errors: usize, + pub warnings: usize, + pub infos: usize, + pub rules_passed: usize, + pub rules_failed: usize, + pub rules_skipped: usize, + /// SHA256 of report.json, so anyone can prove which report belongs to this run. + pub report_sha256: String, + pub output_dir: String, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn format_number_is_stable() { + assert_eq!(format_number(2.0), "2"); + assert_eq!(format_number(2.5), "2.5"); + assert_eq!(format_number(0.1234567), "0.123457"); + assert_eq!(format_number(-3.0), "-3"); + } + + #[test] + fn element_is_a_uses_ancestors() { + let e = Element { + ifc_type: "IfcWallStandardCase".into(), + ancestors: vec![ + "IfcWall".into(), + "IfcBuildingElement".into(), + "IfcElement".into(), + ], + ..Default::default() + }; + assert!(e.is_a("IfcElement")); + assert!(e.is_a("ifcwall")); + assert!(!e.is_a("IfcSlab")); + } + + #[test] + fn volume_prefers_base_quantity_over_geometry() { + let mut e = Element { + geometry: Some(Geometry { + volume_m3: Some(5.0), + ..Default::default() + }), + ..Default::default() + }; + assert_eq!(e.volume_m3(), Some((5.0, QuantitySource::Geometry))); + e.quantities + .entry("Qto_WallBaseQuantities".into()) + .or_default() + .insert("NetVolume".into(), 2.0); + assert_eq!(e.volume_m3(), Some((2.0, QuantitySource::BaseQuantity))); + } + + #[test] + fn severity_orders_error_first() { + assert!(Severity::Error < Severity::Warning); + assert!(Severity::Warning < Severity::Info); + } +} diff --git a/crates/core/src/qto.rs b/crates/core/src/qto.rs new file mode 100644 index 0000000..e661e58 --- /dev/null +++ b/crates/core/src/qto.rs @@ -0,0 +1,765 @@ +//! Quantity takeoff: aggregation, grouping, cost estimate, hand-check samples. +//! +//! * [`RateTable::from_csv`] reads a unit-rate table with the columns +//! `code,description,unit,rate,currency,match_type,match_storey,match_classification` +//! (header row required, column names case-insensitive, column order free). +//! * [`compute`] groups the takeoff items of a [`Model`] by `config.qto.group_by` +//! (`type | storey | classification | material | predefined_type | type_name`), +//! sums volume / area / length / weight with the [`Element`] helpers (base +//! quantity first, geometry fallback), records how many elements took each +//! quantity from which source, matches the first applicable unit rate per +//! group, picks deterministic hand-check samples and writes a plain-language +//! `method` text so every total can be audited. +//! +//! Takeoff items are every non-spatial product except abstract non-physical +//! families (feature elements such as openings, virtual elements, annotations +//! and grids). No concrete building type is hardcoded. + +use std::collections::BTreeMap; +use std::path::Path; + +use crate::config::Config; +use crate::error::{CoreError, CoreResult}; +use crate::model::{CostLine, Element, Model, QtoReport, QtoRow, QtoSample, QuantitySource}; + +/// Abstract IFC families that are never takeoff items (they are not physical +/// products: openings/voids, virtual boundaries, annotations, grids). +const EXCLUDED_FAMILIES: [&str; 4] = [ + "IfcFeatureElement", + "IfcVirtualElement", + "IfcAnnotation", + "IfcGrid", +]; + +/// Units a rate may be expressed in. +const RATE_UNITS: [&str; 5] = ["m3", "m2", "m", "kg", "nr"]; + +/// One unit rate from rates.csv. +#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, Default)] +pub struct Rate { + pub code: String, + pub description: String, + /// "m3" | "m2" | "m" | "kg" | "nr" + pub unit: String, + pub rate: f64, + pub currency: String, + /// IFC type (or ancestor) this rate applies to. + pub match_type: Option, + pub match_storey: Option, + pub match_classification: Option, +} + +/// Loaded rate table. +#[derive(Debug, Clone, PartialEq, Default)] +pub struct RateTable { + pub source: String, + pub rates: Vec, +} + +impl RateTable { + /// Read a unit-rate CSV. Errors are plain language and name the file and line. + pub fn from_csv(path: &Path) -> CoreResult { + let source = path + .file_name() + .map(|s| s.to_string_lossy().to_string()) + .unwrap_or_else(|| path.display().to_string()); + let bytes = std::fs::read(path).map_err(|e| { + CoreError::Qto(format!( + "cannot read the unit rates file {}: {e}", + path.display() + )) + })?; + Self::from_reader(&source, bytes.as_slice()) + } + + /// Parse a unit-rate table from any reader; `source` names it in messages and cost lines. + pub fn from_reader(source: &str, reader: R) -> CoreResult { + let mut rdr = csv::ReaderBuilder::new() + .has_headers(true) + .trim(csv::Trim::All) + .flexible(true) + .from_reader(reader); + let headers = rdr + .headers() + .map_err(|e| { + CoreError::Qto(format!( + "the unit rates file {source} could not be read as CSV: {e}" + )) + })? + .clone(); + let col = |name: &str| { + headers.iter().position(|h| { + h.trim_start_matches('\u{feff}') + .trim() + .eq_ignore_ascii_case(name) + }) + }; + let required = ["code", "description", "unit", "rate"]; + let missing: Vec<&str> = required + .iter() + .copied() + .filter(|c| col(c).is_none()) + .collect(); + if !missing.is_empty() { + return Err(CoreError::Qto(format!( + "the unit rates file {source} is missing the column(s) {}. The first line must be a header with: \ + code, description, unit, rate, currency, match_type, match_storey, match_classification", + missing.join(", ") + ))); + } + let (c_code, c_desc, c_unit, c_rate) = ( + col("code").unwrap(), + col("description").unwrap(), + col("unit").unwrap(), + col("rate").unwrap(), + ); + let (c_cur, c_type, c_storey, c_class) = ( + col("currency"), + col("match_type"), + col("match_storey"), + col("match_classification"), + ); + + let mut rates = Vec::new(); + for (i, rec) in rdr.records().enumerate() { + let line = i + 2; // 1-based, header is line 1 + let rec = rec.map_err(|e| { + CoreError::Qto(format!("the unit rates file {source}, line {line}: {e}")) + })?; + if rec.iter().all(|f| f.trim().is_empty()) { + continue; + } + let get = |c: usize| rec.get(c).unwrap_or("").trim().to_string(); + let opt = |c: Option| c.map(get).filter(|s| !s.is_empty()); + let code = get(c_code); + if code.is_empty() { + return Err(CoreError::Qto(format!( + "the unit rates file {source}, line {line}: the code is empty" + ))); + } + let unit = get(c_unit).to_ascii_lowercase(); + if !RATE_UNITS.contains(&unit.as_str()) { + return Err(CoreError::Qto(format!( + "the unit rates file {source}, line {line} (code {code}): unit '{}' is not one of m3, m2, m, kg, nr", + get(c_unit) + ))); + } + let rate_text = get(c_rate); + let rate: f64 = rate_text.parse().ok().filter(|r: &f64| r.is_finite()).ok_or_else(|| { + CoreError::Qto(format!( + "the unit rates file {source}, line {line} (code {code}): rate '{rate_text}' is not a number \ + (use a dot as decimal separator, no currency symbol)" + )) + })?; + rates.push(Rate { + code, + description: get(c_desc), + unit, + rate, + currency: opt(c_cur).unwrap_or_default(), + match_type: opt(c_type), + match_storey: opt(c_storey), + match_classification: opt(c_class), + }); + } + Ok(RateTable { + source: source.to_string(), + rates, + }) + } +} + +/// True when the element is a takeoff item. +pub fn is_takeoff_item(e: &Element) -> bool { + !e.is_spatial() && !EXCLUDED_FAMILIES.iter().any(|f| e.is_a(f)) +} + +/// The value of one grouping key for an element. +fn group_value(e: &Element, key: &str) -> CoreResult { + let non_empty = |s: &Option| { + s.as_deref() + .map(str::trim) + .filter(|s| !s.is_empty()) + .map(String::from) + }; + Ok(match key { + "type" => e.ifc_type.clone(), + "storey" => non_empty(&e.storey).unwrap_or_else(|| "(no storey)".into()), + "classification" => first_classification(e).unwrap_or_else(|| "(unclassified)".into()), + "material" => { + let mats: Vec<&str> = e.materials.iter().map(|m| m.trim()).filter(|m| !m.is_empty()).collect(); + if mats.is_empty() { + "(no material)".into() + } else { + mats.join(" | ") + } + } + "predefined_type" => non_empty(&e.predefined_type).unwrap_or_else(|| "(none)".into()), + "type_name" => non_empty(&e.type_name).unwrap_or_else(|| "(no type)".into()), + other => { + return Err(CoreError::Qto(format!( + "qto.group_by contains '{other}', expected one of type, storey, classification, material, predefined_type, type_name" + ))) + } + }) +} + +fn first_classification(e: &Element) -> Option { + e.classifications.iter().find_map(|c| { + c.code + .as_deref() + .map(str::trim) + .filter(|s| !s.is_empty()) + .map(String::from) + }) +} + +fn key_phrase(key: &str) -> &'static str { + match key { + "type" => "IFC entity type", + "storey" => "building storey", + "classification" => "first classification code", + "material" => "material (all materials of the element joined with ' | ')", + "predefined_type" => "predefined type", + "type_name" => "type object name", + _ => "unknown key", + } +} + +/// Whether a rate applies to the elements of one group. +/// +/// `match_type` uses `Element::is_a` (type or any ancestor); `match_storey` +/// is an exact storey name; `match_classification` is a prefix of the first +/// classification code. Every element of the group must satisfy each +/// non-empty condition, so a rate never prices elements it was not written +/// for (when the group key already fixes the attribute this is the same as +/// testing the group's first element). +fn rate_matches(rate: &Rate, elements: &[&Element]) -> bool { + if elements.is_empty() { + return false; + } + if let Some(t) = &rate.match_type { + if !elements.iter().all(|e| e.is_a(t)) { + return false; + } + } + if let Some(s) = &rate.match_storey { + if !elements + .iter() + .all(|e| e.storey.as_deref().map(str::trim) == Some(s.as_str())) + { + return false; + } + } + if let Some(p) = &rate.match_classification { + if !elements + .iter() + .all(|e| first_classification(e).is_some_and(|c| c.starts_with(p.as_str()))) + { + return false; + } + } + true +} + +fn round2(x: f64) -> f64 { + (x * 100.0).round() / 100.0 +} + +fn bump(map: &mut BTreeMap, src: QuantitySource) { + *map.entry(src.label().to_string()).or_insert(0) += 1; +} + +fn source_of(q: Option<(f64, QuantitySource)>) -> (f64, QuantitySource) { + q.unwrap_or((0.0, QuantitySource::None)) +} + +fn has_any_quantity(e: &Element) -> bool { + e.volume_m3().is_some() + || e.area_m2().is_some() + || e.length_m().is_some() + || e.weight_kg().is_some() +} + +/// Compute the quantity takeoff. +pub fn compute(model: &Model, config: &Config, rates: Option<&RateTable>) -> CoreResult { + let group_by = config.qto.group_by.clone(); + for k in &group_by { + group_value(&Element::default(), k)?; // validates the key + } + + let mut items: Vec<&Element> = model + .elements + .iter() + .filter(|e| is_takeoff_item(e)) + .collect(); + items.sort_by(|a, b| { + a.global_id + .cmp(&b.global_id) + .then(a.step_id.cmp(&b.step_id)) + }); + let excluded = model.elements.len() - items.len(); + + let mut groups: BTreeMap, Vec<&Element>> = BTreeMap::new(); + for e in &items { + let key = group_by + .iter() + .map(|k| group_value(e, k)) + .collect::>>()?; + groups.entry(key).or_default().push(e); + } + + let mut rows = Vec::with_capacity(groups.len()); + let mut src_totals: [BTreeMap; 3] = Default::default(); + let mut weight_count = 0usize; + for (group, elems) in &groups { + let mut row = QtoRow { + group: group.clone(), + count: elems.len(), + ..Default::default() + }; + for e in elems { + let (v, vs) = source_of(e.volume_m3()); + let (a, as_) = source_of(e.area_m2()); + let (l, ls) = source_of(e.length_m()); + row.volume_m3 += v; + row.area_m2 += a; + row.length_m += l; + if let Some((w, _)) = e.weight_kg() { + row.weight_kg += w; + weight_count += 1; + } + bump(&mut row.volume_sources, vs); + bump(&mut row.area_sources, as_); + bump(&mut row.length_sources, ls); + bump(&mut src_totals[0], vs); + bump(&mut src_totals[1], as_); + bump(&mut src_totals[2], ls); + } + if let Some(table) = rates { + if let Some(rate) = table.rates.iter().find(|r| rate_matches(r, elems)) { + let quantity = match rate.unit.as_str() { + "m3" => row.volume_m3, + "m2" => row.area_m2, + "m" => row.length_m, + "kg" => row.weight_kg, + _ => row.count as f64, + }; + let currency = if rate.currency.is_empty() { + config.qto.currency.clone() + } else { + rate.currency.clone() + }; + row.cost = Some(CostLine { + rate_code: rate.code.clone(), + rate_description: rate.description.clone(), + unit: rate.unit.clone(), + rate: rate.rate, + quantity, + amount: round2(quantity * rate.rate), + currency, + source: table.source.clone(), + }); + } + } + rows.push(row); + } + + let costs: Vec<&CostLine> = rows.iter().filter_map(|r| r.cost.as_ref()).collect(); + let mut currencies: Vec = costs.iter().map(|c| c.currency.clone()).collect(); + currencies.sort_unstable(); + currencies.dedup(); + let mixed_currency = currencies.len() > 1; + let (total_cost, currency) = match currencies.len() { + 0 => (None, None), + 1 => ( + Some(round2(costs.iter().map(|c| c.amount).sum())), + Some(currencies[0].clone()), + ), + _ => (None, None), + }; + + let without = items.iter().filter(|e| !has_any_quantity(e)).count(); + + let samples: Vec = items + .iter() + .filter(|e| has_any_quantity(e)) + .take(config.qto.sample_count) + .map(|e| { + let (v, vs) = split(e.volume_m3()); + let (a, as_) = split(e.area_m2()); + let (l, ls) = split(e.length_m()); + QtoSample { + global_id: e.global_id.clone(), + ifc_type: e.ifc_type.clone(), + name: e.name.clone(), + storey: e.storey.clone(), + volume_m3: v, + volume_source: vs, + area_m2: a, + area_source: as_, + length_m: l, + length_source: ls, + quantity_sets: e.quantities.keys().cloned().collect(), + } + }) + .collect(); + + let mut report = QtoReport { + group_by: group_by.clone(), + total_count: rows.iter().map(|r| r.count).sum(), + total_volume_m3: rows.iter().map(|r| r.volume_m3).sum(), + total_area_m2: rows.iter().map(|r| r.area_m2).sum(), + total_length_m: rows.iter().map(|r| r.length_m).sum(), + total_weight_kg: rows.iter().map(|r| r.weight_kg).sum(), + total_cost, + currency, + elements_without_quantities: without, + method: String::new(), + samples, + rows, + }; + report.method = method_text( + &report, + excluded, + &src_totals, + weight_count, + rates, + mixed_currency, + ); + Ok(report) +} + +fn split(q: Option<(f64, QuantitySource)>) -> (Option, QuantitySource) { + match q { + Some((v, s)) => (Some(v), s), + None => (None, QuantitySource::None), + } +} + +fn sources_phrase(m: &BTreeMap) -> String { + let n = |k: &str| m.get(k).copied().unwrap_or(0); + format!( + "{} from base quantities, {} from geometry, {} not available", + n("base_quantity"), + n("geometry"), + n("none") + ) +} + +fn method_text( + q: &QtoReport, + excluded: usize, + src: &[BTreeMap; 3], + weight_count: usize, + rates: Option<&RateTable>, + mixed_currency: bool, +) -> String { + let keys = q + .group_by + .iter() + .map(|k| key_phrase(k)) + .collect::>() + .join(", then by "); + let mut s = String::new(); + s.push_str(&format!( + "{} element(s) were measured and grouped by {}; {} groups resulted. ", + q.total_count, + if keys.is_empty() { + "nothing (one single group)".to_string() + } else { + keys + }, + q.rows.len() + )); + s.push_str(&format!( + "Spatial elements (sites, buildings, storeys, spaces) and non-physical elements (openings and other feature \ + elements, virtual elements, annotations, grids) are not takeoff items; {excluded} such entries were left out. " + )); + s.push_str( + "For each element, volume, area, length and weight were taken first from the base quantities stored in the IFC \ + file (IfcElementQuantity, e.g. NetVolume, NetArea, Length, NetWeight). When a base quantity was missing, volume \ + and area were computed from the tessellated geometry and length was taken as the longest side of the bounding \ + box; weight is only reported when the file provides it. ", + ); + s.push_str( + "All values are in SI units, converted from the units declared in the file: cubic metres (m³), square metres \ + (m²), metres (m) and kilograms (kg). ", + ); + s.push_str(&format!( + "Volume: {}. Area: {}. Length: {}. Weight was available for {} element(s). ", + sources_phrase(&src[0]), + sources_phrase(&src[1]), + sources_phrase(&src[2]), + weight_count + )); + s.push_str(&format!( + "{} element(s) had no quantity at all; they are counted in their group but add nothing to the totals. ", + q.elements_without_quantities + )); + match rates { + None => s.push_str("No unit rates file was given, so no cost was estimated."), + Some(t) => { + let matched = q.rows.iter().filter(|r| r.cost.is_some()).count(); + s.push_str(&format!( + "Cost was estimated with the unit rates in {} ({} rates): for each group the first rate, in file order, \ + whose match columns all apply (match_type: the IFC type or one of its supertypes; match_storey: the exact \ + storey name; match_classification: a prefix of the classification code; an empty column matches \ + anything) was used. Amount = group quantity in the rate's unit (nr = element count) × rate, rounded to 2 \ + decimals. {} of {} groups matched a rate; groups without a rate have no cost. ", + t.source, + t.rates.len(), + matched, + q.rows.len() + )); + if mixed_currency { + s.push_str( + "The matched rates use different currencies, so no grand total was computed.", + ); + } else if let (Some(total), Some(cur)) = (q.total_cost, &q.currency) { + s.push_str(&format!("Total estimated cost: {total:.2} {cur}.")); + } else { + s.push_str("No rate matched, so no total cost was computed."); + } + } + } + s.trim_end().to_string() +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::model::{Classification, Geometry}; + + fn el(id: &str, ty: &str, storey: Option<&str>) -> Element { + Element { + global_id: id.into(), + ifc_type: ty.into(), + ancestors: vec![ + ty.into(), + "IfcBuiltElement".into(), + "IfcElement".into(), + "IfcProduct".into(), + ], + storey: storey.map(String::from), + ..Default::default() + } + } + + fn with_qty(mut e: Element, name: &str, v: f64) -> Element { + e.quantities + .entry("Qto_Base".into()) + .or_default() + .insert(name.into(), v); + e + } + + fn with_geom(mut e: Element, vol: f64, area: f64) -> Element { + e.geometry = Some(Geometry { + bbox_min: [0.0, 0.0, 0.0], + bbox_max: [4.0, 0.2, 3.0], + volume_m3: Some(vol), + area_m2: Some(area), + triangle_count: 12, + }); + e + } + + fn model() -> Model { + let mut m = Model { + elements: vec![ + with_qty( + with_qty(el("A1", "IfcWall", Some("L1")), "NetVolume", 2.0), + "NetSideArea", + 10.0, + ), + with_geom(el("A2", "IfcWall", Some("L1")), 3.0, 12.0), + with_qty(el("A3", "IfcWall", Some("L2")), "NetVolume", 1.5), + { + let mut s = with_qty(el("B1", "IfcSlab", Some("L1")), "NetVolume", 5.0); + s.classifications.push(Classification { + code: Some("Ss_30_12".into()), + ..Default::default() + }); + s + }, + el("C1", "IfcColumn", None), // no quantity at all + Element { + global_id: "S1".into(), + ifc_type: "IfcBuildingStorey".into(), + ancestors: vec![ + "IfcBuildingStorey".into(), + "IfcSpatialStructureElement".into(), + ], + ..Default::default() + }, + Element { + global_id: "O1".into(), + ifc_type: "IfcOpeningElement".into(), + ancestors: vec![ + "IfcOpeningElement".into(), + "IfcFeatureElementSubtraction".into(), + "IfcFeatureElement".into(), + ], + geometry: Some(Geometry { + volume_m3: Some(9.0), + ..Default::default() + }), + ..Default::default() + }, + ], + ..Default::default() + }; + m.sort_elements(); + m + } + + #[test] + fn groups_by_type_and_storey_with_totals_and_sources() { + let cfg = Config::default(); + let q = compute(&model(), &cfg, None).unwrap(); + let groups: Vec> = q.rows.iter().map(|r| r.group.clone()).collect(); + assert_eq!( + groups, + vec![ + vec!["IfcColumn".to_string(), "(no storey)".to_string()], + vec!["IfcSlab".into(), "L1".into()], + vec!["IfcWall".into(), "L1".into()], + vec!["IfcWall".into(), "L2".into()], + ] + ); + let wall_l1 = &q.rows[2]; + assert_eq!(wall_l1.count, 2); + assert!((wall_l1.volume_m3 - 5.0).abs() < 1e-9); + assert!((wall_l1.area_m2 - 22.0).abs() < 1e-9); + assert_eq!(wall_l1.volume_sources.get("base_quantity"), Some(&1)); + assert_eq!(wall_l1.volume_sources.get("geometry"), Some(&1)); + assert_eq!(q.total_count, 5, "storey and opening are excluded"); + assert!((q.total_volume_m3 - 11.5).abs() < 1e-9); + assert_eq!(q.elements_without_quantities, 1); + assert_eq!(q.rows[0].volume_sources.get("none"), Some(&1)); + assert!(q.total_cost.is_none()); + assert!(q.method.contains("base quantities")); + assert!(q.method.contains("1 element(s) had no quantity")); + } + + #[test] + fn rate_matching_first_match_wins_and_non_matching_is_ignored() { + let csv = + "Code,Description,Unit,Rate,Currency,match_type,match_storey,match_classification\n\ + R-DOOR,Doors,nr,300,,IfcDoor,,\n\ + R-WALL-L1,Walls level 1,m3,100,USD,IfcWall,L1,\n\ + R-WALL,Walls,m3,90,,IfcBuiltElement,,\n\ + R-SLAB,Slabs by class,m2,10,,,,Ss_30\n"; + let table = RateTable::from_reader("rates.csv", csv.as_bytes()).unwrap(); + assert_eq!(table.rates.len(), 4); + let cfg = Config::default(); + let q = compute(&model(), &cfg, Some(&table)).unwrap(); + let by = |t: &str, s: &str| { + q.rows + .iter() + .find(|r| r.group == vec![t.to_string(), s.to_string()]) + .unwrap() + }; + let c = by("IfcWall", "L1").cost.as_ref().unwrap(); + assert_eq!(c.rate_code, "R-WALL-L1"); + assert_eq!(c.currency, "USD"); + assert_eq!(c.amount, 500.0); + assert_eq!(c.source, "rates.csv"); + let c2 = by("IfcWall", "L2").cost.as_ref().unwrap(); + assert_eq!(c2.rate_code, "R-WALL"); + assert_eq!(c2.currency, "EUR", "falls back to config currency"); + assert_eq!(c2.amount, 135.0); + // Slab has no area, classification prefix matches but the ancestor rate R-WALL comes first. + assert_eq!( + by("IfcSlab", "L1").cost.as_ref().unwrap().rate_code, + "R-WALL" + ); + // Mixed currencies -> no grand total. + assert!(q.total_cost.is_none()); + + let csv2 = + "code,description,unit,rate,currency,match_type,match_storey,match_classification\n\ + R-DOOR,Doors,nr,300,EUR,IfcDoor,,\n\ + R-SLAB,Slabs,m3,20,EUR,,,Ss_30\n"; + let t2 = RateTable::from_reader("r2.csv", csv2.as_bytes()).unwrap(); + let q2 = compute(&model(), &cfg, Some(&t2)).unwrap(); + assert_eq!(q2.rows.iter().filter(|r| r.cost.is_some()).count(), 1); + assert_eq!(q2.total_cost, Some(100.0)); + assert_eq!(q2.currency.as_deref(), Some("EUR")); + assert!(q2.method.contains("1 of 4 groups matched")); + } + + #[test] + fn samples_are_deterministic_and_skip_elements_without_quantities() { + let mut cfg = Config::default(); + cfg.qto.sample_count = 3; + let a = compute(&model(), &cfg, None).unwrap(); + let b = compute(&model(), &cfg, None).unwrap(); + assert_eq!(a, b); + let ids: Vec<&str> = a.samples.iter().map(|s| s.global_id.as_str()).collect(); + assert_eq!(ids, vec!["A1", "A2", "A3"]); + assert_eq!(a.samples[0].quantity_sets, vec!["Qto_Base".to_string()]); + assert_eq!(a.samples[1].volume_source, QuantitySource::Geometry); + cfg.qto.sample_count = 10; + let c = compute(&model(), &cfg, None).unwrap(); + assert!(c + .samples + .iter() + .all(|s| s.global_id != "C1" && s.global_id != "O1")); + } + + #[test] + fn other_group_keys_use_placeholders() { + let mut cfg = Config::default(); + cfg.qto.group_by = vec![ + "classification".into(), + "material".into(), + "predefined_type".into(), + "type_name".into(), + ]; + let q = compute(&model(), &cfg, None).unwrap(); + assert!(q + .rows + .iter() + .any(|r| r.group == vec!["(unclassified)", "(no material)", "(none)", "(no type)"])); + assert!(q.rows.iter().any(|r| r.group[0] == "Ss_30_12")); + } + + #[test] + fn missing_column_is_a_plain_language_qto_error() { + let err = + RateTable::from_reader("rates.csv", "code,unit,rate\nX,m3,1\n".as_bytes()).unwrap_err(); + assert!(matches!(err, CoreError::Qto(_))); + let msg = err.to_string(); + assert!(msg.contains("missing the column(s) description"), "{msg}"); + assert!(msg.contains("rates.csv")); + } + + #[test] + fn bad_rate_and_unit_are_reported_with_line_numbers() { + let bad_rate = "code,description,unit,rate\nX,d,m3,12€\n"; + let e = RateTable::from_reader("r.csv", bad_rate.as_bytes()) + .unwrap_err() + .to_string(); + assert!(e.contains("line 2") && e.contains("not a number"), "{e}"); + let bad_unit = "code,description,unit,rate\nX,d,m3,1\nY,d,ft,1\n"; + let e = RateTable::from_reader("r.csv", bad_unit.as_bytes()) + .unwrap_err() + .to_string(); + assert!(e.contains("line 3") && e.contains("'ft'"), "{e}"); + } + + #[test] + fn from_csv_reads_a_file_and_names_the_source() { + let dir = tempfile::tempdir().unwrap(); + let p = dir.path().join("my_rates.csv"); + std::fs::write(&p, "CODE,DESCRIPTION,UNIT,RATE\nA,Any,nr,2.5\n").unwrap(); + let t = RateTable::from_csv(&p).unwrap(); + assert_eq!(t.source, "my_rates.csv"); + assert_eq!(t.rates[0].rate, 2.5); + assert!(t.rates[0].match_type.is_none()); + let missing = RateTable::from_csv(&dir.path().join("nope.csv")).unwrap_err(); + assert!(matches!(missing, CoreError::Qto(_))); + } +} diff --git a/crates/core/src/report.rs b/crates/core/src/report.rs new file mode 100644 index 0000000..51d16e2 --- /dev/null +++ b/crates/core/src/report.rs @@ -0,0 +1,1191 @@ +//! Report writers: report.html, report.json, failures.csv, qto.csv, qto.xlsx, qto.json. +//! +//! * [`write_report_json`] — pretty JSON, keys in struct order, no timestamps. +//! * [`write_failures_csv`] — one row per finding: +//! `severity,rule_id,global_id,step_id,ifc_type,name,storey,message,expected,actual,fix_hint,source`. +//! * [`write_qto_csv`] / [`write_qto_xlsx`] / [`write_qto_json`] — the quantity takeoff. +//! * [`write_report_html`] — one self-contained HTML file (inline CSS, a tiny +//! inline filter script, no external assets), labels from [`Strings`]. +//! * [`write_all`] — writes everything into `out/` and lists the files. +//! +//! Every writer is deterministic: the same report gives the same bytes. + +use std::fmt::Write as _; +use std::path::Path; + +use crate::config::Config; +use crate::error::{CoreError, CoreResult}; +use crate::i18n::Strings; +use crate::model::{ + format_number, QtoReport, RuleSource, RuleStatus, RunReport, Severity, Verdict, +}; + +/// Stylesheet inlined into report.html. +const REPORT_CSS: &str = include_str!("../data/report.css"); + +/// Maximum number of findings rendered in report.html (all of them are in failures.csv). +pub const MAX_HTML_FINDINGS: usize = 2000; + +/// Fixed document creation date written into qto.xlsx so the file is reproducible. +const XLSX_FIXED_DATE: (u16, u8, u8) = (2000, 1, 1); + +/// One produced file, listed on the Export screen. +#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] +pub struct OutputFile { + /// File name inside `out/`. + pub name: String, + /// Plain-language description key (resolved by the UI's i18n). + pub kind: String, + pub bytes: u64, +} + +fn csv_err(path: &Path) -> impl Fn(csv::Error) -> CoreError + '_ { + move |e| CoreError::Report(format!("cannot write {}: {e}", path.display())) +} + +fn xlsx_err(path: &Path) -> impl Fn(rust_xlsxwriter::XlsxError) -> CoreError + '_ { + move |e| CoreError::Report(format!("cannot write {}: {e}", path.display())) +} + +/// `pack:` | `project_config` | `ids:/`. +pub fn source_label(source: &RuleSource) -> String { + match source { + RuleSource::RulePack { pack } => format!("pack:{pack}"), + RuleSource::ProjectConfig => "project_config".to_string(), + RuleSource::Ids { + specification, + requirement, + } => format!("ids:{specification}/{requirement}"), + } +} + +/// Per-source counts as `base_quantity=3;geometry=1`. +fn sources_cell(m: &std::collections::BTreeMap) -> String { + m.iter() + .map(|(k, v)| format!("{k}={v}")) + .collect::>() + .join(";") +} + +pub fn write_report_json(report: &RunReport, path: &Path) -> CoreResult<()> { + let text = serde_json::to_string_pretty(report)?; + std::fs::write(path, text)?; + Ok(()) +} + +/// The quantity takeoff alone, as pretty JSON. +pub fn write_qto_json(report: &RunReport, path: &Path) -> CoreResult<()> { + let text = serde_json::to_string_pretty(&report.qto)?; + std::fs::write(path, text)?; + Ok(()) +} + +pub fn write_failures_csv(report: &RunReport, path: &Path) -> CoreResult<()> { + let err = csv_err(path); + let mut w = csv::Writer::from_path(path).map_err(&err)?; + w.write_record([ + "severity", + "rule_id", + "global_id", + "step_id", + "ifc_type", + "name", + "storey", + "message", + "expected", + "actual", + "fix_hint", + "source", + ]) + .map_err(&err)?; + let o = |s: &Option| s.clone().unwrap_or_default(); + for f in &report.findings { + w.write_record([ + f.severity.as_str().to_string(), + f.rule_id.clone(), + o(&f.global_id), + f.step_id.map(|s| s.to_string()).unwrap_or_default(), + o(&f.ifc_type), + o(&f.name), + o(&f.storey), + f.message.clone(), + o(&f.expected), + o(&f.actual), + o(&f.fix_hint), + source_label(&f.source), + ]) + .map_err(&err)?; + } + w.flush()?; + Ok(()) +} + +// --------------------------------------------------------------------------- +// QTO table shared by CSV and XLSX +// --------------------------------------------------------------------------- + +#[derive(Debug, Clone, PartialEq)] +enum Cell { + Text(String), + Num(f64), + Empty, +} + +/// Number format class of a column (for XLSX). +#[derive(Debug, Clone, Copy, PartialEq)] +enum ColKind { + Text, + Count, + Quantity, + Money, +} + +fn qto_columns(qto: &QtoReport) -> Vec<(String, ColKind)> { + let mut cols: Vec<(String, ColKind)> = qto + .group_by + .iter() + .map(|k| (k.clone(), ColKind::Text)) + .collect(); + cols.extend( + [ + ("count", ColKind::Count), + ("volume_m3", ColKind::Quantity), + ("area_m2", ColKind::Quantity), + ("length_m", ColKind::Quantity), + ("weight_kg", ColKind::Quantity), + ("volume_source", ColKind::Text), + ("area_source", ColKind::Text), + ("length_source", ColKind::Text), + ("rate_code", ColKind::Text), + ("rate", ColKind::Money), + ("unit", ColKind::Text), + ("amount", ColKind::Money), + ("currency", ColKind::Text), + ] + .into_iter() + .map(|(n, k)| (n.to_string(), k)), + ); + cols +} + +fn qto_rows(qto: &QtoReport) -> Vec> { + let mut out = Vec::with_capacity(qto.rows.len() + 1); + for r in &qto.rows { + let mut row: Vec = r.group.iter().map(|g| Cell::Text(g.clone())).collect(); + // A row may carry fewer group values than keys only if the report was hand-built; pad. + while row.len() < qto.group_by.len() { + row.push(Cell::Empty); + } + row.extend([ + Cell::Num(r.count as f64), + Cell::Num(r.volume_m3), + Cell::Num(r.area_m2), + Cell::Num(r.length_m), + Cell::Num(r.weight_kg), + Cell::Text(sources_cell(&r.volume_sources)), + Cell::Text(sources_cell(&r.area_sources)), + Cell::Text(sources_cell(&r.length_sources)), + ]); + match &r.cost { + Some(c) => row.extend([ + Cell::Text(c.rate_code.clone()), + Cell::Num(c.rate), + Cell::Text(c.unit.clone()), + Cell::Num(c.amount), + Cell::Text(c.currency.clone()), + ]), + None => row.extend([ + Cell::Empty, + Cell::Empty, + Cell::Empty, + Cell::Empty, + Cell::Empty, + ]), + } + out.push(row); + } + // TOTAL label goes in the first group column (there is always one: config validation requires a key). + let mut total: Vec = (0..qto.group_by.len()).map(|_| Cell::Empty).collect(); + if let Some(first) = total.first_mut() { + *first = Cell::Text("TOTAL".into()); + } + total.extend([ + Cell::Num(qto.total_count as f64), + Cell::Num(qto.total_volume_m3), + Cell::Num(qto.total_area_m2), + Cell::Num(qto.total_length_m), + Cell::Num(qto.total_weight_kg), + Cell::Empty, + Cell::Empty, + Cell::Empty, + Cell::Empty, + Cell::Empty, + Cell::Empty, + qto.total_cost.map(Cell::Num).unwrap_or(Cell::Empty), + qto.currency.clone().map(Cell::Text).unwrap_or(Cell::Empty), + ]); + out.push(total); + out +} + +pub fn write_qto_csv(report: &RunReport, path: &Path) -> CoreResult<()> { + let err = csv_err(path); + let mut w = csv::Writer::from_path(path).map_err(&err)?; + let cols = qto_columns(&report.qto); + w.write_record(cols.iter().map(|(n, _)| n.as_str())) + .map_err(&err)?; + for row in qto_rows(&report.qto) { + let rec: Vec = row + .into_iter() + .map(|c| match c { + Cell::Text(s) => s, + Cell::Num(n) => format_number(n), + Cell::Empty => String::new(), + }) + .collect(); + w.write_record(&rec).map_err(&err)?; + } + w.flush()?; + Ok(()) +} + +pub fn write_qto_xlsx(report: &RunReport, path: &Path) -> CoreResult<()> { + use rust_xlsxwriter::{DocProperties, ExcelDateTime, Format, FormatAlign, Workbook}; + let err = xlsx_err(path); + let qto = &report.qto; + + let mut wb = Workbook::new(); + let created = ExcelDateTime::from_ymd(XLSX_FIXED_DATE.0, XLSX_FIXED_DATE.1, XLSX_FIXED_DATE.2) + .map_err(&err)?; + let props = DocProperties::new() + .set_title("VeriModel quantity takeoff") + .set_author(crate::TOOL_NAME) + .set_comment(format!("{} {}", crate::TOOL_NAME, crate::VERSION)) + .set_creation_datetime(&created); + wb.set_properties(&props); + + let bold = Format::new().set_bold(); + let bold_total = Format::new() + .set_bold() + .set_border_top(rust_xlsxwriter::FormatBorder::Medium); + let fmt_for = |k: ColKind, total: bool| { + let f = match k { + ColKind::Count => Format::new().set_num_format("0"), + ColKind::Quantity => Format::new().set_num_format("#,##0.000"), + ColKind::Money => Format::new().set_num_format("#,##0.00"), + ColKind::Text => Format::new(), + }; + if total { + f.set_bold() + .set_border_top(rust_xlsxwriter::FormatBorder::Medium) + } else { + f + } + }; + + // Quantities + { + let ws = wb.add_worksheet(); + ws.set_name("Quantities").map_err(&err)?; + let cols = qto_columns(qto); + for (c, (name, _)) in cols.iter().enumerate() { + ws.write_string_with_format(0, c as u16, name, &bold) + .map_err(&err)?; + } + let rows = qto_rows(qto); + let last = rows.len().saturating_sub(1); + for (i, row) in rows.iter().enumerate() { + let r = (i + 1) as u32; + let is_total = i == last; + for (c, cell) in row.iter().enumerate() { + let kind = cols.get(c).map(|x| x.1).unwrap_or(ColKind::Text); + let f = fmt_for(kind, is_total); + match cell { + Cell::Text(s) => { + ws.write_string_with_format( + r, + c as u16, + s, + if is_total { &bold_total } else { &f }, + ) + .map_err(&err)?; + } + Cell::Num(n) => { + ws.write_number_with_format(r, c as u16, *n, &f) + .map_err(&err)?; + } + Cell::Empty => { + if is_total { + ws.write_blank(r, c as u16, &bold_total).map_err(&err)?; + } + } + } + } + } + ws.set_freeze_panes(1, 0).map_err(&err)?; + ws.autofit(); + } + + // Samples + { + let ws = wb.add_worksheet(); + ws.set_name("Samples").map_err(&err)?; + let headers = [ + "global_id", + "ifc_type", + "name", + "storey", + "volume_m3", + "volume_source", + "area_m2", + "area_source", + "length_m", + "length_source", + "quantity_sets", + ]; + for (c, h) in headers.iter().enumerate() { + ws.write_string_with_format(0, c as u16, *h, &bold) + .map_err(&err)?; + } + let qf = Format::new().set_num_format("#,##0.000"); + for (i, s) in qto.samples.iter().enumerate() { + let r = (i + 1) as u32; + ws.write_string(r, 0, &s.global_id).map_err(&err)?; + ws.write_string(r, 1, &s.ifc_type).map_err(&err)?; + ws.write_string(r, 2, s.name.as_deref().unwrap_or("")) + .map_err(&err)?; + ws.write_string(r, 3, s.storey.as_deref().unwrap_or("")) + .map_err(&err)?; + for (c, v, src) in [ + (4u16, s.volume_m3, s.volume_source), + (6, s.area_m2, s.area_source), + (8, s.length_m, s.length_source), + ] { + if let Some(v) = v { + ws.write_number_with_format(r, c, v, &qf).map_err(&err)?; + } + ws.write_string(r, c + 1, src.label()).map_err(&err)?; + } + ws.write_string(r, 10, s.quantity_sets.join("; ")) + .map_err(&err)?; + } + ws.set_freeze_panes(1, 0).map_err(&err)?; + ws.autofit(); + } + + // Method + { + let ws = wb.add_worksheet(); + ws.set_name("Method").map_err(&err)?; + let wrap = Format::new().set_text_wrap().set_align(FormatAlign::Top); + ws.set_column_width(0, 30).map_err(&err)?; + ws.set_column_width(1, 110).map_err(&err)?; + let facts: Vec<(&str, String)> = vec![ + ("Method", qto.method.clone()), + ("Group by", qto.group_by.join(", ")), + ("Elements measured", qto.total_count.to_string()), + ( + "Elements without any quantity", + qto.elements_without_quantities.to_string(), + ), + ( + "Units", + "volume m3, area m2, length m, weight kg (SI)".to_string(), + ), + ( + "Total cost", + match (qto.total_cost, &qto.currency) { + (Some(t), Some(c)) => format!("{t:.2} {c}"), + (Some(t), None) => format!("{t:.2}"), + _ => String::new(), + }, + ), + ( + "Generated by", + format!("{} {}", crate::TOOL_NAME, crate::VERSION), + ), + ("Source model", report.model.file_name.clone()), + ("Source SHA-256", report.model.sha256.clone()), + ]; + for (i, (k, v)) in facts.iter().enumerate() { + ws.write_string_with_format(i as u32, 0, *k, &bold.clone().set_align(FormatAlign::Top)) + .map_err(&err)?; + ws.write_string_with_format(i as u32, 1, v, &wrap) + .map_err(&err)?; + } + } + + wb.save(path).map_err(&err)?; + Ok(()) +} + +// --------------------------------------------------------------------------- +// HTML +// --------------------------------------------------------------------------- + +/// Escape text for an HTML text node. +fn esc(s: &str) -> String { + html_escape::encode_text(s).to_string() +} + +/// Escape text for a double-quoted HTML attribute. +fn attr(s: &str) -> String { + html_escape::encode_double_quoted_attribute(s).to_string() +} + +const DASH: &str = "—"; + +fn opt_cell(s: &Option) -> String { + match s.as_deref().map(str::trim) { + Some(v) if !v.is_empty() => esc(v), + _ => DASH.to_string(), + } +} + +/// Quantity for display: three decimals at most. +fn qty(x: f64) -> String { + format_number((x * 1000.0).round() / 1000.0) +} + +fn money(x: f64) -> String { + format!("{x:.2}") +} + +fn severity_badge(sev: Severity, strings: &Strings) -> String { + let class = match sev { + Severity::Error => "b-error", + Severity::Warning => "b-warning", + Severity::Info => "b-info", + }; + format!( + "{}", + esc(&strings.get(&format!("severity.{}", sev.as_str()))) + ) +} + +fn status_badge(status: RuleStatus, strings: &Strings) -> String { + let (key, class) = match status { + RuleStatus::Pass => ("PASS", "b-pass"), + RuleStatus::Fail => ("FAIL", "b-fail"), + RuleStatus::Skipped => ("SKIPPED", "b-skipped"), + RuleStatus::NotApplicable => ("NOT_APPLICABLE", "b-na"), + }; + format!( + "{}", + esc(&strings.get(&format!("status.{key}"))) + ) +} + +fn pass_fail_badge(passed: bool, strings: &Strings) -> String { + status_badge( + if passed { + RuleStatus::Pass + } else { + RuleStatus::Fail + }, + strings, + ) +} + +fn verdict_badge(verdict: Option, strings: &Strings) -> String { + let (key, class) = match verdict { + Some(Verdict::Pass) => ("PASS", "b-pass"), + Some(Verdict::PassWithWarnings) => ("PASS_WITH_WARNINGS", "b-pww"), + Some(Verdict::Fail) => ("FAIL", "b-fail"), + None => { + return format!( + "{}", + esc(&strings.get("report.no_rules")) + ) + } + }; + format!( + "{}", + esc(&strings.get(&format!("verdict.{key}"))) + ) +} + +fn group_label(key: &str, strings: &Strings) -> String { + let k = match key { + "type" => "report.ifc_type", + "storey" => "report.storey", + "classification" => "report.classification", + "material" => "report.material", + "predefined_type" => "report.predefined_type", + "type_name" => "report.type_name", + other => return other.to_string(), + }; + strings.get(k) +} + +fn source_name(src: crate::model::QuantitySource, strings: &Strings) -> String { + strings.get(&format!("report.source.{}", src.label())) +} + +fn sources_tooltip(m: &std::collections::BTreeMap, strings: &Strings) -> String { + m.iter() + .map(|(k, v)| format!("{}: {v}", strings.get(&format!("report.source.{k}")))) + .collect::>() + .join("; ") +} + +fn units_text(report: &RunReport) -> String { + let u = &report.model.units; + let parts: Vec<&str> = [&u.length_unit, &u.area_unit, &u.volume_unit] + .iter() + .filter_map(|x| x.as_deref()) + .collect(); + let system = match u.system { + crate::model::UnitSystem::Metric => "metric", + crate::model::UnitSystem::Imperial => "imperial", + }; + if parts.is_empty() { + format!("({system})") + } else { + format!("{} ({system})", parts.join(" · ")) + } +} + +/// Render the full HTML report as a string. +pub fn render_report_html(report: &RunReport, strings: &Strings) -> String { + let t = |k: &str| esc(&strings.get(k)); + let lang = report + .config + .pointer("/output/language") + .and_then(|v| v.as_str()) + .filter(|s| s.chars().all(|c| c.is_ascii_alphanumeric() || c == '-') && !s.is_empty()) + .unwrap_or("en"); + let m = &report.model; + let s = &report.summary; + let mut h = + String::with_capacity(64 * 1024 + report.findings.len().min(MAX_HTML_FINDINGS) * 600); + + let _ = write!( + h, + "\n\n\n\n\ + \n\ + \n{} — {}\n\n\n\n
\n", + crate::TOOL_NAME, + attr(crate::VERSION), + t("report.title"), + esc(&m.file_name), + REPORT_CSS + ); + + // Header + let _ = write!( + h, + "
\n

{}

\n

{}

\n", + t("report.title"), + t("report.subtitle") + ); + h.push_str("
\n"); + let _ = writeln!( + h, + "

{}

\n
", + t("report.model") + ); + let mut fact = |label: &str, value: String| { + let _ = writeln!(h, "
{}
{value}
", t(label)); + }; + fact("report.file", esc(&m.file_name)); + if let Some(p) = m.project_name.as_deref().filter(|p| !p.trim().is_empty()) { + fact("report.project", esc(p)); + } + let schema = match &m.mvd { + Some(mvd) if !mvd.trim().is_empty() => format!("{} · {}", esc(&m.schema), esc(mvd)), + _ => esc(&m.schema), + }; + fact("report.schema", schema); + fact( + "report.sha256", + format!("{}", esc(&m.sha256)), + ); + fact("report.units", esc(&units_text(report))); + fact("report.element_count", m.element_count.to_string()); + fact( + "report.storeys", + if m.storeys.is_empty() { + DASH.into() + } else { + esc(&m.storeys.join(", ")) + }, + ); + fact( + "report.disciplines", + if m.disciplines.is_empty() { + DASH.into() + } else { + esc(&m.disciplines.join(", ")) + }, + ); + fact("report.authoring_tool", opt_cell(&m.authoring_tool)); + h.push_str("
\n"); + if !m.reader_warnings.is_empty() { + let _ = writeln!(h, "

{}

\n
    ", t("report.reader_warnings")); + for w in &m.reader_warnings { + let _ = writeln!(h, "
  • {}
  • ", esc(w)); + } + h.push_str("
\n"); + } + h.push_str("
\n
\n"); + + // Summary + let _ = writeln!(h, "
\n

{}

\n
", t("report.summary")); + let _ = writeln!(h, "
{}
{}
", t("report.score"), s.score); + let _ = writeln!( + h, + "
{}
{}
", + t("report.verdict"), + verdict_badge(s.verdict, strings) + ); + for (class, label, n) in [ + ("checked", "report.elements_checked", s.elements_checked), + ("errors", "report.errors", s.errors), + ("warnings", "report.warnings", s.warnings), + ("infos", "report.infos", s.infos), + ] { + let _ = writeln!(h, "
{}
{n}
", t(label)); + } + h.push_str("
\n"); + let rule_text = if s.verdict_rule.trim().is_empty() { + crate::score::VERDICT_RULE + } else { + s.verdict_rule.as_str() + }; + let _ = writeln!( + h, + "
{}{}
\n
", + t("report.verdict_rule"), + esc(rule_text) + ); + + // Rules + let _ = writeln!( + h, + "
\n

{}

", + t("report.rules") + ); + let _ = writeln!( + h, + "

{} {} · {} {} · {} {} · {} {}

", + t("report.rules_passed"), + s.rules_passed, + t("report.rules_failed"), + s.rules_failed, + t("report.rules_skipped"), + s.rules_skipped, + t("report.rules_not_applicable"), + s.rules_not_applicable + ); + if report.rules.is_empty() { + let _ = writeln!(h, "

{}

", t("report.no_rules")); + } else { + let _ = writeln!( + h, + "
\n\n", + t("report.rule_id"), + t("report.category"), + t("report.description"), + t("report.severity"), + t("report.status"), + t("report.checked"), + t("report.failures_count"), + t("report.reason") + ); + for r in &report.rules { + let _ = writeln!( + h, + "", + attr(&source_label(&r.source)), + esc(&r.rule_id), + esc(&r.category), + esc(&r.description), + severity_badge(r.severity, strings), + status_badge(r.status, strings), + r.elements_checked, + r.failures, + opt_cell(&r.skipped_reason) + ); + } + h.push_str("
{}{}{}{}{}{}{}{}
{}{}{}{}{}{}{}{}
\n"); + } + let _ = writeln!( + h, + "

{}

\n
", + t("report.skipped_note") + ); + + // Failures + let _ = writeln!( + h, + "
\n

{} ({})

", + t("report.failures"), + report.findings.len() + ); + if report.findings.is_empty() { + let _ = writeln!(h, "

{}

", t("report.no_failures")); + } else { + let shown = report.findings.len().min(MAX_HTML_FINDINGS); + if report.findings.len() > shown { + let total = report.findings.len().to_string(); + let more = (report.findings.len() - shown).to_string(); + let _ = writeln!( + h, + "

{}

", + esc(&strings.fmt( + "report.failures_truncated", + &[ + ("shown", &shown.to_string()), + ("total", &total), + ("more", &more) + ] + )) + ); + } + let count_tpl = strings.get("report.filter_count"); + let count_now = strings.fmt( + "report.filter_count", + &[("shown", &shown.to_string()), ("total", &shown.to_string())], + ); + let _ = writeln!( + h, + "
\ + \ + {}
", + attr(&strings.get("report.filter_placeholder")), + attr(&strings.get("report.filter_placeholder")), + attr(&strings.get("report.severity")), + t("report.filter_all_severities"), + t("severity.ERROR"), + t("severity.WARNING"), + t("severity.INFO"), + attr(&count_tpl), + esc(&count_now) + ); + let _ = writeln!( + h, + "
\n\n", + t("report.severity"), + t("report.rule_id"), + t("report.global_id"), + t("report.ifc_type"), + t("report.name"), + t("report.storey"), + t("report.message"), + t("report.expected"), + t("report.actual"), + t("report.fix_hint") + ); + for f in report.findings.iter().take(shown) { + let _ = writeln!( + h, + "", + f.severity.as_str(), + severity_badge(f.severity, strings), + attr(&source_label(&f.source)), + esc(&f.rule_id), + f.step_id.map(|id| format!(" title=\"#{id}\"")).unwrap_or_default(), + opt_cell(&f.global_id), + opt_cell(&f.ifc_type), + opt_cell(&f.name), + opt_cell(&f.storey), + esc(&f.message), + opt_cell(&f.expected), + opt_cell(&f.actual), + opt_cell(&f.fix_hint) + ); + } + h.push_str("
{}{}{}{}{}{}{}{}{}{}
{}{}{}{}{}{}{}{}{}{}
\n"); + h.push_str(FILTER_SCRIPT); + } + h.push_str("
\n"); + + render_qto(&mut h, &report.qto, strings); + if let Some(ids) = &report.ids { + render_ids(&mut h, ids, strings); + } + + // Clash + let c = &report.clash; + let _ = writeln!( + h, + "
\n

{}

\n

{}

", + t("report.clash"), + esc(&c.message) + ); + if !c.clashes.is_empty() { + h.push_str("
\n\n\n"); + for x in &c.clashes { + let _ = writeln!( + h, + "", + esc(&x.global_id_a), + esc(&x.global_id_b), + esc(&x.clash_type), + qty(x.distance_m) + ); + } + h.push_str("
GlobalId AGlobalId BTypem
{}{}{}{}
\n"); + } + h.push_str("
\n"); + + // Footer + let _ = write!( + h, + "
\n

{} {} {}

\n

{}

\n
\n
\n\n\n", + t("report.generated_by"), + esc(&report.tool.name), + esc(&report.tool.version), + t("report.bcf_link") + ); + h +} + +/// Client-side filter for the failures table (inline, no dependencies). +const FILTER_SCRIPT: &str = "\n"; + +fn render_qto(h: &mut String, q: &QtoReport, strings: &Strings) { + let t = |k: &str| esc(&strings.get(k)); + let _ = writeln!( + h, + "
\n

{}

", + t("report.qto") + ); + if q.rows.is_empty() { + let _ = writeln!(h, "

{}

", t("report.no_quantities")); + } else { + let has_cost = q.rows.iter().any(|r| r.cost.is_some()); + h.push_str("
\n"); + for k in &q.group_by { + let _ = write!(h, "", esc(&group_label(k, strings))); + } + let _ = write!( + h, + "", + t("report.count"), + t("report.volume"), + t("report.area"), + t("report.length"), + t("report.weight") + ); + if has_cost { + let _ = write!( + h, + "", + t("report.rate_code"), + t("report.rate"), + t("report.amount") + ); + } + h.push_str("\n\n"); + for r in &q.rows { + h.push_str(""); + for i in 0..q.group_by.len() { + let _ = write!( + h, + "", + r.group + .get(i) + .map(|g| esc(g)) + .unwrap_or_else(|| DASH.into()) + ); + } + let _ = write!( + h, + "", + r.count, + attr(&sources_tooltip(&r.volume_sources, strings)), + qty(r.volume_m3), + attr(&sources_tooltip(&r.area_sources, strings)), + qty(r.area_m2), + attr(&sources_tooltip(&r.length_sources, strings)), + qty(r.length_m), + qty(r.weight_kg) + ); + if has_cost { + match &r.cost { + Some(c) => { + let _ = write!( + h, + "", + attr(&c.rate_description), + esc(&c.rate_code), + money(c.rate), + esc(&c.currency), + esc(&c.unit), + money(c.amount), + esc(&c.currency) + ); + } + None => { + let _ = write!(h, ""); + } + } + } + h.push_str("\n"); + } + // Totals + h.push_str(""); + if !q.group_by.is_empty() { + let _ = write!( + h, + "", + q.group_by.len(), + t("report.total") + ); + } + let _ = write!( + h, + "", + q.total_count, + qty(q.total_volume_m3), + qty(q.total_area_m2), + qty(q.total_length_m), + qty(q.total_weight_kg) + ); + if has_cost { + let total = match (q.total_cost, &q.currency) { + (Some(v), Some(c)) => format!("{} {}", money(v), esc(c)), + (Some(v), None) => money(v), + _ => DASH.to_string(), + }; + let _ = write!(h, ""); + } + h.push_str("\n
{}{}{}{}{}{}{}{}{}
{}{}{}{}{}{}{}{} {}/{}{} {}{DASH}{DASH}{DASH}
{}{}{}{}{}{}{total}
\n"); + if has_cost { + let mut sources: Vec<&str> = q + .rows + .iter() + .filter_map(|r| r.cost.as_ref()) + .map(|c| c.source.as_str()) + .collect(); + sources.sort_unstable(); + sources.dedup(); + let _ = writeln!( + h, + "

{}: {}

", + t("report.rate_source"), + esc(&sources.join(", ")) + ); + } + } + let _ = writeln!( + h, + "

{}: {}

", + t("report.elements_without_quantities"), + q.elements_without_quantities + ); + let _ = writeln!( + h, + "

{}

\n

{}

", + t("report.method"), + esc(&q.method) + ); + + if !q.samples.is_empty() { + let _ = writeln!( + h, + "

{}

\n
\n\n", + t("report.samples"), + t("report.global_id"), + t("report.ifc_type"), + t("report.name"), + t("report.storey"), + t("report.volume"), + t("report.area"), + t("report.length"), + t("report.quantity_sets") + ); + let cell = |v: Option, src: crate::model::QuantitySource| { + let value = v.map(qty).unwrap_or_else(|| DASH.to_string()); + format!( + "", + esc(&source_name(src, strings)) + ) + }; + for s in &q.samples { + let _ = writeln!( + h, + "{}{}{}", + esc(&s.global_id), + esc(&s.ifc_type), + opt_cell(&s.name), + opt_cell(&s.storey), + cell(s.volume_m3, s.volume_source), + cell(s.area_m2, s.area_source), + cell(s.length_m, s.length_source), + if s.quantity_sets.is_empty() { DASH.to_string() } else { esc(&s.quantity_sets.join(", ")) } + ); + } + h.push_str("
{}{}{}{}{}{}{}{}
{value}
{}
{}{}{}{}{}
\n"); + } + h.push_str("
\n"); +} + +fn render_ids(h: &mut String, ids: &crate::model::IdsReport, strings: &Strings) { + let t = |k: &str| esc(&strings.get(k)); + let _ = writeln!( + h, + "
\n

{}

", + t("report.ids") + ); + let title = match &ids.title { + Some(ti) if !ti.trim().is_empty() => format!("{} — {}", esc(&ids.ids_file), esc(ti)), + _ => esc(&ids.ids_file), + }; + let _ = writeln!( + h, + "
{}
{title}
", + t("report.file") + ); + let _ = writeln!( + h, + "

{}

", + esc(&strings.fmt( + "report.ids_summary", + &[ + ("passed", &ids.specifications_passed.to_string()), + ("total", &ids.specifications_total.to_string()) + ] + )) + ); + let _ = writeln!( + h, + "
\n\n", + t("report.ids_specification"), + t("report.ids_requirement"), + t("report.ids_applicable"), + t("report.ids_result"), + t("report.ids_failed_entities") + ); + for spec in &ids.specifications { + let mut spec_cell = format!("{}", esc(&spec.name)); + if let Some(d) = spec.description.as_deref().filter(|d| !d.trim().is_empty()) { + let _ = write!(spec_cell, "
{}", esc(d)); + } + if spec.requirements.is_empty() { + let _ = writeln!( + h, + "", + spec.applicable_count, + pass_fail_badge(spec.passed, strings) + ); + } + for req in &spec.requirements { + let _ = writeln!( + h, + "", + esc(&req.description), + spec.applicable_count, + pass_fail_badge(req.passed, strings), + req.failed_entities.len() + ); + } + } + h.push_str("
{}{}{}{}{}
{spec_cell}{DASH}{}{}0
{spec_cell}
“{}”
{}{}{}
\n
\n"); +} + +pub fn write_report_html(report: &RunReport, strings: &Strings, path: &Path) -> CoreResult<()> { + std::fs::write(path, render_report_html(report, strings))?; + Ok(()) +} + +/// Write every report file into `out_dir` and return the list. +pub fn write_all( + report: &RunReport, + config: &Config, + out_dir: &Path, +) -> CoreResult> { + let strings = Strings::for_language(config.output.language); + let mut files = Vec::new(); + let mut add = |name: &str, kind: &str| -> CoreResult<()> { + let p = out_dir.join(name); + let bytes = std::fs::metadata(&p).map(|m| m.len()).unwrap_or(0); + files.push(OutputFile { + name: name.into(), + kind: kind.into(), + bytes, + }); + Ok(()) + }; + write_report_json(report, &out_dir.join("report.json"))?; + add("report.json", "report_json")?; + write_report_html(report, &strings, &out_dir.join("report.html"))?; + add("report.html", "report_html")?; + write_failures_csv(report, &out_dir.join("failures.csv"))?; + add("failures.csv", "failures_csv")?; + write_qto_csv(report, &out_dir.join("qto.csv"))?; + add("qto.csv", "qto_csv")?; + write_qto_xlsx(report, &out_dir.join("qto.xlsx"))?; + add("qto.xlsx", "qto_xlsx")?; + write_qto_json(report, &out_dir.join("qto.json"))?; + add("qto.json", "qto_json")?; + Ok(files) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::model::{CostLine, QtoRow}; + + #[test] + fn source_labels() { + assert_eq!( + source_label(&RuleSource::RulePack { + pack: "base".into() + }), + "pack:base" + ); + assert_eq!(source_label(&RuleSource::ProjectConfig), "project_config"); + assert_eq!( + source_label(&RuleSource::Ids { + specification: "Walls".into(), + requirement: "FireRating".into() + }), + "ids:Walls/FireRating" + ); + } + + #[test] + fn qto_rows_end_with_total_and_match_columns() { + let mut q = QtoReport { + group_by: vec!["type".into(), "storey".into()], + ..Default::default() + }; + q.rows.push(QtoRow { + group: vec!["IfcWall".into(), "L1".into()], + count: 2, + volume_m3: 1.5, + cost: Some(CostLine { + rate_code: "R".into(), + rate: 2.0, + amount: 3.0, + unit: "m3".into(), + currency: "EUR".into(), + ..Default::default() + }), + ..Default::default() + }); + q.total_count = 2; + q.total_cost = Some(3.0); + let cols = qto_columns(&q); + let rows = qto_rows(&q); + assert_eq!(rows.len(), 2); + assert!(rows.iter().all(|r| r.len() == cols.len())); + assert_eq!(rows[1][0], Cell::Text("TOTAL".into())); + } + + #[test] + fn html_escapes_and_truncates() { + let mut r = RunReport::default(); + r.model.file_name = "a.ifc".into(); + let html = render_report_html(&r, &Strings::for_language(crate::config::Language::En)); + assert!(html.contains("a<b>.ifc")); + assert!(!html.contains("a.ifc")); + assert!( + !html.contains("http://") && !html.contains("https://"), + "report must be self-contained" + ); + } +} diff --git a/crates/core/src/rules/checks.rs b/crates/core/src/rules/checks.rs new file mode 100644 index 0000000..37fd5c8 --- /dev/null +++ b/crates/core/src/rules/checks.rs @@ -0,0 +1,952 @@ +//! Check kinds: the engine's vocabulary. Rules choose a kind and parameters; +//! the engine applies the kind to the elements in scope. +//! +//! Every check returns findings (facts about what failed). Severity, rule id +//! and fix hints are attached by the engine, so a check never needs to know +//! which rule invoked it. + +use std::collections::{BTreeMap, BTreeSet}; + +use regex::Regex; +use serde::{Deserialize, Serialize}; + +use crate::config::Config; +use crate::error::{CoreError, CoreResult}; +use crate::model::{Element, Model, PropValue}; + +/// A parameter that is either a literal or a `$config.` reference. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(untagged)] +pub enum Param { + Number(f64), + Bool(bool), + Text(String), + List(Vec), +} + +impl Param { + /// Resolve `$config.` references against the config. Literals pass through. + pub fn resolve(&self, config: &Config) -> CoreResult { + match self { + Param::Text(s) if s.starts_with("$config.") => { + let path = &s["$config.".len()..]; + config.lookup(path).ok_or_else(|| { + CoreError::RulePack(format!("parameter '{s}' refers to an unknown config path")) + }) + } + Param::Number(n) => Ok(serde_json::json!(n)), + Param::Bool(b) => Ok(serde_json::json!(b)), + Param::Text(s) => Ok(serde_json::json!(s)), + Param::List(l) => Ok(serde_json::json!(l)), + } + } + + pub fn as_f64(&self, config: &Config) -> CoreResult { + let v = self.resolve(config)?; + v.as_f64() + .or_else(|| v.as_str().and_then(|s| s.parse().ok())) + .ok_or_else(|| CoreError::RulePack(format!("parameter {:?} is not a number", self))) + } + + pub fn as_bool(&self, config: &Config) -> CoreResult { + let v = self.resolve(config)?; + v.as_bool() + .ok_or_else(|| CoreError::RulePack(format!("parameter {:?} is not a boolean", self))) + } + + pub fn as_string_list(&self, config: &Config) -> CoreResult> { + let v = self.resolve(config)?; + match v { + serde_json::Value::Array(a) => Ok(a + .iter() + .filter_map(|x| x.as_str().map(|s| s.to_string())) + .collect()), + serde_json::Value::String(s) => Ok(vec![s]), + _ => Err(CoreError::RulePack(format!( + "parameter {:?} is not a list", + self + ))), + } + } +} + +/// Which quantity a quantity check looks at. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum QuantityKind { + Volume, + Area, + Length, +} + +/// The engine's check vocabulary. Serialised with a `kind` tag in YAML. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)] +pub enum CheckKind { + /// GlobalId must be unique in the model. + UniqueGlobalId, + /// GlobalId must be a 22 character IFC base64 string. + ValidGlobalId, + /// Name must be unique within the given keys (default from `config.checks.unique_name_within`). + UniqueName { + #[serde(default)] + within: Option>, + }, + /// Element must be contained in (or aggregated into) a spatial structure element. + ContainedInSpatialStructure, + /// The element's container GlobalId must exist in the spatial tree. + ContainerExists, + /// Model-level: every group in `require` must have at least one node in the spatial tree. + /// Each group is a list of alternatives, e.g. [["IfcSite"], ["IfcBuilding", "IfcBridge", "IfcRoad"]]. + SpatialHierarchy { require: Vec> }, + /// Bounding-box centre must be within `max_m` of the origin. + DistanceFromOrigin { max_m: Param }, + /// Property set must exist. + PsetExists { pset: String }, + /// Property must exist (in `pset`, or any pset when omitted) and, if `require_value`, be non-empty. + PropertyExists { + #[serde(default)] + pset: Option, + property: String, + #[serde(default = "default_true")] + require_value: bool, + /// Expected data type: "string" | "number" | "boolean". + #[serde(default)] + data_type: Option, + }, + /// Property value must match a regex and/or be in an allowed list. + PropertyMatches { + #[serde(default)] + pset: Option, + property: String, + #[serde(default)] + pattern: Option, + #[serde(default)] + allowed_values: Option, + }, + /// No property in any pset may be empty / null. + NoEmptyProperties, + /// Element must have a product representation. + HasGeometry, + /// Element with a representation must produce a non-degenerate shape (triangles, volume or area above tolerance). + NonDegenerateGeometry { + #[serde(default)] + min_volume_m3: Option, + #[serde(default)] + min_area_m2: Option, + }, + /// Bounding-box extent must not exceed `max_extent_m`. + BboxWithinBounds { max_extent_m: Param }, + /// Element must carry at least one classification reference (optionally from a given system). + ClassificationExists { + #[serde(default)] + system: Option, + }, + /// Classification code must be in `config.classification.allowed_codes` / file / match `code_pattern`. + ClassificationCodeAllowed, + /// Name must match a regex (explicit `pattern`, or per-type patterns from `config.naming.patterns`). + NameMatches { + #[serde(default)] + pattern: Option, + }, + /// A quantity (from base quantities or geometry) must be greater than `min`. + QuantityPositive { + quantity: QuantityKind, + #[serde(default)] + min: Option, + }, + /// Model-level: every listed type must have at least one element. + TypesPresent { ifc_types: Param }, + /// Model-level: the file schema must be one of `config.project.ifc_versions`. + SchemaAllowed, +} + +fn default_true() -> bool { + true +} + +/// A raw failure produced by a check, before the engine attaches rule metadata. +#[derive(Debug, Clone, PartialEq)] +pub struct CheckFailure { + /// `None` for model-level failures. + pub element: Option, + pub message: String, + pub expected: Option, + pub actual: Option, +} + +impl CheckFailure { + fn element( + idx: usize, + message: impl Into, + expected: impl Into, + actual: impl Into, + ) -> Self { + Self { + element: Some(idx), + message: message.into(), + expected: Some(expected.into()), + actual: Some(actual.into()), + } + } + fn model( + message: impl Into, + expected: impl Into, + actual: impl Into, + ) -> Self { + Self { + element: None, + message: message.into(), + expected: Some(expected.into()), + actual: Some(actual.into()), + } + } +} + +/// Result of running one check over its scope. +#[derive(Debug, Clone, PartialEq)] +pub enum CheckOutcome { + /// Ran; `failures` may be empty. + Ran { failures: Vec }, + /// Could not run: plain-language reason. + Skipped { reason: String }, +} + +/// Context given to every check. +pub struct CheckContext<'a> { + pub model: &'a Model, + pub config: &'a Config, + /// Indices into `model.elements` that are in scope for this rule. + pub scope: &'a [usize], + /// Allowed classification codes resolved from config (inline + file), lazily computed by the engine. + pub allowed_codes: &'a BTreeSet, +} + +const GLOBAL_ID_ALPHABET: &str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$"; + +/// Whether a string is a syntactically valid IFC GlobalId (22 chars, IFC base64 alphabet, first char 0..3). +pub fn is_valid_global_id(id: &str) -> bool { + id.len() == 22 + && id.chars().all(|c| GLOBAL_ID_ALPHABET.contains(c)) + && id + .chars() + .next() + .map(|c| ('0'..='3').contains(&c)) + .unwrap_or(false) +} + +fn name_of(e: &Element) -> String { + e.name.clone().unwrap_or_default() +} + +fn describe_elem(e: &Element) -> String { + match &e.name { + Some(n) if !n.is_empty() => format!("{} '{}'", e.ifc_type, n), + _ => format!("{} #{}", e.ifc_type, e.step_id), + } +} + +impl CheckKind { + /// Human readable name of the kind, for documentation. + pub fn kind_name(&self) -> &'static str { + match self { + CheckKind::UniqueGlobalId => "unique_global_id", + CheckKind::ValidGlobalId => "valid_global_id", + CheckKind::UniqueName { .. } => "unique_name", + CheckKind::ContainedInSpatialStructure => "contained_in_spatial_structure", + CheckKind::ContainerExists => "container_exists", + CheckKind::SpatialHierarchy { .. } => "spatial_hierarchy", + CheckKind::DistanceFromOrigin { .. } => "distance_from_origin", + CheckKind::PsetExists { .. } => "pset_exists", + CheckKind::PropertyExists { .. } => "property_exists", + CheckKind::PropertyMatches { .. } => "property_matches", + CheckKind::NoEmptyProperties => "no_empty_properties", + CheckKind::HasGeometry => "has_geometry", + CheckKind::NonDegenerateGeometry { .. } => "non_degenerate_geometry", + CheckKind::BboxWithinBounds { .. } => "bbox_within_bounds", + CheckKind::ClassificationExists { .. } => "classification_exists", + CheckKind::ClassificationCodeAllowed => "classification_code_allowed", + CheckKind::NameMatches { .. } => "name_matches", + CheckKind::QuantityPositive { .. } => "quantity_positive", + CheckKind::TypesPresent { .. } => "types_present", + CheckKind::SchemaAllowed => "schema_allowed", + } + } + + /// True for checks that evaluate the model as a whole rather than each element. + pub fn is_model_level(&self) -> bool { + matches!( + self, + CheckKind::SpatialHierarchy { .. } + | CheckKind::TypesPresent { .. } + | CheckKind::SchemaAllowed + ) + } + + /// Run the check. + pub fn run(&self, ctx: &CheckContext<'_>) -> CoreResult { + let els = &ctx.model.elements; + let cfg = ctx.config; + let mut failures = Vec::new(); + match self { + CheckKind::UniqueGlobalId => { + let mut by_id: BTreeMap<&str, Vec> = BTreeMap::new(); + for &i in ctx.scope { + by_id.entry(els[i].global_id.as_str()).or_default().push(i); + } + for (id, idxs) in by_id { + if idxs.len() > 1 { + let others: Vec = idxs + .iter() + .map(|i| format!("#{}", els[*i].step_id)) + .collect(); + for &i in &idxs { + failures.push(CheckFailure::element( + i, + format!( + "GlobalId '{id}' is used by {} elements ({})", + idxs.len(), + others.join(", ") + ), + "unique GlobalId", + format!("{} occurrences", idxs.len()), + )); + } + } + } + } + CheckKind::ValidGlobalId => { + for &i in ctx.scope { + let id = &els[i].global_id; + if !is_valid_global_id(id) { + failures.push(CheckFailure::element( + i, + format!("GlobalId '{id}' is not a valid 22-character IFC identifier"), + "22 characters from the IFC base64 alphabet", + if id.is_empty() { + "".to_string() + } else { + format!("'{id}' ({} chars)", id.len()) + }, + )); + } + } + } + CheckKind::UniqueName { within } => { + let keys: Vec = within + .clone() + .or_else(|| { + if cfg.checks.unique_name_within.is_empty() { + None + } else { + Some(cfg.checks.unique_name_within.clone()) + } + }) + .unwrap_or_else(|| vec!["type".into(), "storey".into()]); + let mut groups: BTreeMap, Vec> = BTreeMap::new(); + for &i in ctx.scope { + let e = &els[i]; + let name = name_of(e); + if name.trim().is_empty() { + continue; + } + let mut key = vec![name]; + for k in &keys { + match k.as_str() { + "type" => key.push(e.ifc_type.clone()), + "storey" => key.push(e.storey.clone().unwrap_or_default()), + _ => {} + } + } + groups.entry(key).or_default().push(i); + } + for (key, idxs) in groups { + if idxs.len() > 1 { + for &i in &idxs { + failures.push(CheckFailure::element( + i, + format!( + "Name '{}' is shared by {} elements of the same {}", + key[0], + idxs.len(), + keys.join(" and ") + ), + "unique name", + format!("{} elements named '{}'", idxs.len(), key[0]), + )); + } + } + } + } + CheckKind::ContainedInSpatialStructure => { + for &i in ctx.scope { + if els[i].container.is_none() { + failures.push(CheckFailure::element( + i, + format!("{} is not contained in any storey, space, site or other spatial element", describe_elem(&els[i])), + "IfcRelContainedInSpatialStructure to a spatial element", + "no spatial container", + )); + } + } + } + CheckKind::ContainerExists => { + let spatial = ctx.model.spatial_ids(); + for &i in ctx.scope { + if let Some(c) = &els[i].container { + if !spatial.contains(&c.global_id) { + failures.push(CheckFailure::element( + i, + format!( + "{} is assigned to container {} '{}' which is not part of the spatial hierarchy", + describe_elem(&els[i]), + c.ifc_type, + c.name.clone().unwrap_or_default() + ), + "container present in the site/building/storey tree", + format!("container {} ({})", c.global_id, c.ifc_type), + )); + } + } + } + } + CheckKind::SpatialHierarchy { require } => { + let present: BTreeSet = ctx + .model + .info + .spatial_tree + .iter() + .flat_map(|r| r.walk()) + .map(|n| n.ifc_type.to_ascii_lowercase()) + .collect(); + for group in require { + let ok = group + .iter() + .any(|t| present.contains(&t.to_ascii_lowercase())); + if !ok { + failures.push(CheckFailure::model( + format!( + "Spatial hierarchy is missing a {} element", + group.join(" / ") + ), + format!("at least one of {}", group.join(", ")), + "none found", + )); + } + } + } + CheckKind::DistanceFromOrigin { max_m } => { + if !ctx.model.info.geometry_available { + return Ok(CheckOutcome::Skipped { + reason: "geometry kernel unavailable".into(), + }); + } + let max = max_m.as_f64(cfg)?; + for &i in ctx.scope { + if let Some(g) = &els[i].geometry { + let d = g.distance_from_origin_m(); + if d > max { + failures.push(CheckFailure::element( + i, + format!( + "{} is {:.1} m from the project origin", + describe_elem(&els[i]), + d + ), + format!("<= {} m", crate::model::format_number(max)), + format!("{:.1} m", d), + )); + } + } + } + } + CheckKind::PsetExists { pset } => { + for &i in ctx.scope { + if !els[i].psets.contains_key(pset) { + failures.push(CheckFailure::element( + i, + format!("{} has no property set '{pset}'", describe_elem(&els[i])), + format!("property set {pset}"), + format!("sets present: {}", list_or_none(els[i].psets.keys())), + )); + } + } + } + CheckKind::PropertyExists { + pset, + property, + require_value, + data_type, + } => { + for &i in ctx.scope { + let e = &els[i]; + let label = match pset { + Some(p) => format!("{p}.{property}"), + None => property.clone(), + }; + match e.property(pset.as_deref(), property) { + None => failures.push(CheckFailure::element( + i, + format!("{} is missing property {label}", describe_elem(e)), + format!("property {label} present"), + "missing", + )), + Some(v) if *require_value && v.is_empty() => { + failures.push(CheckFailure::element( + i, + format!("{} has property {label} but no value", describe_elem(e)), + format!("non-empty value for {label}"), + v.display(), + )) + } + Some(v) => { + if let Some(dt) = data_type { + if !type_matches(v, dt) { + failures.push(CheckFailure::element( + i, + format!( + "{} property {label} has the wrong data type", + describe_elem(e) + ), + dt.clone(), + format!("{} ({})", v.type_name(), v.display()), + )); + } + } + } + } + } + } + CheckKind::PropertyMatches { + pset, + property, + pattern, + allowed_values, + } => { + let re = match pattern { + Some(p) => { + let s = p.resolve(cfg)?.as_str().unwrap_or_default().to_string(); + Some(Regex::new(&s).map_err(|e| { + CoreError::RulePack(format!("invalid pattern '{s}': {e}")) + })?) + } + None => None, + }; + let allowed = match allowed_values { + Some(a) => Some(a.as_string_list(cfg)?), + None => None, + }; + for &i in ctx.scope { + let e = &els[i]; + let Some(v) = e.property(pset.as_deref(), property) else { + continue; + }; + let s = v.display(); + if let Some(re) = &re { + if !re.is_match(&s) { + failures.push(CheckFailure::element( + i, + format!("{} property {property} = '{s}' does not match the required pattern", describe_elem(e)), + format!("matches /{}/", re.as_str()), + s.clone(), + )); + continue; + } + } + if let Some(a) = &allowed { + if !a.iter().any(|x| x == &s) { + failures.push(CheckFailure::element( + i, + format!( + "{} property {property} = '{s}' is not an allowed value", + describe_elem(e) + ), + format!("one of {}", a.join(", ")), + s.clone(), + )); + } + } + } + } + CheckKind::NoEmptyProperties => { + for &i in ctx.scope { + let e = &els[i]; + let mut empties = Vec::new(); + for (ps, props) in &e.psets { + for (k, v) in props { + if v.is_empty() { + empties.push(format!("{ps}.{k}")); + } + } + } + if !empties.is_empty() { + failures.push(CheckFailure::element( + i, + format!( + "{} has {} empty propert{}: {}", + describe_elem(e), + empties.len(), + if empties.len() == 1 { "y" } else { "ies" }, + empties.join(", ") + ), + "every property carries a value", + format!("{} empty", empties.len()), + )); + } + } + } + CheckKind::HasGeometry => { + for &i in ctx.scope { + if !els[i].has_representation { + failures.push(CheckFailure::element( + i, + format!("{} has no geometric representation", describe_elem(&els[i])), + "IfcProductDefinitionShape with at least one representation", + "no representation", + )); + } + } + } + CheckKind::NonDegenerateGeometry { + min_volume_m3, + min_area_m2, + } => { + if !ctx.model.info.geometry_available { + return Ok(CheckOutcome::Skipped { + reason: "geometry kernel unavailable".into(), + }); + } + let min_v = match min_volume_m3 { + Some(p) => p.as_f64(cfg)?, + None => cfg.tolerances.geometry.min_volume_m3, + }; + let min_a = match min_area_m2 { + Some(p) => p.as_f64(cfg)?, + None => cfg.tolerances.geometry.min_area_m2, + }; + for &i in ctx.scope { + let e = &els[i]; + if !e.has_representation { + continue; + } + match &e.geometry { + None => failures.push(CheckFailure::element( + i, + format!("{} has a representation but the geometry kernel could not build a shape", describe_elem(e)), + "a valid shape", + "shape generation failed", + )), + Some(g) => { + let vol = g.volume_m3.unwrap_or(0.0); + let area = g.area_m2.unwrap_or(0.0); + if g.triangle_count == 0 || (vol.abs() <= min_v && area <= min_a) { + failures.push(CheckFailure::element( + i, + format!("{} has degenerate geometry (volume {:.6} m³, area {:.6} m², {} triangles)", describe_elem(e), vol, area, g.triangle_count), + format!("volume > {} m³ or area > {} m²", crate::model::format_number(min_v), crate::model::format_number(min_a)), + format!("volume {:.6} m³, area {:.6} m²", vol, area), + )); + } + } + } + } + } + CheckKind::BboxWithinBounds { max_extent_m } => { + if !ctx.model.info.geometry_available { + return Ok(CheckOutcome::Skipped { + reason: "geometry kernel unavailable".into(), + }); + } + let max = max_extent_m.as_f64(cfg)?; + for &i in ctx.scope { + if let Some(g) = &els[i].geometry { + let ext = g.extent(); + let largest = ext[0].max(ext[1]).max(ext[2]); + if largest > max { + failures.push(CheckFailure::element( + i, + format!( + "{} spans {:.1} m, larger than the configured project bounds", + describe_elem(&els[i]), + largest + ), + format!("extent <= {} m", crate::model::format_number(max)), + format!("{:.1} m", largest), + )); + } + } + } + } + CheckKind::ClassificationExists { system } => { + let sys = match system { + Some(p) => p + .resolve(cfg)? + .as_str() + .map(|s| s.to_string()) + .filter(|s| !s.is_empty() && s != "none"), + None => None, + }; + // `classification.applies_to` narrows the scope without a custom rule pack. + let applies = &cfg.classification.applies_to; + for &i in ctx.scope { + let e = &els[i]; + if !applies.is_empty() && !applies.iter().any(|t| e.is_a(t)) { + continue; + } + let found = e.classifications.iter().any(|c| { + c.code.as_ref().map(|s| !s.is_empty()).unwrap_or(false) + && match &sys { + Some(s) => c + .system + .as_ref() + .map(|x| x.to_lowercase().contains(&s.to_lowercase())) + .unwrap_or(false), + None => true, + } + }); + if !found { + failures.push(CheckFailure::element( + i, + match &sys { + Some(s) => { + format!("{} has no {s} classification", describe_elem(e)) + } + None => { + format!("{} has no classification reference", describe_elem(e)) + } + }, + match &sys { + Some(s) => format!("classification from system '{s}'"), + None => "at least one IfcClassificationReference".to_string(), + }, + if e.classifications.is_empty() { + "none".to_string() + } else { + e.classifications + .iter() + .map(|c| { + format!( + "{}:{}", + c.system.clone().unwrap_or_default(), + c.code.clone().unwrap_or_default() + ) + }) + .collect::>() + .join(", ") + }, + )); + } + } + } + CheckKind::ClassificationCodeAllowed => { + let pattern = match &cfg.classification.code_pattern { + Some(p) => Some(Regex::new(p).map_err(|e| { + CoreError::Config(format!("classification.code_pattern: {e}")) + })?), + None => None, + }; + if ctx.allowed_codes.is_empty() && pattern.is_none() { + return Ok(CheckOutcome::Skipped { + reason: "no allowed classification codes or code pattern configured (classification.allowed_codes / allowed_codes_file / code_pattern)".into(), + }); + } + for &i in ctx.scope { + let e = &els[i]; + for c in &e.classifications { + let Some(code) = c.code.as_ref().filter(|s| !s.is_empty()) else { + continue; + }; + let in_list = + ctx.allowed_codes.is_empty() || ctx.allowed_codes.contains(code); + let matches = pattern.as_ref().map(|re| re.is_match(code)).unwrap_or(true); + if !in_list || !matches { + failures.push(CheckFailure::element( + i, + format!("{} classification code '{code}' is not in the configured classification system", describe_elem(e)), + match (&pattern, ctx.allowed_codes.is_empty()) { + (Some(re), true) => format!("code matching /{}/", re.as_str()), + (Some(re), false) => format!("code in the allowed list and matching /{}/", re.as_str()), + (None, _) => format!("one of {} allowed codes", ctx.allowed_codes.len()), + }, + code.clone(), + )); + } + } + } + } + CheckKind::NameMatches { pattern } => { + let explicit = match pattern { + Some(p) => { + let s = p.resolve(cfg)?.as_str().unwrap_or_default().to_string(); + if s.is_empty() { + None + } else { + Some(Regex::new(&s).map_err(|e| { + CoreError::RulePack(format!("invalid pattern '{s}': {e}")) + })?) + } + } + None => None, + }; + let mut per_type: Vec<(String, Regex)> = Vec::new(); + for (t, p) in &cfg.naming.patterns { + per_type.push(( + t.clone(), + Regex::new(p).map_err(|e| { + CoreError::Config(format!("naming.patterns['{t}']: {e}")) + })?, + )); + } + if explicit.is_none() && per_type.is_empty() { + return Ok(CheckOutcome::Skipped { + reason: "no naming patterns configured (naming.patterns)".into(), + }); + } + for &i in ctx.scope { + let e = &els[i]; + let name = name_of(e); + let re = explicit + .as_ref() + .or_else(|| per_type.iter().find(|(t, _)| e.is_a(t)).map(|(_, r)| r)); + let Some(re) = re else { continue }; + if !re.is_match(&name) { + failures.push(CheckFailure::element( + i, + format!( + "{} name '{}' does not follow the naming convention", + e.ifc_type, name + ), + format!("name matching /{}/", re.as_str()), + if name.is_empty() { + "".into() + } else { + name.clone() + }, + )); + } + } + } + CheckKind::QuantityPositive { quantity, min } => { + let min_v = match min { + Some(p) => p.as_f64(cfg)?, + None => 0.0, + }; + for &i in ctx.scope { + let e = &els[i]; + let (label, unit, val) = match quantity { + QuantityKind::Volume => ("volume", "m³", e.volume_m3()), + QuantityKind::Area => ("area", "m²", e.area_m2()), + QuantityKind::Length => ("length", "m", e.length_m()), + }; + if let Some((v, src)) = val { + if v <= min_v { + failures.push(CheckFailure::element( + i, + format!( + "{} has {label} {} {unit} (from {})", + describe_elem(e), + crate::model::format_number(v), + src.label() + ), + format!("{label} > {} {unit}", crate::model::format_number(min_v)), + format!("{} {unit}", crate::model::format_number(v)), + )); + } + } + } + } + CheckKind::TypesPresent { ifc_types } => { + let wanted = ifc_types.as_string_list(cfg)?; + for t in wanted { + let n = els.iter().filter(|e| e.is_a(&t)).count(); + if n == 0 { + failures.push(CheckFailure::model( + format!("No {t} elements found in the model"), + format!("at least one {t}"), + "0", + )); + } + } + } + CheckKind::SchemaAllowed => { + let allowed = &cfg.project.ifc_versions; + if !allowed.is_empty() { + let schema = ctx.model.info.schema.to_ascii_uppercase(); + let ok = allowed + .iter() + .any(|a| normalise_schema(a) == normalise_schema(&schema)); + if !ok { + failures.push(CheckFailure::model( + format!( + "File schema {} is not accepted by the project", + ctx.model.info.schema + ), + format!("one of {}", allowed.join(", ")), + ctx.model.info.schema.clone(), + )); + } + } + } + } + Ok(CheckOutcome::Ran { failures }) + } +} + +/// "IFC4X3_ADD2" / "IFC4.3" / "ifc4x3" -> "IFC4X3"; "IFC2x3" -> "IFC2X3"; "IFC4" -> "IFC4". +pub fn normalise_schema(s: &str) -> String { + let up = s.to_ascii_uppercase().replace('.', "X"); + let base = up.split('_').next().unwrap_or("").to_string(); + match base.as_str() { + "IFC4X0" | "IFC4X1" | "IFC4X2" => "IFC4".to_string(), + _ => base, + } +} + +fn type_matches(v: &PropValue, dt: &str) -> bool { + match dt.to_ascii_lowercase().as_str() { + "string" | "text" | "label" => matches!(v, PropValue::Text(_)), + "number" | "real" | "integer" | "float" => matches!(v, PropValue::Number(_)), + "boolean" | "bool" | "logical" => matches!(v, PropValue::Bool(_)), + _ => true, + } +} + +fn list_or_none<'a>(it: impl Iterator) -> String { + let v: Vec<&str> = it.map(|s| s.as_str()).collect(); + if v.is_empty() { + "none".to_string() + } else { + v.join(", ") + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn global_id_validation() { + assert!(is_valid_global_id("0fqX614OH1YO1Njdxms2$Q")); + assert!(!is_valid_global_id("short")); + assert!(!is_valid_global_id("9fqX614OH1YO1Njdxms2$Q")); + assert!(!is_valid_global_id("0fqX614OH1YO1Njdxms2#Q")); + } + + #[test] + fn schema_normalisation() { + assert_eq!(normalise_schema("IFC2x3"), "IFC2X3"); + assert_eq!(normalise_schema("IFC4X3_ADD2"), "IFC4X3"); + assert_eq!(normalise_schema("IFC4.3"), "IFC4X3"); + assert_eq!(normalise_schema("ifc4"), "IFC4"); + assert_eq!(normalise_schema("IFC4X1"), "IFC4"); + } + + #[test] + fn param_resolves_config_reference() { + let cfg = Config::default(); + let p = Param::Text("$config.tolerances.far_from_origin_m".into()); + assert_eq!(p.as_f64(&cfg).unwrap(), 10_000.0); + assert!(Param::Text("$config.nope".into()).as_f64(&cfg).is_err()); + assert_eq!(Param::Number(3.0).as_f64(&cfg).unwrap(), 3.0); + } +} diff --git a/crates/core/src/rules/engine.rs b/crates/core/src/rules/engine.rs new file mode 100644 index 0000000..9673365 --- /dev/null +++ b/crates/core/src/rules/engine.rs @@ -0,0 +1,572 @@ +//! Rule evaluation: scope resolution, config-generated rules, IDS merge and scoring. + +use std::collections::BTreeSet; +use std::path::Path; + +use regex::Regex; + +use crate::config::{Config, ElementFilter, RequiredPset}; +use crate::error::{CoreError, CoreResult}; +use crate::model::{Element, Finding, Model, RuleResult, RuleSource, RuleStatus, Summary}; +use crate::rules::checks::{CheckContext, CheckKind, CheckOutcome}; +use crate::rules::pack::{Rule, RulePack, RuleScope}; +use crate::score; + +/// Output of the rule engine for one model. +#[derive(Debug, Clone, Default)] +pub struct Evaluation { + pub rules: Vec, + pub findings: Vec, + pub summary: Summary, +} + +/// Does `e` satisfy a config element filter? +pub fn filter_matches(e: &Element, f: &ElementFilter) -> bool { + if let Some(t) = &f.ifc_type { + if !t.is_empty() && !e.is_a(t) { + return false; + } + } + if let Some(p) = &f.name_pattern { + if let Ok(re) = Regex::new(p) { + if !re.is_match(e.name.as_deref().unwrap_or("")) { + return false; + } + } + } + if let Some(s) = &f.storey { + if e.storey.as_deref() != Some(s.as_str()) { + return false; + } + } + for (k, v) in &f.property_equals { + let (pset, prop) = match k.split_once('.') { + Some((p, n)) => (Some(p), n), + None => (None, k.as_str()), + }; + match e.property(pset, prop) { + Some(val) if val.display() == *v => {} + _ => return false, + } + } + true +} + +/// Indices of the elements a scope selects. +pub fn resolve_scope(model: &Model, scope: &RuleScope) -> Vec { + model + .elements + .iter() + .enumerate() + .filter(|(_, e)| { + if !scope.include_spatial && e.is_spatial() && scope.ifc_types.is_empty() { + return false; + } + if !scope.ifc_types.is_empty() && !scope.ifc_types.iter().any(|t| e.is_a(t)) { + return false; + } + if scope.exclude_types.iter().any(|t| e.is_a(t)) { + return false; + } + if let Some(f) = &scope.filter { + if !filter_matches(e, f) { + return false; + } + } + true + }) + .map(|(i, _)| i) + .collect() +} + +/// Rules generated from `requirements.required_psets` in project.yaml. +pub fn rules_from_config(config: &Config) -> Vec { + let mut out = Vec::new(); + for (n, rp) in config.requirements.required_psets.iter().enumerate() { + out.extend(rules_for_required_pset(n, rp)); + } + out +} + +fn rules_for_required_pset(n: usize, rp: &RequiredPset) -> Vec { + let scope = RuleScope { + ifc_types: rp.applies_to.clone(), + ..Default::default() + }; + let severity = rp.severity.clone().unwrap_or_else(|| "error".into()); + let mut rules = vec![Rule { + id: format!("CFG-PSET-{:03}", n + 1), + category: "properties".into(), + description: format!( + "Property set {} must exist on {}", + rp.pset, + applies_label(&rp.applies_to) + ), + severity: severity.clone(), + enabled: true, + enabled_if: None, + scope: scope.clone(), + check: CheckKind::PsetExists { + pset: rp.pset.clone(), + }, + fix_hint: Some(format!( + "Add the property set {} to the element in the authoring tool.", + rp.pset + )), + }]; + for (m, prop) in rp.properties.iter().enumerate() { + rules.push(Rule { + id: format!("CFG-PSET-{:03}-{:02}", n + 1, m + 1), + category: "properties".into(), + description: format!( + "Property {}.{} must exist and have a value on {}", + rp.pset, + prop, + applies_label(&rp.applies_to) + ), + severity: severity.clone(), + enabled: true, + enabled_if: None, + scope: scope.clone(), + check: CheckKind::PropertyExists { + pset: Some(rp.pset.clone()), + property: prop.clone(), + require_value: true, + data_type: None, + }, + fix_hint: Some(format!("Fill in {}.{} on the element.", rp.pset, prop)), + }); + } + rules +} + +fn applies_label(types: &[String]) -> String { + if types.is_empty() { + "all elements".into() + } else { + types.join(", ") + } +} + +/// Allowed classification codes from config (inline list + optional file). +pub fn load_allowed_codes( + config: &Config, + config_dir: Option<&Path>, +) -> CoreResult> { + let mut set: BTreeSet = config + .classification + .allowed_codes + .iter() + .map(|s| s.trim().to_string()) + .collect(); + if let Some(f) = &config.classification.allowed_codes_file { + let path = Config::resolve_path(config_dir, f); + let text = std::fs::read_to_string(&path).map_err(|e| { + CoreError::Config(format!( + "cannot read classification.allowed_codes_file {}: {e}", + path.display() + )) + })?; + let mut lines = text + .lines() + .map(|l| l.trim()) + .filter(|l| !l.is_empty() && !l.starts_with('#')); + if let Some(first) = lines.next() { + let header: Vec<&str> = first + .split(',') + .map(|s| s.trim().to_ascii_lowercase()) + .map(|s| Box::leak(s.into_boxed_str()) as &str) + .collect(); + let code_col = header.iter().position(|h| *h == "code"); + match code_col { + Some(col) => { + for l in lines { + if let Some(c) = l.split(',').nth(col) { + set.insert(c.trim().trim_matches('"').to_string()); + } + } + } + None => { + set.insert(first.split(',').next().unwrap_or("").trim().to_string()); + for l in lines { + set.insert(l.split(',').next().unwrap_or("").trim().to_string()); + } + } + } + } + } + set.remove(""); + Ok(set) +} + +/// The category vocabulary used by the built-in pack and the documentation. A custom +/// pack may add its own; a config may toggle any of these even when the active pack +/// has no rule in that category (e.g. one project.yaml shared by several packs). +pub const STANDARD_CATEGORIES: &[&str] = &[ + "identity", + "spatial", + "properties", + "geometry", + "classification", + "naming", + "sanity", + "schema", + "ids", +]; + +/// Reject `checks.rules` / `checks.categories` keys that match no rule, so a typo +/// can never silently disable a check. +fn validate_toggles(config: &Config, rules: &[(Rule, RuleSource)]) -> CoreResult<()> { + let ids: BTreeSet<&str> = rules.iter().map(|(r, _)| r.id.as_str()).collect(); + let mut cats: BTreeSet<&str> = rules.iter().map(|(r, _)| r.category.as_str()).collect(); + cats.extend(STANDARD_CATEGORIES.iter().copied()); + let mut problems = Vec::new(); + for k in config.checks.rules.keys() { + if !ids.contains(k.as_str()) && !k.starts_with("IDS-") { + problems.push(format!( + "checks.rules refers to unknown rule id '{k}' (known: {})", + ids.iter().copied().collect::>().join(", ") + )); + } + } + for k in config.checks.categories.keys() { + if !cats.contains(k.as_str()) { + problems.push(format!( + "checks.categories refers to unknown category '{k}' (known: {})", + cats.iter().copied().collect::>().join(", ") + )); + } + } + if problems.is_empty() { + Ok(()) + } else { + Err(CoreError::Config(problems.join("; "))) + } +} + +/// Evaluate all rules (pack + config generated) against the model. +pub fn evaluate( + model: &Model, + config: &Config, + pack: &RulePack, + config_dir: Option<&Path>, +) -> CoreResult { + let allowed_codes = load_allowed_codes(config, config_dir)?; + let mut rules: Vec<(Rule, RuleSource)> = pack + .rules + .iter() + .cloned() + .map(|r| { + ( + r, + RuleSource::RulePack { + pack: pack.name.clone(), + }, + ) + }) + .collect(); + rules.extend( + rules_from_config(config) + .into_iter() + .map(|r| (r, RuleSource::ProjectConfig)), + ); + validate_toggles(config, &rules)?; + + let mut results = Vec::new(); + let mut findings = Vec::new(); + + for (rule, source) in &rules { + if !rule.enabled || !config.checks.is_enabled(&rule.id, &rule.category) { + continue; + } + if let Some(cond) = &rule.enabled_if { + let v = config + .lookup(cond.trim_start_matches("$config.")) + .unwrap_or(serde_json::Value::Bool(false)); + if !v.as_bool().unwrap_or(false) { + continue; + } + } + let scope = resolve_scope(model, &rule.scope); + let severity = rule.severity(); + let ctx = CheckContext { + model, + config, + scope: &scope, + allowed_codes: &allowed_codes, + }; + let checked = if rule.check.is_model_level() { + scope.len().max(1) + } else { + scope.len() + }; + let outcome = rule.check.run(&ctx)?; + match outcome { + CheckOutcome::Skipped { reason } => results.push(RuleResult { + rule_id: rule.id.clone(), + category: rule.category.clone(), + description: rule.description.clone(), + severity, + status: RuleStatus::Skipped, + elements_checked: 0, + failures: 0, + skipped_reason: Some(reason), + source: source.clone(), + }), + CheckOutcome::Ran { failures } => { + let status = if failures.is_empty() { + if checked == 0 { + RuleStatus::NotApplicable + } else { + RuleStatus::Pass + } + } else { + RuleStatus::Fail + }; + results.push(RuleResult { + rule_id: rule.id.clone(), + category: rule.category.clone(), + description: rule.description.clone(), + severity, + status, + elements_checked: checked, + failures: failures.len(), + skipped_reason: None, + source: source.clone(), + }); + for f in failures { + let e = f.element.map(|i| &model.elements[i]); + findings.push(Finding { + rule_id: rule.id.clone(), + severity, + global_id: e.map(|e| e.global_id.clone()), + step_id: e.map(|e| e.step_id), + ifc_type: e.map(|e| e.ifc_type.clone()), + name: e.and_then(|e| e.name.clone()), + storey: e.and_then(|e| e.storey.clone()), + message: f.message, + expected: f.expected, + actual: f.actual, + fix_hint: rule.fix_hint.clone(), + source: source.clone(), + }); + } + } + } + } + + results.sort_by(|a, b| a.rule_id.cmp(&b.rule_id)); + let summary = score::summarise(&results, &findings); + Ok(Evaluation { + rules: results, + findings, + summary, + }) +} + +/// Merge extra rule results / findings (e.g. from IDS) and recompute the summary. +pub fn merge(eval: &mut Evaluation, rules: Vec, findings: Vec) { + eval.rules.extend(rules); + eval.findings.extend(findings); + eval.rules.sort_by(|a, b| a.rule_id.cmp(&b.rule_id)); + eval.summary = score::summarise(&eval.rules, &eval.findings); +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::model::{Geometry, ModelInfo, Severity, SpatialNode, SpatialRef}; + + fn elem(id: &str, t: &str, name: &str, storey: Option<&str>) -> Element { + Element { + global_id: id.into(), + step_id: 1, + ifc_type: t.into(), + ancestors: vec![ + t.into(), + "IfcBuildingElement".into(), + "IfcElement".into(), + "IfcProduct".into(), + ], + name: Some(name.into()), + storey: storey.map(|s| s.to_string()), + container: storey.map(|s| SpatialRef { + global_id: "S1".into(), + ifc_type: "IfcBuildingStorey".into(), + name: Some(s.into()), + }), + has_representation: true, + geometry: Some(Geometry { + bbox_min: [0.0; 3], + bbox_max: [1.0; 3], + volume_m3: Some(1.0), + area_m2: Some(6.0), + triangle_count: 12, + }), + ..Default::default() + } + } + + fn model(elements: Vec) -> Model { + let mut m = Model { + info: ModelInfo { + schema: "IFC4".into(), + geometry_available: true, + spatial_tree: vec![SpatialNode { + global_id: "SITE".into(), + ifc_type: "IfcSite".into(), + children: vec![SpatialNode { + global_id: "B".into(), + ifc_type: "IfcBuilding".into(), + children: vec![SpatialNode { + global_id: "S1".into(), + ifc_type: "IfcBuildingStorey".into(), + ..Default::default() + }], + ..Default::default() + }], + ..Default::default() + }], + ..Default::default() + }, + elements, + ids_results: None, + }; + m.sort_elements(); + m + } + + #[test] + fn duplicate_global_id_is_an_error() { + let m = model(vec![ + elem("0fqX614OH1YO1Njdxms2$Q", "IfcWall", "W1", Some("L1")), + elem("0fqX614OH1YO1Njdxms2$Q", "IfcWall", "W2", Some("L1")), + elem("1fqX614OH1YO1Njdxms2$Q", "IfcSlab", "S1", Some("L1")), + ]); + let cfg = Config::default(); + let ev = evaluate(&m, &cfg, &RulePack::generic(), None).unwrap(); + let dup: Vec<_> = ev + .findings + .iter() + .filter(|f| f.rule_id == "ID-001") + .collect(); + assert_eq!(dup.len(), 2, "{:?}", ev.findings); + assert_eq!(dup[0].severity, Severity::Error); + assert_eq!(ev.summary.verdict, Some(crate::model::Verdict::Fail)); + } + + #[test] + fn clean_model_passes() { + let m = model(vec![ + elem("0fqX614OH1YO1Njdxms2$Q", "IfcWall", "W1", Some("L1")), + elem("1fqX614OH1YO1Njdxms2$Q", "IfcSlab", "S1", Some("L1")), + ]); + let cfg = Config::default(); + let ev = evaluate(&m, &cfg, &RulePack::generic(), None).unwrap(); + let errors: Vec<_> = ev + .findings + .iter() + .filter(|f| f.severity == Severity::Error) + .collect(); + assert!(errors.is_empty(), "{:#?}", errors); + assert_eq!(ev.summary.verdict, Some(crate::model::Verdict::Pass)); + assert_eq!(ev.summary.score, 100); + } + + #[test] + fn element_without_storey_fails_spatial_rule() { + let m = model(vec![elem("0fqX614OH1YO1Njdxms2$Q", "IfcWall", "W1", None)]); + let ev = evaluate(&m, &Config::default(), &RulePack::generic(), None).unwrap(); + assert!( + ev.findings.iter().any(|f| f.rule_id == "SP-001"), + "{:?}", + ev.findings + ); + } + + #[test] + fn config_required_pset_generates_rule_and_toggles_work() { + let m = model(vec![elem( + "0fqX614OH1YO1Njdxms2$Q", + "IfcWall", + "W1", + Some("L1"), + )]); + let cfg = Config::from_yaml( + "requirements:\n required_psets:\n - pset: Pset_WallCommon\n applies_to: [IfcWall]\n properties: [FireRating]\n", + ) + .unwrap(); + let ev = evaluate(&m, &cfg, &RulePack::generic(), None).unwrap(); + assert!(ev.findings.iter().any(|f| f.rule_id == "CFG-PSET-001")); + assert!(ev.findings.iter().any(|f| f.rule_id == "CFG-PSET-001-01")); + let cfg2 = Config::from_yaml("checks:\n rules:\n ID-001: false\n").unwrap(); + let ev2 = evaluate(&m, &cfg2, &RulePack::generic(), None).unwrap(); + assert!(!ev2.rules.iter().any(|r| r.rule_id == "ID-001")); + } + + #[test] + fn geometry_rules_are_skipped_without_kernel() { + let mut m = model(vec![elem( + "0fqX614OH1YO1Njdxms2$Q", + "IfcWall", + "W1", + Some("L1"), + )]); + m.info.geometry_available = false; + let ev = evaluate(&m, &Config::default(), &RulePack::generic(), None).unwrap(); + let geo = ev.rules.iter().find(|r| r.rule_id == "GEO-002").unwrap(); + assert_eq!(geo.status, RuleStatus::Skipped); + assert!(geo.skipped_reason.is_some()); + assert!(ev.summary.rules_skipped >= 1); + } + + #[test] + fn unknown_toggle_keys_are_rejected() { + let m = model(vec![elem( + "0fqX614OH1YO1Njdxms2$Q", + "IfcWall", + "W1", + Some("L1"), + )]); + let cfg = Config::from_yaml("checks:\n rules:\n ID-999: false\n").unwrap(); + let err = evaluate(&m, &cfg, &RulePack::generic(), None).unwrap_err(); + assert!(err.to_string().contains("ID-999"), "{err}"); + let cfg2 = Config::from_yaml("checks:\n categories:\n geometrie: false\n").unwrap(); + assert!(evaluate(&m, &cfg2, &RulePack::generic(), None).is_err()); + } + + #[test] + fn classification_applies_to_narrows_scope() { + let m = model(vec![ + elem("0fqX614OH1YO1Njdxms2$Q", "IfcWall", "W1", Some("L1")), + elem("1fqX614OH1YO1Njdxms2$Q", "IfcSlab", "S1", Some("L1")), + ]); + let cfg = Config::from_yaml("classification:\n required: true\n applies_to: [IfcWall]\n") + .unwrap(); + let ev = evaluate(&m, &cfg, &RulePack::generic(), None).unwrap(); + let cl: Vec<_> = ev + .findings + .iter() + .filter(|f| f.rule_id == "CL-001") + .collect(); + assert_eq!(cl.len(), 1); + assert_eq!(cl[0].ifc_type.as_deref(), Some("IfcWall")); + } + + #[test] + fn naming_pattern_from_config() { + let m = model(vec![elem( + "0fqX614OH1YO1Njdxms2$Q", + "IfcWall", + "Wall-A", + Some("L1"), + )]); + let cfg = Config::from_yaml("naming:\n patterns:\n IfcWall: '^W-[0-9]{3}$'\n").unwrap(); + let ev = evaluate(&m, &cfg, &RulePack::generic(), None).unwrap(); + assert!( + ev.findings.iter().any(|f| f.rule_id == "NAM-001"), + "{:?}", + ev.findings + ); + } +} diff --git a/crates/core/src/rules/mod.rs b/crates/core/src/rules/mod.rs new file mode 100644 index 0000000..8d49ab3 --- /dev/null +++ b/crates/core/src/rules/mod.rs @@ -0,0 +1,15 @@ +//! Pluggable rule engine. +//! +//! A **rule** is data (YAML): id, description, scope, a *check kind* with +//! parameters, severity and a fix hint. The engine knows a fixed vocabulary of +//! check kinds (see [`checks::CheckKind`]); adding a rule never requires +//! editing engine code, only adding a YAML entry. Project specific values are +//! referenced with `$config.` and resolved against `project.yaml` +//! at evaluation time. + +pub mod checks; +pub mod engine; +pub mod pack; + +pub use engine::{evaluate, Evaluation}; +pub use pack::{load_rule_pack, Rule, RulePack, RuleScope}; diff --git a/crates/core/src/rules/pack.rs b/crates/core/src/rules/pack.rs new file mode 100644 index 0000000..3d46341 --- /dev/null +++ b/crates/core/src/rules/pack.rs @@ -0,0 +1,195 @@ +//! Rule pack format and loading. + +use serde::{Deserialize, Serialize}; +use std::path::Path; + +use crate::config::{Config, ElementFilter}; +use crate::error::{CoreError, CoreResult}; +use crate::model::Severity; +use crate::rules::checks::CheckKind; + +/// Built-in generic rule pack, shipped as data (not code). +pub const GENERIC_RULE_PACK_YAML: &str = include_str!("../../rule_packs/generic.yaml"); + +/// A rule pack: a named, versioned list of rules. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct RulePack { + pub name: String, + #[serde(default = "default_version")] + pub version: u32, + #[serde(default)] + pub description: Option, + pub rules: Vec, +} + +fn default_version() -> u32 { + 1 +} + +/// Which elements a rule applies to. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +#[serde(default, deny_unknown_fields)] +pub struct RuleScope { + /// Element types (or ancestors) the rule applies to. Empty = all products. + pub ifc_types: Vec, + /// Types (or ancestors) excluded from the scope. + pub exclude_types: Vec, + /// Include spatial structure elements (sites, buildings, storeys, spaces). Default false. + pub include_spatial: bool, + /// Additional filter on name / storey / property values. + pub filter: Option, +} + +/// One rule definition. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct Rule { + /// Stable identifier, e.g. "ID-001". Must be unique in the pack. + pub id: String, + /// Category used for toggles and grouping: identity, spatial, properties, geometry, classification, naming, sanity, ids. + pub category: String, + pub description: String, + #[serde(default = "default_severity")] + pub severity: String, + #[serde(default = "default_true")] + pub enabled: bool, + /// Optional `$config.` boolean that must be true for the rule to run (e.g. `$config.classification.required`). + #[serde(default)] + pub enabled_if: Option, + #[serde(default)] + pub scope: RuleScope, + pub check: CheckKind, + #[serde(default)] + pub fix_hint: Option, +} + +fn default_severity() -> String { + "error".into() +} +fn default_true() -> bool { + true +} + +impl Rule { + pub fn severity(&self) -> Severity { + self.severity.parse().unwrap_or(Severity::Error) + } +} + +impl RulePack { + /// Parse a rule pack from YAML text and validate it. + pub fn from_yaml(text: &str) -> CoreResult { + let pack: RulePack = + serde_yaml::from_str(text).map_err(|e| CoreError::RulePack(e.to_string()))?; + pack.validate()?; + Ok(pack) + } + + /// The built-in generic pack. + pub fn generic() -> RulePack { + RulePack::from_yaml(GENERIC_RULE_PACK_YAML) + .expect("built-in generic rule pack must be valid") + } + + pub fn validate(&self) -> CoreResult<()> { + let mut seen = std::collections::BTreeSet::new(); + let mut problems = Vec::new(); + if self.rules.is_empty() { + problems.push("rule pack has no rules".to_string()); + } + for r in &self.rules { + if !seen.insert(r.id.clone()) { + problems.push(format!("duplicate rule id '{}'", r.id)); + } + if r.severity.parse::().is_err() { + problems.push(format!( + "rule '{}': invalid severity '{}'", + r.id, r.severity + )); + } + if let Some(f) = &r.scope.filter { + if let Some(p) = &f.name_pattern { + if let Err(e) = regex::Regex::new(p) { + problems.push(format!( + "rule '{}': scope.filter.name_pattern invalid regex: {e}", + r.id + )); + } + } + } + if let Some(e) = &r.enabled_if { + if !e.starts_with("$config.") { + problems.push(format!( + "rule '{}': enabled_if must be a '$config.' reference", + r.id + )); + } + } + } + if problems.is_empty() { + Ok(()) + } else { + Err(CoreError::RulePack(problems.join("; "))) + } + } +} + +/// Load the rule pack named in `config.requirements.rule_pack`: "generic" or a YAML path +/// (relative to the config directory). +pub fn load_rule_pack(config: &Config, config_dir: Option<&Path>) -> CoreResult { + let name = config.requirements.rule_pack.trim(); + if name.is_empty() || name.eq_ignore_ascii_case("generic") { + return Ok(RulePack::generic()); + } + let path = Config::resolve_path(config_dir, name); + let text = std::fs::read_to_string(&path).map_err(|e| { + CoreError::RulePack(format!("cannot read rule pack {}: {e}", path.display())) + })?; + RulePack::from_yaml(&text) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn generic_pack_loads_and_has_unique_ids() { + let p = RulePack::generic(); + assert!( + p.rules.len() >= 15, + "generic pack should be comprehensive, got {}", + p.rules.len() + ); + let mut ids: Vec<_> = p.rules.iter().map(|r| r.id.clone()).collect(); + ids.sort(); + ids.dedup(); + assert_eq!(ids.len(), p.rules.len()); + } + + #[test] + fn duplicate_ids_are_rejected() { + let y = r#" +name: t +rules: + - id: A + category: identity + description: a + check: { kind: unique_global_id } + - id: A + category: identity + description: b + check: { kind: valid_global_id } +"#; + assert!(RulePack::from_yaml(y) + .unwrap_err() + .to_string() + .contains("duplicate")); + } + + #[test] + fn unknown_check_kind_is_rejected() { + let y = "name: t\nrules:\n - id: A\n category: x\n description: a\n check: { kind: teleport }\n"; + assert!(RulePack::from_yaml(y).is_err()); + } +} diff --git a/crates/core/src/run.rs b/crates/core/src/run.rs new file mode 100644 index 0000000..1f3f59f --- /dev/null +++ b/crates/core/src/run.rs @@ -0,0 +1,327 @@ +//! One run, end to end: evaluate rules, IDS, QTO, clash; write the `out/` folder. +//! +//! The reader (another crate) produces the [`Model`]; this module does the +//! rest and is shared by the CLI and the desktop app. `report.json`, +//! `failures.csv` and `qto.csv` are deterministic; only `run.json` and +//! `audit.log` carry timestamps. + +use std::path::{Path, PathBuf}; +use std::time::Instant; + +use serde::{Deserialize, Serialize}; + +use crate::audit::AuditLog; +use crate::config::Config; +use crate::error::{CoreError, CoreResult}; +use crate::hash; +use crate::i18n::Strings; +use crate::model::{Model, RunLedger, RunReport, ToolInfo}; +use crate::report::OutputFile; +use crate::rules::{self, engine}; +use crate::{bcf, clash, ids, qto, report}; + +/// What the caller hands to [`execute`]. +#[derive(Debug, Clone, Default)] +pub struct RunInputs { + /// Path of the IFC file (for the ledger; the model is already read). + pub ifc_path: PathBuf, + pub ids_path: Option, + /// `project.yaml` path if one was given; `None` means defaults were used. + pub config_path: Option, + /// Directory the config was loaded from (relative paths resolve against it). + pub config_dir: Option, + pub out_dir: PathBuf, + /// Moment the reader started, so `duration_ms` covers reading too. + pub started: Option, +} + +/// Everything a run produced. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RunOutcome { + pub report: RunReport, + pub ledger: RunLedger, + pub files: Vec, + pub bcf: bcf::BcfStats, + pub out_dir: PathBuf, +} + +/// Build the report without writing anything (used by tests and the UI preview). +pub fn build_report( + model: &Model, + config: &Config, + config_dir: Option<&Path>, +) -> CoreResult { + let pack = rules::load_rule_pack(config, config_dir)?; + let mut eval = engine::evaluate(model, config, &pack, config_dir)?; + + let ids_report = match &model.ids_results { + Some(results) => { + let mut ev = ids::evaluate(results); + // The IDS engine reports GlobalIds only; add storey and step id from the model + // so IDS findings carry the same evidence as rule-pack findings. + let index: std::collections::BTreeMap<&str, &crate::model::Element> = model + .elements + .iter() + .map(|e| (e.global_id.as_str(), e)) + .collect(); + for f in &mut ev.findings { + if let Some(e) = f.global_id.as_deref().and_then(|g| index.get(g)) { + if f.storey.is_none() { + f.storey = e.storey.clone(); + } + if f.step_id.is_none() { + f.step_id = Some(e.step_id); + } + if f.ifc_type.is_none() { + f.ifc_type = Some(e.ifc_type.clone()); + } + } + } + engine::merge(&mut eval, ev.rules, ev.findings); + Some(ev.report) + } + None => None, + }; + + let rates = match &config.qto.unit_rates_file { + Some(f) => Some(qto::RateTable::from_csv(&Config::resolve_path( + config_dir, f, + ))?), + None => None, + }; + let qto_report = qto::compute(model, config, rates.as_ref())?; + let strings = Strings::for_language(config.output.language); + let clash_report = clash::run(model, None, config, &strings); + + let mut report = RunReport { + tool: ToolInfo::default(), + model: model.info.clone(), + config: config.to_json_value(), + summary: eval.summary, + rules: eval.rules, + findings: eval.findings, + qto: qto_report, + ids: ids_report, + clash: clash_report, + }; + report.normalise(); + Ok(report) +} + +/// Evaluate the model and write the whole `out/` folder. +pub fn execute(model: &Model, config: &Config, inputs: &RunInputs) -> CoreResult { + let started = inputs.started.unwrap_or_else(Instant::now); + std::fs::create_dir_all(&inputs.out_dir)?; + let audit = AuditLog::open(&inputs.out_dir)?; + audit.record( + "run.start", + &format!( + "ifc={} schema={} elements={}", + inputs.ifc_path.display(), + model.info.schema, + model.elements.len() + ), + )?; + + let report = build_report(model, config, inputs.config_dir.as_deref())?; + audit.record( + "rules.done", + &format!( + "rules={} errors={} warnings={} score={}", + report.rules.len(), + report.summary.errors, + report.summary.warnings, + report.summary.score + ), + )?; + + let mut files = report::write_all(&report, config, &inputs.out_dir)?; + audit.record( + "report.written", + &files + .iter() + .map(|f| f.name.clone()) + .collect::>() + .join(","), + )?; + + let bcf_path = inputs.out_dir.join("issues.bcfzip"); + let bcf_stats = bcf::write_bcfzip(&report, model, config, &bcf_path)?; + files.push(OutputFile { + name: "issues.bcfzip".into(), + kind: "bcf".into(), + bytes: file_len(&bcf_path), + }); + let issues_csv = inputs.out_dir.join("issues.csv"); + bcf::write_issues_csv(&report, &issues_csv)?; + files.push(OutputFile { + name: "issues.csv".into(), + kind: "issues_csv".into(), + bytes: file_len(&issues_csv), + }); + audit.record("bcf.written", &format!("topics={}", bcf_stats.topics))?; + + let cfg_yaml = config.to_yaml()?; + std::fs::write(inputs.out_dir.join("project.yaml"), &cfg_yaml)?; + files.push(OutputFile { + name: "project.yaml".into(), + kind: "config".into(), + bytes: cfg_yaml.len() as u64, + }); + + let report_sha = hash::sha256_file(&inputs.out_dir.join("report.json"))?; + let ledger = RunLedger { + tool: ToolInfo::default(), + timestamp: chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Secs, true), + duration_ms: started.elapsed().as_millis() as u64, + ifc_file: file_name(&inputs.ifc_path), + ifc_sha256: model.info.sha256.clone(), + ids_file: inputs.ids_path.as_ref().map(|p| file_name(p)), + ids_sha256: match &inputs.ids_path { + Some(p) => Some(hash::sha256_file(p)?), + None => None, + }, + config_file: inputs.config_path.as_ref().map(|p| file_name(p)), + config_sha256: hash::sha256_bytes(cfg_yaml.as_bytes()), + rates_file: config.qto.unit_rates_file.clone(), + rates_sha256: match &config.qto.unit_rates_file { + Some(f) => Some(hash::sha256_file(&Config::resolve_path( + inputs.config_dir.as_deref(), + f, + ))?), + None => None, + }, + schema: model.info.schema.clone(), + element_count: model.elements.len(), + score: report.summary.score, + verdict: report.summary.verdict, + errors: report.summary.errors, + warnings: report.summary.warnings, + infos: report.summary.infos, + rules_passed: report.summary.rules_passed, + rules_failed: report.summary.rules_failed, + rules_skipped: report.summary.rules_skipped, + report_sha256: report_sha, + output_dir: inputs.out_dir.display().to_string(), + }; + let ledger_text = serde_json::to_string_pretty(&ledger)?; + std::fs::write(inputs.out_dir.join("run.json"), &ledger_text)?; + files.push(OutputFile { + name: "run.json".into(), + kind: "run_json".into(), + bytes: ledger_text.len() as u64, + }); + files.push(OutputFile { + name: "audit.log".into(), + kind: "audit_log".into(), + bytes: file_len(audit.path()), + }); + audit.record( + "run.end", + &format!( + "duration_ms={} verdict={:?}", + ledger.duration_ms, ledger.verdict + ), + )?; + + Ok(RunOutcome { + report, + ledger, + files, + bcf: bcf_stats, + out_dir: inputs.out_dir.clone(), + }) +} + +/// Read a `run.json` ledger (for run history). +pub fn read_ledger(path: &Path) -> CoreResult { + let text = std::fs::read_to_string(path) + .map_err(|e| CoreError::Io(format!("cannot read {}: {e}", path.display())))?; + Ok(serde_json::from_str(&text)?) +} + +/// Scan a directory for runs (`
/*/run.json`), newest first by timestamp. +pub fn list_runs(root: &Path) -> CoreResult> { + let mut out = Vec::new(); + if let Ok(rd) = std::fs::read_dir(root) { + for entry in rd.flatten() { + let p = entry.path().join("run.json"); + if p.is_file() { + if let Ok(l) = read_ledger(&p) { + out.push(l); + } + } + } + } + out.sort_by(|a, b| b.timestamp.cmp(&a.timestamp)); + Ok(out) +} + +fn file_name(p: &Path) -> String { + p.file_name() + .map(|s| s.to_string_lossy().to_string()) + .unwrap_or_else(|| p.display().to_string()) +} + +fn file_len(p: &Path) -> u64 { + std::fs::metadata(p).map(|m| m.len()).unwrap_or(0) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::model::{Element, ModelInfo}; + + fn tiny_model() -> Model { + let mk = |id: &str, name: &str| Element { + global_id: id.into(), + ifc_type: "IfcWall".into(), + ancestors: vec!["IfcWall".into(), "IfcElement".into(), "IfcProduct".into()], + name: Some(name.into()), + has_representation: true, + ..Default::default() + }; + let mut m = Model { + info: ModelInfo { + schema: "IFC4".into(), + file_name: "t.ifc".into(), + sha256: "00".into(), + ..Default::default() + }, + elements: vec![ + mk("0fqX614OH1YO1Njdxms2$Q", "A"), + mk("0fqX614OH1YO1Njdxms2$Q", "B"), + ], + ids_results: None, + }; + m.sort_elements(); + m + } + + #[test] + fn execute_writes_all_outputs_and_is_deterministic() { + let model = tiny_model(); + let cfg = Config::default(); + let dir = tempfile::tempdir().unwrap(); + let run_once = |name: &str| { + let out = dir.path().join(name); + let inputs = RunInputs { + ifc_path: "t.ifc".into(), + out_dir: out.clone(), + ..Default::default() + }; + let o = execute(&model, &cfg, &inputs).unwrap(); + assert!(o.files.iter().any(|f| f.name == "report.json")); + assert!(out.join("run.json").is_file()); + assert!(out.join("audit.log").is_file()); + assert!(out.join("project.yaml").is_file()); + std::fs::read(out.join("report.json")).unwrap() + }; + let a = run_once("a"); + let b = run_once("b"); + assert_eq!(a, b, "report.json must be byte-identical across runs"); + let runs = list_runs(dir.path()).unwrap(); + assert_eq!(runs.len(), 2); + assert_eq!(runs[0].verdict, Some(crate::model::Verdict::Fail)); + } +} diff --git a/crates/core/src/score.rs b/crates/core/src/score.rs new file mode 100644 index 0000000..c92ca9d --- /dev/null +++ b/crates/core/src/score.rs @@ -0,0 +1,150 @@ +//! Score and verdict. The formula is deliberately simple and stated in the UI: +//! +//! * **Verdict**: FAIL if any ERROR finding; PASS WITH WARNINGS if no errors +//! but at least one WARNING; PASS otherwise. Skipped rules never count as +//! passed and are listed separately. +//! * **Score** (0–100): `100 × (1 − (errors + 0.25 × warnings) / element_checks)`, +//! where `element_checks` is the number of (element, rule) pairs evaluated. +//! INFO findings do not affect the score. Clamped to 0..=100. + +use crate::model::{Finding, RuleResult, RuleStatus, Severity, Summary, Verdict}; + +pub const WARNING_WEIGHT: f64 = 0.25; + +/// Plain-language statement of the verdict rule, shown in the UI and report. +pub const VERDICT_RULE: &str = "FAIL = at least one ERROR. PASS WITH WARNINGS = no errors, at least one WARNING. PASS = no errors and no warnings. Score = 100 × (1 − (errors + 0.25 × warnings) / element checks). Skipped rules are never counted as passed."; + +pub fn summarise(rules: &[RuleResult], findings: &[Finding]) -> Summary { + let errors = findings + .iter() + .filter(|f| f.severity == Severity::Error) + .count(); + let warnings = findings + .iter() + .filter(|f| f.severity == Severity::Warning) + .count(); + let infos = findings + .iter() + .filter(|f| f.severity == Severity::Info) + .count(); + let element_checks: usize = rules + .iter() + .filter(|r| r.status != RuleStatus::Skipped) + .map(|r| r.elements_checked) + .sum(); + let mut distinct = std::collections::BTreeSet::new(); + for f in findings { + if let Some(g) = &f.global_id { + distinct.insert(g.clone()); + } + } + let score = if element_checks == 0 { + if errors > 0 { + 0 + } else { + 100 + } + } else { + let penalty = errors as f64 + WARNING_WEIGHT * warnings as f64; + let s = 100.0 * (1.0 - penalty / element_checks as f64); + s.round().clamp(0.0, 100.0) as u8 + }; + let verdict = if rules.is_empty() { + None + } else if errors > 0 { + Some(Verdict::Fail) + } else if warnings > 0 { + Some(Verdict::PassWithWarnings) + } else { + Some(Verdict::Pass) + }; + Summary { + score, + verdict, + elements_checked: rules.iter().map(|r| r.elements_checked).max().unwrap_or(0), + element_checks, + errors, + warnings, + infos, + rules_total: rules.len(), + rules_passed: rules + .iter() + .filter(|r| r.status == RuleStatus::Pass) + .count(), + rules_failed: rules + .iter() + .filter(|r| r.status == RuleStatus::Fail) + .count(), + rules_skipped: rules + .iter() + .filter(|r| r.status == RuleStatus::Skipped) + .count(), + rules_not_applicable: rules + .iter() + .filter(|r| r.status == RuleStatus::NotApplicable) + .count(), + verdict_rule: VERDICT_RULE.to_string(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::model::RuleSource; + + fn rule(id: &str, status: RuleStatus, checked: usize, failures: usize) -> RuleResult { + RuleResult { + rule_id: id.into(), + category: "x".into(), + description: "d".into(), + severity: Severity::Error, + status, + elements_checked: checked, + failures, + skipped_reason: None, + source: RuleSource::ProjectConfig, + } + } + fn finding(sev: Severity) -> Finding { + Finding { + rule_id: "r".into(), + severity: sev, + global_id: Some("g".into()), + step_id: None, + ifc_type: None, + name: None, + storey: None, + message: "m".into(), + expected: None, + actual: None, + fix_hint: None, + source: RuleSource::ProjectConfig, + } + } + + #[test] + fn score_formula() { + let rules = vec![ + rule("a", RuleStatus::Fail, 100, 10), + rule("b", RuleStatus::Pass, 100, 0), + ]; + let findings: Vec = (0..10).map(|_| finding(Severity::Error)).collect(); + let s = summarise(&rules, &findings); + assert_eq!(s.score, 95); + assert_eq!(s.verdict, Some(Verdict::Fail)); + let warn: Vec = (0..8).map(|_| finding(Severity::Warning)).collect(); + let s2 = summarise(&rules, &warn); + assert_eq!(s2.score, 99); + assert_eq!(s2.verdict, Some(Verdict::PassWithWarnings)); + } + + #[test] + fn skipped_rules_do_not_count() { + let rules = vec![rule("a", RuleStatus::Skipped, 0, 0)]; + let s = summarise(&rules, &[]); + assert_eq!(s.rules_skipped, 1); + assert_eq!(s.rules_passed, 0); + assert_eq!(s.score, 100); + assert_eq!(s.verdict, Some(Verdict::Pass)); + } +} diff --git a/crates/core/tests/bcf_ids.rs b/crates/core/tests/bcf_ids.rs new file mode 100644 index 0000000..1a040d0 --- /dev/null +++ b/crates/core/tests/bcf_ids.rs @@ -0,0 +1,95 @@ +//! Integration: IDS results -> rules/findings -> BCF topics and issues.csv. + +use std::io::Read; + +use verimodel_core::bcf::{write_bcfzip, write_issues_csv}; +use verimodel_core::config::Config; +use verimodel_core::ids::evaluate; +use verimodel_core::model::{ + Element, IdsFailedEntity, IdsRequirementResult, IdsResults, IdsSpecificationResult, Model, + ModelInfo, RunReport, +}; + +fn ids_results() -> IdsResults { + IdsResults { + ids_file: "fire.ids".into(), + title: Some("Fire".into()), + specifications: vec![IdsSpecificationResult { + name: "Walls have a fire rating".into(), + cardinality: Some("required".into()), + applicable_count: 2, + passed: false, + requirements: vec![IdsRequirementResult { + description: "FireRating shall be provided in Pset_WallCommon".into(), + facet: "property".into(), + passed: false, + failed_entities: vec![IdsFailedEntity { + global_id: "2O2Fr$t4X7Zf8NOew3FLOH".into(), + ifc_type: "IfcWall".into(), + name: Some("W-01".into()), + reason: "FireRating is missing".into(), + }], + }], + ..Default::default() + }], + } +} + +#[test] +fn ids_failures_become_bcf_topics() { + let ev = evaluate(&ids_results()); + let model = Model { + info: ModelInfo { + file_name: "m.ifc".into(), + sha256: "cd".repeat(32), + ..Default::default() + }, + elements: vec![Element { + global_id: "2O2Fr$t4X7Zf8NOew3FLOH".into(), + ifc_type: "IfcWall".into(), + ..Default::default() + }], + ids_results: Some(ids_results()), + }; + let mut report = RunReport { + model: model.info.clone(), + config: Config::default().to_json_value(), + rules: ev.rules, + findings: ev.findings, + ids: Some(ev.report), + ..Default::default() + }; + report.normalise(); + + let dir = tempfile::tempdir().unwrap(); + let bcf_path = dir.path().join("issues.bcfzip"); + let stats = write_bcfzip(&report, &model, &Config::default(), &bcf_path).unwrap(); + assert_eq!(stats.topics, 1); + assert_eq!(stats.with_viewpoint, 1); + assert_eq!(stats.version, "2.1"); + + let mut zip = zip::ZipArchive::new(std::fs::File::open(&bcf_path).unwrap()).unwrap(); + let markup_name = zip + .file_names() + .find(|n| n.ends_with("/markup.bcf")) + .unwrap() + .to_string(); + let mut markup = String::new(); + zip.by_name(&markup_name) + .unwrap() + .read_to_string(&mut markup) + .unwrap(); + assert!( + markup.contains("[IDS-01-01] FireRating is missing"), + "{markup}" + ); + assert!(markup + .contains("Walls have a fire rating: FireRating shall be provided in Pset_WallCommon")); + assert!(markup.contains("ids")); + + let csv_path = dir.path().join("issues.csv"); + assert_eq!(write_issues_csv(&report, &csv_path).unwrap(), 1); + let csv_text = std::fs::read_to_string(&csv_path).unwrap(); + let guid = markup_name.trim_end_matches("/markup.bcf"); + assert!(csv_text.contains(guid), "issues.csv shares the topic GUID"); +} diff --git a/crates/core/tests/report.rs b/crates/core/tests/report.rs new file mode 100644 index 0000000..6705130 --- /dev/null +++ b/crates/core/tests/report.rs @@ -0,0 +1,416 @@ +//! Integration tests for the report writers: every output file is produced, +//! user data is escaped, and every writer is byte-for-byte deterministic. + +use std::collections::BTreeMap; +use std::path::Path; + +use verimodel_core::config::{Config, Language}; +use verimodel_core::i18n::Strings; +use verimodel_core::model::{ + ClashReport, CostLine, Finding, IdsFailedEntity, IdsReport, IdsRequirementResult, + IdsSpecificationResult, ModelInfo, QtoReport, QtoRow, QtoSample, QuantitySource, RuleResult, + RuleSource, RuleStatus, RunReport, Severity, Summary, ToolInfo, Verdict, +}; +use verimodel_core::report; + +fn finding(rule: &str, sev: Severity, gid: &str, name: &str, source: RuleSource) -> Finding { + Finding { + rule_id: rule.into(), + severity: sev, + global_id: Some(gid.into()), + step_id: Some(42), + ifc_type: Some("IfcWall".into()), + name: Some(name.into()), + storey: Some("Level 1".into()), + message: format!("{rule} failed, with a comma"), + expected: Some("a value".into()), + actual: Some("\"nothing\"".into()), + fix_hint: Some("Fill it in".into()), + source, + } +} + +fn sources(base: usize, geom: usize) -> BTreeMap { + let mut m = BTreeMap::new(); + if base > 0 { + m.insert("base_quantity".to_string(), base); + } + if geom > 0 { + m.insert("geometry".to_string(), geom); + } + m +} + +fn sample_report() -> RunReport { + let pack = RuleSource::RulePack { + pack: "base".into(), + }; + let ids_src = RuleSource::Ids { + specification: "Walls".into(), + requirement: "FireRating".into(), + }; + let rules = vec![ + RuleResult { + rule_id: "GEO-001".into(), + category: "geometry".into(), + description: "Elements have geometry".into(), + severity: Severity::Error, + status: RuleStatus::Skipped, + elements_checked: 0, + failures: 0, + skipped_reason: Some("Geometry kernel unavailable".into()), + source: pack.clone(), + }, + RuleResult { + rule_id: "ID-001".into(), + category: "identity".into(), + description: "GlobalIds are unique".into(), + severity: Severity::Error, + status: RuleStatus::Fail, + elements_checked: 3, + failures: 1, + skipped_reason: None, + source: pack.clone(), + }, + RuleResult { + rule_id: "PS-001".into(), + category: "properties".into(), + description: "Required psets".into(), + severity: Severity::Warning, + status: RuleStatus::Fail, + elements_checked: 3, + failures: 2, + skipped_reason: None, + source: RuleSource::ProjectConfig, + }, + ]; + let findings = vec![ + finding("ID-001", Severity::Error, "0aaa", "&", pack.clone()), + finding( + "PS-001", + Severity::Warning, + "0bbb", + "Wall 2", + RuleSource::ProjectConfig, + ), + finding( + "PS-001", + Severity::Warning, + "0ccc", + "Wall 3", + ids_src.clone(), + ), + ]; + let qto = QtoReport { + group_by: vec!["type".into(), "storey".into()], + rows: vec![ + QtoRow { + group: vec!["IfcSlab".into(), "Level 1".into()], + count: 1, + volume_m3: 5.0, + area_m2: 25.0, + length_m: 5.0, + weight_kg: 0.0, + volume_sources: sources(1, 0), + area_sources: sources(0, 1), + length_sources: sources(0, 1), + cost: None, + }, + QtoRow { + group: vec!["IfcWall".into(), "Level 1".into()], + count: 3, + volume_m3: 4.5, + area_m2: 30.25, + length_m: 12.0, + weight_kg: 0.0, + volume_sources: sources(2, 1), + area_sources: sources(3, 0), + length_sources: sources(3, 0), + cost: Some(CostLine { + rate_code: "W-01".into(), + rate_description: "Walls".into(), + unit: "m3".into(), + rate: 120.0, + quantity: 4.5, + amount: 540.0, + currency: "EUR".into(), + source: "rates.csv".into(), + }), + }, + ], + total_count: 4, + total_volume_m3: 9.5, + total_area_m2: 55.25, + total_length_m: 17.0, + total_weight_kg: 0.0, + total_cost: Some(540.0), + currency: Some("EUR".into()), + elements_without_quantities: 0, + method: "Grouped by type and storey. Base quantities first.".into(), + samples: vec![QtoSample { + global_id: "0aaa".into(), + ifc_type: "IfcWall".into(), + name: Some("&".into()), + storey: Some("Level 1".into()), + volume_m3: Some(1.5), + volume_source: QuantitySource::BaseQuantity, + area_m2: Some(10.0), + area_source: QuantitySource::Geometry, + length_m: None, + length_source: QuantitySource::None, + quantity_sets: vec!["Qto_WallBaseQuantities".into()], + }], + }; + let ids = IdsReport { + ids_file: "requirements.ids".into(), + title: Some("Fire safety".into()), + specifications_total: 1, + specifications_passed: 0, + specifications: vec![IdsSpecificationResult { + name: "Walls".into(), + applicable_count: 3, + passed: false, + requirements: vec![IdsRequirementResult { + description: "FireRating shall be provided in Pset_WallCommon".into(), + facet: "property".into(), + passed: false, + failed_entities: vec![IdsFailedEntity { + global_id: "0ccc".into(), + ifc_type: "IfcWall".into(), + name: Some("Wall 3".into()), + reason: "property FireRating is missing".into(), + }], + }], + ..Default::default() + }], + }; + RunReport { + tool: ToolInfo::default(), + model: ModelInfo { + file_name: "house.ifc".into(), + sha256: "abc123".into(), + schema: "IFC4".into(), + element_count: 4, + storeys: vec!["Level 1".into()], + disciplines: vec!["Architecture".into()], + authoring_tool: Some("SomeCAD 1.0".into()), + ..Default::default() + }, + config: Config::default().to_json_value(), + summary: Summary { + score: 67, + verdict: Some(Verdict::Fail), + elements_checked: 3, + element_checks: 6, + errors: 1, + warnings: 2, + infos: 0, + rules_total: 3, + rules_passed: 0, + rules_failed: 2, + rules_skipped: 1, + rules_not_applicable: 0, + verdict_rule: verimodel_core::score::VERDICT_RULE.to_string(), + }, + rules, + findings, + qto, + ids: Some(ids), + clash: ClashReport { + enabled: false, + implemented: false, + message: "Clash detection is disabled.".into(), + clashes: vec![], + }, + } +} + +fn read(dir: &Path, name: &str) -> Vec { + std::fs::read(dir.join(name)).unwrap_or_else(|e| panic!("{name}: {e}")) +} + +#[test] +fn write_all_produces_every_file_deterministically() { + let report = sample_report(); + let cfg = Config::default(); + let tmp = tempfile::tempdir().unwrap(); + let a = tmp.path().join("a"); + let b = tmp.path().join("b"); + std::fs::create_dir_all(&a).unwrap(); + std::fs::create_dir_all(&b).unwrap(); + + let files = report::write_all(&report, &cfg, &a).unwrap(); + let kinds: Vec<&str> = files.iter().map(|f| f.kind.as_str()).collect(); + assert_eq!( + kinds, + vec![ + "report_json", + "report_html", + "failures_csv", + "qto_csv", + "qto_xlsx", + "qto_json" + ] + ); + for f in &files { + assert!(f.bytes > 0, "{} is empty", f.name); + assert_eq!(std::fs::metadata(a.join(&f.name)).unwrap().len(), f.bytes); + } + report::write_all(&report, &cfg, &b).unwrap(); + for f in &files { + assert_eq!( + read(&a, &f.name), + read(&b, &f.name), + "{} differs between two writes", + f.name + ); + } + + // failures.csv: header + one line per finding, quoting handled by the csv crate. + let failures = String::from_utf8(read(&a, "failures.csv")).unwrap(); + let mut rdr = csv::Reader::from_reader(failures.as_bytes()); + let headers: Vec = rdr.headers().unwrap().iter().map(String::from).collect(); + assert_eq!( + headers, + vec![ + "severity", + "rule_id", + "global_id", + "step_id", + "ifc_type", + "name", + "storey", + "message", + "expected", + "actual", + "fix_hint", + "source" + ] + ); + let recs: Vec = rdr.records().map(|r| r.unwrap()).collect(); + assert_eq!(recs.len(), report.findings.len()); + assert_eq!(failures.lines().count(), report.findings.len() + 1); + assert_eq!(&recs[0][5], "&"); + assert_eq!(&recs[0][11], "pack:base"); + assert_eq!(&recs[1][11], "project_config"); + assert_eq!(&recs[2][11], "ids:Walls/FireRating"); + assert_eq!(&recs[0][9], "\"nothing\""); + + // qto.csv: header, two rows, TOTAL. + let qto = String::from_utf8(read(&a, "qto.csv")).unwrap(); + let lines: Vec<&str> = qto.lines().collect(); + assert_eq!(lines.len(), 4); + assert!(lines[0] + .starts_with("type,storey,count,volume_m3,area_m2,length_m,weight_kg,volume_source")); + assert!(lines[2].contains("base_quantity=2;geometry=1")); + assert!(lines[2].contains("W-01,120,m3,540,EUR")); + assert!(lines[3].starts_with("TOTAL,,4,9.5,55.25,17,0")); + assert!(lines[3].ends_with("540,EUR")); + + // qto.json is the QtoReport. + let q: QtoReport = serde_json::from_slice(&read(&a, "qto.json")).unwrap(); + assert_eq!(q, report.qto); + + // xlsx is a zip whose creation date is pinned (otherwise it would embed "now"). + let xlsx = read(&a, "qto.xlsx"); + assert_eq!(&xlsx[..2], b"PK"); + let mut zip = zip::ZipArchive::new(std::io::Cursor::new(xlsx)).unwrap(); + let mut core = String::new(); + std::io::Read::read_to_string(&mut zip.by_name("docProps/core.xml").unwrap(), &mut core) + .unwrap(); + assert!(core.contains("2000-01-01T00:00:00Z"), "{core}"); + let names: Vec = zip.file_names().map(String::from).collect(); + assert!( + names.iter().any(|n| n == "xl/worksheets/sheet3.xml"), + "three sheets expected: {names:?}" + ); +} + +#[test] +fn html_report_contains_escaped_data_and_all_sections() { + let report = sample_report(); + let strings = Strings::for_language(Language::En); + let tmp = tempfile::tempdir().unwrap(); + let p = tmp.path().join("report.html"); + report::write_report_html(&report, &strings, &p).unwrap(); + let html = std::fs::read_to_string(&p).unwrap(); + + assert!(html.starts_with("")); + assert!(html.contains("<b>&"), "name must be escaped"); + assert!( + !html.contains("&"), + "raw user data must never reach the HTML" + ); + assert!(html.contains(&strings.get("verdict.FAIL"))); + assert!(html.contains("b-fail")); + // Verdict rule text (escaped form of the constant). + assert!(html.contains("FAIL = at least one ERROR.")); + for key in [ + "report.subtitle", + "report.skipped_note", + "report.method", + "report.samples", + "report.ids", + "report.bcf_link", + ] { + assert!( + html.contains(&html_escape::encode_text(&strings.get(key)).to_string()), + "missing {key}" + ); + } + assert!(html.contains("Geometry kernel unavailable")); + assert!(html.contains("FireRating shall be provided in Pset_WallCommon")); + assert!(html.contains("W-01")); + assert!(html.contains("540.00 EUR")); + assert!(html.contains(&strings.get("report.source.base_quantity"))); + assert!(html.contains("Clash detection is disabled.")); + assert!(html.contains(&format!("VeriModel {}", verimodel_core::VERSION))); + assert!(html.contains("abc123")); + // Self-contained: no external resources. + assert!(!html.contains("src=\"http")); + assert!(!html.contains("href=\"http")); + assert!(!html.contains("@import")); + + // Spanish labels. + let es = Strings::for_language(Language::Es); + let html_es = report::render_report_html(&report, &es); + assert!(html_es.contains(&es.get("report.summary"))); + assert_ne!(es.get("report.summary"), strings.get("report.summary")); +} + +#[test] +fn html_truncates_long_failure_lists() { + let mut report = sample_report(); + let base = report.findings[0].clone(); + report.findings = (0..report::MAX_HTML_FINDINGS + 5) + .map(|i| Finding { + global_id: Some(format!("G{i:05}")), + ..base.clone() + }) + .collect(); + let strings = Strings::for_language(Language::En); + let html = report::render_report_html(&report, &strings); + assert_eq!( + html.matches(" building > storey > space ...) + element one line per IfcProduct (properties, quantities, classification...) + geometry one line per shape the geometry kernel could build (bbox, volume, area) + ids IDS audit results (only when --ids is given) + warning non-fatal problem, plain language + end element_count and a summary + error fatal problem {code, message, hint}; the process then exits 1 + +All numeric quantities are converted to SI base units (m, m2, m3, kg). +Geometry is emitted in metres (IfcOpenShell converts world coordinates to SI). + +Usage: verimodel_extract.py --ifc model.ifc [--ids spec.ids] [--no-geometry] + [--threads N] [--mode full|inspect] [--check-env] +""" +from __future__ import annotations + +import argparse +import json +import multiprocessing +import os +import sys +import tempfile +import traceback +import zipfile + +PROTOCOL_VERSION = 1 + + +def emit(obj: dict) -> None: + sys.stdout.write(json.dumps(obj, ensure_ascii=False, allow_nan=False, separators=(",", ":"))) + sys.stdout.write("\n") + + +def fail(code: str, message: str, hint: str) -> None: + emit({"kind": "error", "code": code, "message": message, "hint": hint}) + sys.stdout.flush() + sys.exit(1) + + +def safe_float(v): + try: + x = float(v) + except (TypeError, ValueError): + return None + if x != x or x in (float("inf"), float("-inf")): + return None + return x + + +# -------------------------------------------------------------------------- +# environment +# -------------------------------------------------------------------------- + +def check_env() -> dict: + info = {"python": sys.version.split()[0], "ifcopenshell_version": None, "ifctester": False} + try: + import ifcopenshell # noqa: F401 + + info["ifcopenshell_version"] = getattr(ifcopenshell, "version", "unknown") + except Exception as e: # pragma: no cover - environment dependent + return {**info, "error": str(e)} + try: + import ifctester # noqa: F401 + + info["ifctester"] = True + except Exception: + info["ifctester"] = False + return info + + +# -------------------------------------------------------------------------- +# value conversion +# -------------------------------------------------------------------------- + +def to_json_value(v): + """Convert an IfcOpenShell property value into JSON-safe data.""" + if v is None: + return None + if isinstance(v, bool): + return v + if isinstance(v, (int, float)): + f = safe_float(v) + return f + if isinstance(v, str): + return v + if isinstance(v, (list, tuple, set)): + return [to_json_value(x) for x in v] + if isinstance(v, dict): + # complex / nested property: flatten to "a.b" keys is done by caller; keep as text here + return {str(k): to_json_value(x) for k, x in v.items() if k != "id"} + # IfcOpenShell entity instance or enum + try: + if hasattr(v, "wrappedValue"): + return to_json_value(v.wrappedValue) + except Exception: + pass + return str(v) + + +def flatten_props(props: dict) -> dict: + """Flatten nested complex properties into dotted keys, values JSON safe.""" + out = {} + for k, v in props.items(): + if k == "id": + continue + jv = to_json_value(v) + if isinstance(jv, dict): + for kk, vv in jv.items(): + if isinstance(vv, dict): + out[f"{k}.{kk}"] = json.dumps(vv, ensure_ascii=False) + else: + out[f"{k}.{kk}"] = vv + else: + out[k] = jv + return out + + +# -------------------------------------------------------------------------- +# units +# -------------------------------------------------------------------------- + +def unit_facts(f): + import ifcopenshell.util.unit as uu + + def scale(unit_type, fallback): + try: + return float(uu.calculate_unit_scale(f, unit_type)) + except Exception: + return fallback + + def name(unit_type): + try: + u = uu.get_project_unit(f, unit_type) + if u is None: + return None + try: + return uu.get_full_unit_name(u) + except Exception: + return getattr(u, "Name", None) + except Exception: + return None + + length_to_m = scale("LENGTHUNIT", 1.0) + area_to_m2 = scale("AREAUNIT", length_to_m ** 2) + volume_to_m3 = scale("VOLUMEUNIT", length_to_m ** 3) + mass_to_kg = scale("MASSUNIT", 1.0) + length_name = name("LENGTHUNIT") + imperial = False + try: + u = uu.get_project_unit(f, "LENGTHUNIT") + if u is not None and u.is_a("IfcConversionBasedUnit"): + imperial = (u.Name or "").upper() in ("INCH", "FOOT", "YARD", "MILE") + except Exception: + pass + return { + "length_unit": length_name, + "length_to_m": length_to_m, + "area_unit": name("AREAUNIT"), + "area_to_m2": area_to_m2, + "volume_unit": name("VOLUMEUNIT"), + "volume_to_m3": volume_to_m3, + "system": "imperial" if imperial else "metric", + }, mass_to_kg + + +# -------------------------------------------------------------------------- +# schema helpers +# -------------------------------------------------------------------------- + +class SchemaInfo: + def __init__(self, f): + import ifcopenshell + + self.schema_name = f.schema + self.schema = ifcopenshell.ifcopenshell_wrapper.schema_by_name(f.schema_identifier if hasattr(f, "schema_identifier") else f.schema) + self._cache = {} + + def ancestors(self, type_name: str): + if type_name in self._cache: + return self._cache[type_name] + chain = [] + try: + d = self.schema.declaration_by_name(type_name) + while d is not None: + chain.append(d.name()) + d = d.supertype() + except Exception: + chain = [type_name] + self._cache[type_name] = chain + return chain + + +def normalise_schema(name: str) -> str: + up = (name or "").upper().replace(".", "X") + base = up.split("_")[0] + if base in ("IFC4X0", "IFC4X1", "IFC4X2"): + return "IFC4" + return base + + +# -------------------------------------------------------------------------- +# spatial structure +# -------------------------------------------------------------------------- + +def is_spatial(e, schema: SchemaInfo) -> bool: + anc = schema.ancestors(e.is_a()) + return "IfcSpatialElement" in anc or "IfcSpatialStructureElement" in anc + + +def spatial_tree(f, schema: SchemaInfo, units): + import ifcopenshell.util.element as ue + + def node(e): + elev = None + if e.is_a("IfcBuildingStorey"): + elev = safe_float(getattr(e, "Elevation", None)) + if elev is not None: + elev = elev * units["length_to_m"] + kids = [] + try: + parts = ue.get_parts(e) or [] + except Exception: + parts = [] + for p in parts: + if is_spatial(p, schema): + kids.append(node(p)) + kids.sort(key=lambda n: ((n["elevation_m"] if n["elevation_m"] is not None else 0.0), n["name"] or "", n["global_id"])) + return { + "global_id": e.GlobalId, + "ifc_type": e.is_a(), + "name": e.Name, + "elevation_m": elev, + "children": kids, + } + + roots = [] + for proj in f.by_type("IfcProject"): + try: + parts = ue.get_parts(proj) or [] + except Exception: + parts = [] + for p in parts: + if is_spatial(p, schema): + roots.append(node(p)) + if not roots: + # Orphan spatial elements (no project aggregation): list them flat so checks can still see them. + for e in f.by_type("IfcSpatialStructureElement") if schema.schema_name.startswith("IFC2X3") else f.by_type("IfcSpatialElement"): + try: + if ue.get_aggregate(e) is None: + roots.append(node(e)) + except Exception: + roots.append(node(e)) + roots.sort(key=lambda n: (n["name"] or "", n["global_id"])) + return roots + + +def storey_of(e, schema: SchemaInfo): + """Walk containment / aggregation upwards until an IfcBuildingStorey is found.""" + import ifcopenshell.util.element as ue + + cur = e + for _ in range(32): + try: + parent = ue.get_container(cur) if not is_spatial(cur, schema) else ue.get_aggregate(cur) + except Exception: + parent = None + if parent is None: + try: + parent = ue.get_aggregate(cur) + except Exception: + parent = None + if parent is None: + return None + if parent.is_a("IfcBuildingStorey"): + return parent.Name + cur = parent + return None + + +# -------------------------------------------------------------------------- +# element facts +# -------------------------------------------------------------------------- + +QUANTITY_VALUE_INDEX = { + "IfcQuantityLength": ("LengthValue", "length"), + "IfcQuantityArea": ("AreaValue", "area"), + "IfcQuantityVolume": ("VolumeValue", "volume"), + "IfcQuantityCount": ("CountValue", "count"), + "IfcQuantityWeight": ("WeightValue", "mass"), + "IfcQuantityTime": ("TimeValue", "time"), + "IfcQuantityNumber": ("NumberValue", "count"), +} + + +def quantities_of(e, units, mass_to_kg): + """Quantity sets with values converted to SI, walking IfcElementQuantity directly so + each quantity's kind (length/area/volume) is known for conversion.""" + import ifcopenshell.util.element as ue + + out = {} + try: + qsets = ue.get_psets(e, qtos_only=True) + except Exception: + qsets = {} + # Map set name -> entity so we can inspect quantity kinds + for qname, qvals in qsets.items(): + qid = qvals.get("id") + qset = None + if qid is not None: + try: + qset = e.file.by_id(qid) + except Exception: + qset = None + values = {} + if qset is not None and qset.is_a("IfcElementQuantity"): + for q in qset.Quantities or []: + kind = QUANTITY_VALUE_INDEX.get(q.is_a()) + if kind is None: + continue + attr, dim = kind + raw = safe_float(getattr(q, attr, None)) + if raw is None: + continue + if dim == "length": + raw *= units["length_to_m"] + elif dim == "area": + raw *= units["area_to_m2"] + elif dim == "volume": + raw *= units["volume_to_m3"] + elif dim == "mass": + raw *= mass_to_kg + values[q.Name] = raw + else: + for k, v in qvals.items(): + if k == "id": + continue + fv = safe_float(v) + if fv is not None: + values[k] = fv + if values: + out[qname] = values + return out + + +def classifications_of(e): + import ifcopenshell.util.classification as uc + + out = [] + try: + refs = uc.get_references(e) + except Exception: + refs = [] + for r in refs: + system = None + try: + c = uc.get_classification(r) + system = getattr(c, "Name", None) if c is not None else None + except Exception: + system = None + code = getattr(r, "Identification", None) if hasattr(r, "Identification") else getattr(r, "ItemReference", None) + out.append({"system": system, "code": code, "name": getattr(r, "Name", None)}) + out.sort(key=lambda c: (c["system"] or "", c["code"] or "", c["name"] or "")) + return out + + +def element_facts(e, schema: SchemaInfo, units, mass_to_kg): + import ifcopenshell.util.element as ue + + psets = {} + try: + raw = ue.get_psets(e, psets_only=True) + except Exception as ex: + raw = {} + for name, props in raw.items(): + psets[name] = flatten_props(props) + container = None + try: + c = ue.get_container(e) if not is_spatial(e, schema) else ue.get_aggregate(e) + except Exception: + c = None + if c is not None: + container = {"global_id": c.GlobalId, "ifc_type": c.is_a(), "name": c.Name} + materials = [] + try: + for m in ue.get_materials(e) or []: + n = getattr(m, "Name", None) + if n: + materials.append(n) + except Exception: + pass + materials = sorted(set(materials)) + type_name = None + try: + t = ue.get_type(e) + type_name = getattr(t, "Name", None) if t is not None else None + except Exception: + pass + predefined = None + try: + predefined = ue.get_predefined_type(e) + except Exception: + pass + return { + "kind": "element", + "global_id": e.GlobalId if e.GlobalId is not None else "", + "step_id": e.id(), + "ifc_type": e.is_a(), + "ancestors": schema.ancestors(e.is_a()), + "predefined_type": predefined, + "name": e.Name, + "description": getattr(e, "Description", None), + "object_type": getattr(e, "ObjectType", None), + "tag": getattr(e, "Tag", None), + "type_name": type_name, + "storey": storey_of(e, schema), + "container": container, + "psets": psets, + "quantities": quantities_of(e, units, mass_to_kg), + "classifications": classifications_of(e), + "materials": materials, + "has_representation": getattr(e, "Representation", None) is not None, + } + + +# -------------------------------------------------------------------------- +# geometry +# -------------------------------------------------------------------------- + +def stream_geometry(f, threads: int): + import ifcopenshell.geom + import ifcopenshell.util.shape as us + + settings = ifcopenshell.geom.settings() + settings.set("use-world-coords", True) + try: + settings.set("weld-vertices", True) + except Exception: + pass + it = ifcopenshell.geom.iterator(settings, f, max(1, threads)) + if not it.initialize(): + return 0 + n = 0 + while True: + try: + shape = it.get() + g = shape.geometry + verts = g.verts + faces = g.faces + tri = len(faces) // 3 + if len(verts) >= 3: + xs, ys, zs = verts[0::3], verts[1::3], verts[2::3] + bmin = [min(xs), min(ys), min(zs)] + bmax = [max(xs), max(ys), max(zs)] + else: + bmin = [0.0, 0.0, 0.0] + bmax = [0.0, 0.0, 0.0] + vol = None + area = None + if tri > 0: + try: + vol = safe_float(abs(us.get_volume(g))) + except Exception: + vol = None + try: + area = safe_float(us.get_area(g)) + except Exception: + area = None + emit({ + "kind": "geometry", + "global_id": shape.guid, + "step_id": int(shape.id), + "bbox_min": bmin, + "bbox_max": bmax, + "volume_m3": vol, + "area_m2": area, + "triangle_count": tri, + }) + n += 1 + except Exception as ex: + emit({"kind": "warning", "message": f"geometry: {ex}"}) + if not it.next(): + break + return n + + +# -------------------------------------------------------------------------- +# IDS +# -------------------------------------------------------------------------- + +def run_ids(f, ids_path: str) -> dict: + import ifctester.ids + + spec = ifctester.ids.open(ids_path) + spec.validate(f) + specs_out = [] + for s in spec.specifications: + max_occ = getattr(s, "maxOccurs", None) + min_occ = getattr(s, "minOccurs", None) + if max_occ == 0: + cardinality = "prohibited" + elif min_occ in (0, "0"): + cardinality = "optional" + else: + cardinality = "required" + applicability = [] + for a in s.applicability: + try: + applicability.append(a.to_string("applicability")) + except Exception: + applicability.append(type(a).__name__) + reqs = [] + for r in s.requirements: + try: + desc = r.to_string("requirement", s, r) + except Exception: + desc = type(r).__name__ + failed = [] + for fl in getattr(r, "failures", []) or []: + el = fl.get("element") + failed.append({ + "global_id": getattr(el, "GlobalId", "") or "", + "ifc_type": el.is_a() if el is not None else "", + "name": getattr(el, "Name", None), + "reason": str(fl.get("reason", "")), + }) + failed.sort(key=lambda x: (x["global_id"], x["reason"])) + reqs.append({ + "description": desc, + "facet": type(r).__name__.lower(), + "passed": bool(r.status) if r.status is not None else True, + "failed_entities": failed, + }) + specs_out.append({ + "name": s.name or "", + "description": s.description, + "instructions": s.instructions, + "applicability": applicability, + "cardinality": cardinality, + "applicable_count": len(getattr(s, "applicable_entities", []) or []), + "passed": bool(s.status) if s.status is not None else True, + "requirements": reqs, + }) + return {"kind": "ids", "ids_file": os.path.basename(ids_path), "title": (spec.info or {}).get("title"), "specifications": specs_out} + + +# -------------------------------------------------------------------------- +# main +# -------------------------------------------------------------------------- + +def open_ifc(path: str): + import ifcopenshell + + if path.lower().endswith(".ifczip") or zipfile.is_zipfile(path): + with zipfile.ZipFile(path) as z: + names = [n for n in z.namelist() if n.lower().endswith(".ifc")] + if not names: + fail("ifczip_empty", "The .ifczip archive does not contain an .ifc file.", "Check the archive content; it must contain exactly one .ifc file.") + tmpdir = tempfile.mkdtemp(prefix="verimodel_") + extracted = z.extract(names[0], tmpdir) + return ifcopenshell.open(extracted) + return ifcopenshell.open(path) + + +def main() -> int: + ap = argparse.ArgumentParser(description="VeriModel IFC extractor (IfcOpenShell bridge)") + ap.add_argument("--ifc") + ap.add_argument("--ids") + ap.add_argument("--no-geometry", action="store_true") + ap.add_argument("--threads", type=int, default=0) + ap.add_argument("--mode", choices=["full", "inspect"], default="full") + ap.add_argument("--check-env", action="store_true") + args = ap.parse_args() + + if args.check_env: + emit({"kind": "env", "protocol": PROTOCOL_VERSION, **check_env()}) + return 0 + if not args.ifc: + fail("no_input", "No IFC file given.", "Pass --ifc .") + if not os.path.isfile(args.ifc): + fail("not_found", f"The file '{args.ifc}' does not exist.", "Check the path and that the file was not moved.") + + try: + import ifcopenshell # noqa: F401 + except Exception as ex: + fail("ifcopenshell_missing", f"IfcOpenShell is not available in this Python ({sys.executable}): {ex}", "Install it with: pip install ifcopenshell ifctester") + + try: + f = open_ifc(args.ifc) + except Exception as ex: + fail("parse_failed", f"The file could not be parsed as IFC: {ex}", "Check that the file is a STEP (.ifc) file, is not truncated, and was exported completely.") + + try: + schema = SchemaInfo(f) + except Exception as ex: + fail("schema_unknown", f"The IFC schema of the file is not supported: {ex}", "VeriModel supports IFC2X3, IFC4 and IFC4X3.") + + units, mass_to_kg = unit_facts(f) + h = f.header + try: + mvd = "; ".join(h.file_description.description or []) or None + except Exception: + mvd = None + try: + app = h.file_name.originating_system or h.file_name.preprocessor_version or None + except Exception: + app = None + projects = f.by_type("IfcProject") + geometry_available = not args.no_geometry and args.mode == "full" + if geometry_available: + try: + import ifcopenshell.geom # noqa: F401 + except Exception: + geometry_available = False + emit({"kind": "warning", "message": "The geometry kernel of IfcOpenShell is not available; geometry checks will be skipped."}) + + emit({ + "kind": "header", + "protocol": PROTOCOL_VERSION, + "schema": normalise_schema(f.schema), + "schema_raw": f.schema, + "mvd": mvd, + "authoring_tool": app, + "project_name": projects[0].Name if projects else None, + "units": units, + "file_size_bytes": os.path.getsize(args.ifc), + "ifcopenshell_version": getattr(sys.modules["ifcopenshell"], "version", "unknown"), + "geometry_available": geometry_available, + }) + emit({"kind": "spatial", "tree": spatial_tree(f, schema, units)}) + + count = 0 + products = f.by_type("IfcProduct") + for e in products: + try: + emit(element_facts(e, schema, units, mass_to_kg)) + count += 1 + except Exception as ex: + emit({"kind": "warning", "message": f"element #{e.id()} ({e.is_a()}) could not be read: {ex}"}) + sys.stdout.flush() + + if args.mode == "full": + if geometry_available: + try: + threads = args.threads or multiprocessing.cpu_count() + stream_geometry(f, threads) + except Exception as ex: + emit({"kind": "warning", "message": f"The geometry kernel failed: {ex}. Geometry checks will be skipped."}) + emit({"kind": "geometry_unavailable"}) + if args.ids: + if not os.path.isfile(args.ids): + fail("ids_not_found", f"The IDS file '{args.ids}' does not exist.", "Check the path of the IDS file.") + try: + emit(run_ids(f, args.ids)) + except ImportError as ex: + fail("ifctester_missing", f"The IDS engine (ifctester) is not installed: {ex}", "Install it with: pip install ifctester") + except Exception as ex: + fail("ids_failed", f"The IDS file could not be processed: {ex}", "Check that the IDS file follows the buildingSMART IDS 1.0 schema.") + + emit({"kind": "end", "element_count": count}) + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main()) + except SystemExit: + raise + except Exception as ex: # last resort: never a bare traceback on stdout + sys.stderr.write(traceback.format_exc()) + fail("internal", f"Unexpected reader failure: {ex}", "See the log for details and report this as a bug.") diff --git a/crates/ifc_reader/src/lib.rs b/crates/ifc_reader/src/lib.rs new file mode 100644 index 0000000..6f8655f --- /dev/null +++ b/crates/ifc_reader/src/lib.rs @@ -0,0 +1,738 @@ +//! # VeriModel IFC reader +//! +//! The ONLY crate that touches IFC files. It drives IfcOpenShell (Python) in a +//! subprocess through a bundled extractor script and turns its NDJSON stream +//! of facts into a [`verimodel_core::Model`]. It never decides pass/fail. +//! +//! ## Why a subprocess bridge +//! IfcOpenShell's Python API is the mature, complete surface (parsing for every +//! schema, geometry kernel, IDS via IfcTester, unit handling). Embedding a +//! Python interpreter would tie the binary to one Python build and make +//! installers fragile; a subprocess keeps VeriModel a plain Rust binary that +//! only needs `python3` with `ifcopenshell` (+ `ifctester`) on the machine. +//! The script is embedded in the binary and written to a temporary file at +//! run time, so there is nothing to install besides Python packages. +//! +//! ## Protocol +//! One JSON object per line (see `python/verimodel_extract.py`): `header`, +//! `spatial`, `element`*, `geometry`*, `ids`?, `warning`*, `end` | `error`. +//! Elements are streamed and consumed line by line. + +use std::collections::BTreeMap; +use std::io::{BufRead, BufReader}; +use std::path::{Path, PathBuf}; +use std::process::{Command, Stdio}; + +use serde::Deserialize; +use verimodel_core::model::{ + Classification, Element, Geometry, IdsResults, Model, ModelInfo, ModelUnits, PropValue, + SpatialNode, SpatialRef, UnitSystem, +}; + +/// The bundled extractor script. +pub const EXTRACT_SCRIPT: &str = include_str!("../python/verimodel_extract.py"); + +/// Protocol version the Rust side understands. +pub const PROTOCOL_VERSION: u32 = 1; + +/// Options for [`read_model`]. +#[derive(Debug, Clone)] +pub struct ReadOptions { + /// Optional IDS file to audit with IfcTester. + pub ids_path: Option, + /// Run the geometry kernel (bounding boxes, volumes, areas). Slower, needed for geometry checks and QTO fallback. + pub geometry: bool, + /// Explicit Python interpreter; `None` = auto-detect (`VERIMODEL_PYTHON`, then `python3`, `python`, `py -3`). + pub python: Option, + /// Threads for the geometry kernel; 0 = all cores. + pub threads: usize, +} + +impl Default for ReadOptions { + fn default() -> Self { + Self { + ids_path: None, + geometry: true, + python: None, + threads: 0, + } + } +} + +/// Plain-language reader error. `message` and `hint` are shown to the user as-is. +#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub struct ReaderError { + pub code: String, + pub message: String, + pub hint: String, +} + +impl ReaderError { + fn new(code: &str, message: impl Into, hint: impl Into) -> Self { + Self { + code: code.into(), + message: message.into(), + hint: hint.into(), + } + } +} + +impl std::fmt::Display for ReaderError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.message)?; + if !self.hint.is_empty() { + write!(f, " ({})", self.hint)?; + } + Ok(()) + } +} + +impl std::error::Error for ReaderError {} + +/// What `check_environment` found. +#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub struct EnvironmentInfo { + /// Interpreter path that works. + pub python: String, + pub python_version: String, + pub ifcopenshell_version: String, + pub ifctester: bool, +} + +const INSTALL_HINT: &str = "Install Python 3.9+ and run: pip install ifcopenshell ifctester (or set VERIMODEL_PYTHON to an interpreter that has them)"; + +// --------------------------------------------------------------------------- +// Python discovery +// --------------------------------------------------------------------------- + +/// Candidate interpreters, in order. +fn python_candidates(explicit: Option<&Path>) -> Vec<(String, Vec)> { + let mut v = Vec::new(); + if let Some(p) = explicit { + v.push((p.display().to_string(), vec![])); + } + if let Ok(p) = std::env::var("VERIMODEL_PYTHON") { + if !p.trim().is_empty() { + v.push((p, vec![])); + } + } + v.push(("python3".into(), vec![])); + v.push(("python".into(), vec![])); + if cfg!(windows) { + v.push(("py".into(), vec!["-3".into()])); + } + v +} + +/// Write the embedded script to a temp file (cached per process). +fn script_path() -> Result { + let dir = std::env::temp_dir().join(format!("verimodel-reader-{}", verimodel_core::VERSION)); + std::fs::create_dir_all(&dir).map_err(|e| { + ReaderError::new( + "io", + format!("cannot create temp dir {}: {e}", dir.display()), + "", + ) + })?; + let path = dir.join("verimodel_extract.py"); + let needs_write = match std::fs::read_to_string(&path) { + Ok(existing) => existing != EXTRACT_SCRIPT, + Err(_) => true, + }; + if needs_write { + std::fs::write(&path, EXTRACT_SCRIPT).map_err(|e| { + ReaderError::new("io", format!("cannot write {}: {e}", path.display()), "") + })?; + } + Ok(path) +} + +#[derive(Deserialize)] +struct EnvLine { + #[serde(default)] + python: Option, + #[serde(default)] + ifcopenshell_version: Option, + #[serde(default)] + ifctester: bool, + #[serde(default)] + error: Option, + #[serde(default)] + protocol: u32, +} + +/// Find a Python with IfcOpenShell. Cheap enough to call before every run. +pub fn check_environment_with(explicit: Option<&Path>) -> Result { + let script = script_path()?; + let mut last_err = String::new(); + for (exe, pre) in python_candidates(explicit) { + let out = Command::new(&exe) + .args(&pre) + .arg("-I") + .arg(&script) + .arg("--check-env") + .stdin(Stdio::null()) + .output(); + let out = match out { + Ok(o) => o, + Err(e) => { + last_err = format!("{exe}: {e}"); + continue; + } + }; + let text = String::from_utf8_lossy(&out.stdout); + let Some(line) = text.lines().find(|l| l.contains("\"kind\":\"env\"")) else { + last_err = format!( + "{exe}: unexpected output: {}", + String::from_utf8_lossy(&out.stderr).trim() + ); + continue; + }; + let env: EnvLine = match serde_json::from_str(line) { + Ok(v) => v, + Err(e) => { + last_err = format!("{exe}: {e}"); + continue; + } + }; + if env.protocol != PROTOCOL_VERSION { + last_err = format!( + "{exe}: extractor protocol {} != {}", + env.protocol, PROTOCOL_VERSION + ); + continue; + } + match (env.ifcopenshell_version, env.error) { + (Some(v), None) => { + return Ok(EnvironmentInfo { + python: exe, + python_version: env.python.unwrap_or_default(), + ifcopenshell_version: v, + ifctester: env.ifctester, + }) + } + (_, Some(e)) => last_err = format!("{exe}: {e}"), + _ => last_err = format!("{exe}: IfcOpenShell not importable"), + } + } + Err(ReaderError::new( + "python_missing", + format!("No Python interpreter with IfcOpenShell was found ({last_err})."), + INSTALL_HINT, + )) +} + +/// Auto-detect the environment. +pub fn check_environment() -> Result { + check_environment_with(None) +} + +// --------------------------------------------------------------------------- +// NDJSON line types +// --------------------------------------------------------------------------- + +#[derive(Deserialize)] +struct HeaderLine { + #[serde(default)] + protocol: u32, + schema: String, + #[serde(default)] + schema_raw: Option, + #[serde(default)] + mvd: Option, + #[serde(default)] + authoring_tool: Option, + #[serde(default)] + project_name: Option, + #[serde(default)] + units: UnitsLine, + #[serde(default)] + file_size_bytes: u64, + #[serde(default)] + geometry_available: bool, +} + +#[derive(Deserialize, Default)] +struct UnitsLine { + #[serde(default)] + length_unit: Option, + #[serde(default = "one")] + length_to_m: f64, + #[serde(default)] + area_unit: Option, + #[serde(default = "one")] + area_to_m2: f64, + #[serde(default)] + volume_unit: Option, + #[serde(default = "one")] + volume_to_m3: f64, + #[serde(default)] + system: Option, +} + +fn one() -> f64 { + 1.0 +} + +#[derive(Deserialize)] +struct SpatialLine { + #[serde(default)] + tree: Vec, +} + +#[derive(Deserialize)] +struct ElementLine { + #[serde(default)] + global_id: String, + #[serde(default)] + step_id: i64, + ifc_type: String, + #[serde(default)] + ancestors: Vec, + #[serde(default)] + predefined_type: Option, + #[serde(default)] + name: Option, + #[serde(default)] + description: Option, + #[serde(default)] + object_type: Option, + #[serde(default)] + tag: Option, + #[serde(default)] + type_name: Option, + #[serde(default)] + storey: Option, + #[serde(default)] + container: Option, + #[serde(default)] + psets: BTreeMap>, + #[serde(default)] + quantities: BTreeMap>, + #[serde(default)] + classifications: Vec, + #[serde(default)] + materials: Vec, + #[serde(default)] + has_representation: bool, +} + +#[derive(Deserialize)] +struct GeometryLine { + #[serde(default)] + global_id: String, + /// STEP id: geometry is merged by step id, never by GlobalId, because + /// duplicated GlobalIds are exactly one of the defects we must detect. + #[serde(default)] + step_id: i64, + bbox_min: [f64; 3], + bbox_max: [f64; 3], + #[serde(default)] + volume_m3: Option, + #[serde(default)] + area_m2: Option, + #[serde(default)] + triangle_count: u64, +} + +#[derive(Deserialize)] +struct WarningLine { + message: String, +} + +#[derive(Deserialize)] +struct ErrorLine { + code: String, + message: String, + #[serde(default)] + hint: String, +} + +#[derive(Deserialize)] +struct KindOnly { + kind: String, +} + +fn json_to_prop(v: serde_json::Value) -> PropValue { + match v { + serde_json::Value::Null => PropValue::Null, + serde_json::Value::Bool(b) => PropValue::Bool(b), + serde_json::Value::Number(n) => PropValue::Number(n.as_f64().unwrap_or(0.0)), + serde_json::Value::String(s) => PropValue::Text(s), + serde_json::Value::Array(a) => PropValue::List(a.into_iter().map(json_to_prop).collect()), + serde_json::Value::Object(o) => PropValue::Text(serde_json::Value::Object(o).to_string()), + } +} + +impl From for Element { + fn from(l: ElementLine) -> Self { + Element { + global_id: l.global_id, + step_id: l.step_id, + ifc_type: l.ifc_type, + ancestors: l.ancestors, + predefined_type: l.predefined_type, + name: l.name, + description: l.description, + object_type: l.object_type, + tag: l.tag, + type_name: l.type_name, + storey: l.storey, + container: l.container, + psets: l + .psets + .into_iter() + .map(|(k, props)| { + ( + k, + props + .into_iter() + .map(|(pk, pv)| (pk, json_to_prop(pv))) + .collect(), + ) + }) + .collect(), + quantities: l.quantities, + classifications: l.classifications, + materials: l.materials, + has_representation: l.has_representation, + geometry: None, + } + } +} + +// --------------------------------------------------------------------------- +// Reading +// --------------------------------------------------------------------------- + +fn spawn_extractor( + ifc_path: &Path, + opts: &ReadOptions, + mode: &str, +) -> Result<(std::process::Child, String), ReaderError> { + if !ifc_path.is_file() { + return Err(ReaderError::new( + "not_found", + format!("The file '{}' does not exist.", ifc_path.display()), + "Check the path and that the file was not moved.", + )); + } + let env = check_environment_with(opts.python.as_deref())?; + let script = script_path()?; + let mut cmd = Command::new(&env.python); + if env.python == "py" { + cmd.arg("-3"); + } + cmd.arg("-I") + .arg(&script) + .arg("--ifc") + .arg(ifc_path) + .arg("--mode") + .arg(mode); + if let Some(ids) = &opts.ids_path { + cmd.arg("--ids").arg(ids); + } + if !opts.geometry { + cmd.arg("--no-geometry"); + } + if opts.threads > 0 { + cmd.arg("--threads").arg(opts.threads.to_string()); + } + cmd.stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + let child = cmd.spawn().map_err(|e| { + ReaderError::new( + "spawn_failed", + format!("Cannot start the IFC reader ({}): {e}", env.python), + INSTALL_HINT, + ) + })?; + Ok((child, env.python)) +} + +/// Read a model fully (elements, geometry, IDS). +pub fn read_model(ifc_path: &Path, opts: &ReadOptions) -> Result { + read_with_mode(ifc_path, opts, "full") +} + +/// Quick inspection for the file card: no geometry, no IDS. +pub fn inspect(ifc_path: &Path) -> Result { + let opts = ReadOptions { + geometry: false, + ..Default::default() + }; + Ok(read_with_mode(ifc_path, &opts, "inspect")?.info) +} + +fn read_with_mode(ifc_path: &Path, opts: &ReadOptions, mode: &str) -> Result { + if !ifc_path.is_file() { + return Err(ReaderError::new( + "not_found", + format!("The file '{}' does not exist.", ifc_path.display()), + "Check the path and that the file was not moved.", + )); + } + let sha = verimodel_core::hash::sha256_file(ifc_path).map_err(|e| { + ReaderError::new( + "io", + format!("Cannot read '{}': {e}", ifc_path.display()), + "", + ) + })?; + let (mut child, _python) = spawn_extractor(ifc_path, opts, mode)?; + let stdout = child.stdout.take().expect("piped stdout"); + let stderr = child.stderr.take().expect("piped stderr"); + let stderr_thread = std::thread::spawn(move || { + let mut s = String::new(); + let _ = std::io::Read::read_to_string(&mut BufReader::new(stderr), &mut s); + s + }); + + let mut model = Model::default(); + model.info.file_name = ifc_path + .file_name() + .map(|s| s.to_string_lossy().to_string()) + .unwrap_or_default(); + model.info.sha256 = sha; + let mut geometry: BTreeMap = BTreeMap::new(); + let mut got_header = false; + let mut got_end = false; + let mut geometry_lines = 0usize; + + for line in BufReader::new(stdout).lines() { + let line = line.map_err(|e| { + ReaderError::new("io", format!("Reader output could not be read: {e}"), "") + })?; + if line.trim().is_empty() { + continue; + } + let kind: KindOnly = match serde_json::from_str(&line) { + Ok(k) => k, + Err(_) => { + model.info.reader_warnings.push(format!( + "Unreadable line from the IFC reader: {}", + truncate(&line, 120) + )); + continue; + } + }; + match kind.kind.as_str() { + "header" => { + let h: HeaderLine = parse(&line)?; + if h.protocol != PROTOCOL_VERSION { + return Err(ReaderError::new( + "protocol", + format!( + "IFC reader protocol {} is not supported (expected {}).", + h.protocol, PROTOCOL_VERSION + ), + "Reinstall VeriModel.", + )); + } + model.info.schema = h.schema; + model.info.mvd = h.mvd; + model.info.authoring_tool = h.authoring_tool; + model.info.project_name = h.project_name; + model.info.file_size_bytes = h.file_size_bytes; + model.info.geometry_available = h.geometry_available; + model.info.units = ModelUnits { + length_unit: h.units.length_unit, + length_to_m: h.units.length_to_m, + area_unit: h.units.area_unit, + area_to_m2: h.units.area_to_m2, + volume_unit: h.units.volume_unit, + volume_to_m3: h.units.volume_to_m3, + system: if h.units.system.as_deref() == Some("imperial") { + UnitSystem::Imperial + } else { + UnitSystem::Metric + }, + }; + if let Some(raw) = h.schema_raw { + if raw != model.info.schema { + log::debug!("schema {raw} normalised to {}", model.info.schema); + } + } + got_header = true; + } + "spatial" => { + let s: SpatialLine = parse(&line)?; + model.info.spatial_tree = s.tree; + } + "element" => { + let e: ElementLine = parse(&line)?; + model.elements.push(e.into()); + } + "geometry" => { + let g: GeometryLine = parse(&line)?; + geometry_lines += 1; + let _ = &g.global_id; + geometry.insert( + g.step_id, + Geometry { + bbox_min: g.bbox_min, + bbox_max: g.bbox_max, + volume_m3: g.volume_m3, + area_m2: g.area_m2, + triangle_count: g.triangle_count, + }, + ); + } + "geometry_unavailable" => model.info.geometry_available = false, + "ids" => { + let r: IdsResults = parse(&line)?; + model.ids_results = Some(r); + } + "warning" => { + let w: WarningLine = parse(&line)?; + model.info.reader_warnings.push(w.message); + } + "end" => got_end = true, + "error" => { + let e: ErrorLine = parse(&line)?; + let _ = child.wait(); + return Err(ReaderError { + code: e.code, + message: e.message, + hint: e.hint, + }); + } + other => model + .info + .reader_warnings + .push(format!("Unknown reader message '{other}' ignored")), + } + } + let status = child + .wait() + .map_err(|e| ReaderError::new("io", format!("IFC reader process failed: {e}"), ""))?; + let stderr_text = stderr_thread.join().unwrap_or_default(); + if !got_header { + return Err(ReaderError::new( + "no_output", + "The IFC reader produced no output.".to_string(), + format!( + "{} Details: {}", + INSTALL_HINT, + truncate(stderr_text.trim(), 400) + ), + )); + } + if !got_end || !status.success() { + return Err(ReaderError::new( + "reader_crashed", + "The IFC reader stopped before finishing the file.".to_string(), + format!( + "The file may be corrupt or too large for the available memory. Details: {}", + truncate(stderr_text.trim(), 400) + ), + )); + } + if !stderr_text.trim().is_empty() { + log::debug!("reader stderr: {}", stderr_text.trim()); + } + + // Attach geometry, derive counts, disciplines, storeys. + for e in &mut model.elements { + if let Some(g) = geometry.remove(&e.step_id) { + e.geometry = Some(g); + } + } + if model.info.geometry_available + && geometry_lines == 0 + && model.elements.iter().any(|e| e.has_representation) + && mode == "full" + { + model + .info + .reader_warnings + .push("The geometry kernel produced no shapes; geometry checks were skipped.".into()); + model.info.geometry_available = false; + } + model.sort_elements(); + model.info.element_count = model.elements.len(); + let mut counts: BTreeMap = BTreeMap::new(); + for e in &model.elements { + *counts.entry(e.ifc_type.clone()).or_default() += 1; + } + model.info.type_counts = counts; + model.info.disciplines = verimodel_core::disciplines::detect(&model.elements); + model.info.storeys = storeys_in_order(&model.info.spatial_tree); + Ok(model) +} + +fn parse<'a, T: Deserialize<'a>>(line: &'a str) -> Result { + serde_json::from_str(line).map_err(|e| { + ReaderError::new( + "protocol", + format!("Unexpected data from the IFC reader: {e}"), + "Reinstall VeriModel or report this as a bug.", + ) + }) +} + +fn truncate(s: &str, n: usize) -> String { + if s.chars().count() <= n { + s.to_string() + } else { + format!("{}…", s.chars().take(n).collect::()) + } +} + +/// Storey names in tree order (elevation order within a building). +fn storeys_in_order(tree: &[SpatialNode]) -> Vec { + let mut out = Vec::new(); + for root in tree { + for n in root.walk() { + if n.ifc_type.eq_ignore_ascii_case("IfcBuildingStorey") { + let name = n.name.clone().unwrap_or_else(|| n.global_id.clone()); + if !out.contains(&name) { + out.push(name); + } + } + } + } + out +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn element_line_maps_into_element() { + let line = r#"{"kind":"element","global_id":"0fqX614OH1YO1Njdxms2$Q","step_id":5,"ifc_type":"IfcWall","ancestors":["IfcWall","IfcElement"],"name":"W","psets":{"Pset_WallCommon":{"FireRating":"REI60","IsExternal":true,"X":null,"N":2.5}},"quantities":{"Qto_WallBaseQuantities":{"NetVolume":1.5}},"has_representation":true}"#; + let e: Element = serde_json::from_str::(line).unwrap().into(); + assert_eq!(e.ifc_type, "IfcWall"); + assert_eq!( + e.psets["Pset_WallCommon"]["FireRating"], + PropValue::Text("REI60".into()) + ); + assert_eq!( + e.psets["Pset_WallCommon"]["IsExternal"], + PropValue::Bool(true) + ); + assert_eq!(e.psets["Pset_WallCommon"]["X"], PropValue::Null); + assert_eq!(e.quantity("NetVolume"), Some(1.5)); + assert!(e.is_a("IfcElement")); + } + + #[test] + fn script_is_embedded_and_cached() { + assert!(EXTRACT_SCRIPT.contains("PROTOCOL_VERSION = 1")); + let p = script_path().unwrap(); + assert!(p.is_file()); + } + + #[test] + fn missing_file_is_a_plain_error() { + let err = read_model( + Path::new("/definitely/not/here.ifc"), + &ReadOptions::default(), + ) + .unwrap_err(); + assert_eq!(err.code, "not_found"); + assert!(err.message.contains("does not exist")); + } +} diff --git a/crates/ifc_reader/tests/fixtures.rs b/crates/ifc_reader/tests/fixtures.rs new file mode 100644 index 0000000..5106696 --- /dev/null +++ b/crates/ifc_reader/tests/fixtures.rs @@ -0,0 +1,142 @@ +//! Integration tests against the public buildingSMART fixtures. They need a +//! Python with IfcOpenShell (see README); set VERIMODEL_SKIP_IFC_TESTS=1 to +//! skip explicitly (never silently). + +use std::path::PathBuf; + +use verimodel_ifc_reader::{inspect, read_model, ReadOptions}; + +fn fixture(name: &str) -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../../tests/fixtures") + .join(name) +} + +fn skip() -> bool { + if std::env::var("VERIMODEL_SKIP_IFC_TESTS").is_ok() { + eprintln!("VERIMODEL_SKIP_IFC_TESTS set: skipping IFC reader tests"); + return true; + } + false +} + +#[test] +fn reads_ifc2x3_with_units_converted_to_metres() { + if skip() { + return; + } + let m = read_model( + &fixture("bsi_ifc2x3_building_architecture.ifc"), + &ReadOptions::default(), + ) + .unwrap(); + assert_eq!(m.info.schema, "IFC2X3"); + assert_eq!(m.info.units.length_unit.as_deref(), Some("MILLIMETRE")); + assert!((m.info.units.length_to_m - 0.001).abs() < 1e-12); + assert_eq!(m.elements.len(), 19); + assert_eq!(m.info.storeys, vec!["00 groundfloor"]); + assert!(m.info.disciplines.contains(&"architecture".to_string())); + let wall = m.elements.iter().find(|e| e.ifc_type == "IfcWall").unwrap(); + // 200 mm in the file -> 0.2 m + assert!( + (wall.quantity("Width").unwrap() - 0.2).abs() < 1e-9, + "{:?}", + wall.quantities + ); + assert_eq!(wall.storey.as_deref(), Some("00 groundfloor")); + assert!( + wall.geometry.is_some(), + "geometry kernel should produce a shape for the wall" + ); + assert!(m.info.geometry_available); + assert!(wall.is_a("IfcElement")); +} + +#[test] +fn reads_ifc4_and_ifc4x3() { + if skip() { + return; + } + let s = read_model( + &fixture("bsi_ifc4_building_structural.ifc"), + &ReadOptions::default(), + ) + .unwrap(); + assert_eq!(s.info.schema, "IFC4"); + assert_eq!(s.elements.len(), 21); + assert!(s.info.disciplines.contains(&"structure".to_string())); + let b = read_model( + &fixture("bsi_ifc4x3_infra_bridge.ifc"), + &ReadOptions::default(), + ) + .unwrap(); + assert_eq!(b.info.schema, "IFC4X3"); + assert_eq!(b.elements.len(), 77); + assert!(b.info.storeys.is_empty(), "bridge has no building storeys"); + assert!(b.info.disciplines.contains(&"civil".to_string())); + assert!(b + .info + .spatial_tree + .iter() + .flat_map(|r| r.walk()) + .any(|n| n.ifc_type == "IfcBridge")); +} + +#[test] +fn inspect_is_fast_and_has_no_geometry() { + if skip() { + return; + } + let info = inspect(&fixture("bsi_ifc4_building_hvac.ifc")).unwrap(); + assert_eq!(info.schema, "IFC4"); + assert_eq!(info.element_count, 10); + assert!(!info.geometry_available); + assert!(info.disciplines.contains(&"mep".to_string())); + assert_eq!(info.sha256.len(), 64); +} + +#[test] +fn ids_results_are_returned_as_facts() { + if skip() { + return; + } + let dir = tempfile::tempdir().unwrap(); + let ids = dir.path().join("t.ids"); + std::fs::write(&ids, r#" + + Reader test + + + IFCWALL + Pset_WallCommonFireRating + + +"#).unwrap(); + let opts = ReadOptions { + ids_path: Some(ids), + geometry: false, + ..Default::default() + }; + let m = read_model(&fixture("bsi_ifc2x3_building_architecture.ifc"), &opts).unwrap(); + let r = m.ids_results.expect("ids results"); + assert_eq!(r.title.as_deref(), Some("Reader test")); + assert_eq!(r.specifications.len(), 1); + let s = &r.specifications[0]; + assert_eq!(s.applicable_count, 4); + assert!(!s.passed); + assert_eq!(s.requirements[0].failed_entities.len(), 4); + assert!(s.requirements[0].description.contains("FireRating")); +} + +#[test] +fn garbage_file_gives_plain_language_error() { + if skip() { + return; + } + let dir = tempfile::tempdir().unwrap(); + let p = dir.path().join("bad.ifc"); + std::fs::write(&p, "this is not an ifc file").unwrap(); + let err = read_model(&p, &ReadOptions::default()).unwrap_err(); + assert_eq!(err.code, "parse_failed", "{err:?}"); + assert!(!err.hint.is_empty()); +} diff --git a/docs/ASSUMPTIONS.md b/docs/ASSUMPTIONS.md new file mode 100644 index 0000000..8f8eacf --- /dev/null +++ b/docs/ASSUMPTIONS.md @@ -0,0 +1,161 @@ +# Assumptions and interpretations + +This is a starter list of the interpretations VeriModel makes when it reads +IFC files, checks them and counts quantities. Each entry says what the code does +and where. It records behaviour, not an opinion about the standard. When the +code changes, update the entry in the same change. + +Standards referenced: IFC (IFC2X3, IFC4, IFC4X3), IDS 1.0, BCF 2.1 and 3.0, +and the buildingSMART property set names (for example `Pset_WallCommon`). + +## Units + +1. **Internal units are SI.** Lengths are in metres, areas in square metres, + volumes in cubic metres and weights in kilograms, whatever the file declares. + The reader converts from the units in `IfcUnitAssignment` and keeps the + original units in `ModelUnits` so that a display can convert back. + (`crates/core/src/model.rs`, module documentation and `ModelUnits`.) +2. **Display units are not wired yet.** `project.units` is stored but no + report uses it; reports show SI values. (See [CONFIG.md](CONFIG.md).) + +## Schema + +3. **Schema names are normalised before comparison.** The comparison is + case-insensitive and ignores anything after an underscore, so + `IFC4X3_ADD2` is `IFC4X3`. A dot is read as `X`, so `IFC4.3` is `IFC4X3`. + `IFC4X0`, `IFC4X1` and `IFC4X2` are all treated as `IFC4`. + (`normalise_schema` in `crates/core/src/rules/checks.rs`, with its unit tests.) +4. **IFC4X1 and IFC4X2 are treated as IFC4.** A project that lists `IFC4` accepts + a file written in IFC4X1 or IFC4X2. This is a simplification made for the + gate, not a statement that the schemas are identical. +5. **Empty `project.ifc_versions` accepts any schema.** (Rule SCH-001.) + +## Identity + +6. **A GlobalId is valid when it is syntactically valid.** It must be 22 + characters, every character must come from the IFC base64 alphabet + (`0-9`, `A-Z`, `a-z`, `_`, `$`), and the first character must be `0` to `3`. + The check does not decode the identifier or confirm that it was generated + from a UUID. (`is_valid_global_id`, rule ID-002.) +7. **Duplicate GlobalIds are compared across the whole model**, including + spatial elements. Each element that shares an id is reported. + (Rule ID-001.) +8. **Empty names are not compared** for duplicate names. By default, names must + be unique within the same type and storey. (`unique_name`, rule ID-003.) + +## Spatial structure + +9. **The spatial structure is checked by type name.** A requirement such as + "a site must exist" is satisfied when the spatial tree contains a node of + that IFC type, compared without regard to case. (`spatial_hierarchy`.) +10. **Distance from origin is measured to the bounding-box centre**, not to the + element's placement point. (`Geometry::distance_from_origin_m`.) +11. **A model-level rule counts its scope.** A rule about the whole model (for + example a required spatial structure) counts as the number of elements in its + scope, or as one when the scope is empty. (`checked` in `engine::evaluate`.) + +## Geometry and quantities + +12. **Base quantities come before geometry.** For each quantity, the first + base quantity found in the file's quantity sets is used. When none is + present, the value is computed from the tessellated geometry. The lookup + order is in `crates/core/src/model.rs`: + - Volume: `NetVolume`, `GrossVolume`, `Volume`; then geometry. + - Area: `NetArea`, `GrossArea`, `NetSideArea`, `GrossSideArea`, + `NetFloorArea`, `GrossFloorArea`, `OuterSurfaceArea`, `Area`; then geometry. + - Length: `Length`, `NetLength`, `GrossLength`, `Height`, `Depth`; then the + longest side of the bounding box. + - Weight: `NetWeight`, `GrossWeight`, `Weight`. There is no geometry fallback + for weight; without a base quantity it is not reported. +13. **Quantity sets are searched in sorted order.** When the same quantity name + appears in two sets, the set that sorts first is used. +14. **Takeoff items are non-spatial products.** Spatial elements (sites, + buildings, storeys, spaces) are left out, and so are feature elements + (openings and similar), virtual elements, annotations and grids. + (`is_takeoff_item`, `EXCLUDED_FAMILIES` in `crates/core/src/qto.rs`.) +15. **An element with no quantity at all still counts** in its group, adds + nothing to the totals, and is reported as "no quantity". +16. **A degenerate solid is one with no triangles, or with volume and area both + at or below the configured minimums.** (Rule GEO-002, `non_degenerate_geometry`.) +17. **Geometry rules are skipped without the geometry kernel.** A skipped rule + gives a plain-language reason and is never counted as passed. (`RuleStatus::Skipped`.) + +## Pricing (QTO) + +18. **Group keys.** A `classification` key is the element's first non-empty + classification code. A `material` key joins all of the element's materials with + ` | `. A missing value becomes a placeholder such as `(unclassified)`. +19. **A rate applies to a group only when every element of the group matches + every non-empty match column.** `match_type` also matches subtypes. `match_storey` + is an exact storey name. `match_classification` is a prefix of the first + classification code. +20. **The first matching rate in file order wins.** The rest of the table is not + consulted for that group. (`rate_matches`, `compute` in `qto.rs`.) +21. **Quantity for pricing:** the group total in the rate's unit. For `nr` it is the + number of elements. Amount = quantity × rate, rounded to two decimals. +22. **Totals are sums of the rounded amounts.** When matched rates use more than + one currency, no grand total is given. +23. **The currency of a rate with no currency column** is `qto.currency`. + +## Scoring and verdict + +24. **Verdict.** `FAIL` if any finding is an error; `PASS_WITH_WARNINGS` if there + are warnings but no errors; `PASS` otherwise. Informational findings do not + change the verdict. (`crates/core/src/score.rs`, `VERDICT_RULE`.) +25. **Score.** `100 × (1 − (errors + 0.25 × warnings) / element checks)`, + rounded to a whole number and clamped to 0 to 100. `element checks` is the + sum of the elements each non-skipped rule evaluated. Informational findings do + not change the score. With no element checks, the score is 0 if there is an + error and 100 otherwise. (`score::summarise`.) +26. **Skipped rules never count as passed** and are not in the element-check + denominator. +27. **A rule that applies to no element is "not applicable"**, not a pass. + (`RuleStatus::NotApplicable`.) + +## Rule evaluation + +28. **A rule whose `enabled_if` path is missing is off.** The missing path is + treated as `false`, and such a rule is left out of the report entirely. +29. **`checks.rules` overrides `checks.categories`**, which overrides the default + (on). (`ChecksSection::is_enabled`.) +30. **Results are ordered by rule id**, and findings by severity, then rule id, + then GlobalId, then message. (`engine::evaluate`, `RunReport::normalise`.) +31. **A property set requirement with no `applies_to`** applies to every + non-spatial element. (`rules_for_required_pset`.) + +## IDS + +32. **Every IDS-derived finding is an error.** The cardinality of a specification + (from `minOccurs` and `maxOccurs` on its applicability) decides only whether + applicable elements must, may or must not exist. A requirement that fails on an + applicable element is always an error. (`severity_for` in `crates/core/src/ids.rs`; + cardinality from `run_ids` in `crates/ifc_reader/python/verimodel_extract.py`.) +33. **An IDS requirement that passes with zero applicable elements** is reported + as not applicable. See [IDS.md](IDS.md). + +## Outputs and reproducibility + +34. **Deterministic outputs.** `report.json`, `report.html`, `failures.csv` and + `qto.csv` are written so that the same inputs give the same bytes; the report + writer does not write timestamps. Time stamps appear in `run.json` (timestamp and + duration), `audit.log`, and the `CreationDate` of BCF topics, which is the real + UTC time of the export. Other BCF content is repeatable. (`run.rs` and `bcf.rs` + module documentation.) +35. **Hashes are recorded in `run.json`:** the IFC file (SHA-256 of the whole + file), the IDS file, the rates file, the effective configuration (the + `project.yaml` written to `out/`), and `report.json`. +36. **The effective configuration is written to `out/project.yaml`.** It is the + configuration after defaults are applied, so a run can be reproduced from + that folder. +37. **Every run appends to `audit.log`.** The log is never rewritten. Each line + holds a UTC timestamp, the event and its details. + +## Not implemented yet + +- **Clash detection.** `clash.enabled: true` returns an explicit "not + implemented" message. No clash is reported. +- **Display unit conversion** from `project.units`. +- **`output.include_3d_snapshot`** and the `clash.*` filters are stored but not read. +- **`requirements.ids_file`** is stored but not read; the command line uses `--ids`. +- **Classification rule CL-002 with `allowed_codes_file`** reads the file only when + checks run, so a bad path is reported at run time, not when the file is validated. diff --git a/docs/CONFIG.md b/docs/CONFIG.md new file mode 100644 index 0000000..f80d5b7 --- /dev/null +++ b/docs/CONFIG.md @@ -0,0 +1,203 @@ +# project.yaml reference + +`project.yaml` holds everything that is specific to one project: its schema +rules, the properties every element must carry, tolerances, quantity settings, +naming and classification rules, rule switches and output settings. The +engine itself has no project-specific values; it reads them from this file. + +This page is derived from `crates/core/src/config.rs`, the single source of +truth for the schema. If this page and the code disagree, the code wins. + +## Rules that apply to the whole file + +- **Every key is checked.** Unknown keys are errors, with the key name in the + message. A typo cannot silently switch a rule off. Wrong types are errors too + (for example `ID-003: no` where a boolean is expected). +- **Every key is optional.** A missing key takes its default. An empty file + (`{}`) is a valid configuration with all defaults. A missing `--config` on the + command line also means all defaults. +- **Relative paths** (`requirements.ids_file`, `requirements.rule_pack` when it + is a file, `qto.unit_rates_file`, `classification.allowed_codes_file`) are + resolved against the folder that contains `project.yaml`, not the folder you + run the command from. +- **Validation** runs when the file is read. Problems are listed in plain + language, separated by semicolons. Checks made by `Config::validate`: + `qto.group_by` values and non-empty list; `tolerances.far_from_origin_m > 0`; + `tolerances.geometry.min_volume_m3 >= 0`; `output.bcf_version` is `2.1` or + `3.0`; every regular expression in `naming.patterns` and + `classification.code_pattern` compiles; every `required_psets` entry has a + non-empty `pset` and a valid `severity`; `checks.unique_name_within` values + are `type` or `storey`. +- **Validated when the checks run:** every rule id in `checks.rules` must exist + in the active rule pack (or be an `IDS-*` id) and every name in + `checks.categories` must be a category of the pack or one of the standard + categories (identity, spatial, properties, geometry, classification, naming, + sanity, schema, ids); otherwise the run stops with a message naming the key. + `allowed_codes_file` is read only when the checks run. +- **Check the file:** `verimodel validate-config --config project.yaml`. + `verimodel validate-config --schema` prints the JSON schema, which editors + can use for autocompletion. + +Status markers used below: **read** means the current code uses the value; +**declared** means the key is accepted and stored in the file but no code uses +it yet. + +## Top level + +| Key | Type | Default | Meaning | +| --- | --- | --- | --- | +| `project` | section | see below | Project identity and file-level rules. | +| `requirements` | section | see below | Rule pack and required property sets. | +| `tolerances` | section | see below | Numbers that decide geometry and position checks. | +| `qto` | section | see below | Quantity takeoff grouping, rates and currency. | +| `clash` | section | see below | Clash detection (planned). | +| `output` | section | see below | Report language and BCF settings. | +| `checks` | section | see below | Switch single rules or whole categories off. | +| `naming` | section | see below | Naming convention per element type. | +| `classification` | section | see below | Classification codes elements must carry. | + +## `project` + +| Key | Type | Default | Status | Meaning | +| --- | --- | --- | --- | --- | +| `project.name` | text | `Generic Project` | read | Name shown in reports. | +| `project.language` | `en` or `es` | `en` | read | Language of the user interface and reports. | +| `project.units` | `auto`, `metric` or `imperial` | `auto` | declared | Intended unit preference for display. `auto` follows the IFC file. No code reads this key yet; all values are stored in SI units. | +| `project.classification_system` | text | `none` | read | Name of the classification system expected, for example `Uniclass`, `OmniClass`, `CCI`, `DIN276`. Rule CL-001 matches it, ignoring case, against the system name in the file. `none` disables that match. | +| `project.ifc_versions` | list of text | `[IFC2X3, IFC4, IFC4X3]` | read | Schemas the project accepts. Read by rule SCH-001. An empty list accepts any schema. Compared after normalisation (see [ASSUMPTIONS.md](ASSUMPTIONS.md)). | + +## `requirements` + +| Key | Type | Default | Status | Meaning | +| --- | --- | --- | --- | --- | +| `requirements.ids_file` | text (path) | none | used | IDS file to audit against, relative to the config file. `--ids` on the command line (or the IDS picked in the app) takes precedence. | +| `requirements.rule_pack` | text | `generic` | read | `generic` for the built-in pack, or a path to a custom rule pack YAML (relative to this file). See [RULES.md](RULES.md). | +| `requirements.required_psets` | list of `RequiredPset` | `[]` | read | Property sets, and optionally properties, that must exist. Each entry creates generated rules (see below). | + +### `requirements.required_psets[]` (`RequiredPset`) + +| Key | Type | Default | Meaning | +| --- | --- | --- | --- | +| `pset` | text | none, required | Property set name, for example `Pset_WallCommon`. Must not be empty. | +| `applies_to` | list of text | `[]` | IFC types (or supertypes) the rule applies to, for example `[IfcWall]`. Empty applies it to all non-spatial elements. | +| `properties` | list of text | `[]` | Property names that must exist inside the set and carry a value. Empty requires only that the set exists. | +| `severity` | `error`, `warning` or `info` | `error` | Severity of every finding the entry produces. | + +Each entry generates rules with category `properties`. `n` is the position of +the entry, written with three digits (001, 002, ...), and `m` is the position of +the property, written with two digits (01, 02, ...): + +- `CFG-PSET-n`: the property set must exist. +- `CFG-PSET-n-m`: the property must exist and have a value. + +These ids can be switched off like any other rule id (`checks.rules`). + +Example: + +```yaml +requirements: + required_psets: + - pset: Pset_WallCommon + applies_to: [IfcWall] + properties: [FireRating, IsExternal] + severity: error +``` + +## `tolerances` + +| Key | Type | Default | Status | Meaning | +| --- | --- | --- | --- | --- | +| `tolerances.clash_hard_mm` | number (mm) | `10.0` | declared | Hard-clash distance for clash detection. Clash detection is not implemented yet. | +| `tolerances.clash_clearance_mm` | number (mm) | `50.0` | declared | Clearance distance for clash detection. Not implemented yet. | +| `tolerances.far_from_origin_m` | number (m), must be > 0 | `10000.0` | read | An element whose bounding-box centre is farther than this from the origin is flagged by rule SP-004 (generic pack). | +| `tolerances.geometry.min_volume_m3` | number (m³), must be >= 0 | `0.000001` | read | A solid with volume at or below this is degenerate (rules GEO-002, QT-001). | +| `tolerances.geometry.min_area_m2` | number (m²) | `0.000001` | read | A surface with area at or below this is degenerate (rule GEO-002). | +| `tolerances.geometry.max_extent_m` | number (m) | `5000.0` | read | An element whose bounding box is longer than this in any direction is flagged by rule GEO-003. | + +## `qto` + +| Key | Type | Default | Status | Meaning | +| --- | --- | --- | --- | --- | +| `qto.group_by` | list of text | `[type, storey]` | read | How takeoff rows are grouped. Any non-empty combination of `type`, `storey`, `classification`, `material`, `predefined_type`, `type_name`. Other values are errors. | +| `qto.unit_rates_file` | text (path) | none | read | Unit-rate CSV for pricing. Format in [../examples/README.md](../examples/README.md#unit-rates-ratescsv). | +| `qto.currency` | text | `EUR` | read | Currency used for a rate that has no currency of its own. | +| `qto.sample_count` | whole number | `5` | read | How many elements with quantities are listed as hand-check samples. | + +## `clash` + +| Key | Type | Default | Status | Meaning | +| --- | --- | --- | --- | --- | +| `clash.enabled` | boolean | `false` | read | Turns clash detection on. While clash detection is not implemented, enabling it returns an explicit "not implemented" message and no clashes. | +| `clash.set_a_filter` | `ElementFilter` | empty | declared | Elements of the first model to test. Not read yet. | +| `clash.set_b_filter` | `ElementFilter` | empty | declared | Elements of the second model to test. Not read yet. | + +### `ElementFilter` (used by `clash.set_a_filter`, `clash.set_b_filter` and rule scopes) + +| Key | Type | Default | Meaning | +| --- | --- | --- | --- | +| `ifc_type` | text | none | IFC type or supertype, for example `IfcPipeSegment`. | +| `name_pattern` | regular expression | none | Element name must match. | +| `storey` | text | none | Exact storey name. | +| `property_equals` | map of `Pset.Property` to text | `{}` | Each listed property must have exactly this value. | + +## `output` + +| Key | Type | Default | Status | Meaning | +| --- | --- | --- | --- | --- | +| `output.language` | `en` or `es` | `en` | read | Language of `report.html` and of BCF topic titles. | +| `output.include_3d_snapshot` | boolean | `true` | declared | Whether BCF viewpoints include a snapshot. No code reads this key yet. | +| `output.bcf_version` | `"2.1"` or `"3.0"` | `"2.1"` | read | BCF version written to `issues.bcfzip`. Quoted in the file so it stays text. | +| `output.bcf_author` | text | `verimodel@local` | read | Author recorded on every BCF topic. | + +## `checks` + +| Key | Type | Default | Meaning | +| --- | --- | --- | --- | +| `checks.rules` | map of rule id to boolean | `{}` | `false` switches one rule off, `true` switches it on. Overrides the category setting. Missing ids stay enabled. | +| `checks.categories` | map of category to boolean | `{}` | `false` switches a whole category off. Missing categories stay enabled. | +| `checks.unique_name_within` | list of `type` or `storey` | `[]` | Scope of rule ID-003 (unique names). Empty means `[type, storey]`. `[type]` makes names unique across the whole model. | + +Resolution order for a rule: its id in `checks.rules` if present; otherwise its +category in `checks.categories`; otherwise enabled. A rule can also be disabled +in its own rule pack (`enabled: false`). + +Category names: `identity`, `spatial`, `properties`, `geometry`, +`classification`, `naming`, `sanity`, `schema`, and `ids` (for IDS-derived +rules, once IDS checks run). + +## `naming` + +| Key | Type | Default | Status | Meaning | +| --- | --- | --- | --- | --- | +| `naming.patterns` | map of IFC type to regular expression | `{}` | read | Element names of that type, or of any of its subtypes, must match the expression. Read by rule NAM-001. Empty means the rule is skipped. | + +## `classification` + +| Key | Type | Default | Status | Meaning | +| --- | --- | --- | --- | --- | +| `classification.required` | boolean | `false` | read | `true` turns on rule CL-001: every element in scope must carry a classification reference from `project.classification_system`. | +| `classification.applies_to` | list of text | `[]` | used | Element types (or supertypes) that must be classified, e.g. `[IfcWall, IfcSlab]`. Empty means every element in the rule's scope (`IfcElement`). Read by the `classification_exists` check (rule CL-001). | +| `classification.allowed_codes` | list of text | `[]` | read | Codes accepted inline. Read by rule CL-002. | +| `classification.allowed_codes_file` | text (path) | none | read | File of accepted codes: either a CSV with a `code` column (the first line is the header), or one code per line. Lines starting with `#` are ignored. Read when the checks run. | +| `classification.code_pattern` | regular expression | none | read | Every classification code must match it (rule CL-002). Checks shape, not existence in a table. | + +Rule CL-002 behaviour, depending on what is configured: + +- No allowed codes and no `code_pattern`: the rule is skipped, with a + plain-language reason. A skipped rule is never counted as passed. +- Only `code_pattern`: each code must match the pattern. +- A list (inline or from file): each code must be in the list, and must also + match `code_pattern` when one is set. + +## Minimal and full examples + +Minimal, valid: + +```yaml +project: + name: "Pilot" +``` + +The four complete examples are in `examples/`: +`residential/project.yaml`, `office/project.yaml`, +`infrastructure/project.yaml`. diff --git a/docs/IDS.md b/docs/IDS.md new file mode 100644 index 0000000..efa87d1 --- /dev/null +++ b/docs/IDS.md @@ -0,0 +1,170 @@ +# IDS in VeriModel + +## What IDS is + +IDS (Information Delivery Specification) is the buildingSMART standard for +writing down, in a machine-readable file, which information a model must +contain. An IDS file is XML. Each **specification** has two parts: + +- **Applicability**: which elements the specification applies to, for example + every `IFCWALL`. +- **Requirements**: what those elements must contain. The facets are `entity`, + `attribute`, `property`, `classification`, `material` and `partOf`. Each + facet has a cardinality: `required`, `optional` or `prohibited`. + +A project can therefore state a requirement once, in IDS, and any tool that +reads IDS can check a model against it. + +Standard and tools: + +- IDS repository and documentation: +- IDS 1.0 schema (the XSD that defines the file format): +- IfcTester, the Python library in IfcOpenShell that reads and checks IDS: + +VeriModel does not check IDS itself. It uses IfcTester (through the reader) to +audit the model, and turns the results into rules and findings. + +## A minimal IDS file, walked through + +The file used by the examples is [`examples/sample.ids`](../examples/sample.ids). +Its structure, from the outside in: + +```xml + + + VeriModel sample requirements + 1.0 + examples@example.com + 2026-10-17 + ... + + + + + + IFCWALL + + + + + Pset_WallCommon + FireRating + + + + + + +``` + +Points to know when writing one: + +- **Entity names are upper case** (`IFCWALL`, `IFCBEAM`), as the standard expects. +- **`ifcVersion` takes the tokens `IFC2X3`, `IFC4` and `IFC4X3_ADD2`**. The IDS + 1.0 schema does not accept `IFC4X3`; the IFC 4.3 token is `IFC4X3_ADD2`. A file + with the wrong token is rejected by the schema check (verified with the + schema in IfcTester 0.9.0). +- **`dataType` is an upper-case IFC type name** such as `IFCLABEL`, `IFCBOOLEAN` + or `IFCREAL`. +- **`minOccurs` on `applicability`** sets whether the specification needs + applicable elements. `minOccurs="1"` (or more) is `required`: at least one + applicable element must exist, so a model with no walls fails a walls + specification (VeriModel reports one model-level error). `minOccurs="0"` is + `optional`: a model with no walls passes, and any wall that fails the + requirement is still an error. The sample uses `minOccurs="0"` so that it runs + across every fixture, including models with no walls or no beams. Use `"1"` when + missing elements are themselves a failure. +- **Facet order** inside `requirements` may be mixed (the schema allows any + order), but each facet element must have the children the schema names: + `propertySet` and `baseName` for `property`; `name` for `attribute`; `system` + for `classification`. + +Check any IDS file against the schema and parse it with the same library that +VeriModel uses: + +```python +import ifctester.ids as ids +spec = ids.open("examples/sample.ids", validate=True) # XSD check, then parse +``` + +Run it against a model: + +```python +import ifcopenshell, ifctester.reporter as reporter +model = ifcopenshell.open("tests/fixtures/bsi_ifc2x3_building_architecture.ifc") +spec.validate(model) # keep `model` alive until the report is made +r = reporter.Json(spec); r.report(); print(r.to_string()) +``` + +### What the sample reports on the buildingSMART fixtures + +Results from IfcTester 0.9.0 on the four files in `tests/fixtures/`: + +| Fixture | Walls: FireRating | Walls: IsExternal | Beams: material | Specifications passing | +| --- | --- | --- | --- | --- | +| `bsi_ifc2x3_building_architecture.ifc` (4 walls, no beams) | fail (4 walls lack the property set) | fail (4 walls) | pass, vacuously (0 beams) | 1 of 3 | +| `bsi_ifc4_building_structural.ifc` (4 walls, 6 beams) | fail (4 walls) | fail (4 walls) | pass (6 beams) | 1 of 3 | +| `bsi_ifc4_building_hvac.ifc` (no walls, no beams) | pass, vacuously | pass, vacuously | pass, vacuously | 3 of 3 | +| `bsi_ifc4x3_infra_bridge.ifc` (4 walls, 8 beams) | fail (4 walls) | fail (4 walls) | pass (8 beams) | 1 of 3 | + +"Vacuously" means the specification applies to no element, so nothing can fail. +VeriModel reports such a requirement as **not applicable**, not as a pass with +elements checked. + +## How VeriModel reports IDS results + +Source: `crates/core/src/ids.rs`. The IDS engine (IfcTester, driven by the reader) +returns the facts; the core turns them into rules and findings, so IDS results +appear in the same tables as rule-pack results. + +- **One rule per requirement.** The rule id is `IDS--`, with both + numbers counted from 1 and written with two digits: `IDS-01-01` is the first + requirement of the first specification. Its category is `ids`. +- **A specification without requirements** gets one rule, `IDS--00`, so + its verdict is still reported. +- **Requirement quoted.** The rule's description is `: `. Each finding + puts the requirement text in `expected`, and the IDS engine's reason in + `actual`. The requirement is therefore quoted verbatim in the report. +- **Severity is always error.** Every IDS-derived rule is an error, whatever the + cardinality. A requirement that fails on an applicable element is a failure. The + cardinality only says whether applicable elements must, may or must not exist + (see the `minOccurs` note above). +- **Findings.** One finding per failed element, with its GlobalId, type and + name. If a requirement failed but no element is named (for example a required + specification with no applicable element), one model-level finding says so. +- **Status.** Pass, Fail, or Not applicable when the requirement passed with + zero applicable elements. +- **Fix hint.** The specification's `instructions`, or + `See IDS specification ''.` when none is given. +- **Report header.** The IDS title, file name, and counts of specifications + passed and total are written to the report and `run.json` (the IDS file's + SHA-256 is recorded too). + +Example: the IFC2X3 architecture fixture against the sample gives the walls +requirement `IDS-01-01` and four errors, one per wall. Each finding quotes the +requirement in `expected` (here `FireRating data shall be provided in the dataset +Pset_WallCommon`, the wording IfcTester generates) and gives the reason in +`actual` (here `The required property set does not exist`). The beams +specification has no applicable element in that file and reports `Not applicable`. + +## Running with an IDS file + +``` +verimodel check --ifc tests/fixtures/bsi_ifc2x3_building_architecture.ifc \ + --config examples/residential/project.yaml --ids examples/sample.ids --out ./out +``` + +The command line reads the IDS from `--ids`. The `requirements.ids_file` key in +`project.yaml` is accepted but not read yet (see [CONFIG.md](CONFIG.md)). + +## Where to go next + +- The IDS 1.0 schema and repository (links above). +- The sample files used here are in `examples/sample.ids`, with notes in + `examples/README.md`. diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md new file mode 100644 index 0000000..2be712e --- /dev/null +++ b/docs/RELEASE_NOTES.md @@ -0,0 +1,25 @@ +## VeriModel 1.0.0 + +**Your model does not pass unless it proves it passes.** + +First release of VeriModel: a local-first IFC quality gate, quantity takeoff and BCF exporter, with a read-only language-model copilot. + +### Highlights +- **Generic quality gate** for any IFC model (IFC2x3, IFC4, IFC4.3): identity, spatial hierarchy, properties, geometry health, classification, naming and quantity sanity checks, all defined as data (YAML rule packs) and configured in `project.yaml`. +- **IDS 1.0 support** through IfcTester: every requirement becomes a rule, every failure quotes the requirement. +- **Quantity takeoff** from base quantities with geometry fallback, configurable grouping, unit-rate costing and hand-check samples. +- **BCF 2.1 / 3.0 export** validated against the official buildingSMART schemas, plus CSV for Excel. +- **Deterministic, auditable outputs**: `report.html`, `report.json`, `failures.csv`, `qto.csv/xlsx/json`, `issues.bcfzip`, `run.json` ledger with SHA-256 hashes, `audit.log`. +- **Desktop app** (Tauri 2) with a 3-step flow, EN/ES, dark/light, metric/imperial, run history with diffs, and a demo model that loads in one click. +- **CLI** with the same engine: `check`, `qto`, `inspect`, `validate-config`, `doctor`, `ask`, `docs-to-yaml`. +- **Assistant** (optional, downloads a 0.5B model on demand, runs on CPU): finds failures, explains them, drafts `project.yaml`, reads your imported documentation. Never part of a verdict. + +### Requirements +- A Python 3.9+ with `ifcopenshell` and `ifctester` (`pip install ifcopenshell ifctester`). Run `verimodel doctor` to check. + +### Assets +- `VeriModel_1.0.0_x64-setup.exe` / `.msi` (Windows), `.dmg` (macOS), `.AppImage` / `.deb` (Linux) +- `verimodel-cli-*` headless command line +- `SHA256SUMS.txt` + +Licence: PolyForm Noncommercial 1.0.0 (free for noncommercial use; commercial licences on request). diff --git a/docs/RULES.md b/docs/RULES.md new file mode 100644 index 0000000..eb6f3df --- /dev/null +++ b/docs/RULES.md @@ -0,0 +1,455 @@ +# Rules and rule packs + +A **rule** says what must be true of the elements in a model. A **rule pack** +is a YAML file holding a list of rules. VeriModel ships one built-in pack, +`crates/core/rule_packs/generic.yaml`, and a project can replace it with its +own pack. + +Rules are data, not code. The engine knows a fixed vocabulary of **check +kinds** (listed below). A new rule that uses an existing check kind needs only +a YAML entry. A new kind of check needs code in `crates/core/src/rules/checks.rs`. + +Everything in this page is taken from `crates/core/src/rules/pack.rs`, +`crates/core/src/rules/checks.rs`, `crates/core/src/rules/engine.rs`, +`crates/core/src/config.rs` and `crates/core/src/score.rs`. + +## Rule pack format + +```yaml +name: my_pack # required, text +version: 1 # optional, whole number, default 1 +description: Optional text +rules: # required, at least one rule + - id: ABC-001 # required, unique within the pack + category: properties # required; used for on/off switches and grouping + description: Walls must state their fire rating + severity: error # optional, default error: error | warning | info + enabled: true # optional, default true + enabled_if: "$config.classification.required" # optional, see below + scope: # optional; default selects non-spatial products + ifc_types: [IfcWall] + exclude_types: [] + include_spatial: false + filter: {} # optional ElementFilter, see below + check: # required: one check kind with its parameters + kind: property_exists + pset: Pset_WallCommon + property: FireRating + fix_hint: Fill in FireRating in the authoring tool. # optional, but always write one +``` + +Parser rules (every key is checked; unknown keys are errors): + +- A pack must contain at least one rule. Rule ids must be unique in the pack. +- `severity` must be `error`, `warning` or `info` (case does not matter). +- `enabled_if` must start with `$config.`. +- `scope.filter.name_pattern`, when given, must be a valid regular expression. +- A `check` with an unknown `kind` is rejected when the pack is read. + +Other packs are loaded by setting `requirements.rule_pack` in `project.yaml` to +a path, relative to that file: see +[`examples/infrastructure/infrastructure_rules.yaml`](../examples/infrastructure/infrastructure_rules.yaml). + +## Scope + +`scope` picks the elements a rule looks at. + +| Key | Default | Meaning | +| --- | --- | --- | +| `ifc_types` | `[]` | Element types, or supertypes, to include. Empty means every product. | +| `exclude_types` | `[]` | Types or supertypes to leave out. | +| `include_spatial` | `false` | Include sites, buildings, storeys, spaces and similar. Only matters when `ifc_types` is empty: a spatial element is then left out unless this is `true`. When `ifc_types` is set, the list alone decides. | +| `filter` | none | Extra conditions, below. | + +`ElementFilter` (also used for clash sets): + +| Key | Meaning | +| --- | --- | +| `ifc_type` | Type or supertype. | +| `name_pattern` | Regular expression the name must match. | +| `storey` | Exact storey name. | +| `property_equals` | Map of `Pset.Property` to a value that must match exactly, for example `Pset_WallCommon.IsExternal: "true"`. | + +Example: + +```yaml +scope: + ifc_types: [IfcWall] + filter: + storey: "Level 1" + property_equals: + "Pset_WallCommon.IsExternal": "true" +``` + +## Parameters: literals and `$config.` references + +A parameter can be a number, a boolean, text, or a list of text. A text value +that starts with `$config.` is replaced by the value at that path in +`project.yaml` when the rule runs: + +```yaml +check: { kind: distance_from_origin, max_m: "$config.tolerances.far_from_origin_m" } +``` + +Paths use dots and follow the layout of `project.yaml` (see +[CONFIG.md](CONFIG.md)). A path that does not exist stops the run with an error +that names the path. Thresholds written this way are changed in one +place, and the same rule file works for every project. + +## `enabled_if` + +`enabled_if: "$config."` runs the rule only when that value is `true`. +A missing path counts as `false`. When the condition is false, the rule is left +out of the report entirely (it is neither passed nor failed). + +```yaml +enabled_if: "$config.classification.required" +``` + +## Switching rules on and off + +Three levels, most specific first: + +1. `enabled: false` in the rule pack disables the rule for every project using that pack. +2. `checks.rules` in `project.yaml` switches one rule by id: + `checks.rules: { ID-003: false }`. +3. `checks.categories` in `project.yaml` switches all rules of one category: + `checks.categories: { naming: false }`. + +`checks.rules` wins over `checks.categories`. A rule with neither setting is on. +Rules that `project.yaml` generates from `required_psets` take the ids +`CFG-PSET-n` and `CFG-PSET-n-m` (see [CONFIG.md](CONFIG.md)). + +Categories used by the built-in pack: `identity`, `spatial`, `properties`, +`geometry`, `classification`, `naming`, `sanity`, `schema`. IDS-derived rules +use `ids`. Any text is accepted as a category name. + +## Check kinds + +Each entry gives the kind, its parameters (required unless marked optional), +and what counts as a failure. Element checks report one finding per failing +element. Model checks report one finding for the model as a whole. + +### `unique_global_id` (per element) + +No parameters. Fails every element whose GlobalId is used by another element in scope. + +```yaml +check: { kind: unique_global_id } +``` + +### `valid_global_id` (per element) + +No parameters. Fails an element whose GlobalId is not 22 characters from the IFC +base64 alphabet (`0-9 A-Z a-z _ $`) with a first character from `0` to `3`. +This is a syntax check only. + +```yaml +check: { kind: valid_global_id } +``` + +### `unique_name` (per element) + +| Parameter | Required | Meaning | +| --- | --- | --- | +| `within` | no | List of `type` and/or `storey`. Default: `checks.unique_name_within` from `project.yaml`, else `[type, storey]`. | + +Fails every element that shares its name with another element with the same +keys. Elements with an empty name are not compared. + +```yaml +check: { kind: unique_name, within: [type] } +``` + +### `contained_in_spatial_structure` (per element) + +No parameters. Fails an element that has no spatial container (storey, space, site or other spatial element). + +```yaml +check: { kind: contained_in_spatial_structure } +``` + +### `container_exists` (per element) + +No parameters. Fails an element whose container is not in the model's spatial tree. + +```yaml +check: { kind: container_exists } +``` + +### `spatial_hierarchy` (model) + +| Parameter | Required | Meaning | +| --- | --- | --- | +| `require` | yes | List of groups. Each group is a list of alternative types. The spatial tree of the model must contain at least one node of each group. | + +Fails once for each group that is missing. Matching is by type name in the +spatial tree, ignoring case. + +```yaml +check: + kind: spatial_hierarchy + require: + - [IfcSite] + - [IfcBuilding, IfcFacility, IfcBridge] + - [IfcBuildingStorey, IfcBridgePart] +``` + +### `distance_from_origin` (per element) + +| Parameter | Required | Meaning | +| --- | --- | --- | +| `max_m` | yes | Largest allowed distance in metres from the origin to the bounding-box centre. Number or `$config.` reference. | + +Fails an element whose bounding-box centre is farther than `max_m`. Skipped, +with a reason, when the geometry kernel is unavailable. + +```yaml +check: { kind: distance_from_origin, max_m: "$config.tolerances.far_from_origin_m" } +``` + +### `pset_exists` (per element) + +| Parameter | Required | Meaning | +| --- | --- | --- | +| `pset` | yes | Property set name. | + +Fails an element that does not have the property set. + +```yaml +check: { kind: pset_exists, pset: Pset_ConcreteElementGeneral } +``` + +### `property_exists` (per element) + +| Parameter | Required | Default | Meaning | +| --- | --- | --- | --- | +| `pset` | no | any set | Property set to look in. If omitted, every property set is searched. | +| `property` | yes | | Property name. | +| `require_value` | no | `true` | If `true`, an empty value (null, empty text or empty list) fails. | +| `data_type` | no | none | `string` (also `text`, `label`), `number` (also `real`, `integer`, `float`) or `boolean` (also `bool`, `logical`). Other values are not checked. | + +Fails when the property is missing, when it is empty and `require_value` is +`true`, or when its type is not the one given. + +```yaml +check: + kind: property_exists + pset: Pset_WallCommon + property: FireRating + require_value: true + data_type: string +``` + +### `property_matches` (per element) + +| Parameter | Required | Meaning | +| --- | --- | --- | +| `pset` | no | Property set to look in. Searches every set when omitted. | +| `property` | yes | Property name. | +| `pattern` | no | Regular expression the value must match. | +| `allowed_values` | no | List of values, one of which the value must equal. | + +Checks only properties that exist. A missing property is not a failure of this +kind; use `property_exists` for that. The value is compared as text. + +```yaml +check: + kind: property_matches + pset: Pset_DoorCommon + property: FireRating + pattern: "^(EI|REI)[0-9]+$" + allowed_values: [EI30, EI60, EI90] +``` + +### `no_empty_properties` (per element) + +No parameters. Fails an element when any of its property values, in any set, is empty. +The finding lists the empty ones. + +```yaml +check: { kind: no_empty_properties } +``` + +### `has_geometry` (per element) + +No parameters. Fails an element that has no product representation. + +```yaml +check: { kind: has_geometry } +``` + +### `non_degenerate_geometry` (per element) + +| Parameter | Required | Default | Meaning | +| --- | --- | --- | --- | +| `min_volume_m3` | no | `tolerances.geometry.min_volume_m3` | Volume threshold, m³. | +| `min_area_m2` | no | `tolerances.geometry.min_area_m2` | Area threshold, m². | + +Fails an element that has a representation but whose shape could not be built, +has no triangles, or has a volume at or below `min_volume_m3` **and** an area at +or below `min_area_m2`. Skipped, with a reason, without the geometry kernel. + +```yaml +check: + kind: non_degenerate_geometry + min_volume_m3: "$config.tolerances.geometry.min_volume_m3" + min_area_m2: "$config.tolerances.geometry.min_area_m2" +``` + +### `bbox_within_bounds` (per element) + +| Parameter | Required | Meaning | +| --- | --- | --- | +| `max_extent_m` | yes | Largest allowed bounding-box side, metres. Number or `$config.` reference. | + +Fails an element whose bounding box is longer than `max_extent_m` in any +direction. Skipped without the geometry kernel. + +```yaml +check: { kind: bbox_within_bounds, max_extent_m: "$config.tolerances.geometry.max_extent_m" } +``` + +### `classification_exists` (per element) + +| Parameter | Required | Meaning | +| --- | --- | --- | +| `system` | no | Text the classification system name must contain, ignoring case. Usually `"$config.project.classification_system"`. A value of `none` or empty means any system. | + +Fails an element with no classification reference that has a code (from the +given system, if one is named). + +```yaml +check: { kind: classification_exists, system: "$config.project.classification_system" } +``` + +### `classification_code_allowed` (per element) + +No parameters. The rules come from `project.yaml`, section `classification`: +`allowed_codes`, `allowed_codes_file` and `code_pattern`. Skipped, with a +reason, when none of them is set. See [CONFIG.md](CONFIG.md#classification). + +```yaml +check: { kind: classification_code_allowed } +``` + +### `name_matches` (per element) + +| Parameter | Required | Meaning | +| --- | --- | --- | +| `pattern` | no | Regular expression every name in scope must match. | + +Without `pattern`, the expression for each element is taken from +`naming.patterns` in `project.yaml`, using the first entry (in alphabetical +order of type name) whose type matches the element. Skipped, with a reason, when there is no pattern at all. + +```yaml +check: { kind: name_matches, pattern: "^W-[0-9]{3}$" } +``` + +### `quantity_positive` (per element) + +| Parameter | Required | Default | Meaning | +| --- | --- | --- | --- | +| `quantity` | yes | | `volume` (m³), `area` (m²) or `length` (m). | +| `min` | no | `0` | The value must be greater than this. Number or `$config.` reference. | + +Takes the value from the base quantities in the file when present, otherwise +from the geometry (see [ASSUMPTIONS.md](ASSUMPTIONS.md)). Fails when the value +is at or below `min`. Elements without any value are not checked. + +```yaml +check: { kind: quantity_positive, quantity: volume, min: "$config.tolerances.geometry.min_volume_m3" } +``` + +### `types_present` (model) + +| Parameter | Required | Meaning | +| --- | --- | --- | +| `ifc_types` | yes | List of types, or supertypes. Each must have at least one element in the model. | + +Fails once for each missing type. + +```yaml +check: { kind: types_present, ifc_types: [IfcBridge] } +``` + +### `schema_allowed` (model) + +No parameters. Fails when the file's schema is not in `project.ifc_versions`. An +empty list accepts any schema. Schemas are compared after normalisation (see [ASSUMPTIONS.md](ASSUMPTIONS.md)). + +```yaml +check: { kind: schema_allowed } +``` + +## Adding a custom rule without touching engine code + +1. Copy `crates/core/rule_packs/generic.yaml`, or start a new file with the + format above, and give it a unique `name`. +2. Add a rule that uses one of the check kinds above. +3. Give it an `id` that is unique in the pack, a `category`, a `description`, + a `severity`, a `scope`, a `check` and a `fix_hint`. +4. Point `requirements.rule_pack` at the file in `project.yaml`. +5. Check it with `verimodel validate-config --config project.yaml`, then run + `verimodel check` on a model. + +Example: a rule that every door has a fire rating from a standard list, with the +list kept in one place (`project.yaml`) by using `property_matches` with +`allowed_values` written inline: + +```yaml +- id: DOR-001 + category: properties + description: Doors must state a fire rating from the approved list + severity: error + scope: { ifc_types: [IfcDoor] } + check: + kind: property_matches + pset: Pset_DoorCommon + property: FireRating + allowed_values: [EI30, EI60, EI90] + fix_hint: Set Pset_DoorCommon.FireRating to one of EI30, EI60 or EI90. +``` + +A check kind that does not exist cannot be added this way: it needs code in +`checks.rs`. + +## The built-in generic pack + +`crates/core/rule_packs/generic.yaml` has 17 rules. + +| Id | Category | Severity | Check kind | What it checks | +| --- | --- | --- | --- | --- | +| ID-001 | identity | error | `unique_global_id` | GlobalIds are unique | +| ID-002 | identity | error | `valid_global_id` | GlobalIds are valid | +| ID-003 | identity | warning | `unique_name` | Names unique within type and storey | +| SP-001 | spatial | error | `contained_in_spatial_structure` | Every element has a container | +| SP-002 | spatial | error | `container_exists` | Containers exist in the tree | +| SP-003 | spatial | warning | `spatial_hierarchy` | Site, building or facility, and storey or part present | +| SP-004 | spatial | warning | `distance_from_origin` | Not far from origin (`tolerances.far_from_origin_m`) | +| PR-001 | properties | warning | `no_empty_properties` | No empty property values | +| GEO-001 | geometry | warning | `has_geometry` | Physical elements have a body | +| GEO-002 | geometry | error | `non_degenerate_geometry` | Shapes are not degenerate | +| GEO-003 | geometry | warning | `bbox_within_bounds` | Elements within `tolerances.geometry.max_extent_m` | +| CL-001 | classification | error | `classification_exists` | Classified (only when `classification.required` is `true`) | +| CL-002 | classification | warning | `classification_code_allowed` | Codes are allowed | +| NAM-001 | naming | warning | `name_matches` | Names follow `naming.patterns` | +| QT-001 | sanity | warning | `quantity_positive` (volume) | Positive volume | +| QT-002 | sanity | warning | `quantity_positive` (area) | Positive area | +| SCH-001 | schema | error | `schema_allowed` | Schema is accepted by the project | + +## Verdict and score + +Quoted from `crates/core/src/score.rs`. + +Verdict rule (shown in the report): + +> FAIL = at least one ERROR. PASS WITH WARNINGS = no errors, at least one WARNING. PASS = no errors and no warnings. Score = 100 × (1 − (errors + 0.25 × warnings) / element checks). Skipped rules are never counted as passed. + +In detail: + +- **Verdict.** `FAIL` if any finding has severity error; otherwise `PASS_WITH_WARNINGS` if any has severity warning; otherwise `PASS`. There is no verdict when no rules ran. +- **Score.** `100 × (1 − (errors + 0.25 × warnings) / element_checks)`, rounded to a whole number and clamped to 0 to 100. `element_checks` is the sum, over rules that did not skip, of the number of elements each rule evaluated (a model-level rule counts as one). INFO findings do not change the score. +- **Edge case.** With no element checks at all, the score is 0 if there is an error and 100 otherwise. +- **Rule statuses.** Pass, Fail, Skipped (the rule could not run, with a reason; never counted as passed), and Not applicable (no element was in scope). diff --git a/docs/screenshots/architecture.png b/docs/screenshots/architecture.png new file mode 100644 index 0000000..c811354 Binary files /dev/null and b/docs/screenshots/architecture.png differ diff --git a/docs/screenshots/assistant.png b/docs/screenshots/assistant.png new file mode 100644 index 0000000..1e5fdc5 Binary files /dev/null and b/docs/screenshots/assistant.png differ diff --git a/docs/screenshots/report-html.png b/docs/screenshots/report-html.png new file mode 100644 index 0000000..1b27841 Binary files /dev/null and b/docs/screenshots/report-html.png differ diff --git a/docs/screenshots/step1-load.png b/docs/screenshots/step1-load.png new file mode 100644 index 0000000..d67efb8 Binary files /dev/null and b/docs/screenshots/step1-load.png differ diff --git a/docs/screenshots/step2-dark.png b/docs/screenshots/step2-dark.png new file mode 100644 index 0000000..4047118 Binary files /dev/null and b/docs/screenshots/step2-dark.png differ diff --git a/docs/screenshots/step2-detail.png b/docs/screenshots/step2-detail.png new file mode 100644 index 0000000..77dcc20 Binary files /dev/null and b/docs/screenshots/step2-detail.png differ diff --git a/docs/screenshots/step2-review.png b/docs/screenshots/step2-review.png new file mode 100644 index 0000000..3c18c24 Binary files /dev/null and b/docs/screenshots/step2-review.png differ diff --git a/docs/screenshots/step3-export.png b/docs/screenshots/step3-export.png new file mode 100644 index 0000000..4d9e5ac Binary files /dev/null and b/docs/screenshots/step3-export.png differ diff --git a/examples/.gitkeep b/examples/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..4d6b4a1 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,129 @@ +# VeriModel examples + +These files show how to set up VeriModel for three kinds of project. They are +**illustrative**: they show the format and the most common settings. They are +not recommendations for any real project, and the rates are placeholders, not +market prices. Copy an example, then change every value to match your own +project and your own requirements. + +## What is here + +| File | What it is | +| --- | --- | +| `residential/project.yaml` | A residential building. Any IFC schema. Walls and doors must carry their fire rating; classification is Uniclass and optional; quantities are priced with `rates.csv`. | +| `office/project.yaml` | An office building in Spanish (`es`), imperial units, IFC4 only, OmniClass classification. Tighter tolerances. Slabs and columns must state `LoadBearing`. Quantities are grouped by classification. No prices. | +| `infrastructure/project.yaml` | A bridge and road project in IFC4X3. Very large tolerances, no storeys, quantities grouped by material. Uses a custom rule pack. | +| `infrastructure/infrastructure_rules.yaml` | A **custom** rule pack, in the same format as the built-in `crates/core/rule_packs/generic.yaml`. Referenced by the infrastructure `project.yaml`. | +| `sample.ids` | A small buildingSMART IDS 1.0 file with three specifications: walls have a fire rating, walls state `IsExternal`, beams have a material. Used with `--ids`. | +| `rates.csv` | Twelve unit rates in EUR. Used by the residential example through `qto.unit_rates_file`. | + +Every `project.yaml` is commented section by section. The complete list of keys, +types and defaults is in [`docs/CONFIG.md`](../docs/CONFIG.md). + +## How to run + +Run these from the repository root. The IFC files are the public buildingSMART +samples in `tests/fixtures/` (see `tests/fixtures/README.md`). + +Check that a configuration file is valid (unknown keys are errors): + +``` +verimodel validate-config --config examples/residential/project.yaml +``` + +Residential example, with the IDS file and the rates: + +``` +verimodel check --ifc tests/fixtures/bsi_ifc2x3_building_architecture.ifc \ + --config examples/residential/project.yaml --ids examples/sample.ids --out ./out +``` + +Quantity takeoff only, with prices from `rates.csv`: + +``` +verimodel qto --ifc tests/fixtures/bsi_ifc2x3_building_architecture.ifc \ + --config examples/residential/project.yaml --out ./out +``` + +Office example (IFC4 model, because the office project accepts IFC4 only): + +``` +verimodel check --ifc tests/fixtures/bsi_ifc4_building_structural.ifc \ + --config examples/office/project.yaml --out ./out +``` + +Infrastructure example (IFC4X3 bridge model, custom rule pack): + +``` +verimodel check --ifc tests/fixtures/bsi_ifc4x3_infra_bridge.ifc \ + --config examples/infrastructure/project.yaml --out ./out +``` + +If the `verimodel` binary is not installed, replace `verimodel` with +`cargo run -q -p verimodel-cli --`. To check that IFC reading and IDS checking +are installed, run `verimodel doctor`. + +Exit codes: `0` = PASS or PASS WITH WARNINGS, `1` = FAIL, `2` = error (bad +input, missing file, missing IFC tooling), `3` = feature not implemented yet +(clash). + +Each run writes a folder under `--out`: + +- `report.html` (readable report), `report.json` (same data, machine readable) +- `failures.csv` (one row per element per failed rule) +- `qto.csv`, `qto.xlsx`, `qto.json` (quantities, and cost when rates match) +- `issues.bcfzip` (BCF issues for ERROR and WARNING findings) and `issues.csv` +- `run.json` (run ledger: input and config hashes, score, verdict) and `audit.log` +- `project.yaml` (the effective configuration of the run, so it can be reproduced) + +## Unit rates: `rates.csv` + +The file has one header line and then one line per rate. Its first line must be +exactly this header (column names are not case sensitive, and their order is +free): + +``` +code,description,unit,rate,currency,match_type,match_storey,match_classification +``` + +| Column | Required | Meaning | +| --- | --- | --- | +| `code` | yes | Your own identifier for the rate, shown in the cost table. | +| `description` | yes | What the rate covers, in plain words. Avoid commas, or wrap the text in double quotes. | +| `unit` | yes | Unit the rate is per. One of `m3` (cubic metres), `m2` (square metres), `m` (metres), `kg` (kilograms), `nr` (number of elements). | +| `rate` | yes | Price per unit. A plain number with a dot as decimal separator. No currency symbol. | +| `currency` | no | Currency of this rate, for example `EUR`. If empty, `qto.currency` from the project file is used. | +| `match_type` | no | IFC type the rate applies to, for example `IfcWall`. It also matches the subtypes of that type. | +| `match_storey` | no | Exact storey name, for example `Level 1`. Empty matches every storey. | +| `match_classification` | no | Start of the classification code, for example `Ss_25`. Empty matches every element. | + +How a rate is chosen: + +1. Quantities are grouped as set by `qto.group_by` (for example by IFC type and storey). +2. For each group, the **first rate in file order** whose match columns apply to + every element of that group is used. An empty match column matches anything. +3. The quantity used is the group total in the rate's unit. For `nr`, it is the + number of elements. +4. Amount = quantity × rate, rounded to two decimals. +5. A group with no matching rate has no cost. Its quantity is still reported. +6. If the matched rates use different currencies, no grand total is given. + +Because the first match wins, put the more specific rates (for example one for +a storey) above the general rates (for example one for the whole type). + +The twelve rates in `rates.csv` each match one IFC type (`IfcWall`, `IfcSlab`, +`IfcBeam`, `IfcColumn`, `IfcFooting`, `IfcDoor`, `IfcWindow`, `IfcRoof`, +`IfcCovering`, `IfcDuctSegment`, `IfcPipeSegment`, `IfcRailing`), so no two +rates compete for the same group. + +## Notes + +- The IDS file in `sample.ids` is a teaching example. A real project needs its + own IDS file, written from its own requirements. +- The residential `project.yaml` names the IDS file in `requirements.ids_file`, + but the current command line reads the IDS only from `--ids`. Pass `--ids` as + shown above. +- Classification code patterns in these examples check the shape of a code + (for example `Ss_25_10_30` or `23-13 11 11`). They do not check that the code + exists in the Uniclass or OmniClass tables. +- Clash detection is planned for a later version. The examples keep it off. diff --git a/examples/demo/demo_building.ifc b/examples/demo/demo_building.ifc new file mode 100644 index 0000000..dae33f2 --- /dev/null +++ b/examples/demo/demo_building.ifc @@ -0,0 +1,1253 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); +FILE_NAME('/dev/null','2026-10-17T16:55:49+00:00',(''),(''),'IfcOpenShell 0.9.0.post1','IfcOpenShell 0.9.0.post1','Nobody'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('1Ox8RLg6TBi9PBWFYEYuFl',$,'VeriModel demo pavilion',$,$,$,$,(#10),#5); +#2=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#3=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#4=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); +#5=IFCUNITASSIGNMENT((#2,#3,#4)); +#6=IFCCARTESIANPOINT((0.,0.,0.)); +#7=IFCDIRECTION((0.,0.,1.)); +#8=IFCDIRECTION((1.,0.,0.)); +#9=IFCAXIS2PLACEMENT3D(#6,#7,#8); +#10=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,$); +#11=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#10,$,.MODEL_VIEW.,$); +#12=IFCSITE('1EpypJIb12CfdN9VsEREsE',$,'Demo site',$,$,$,$,$,$,$,$,$,$,$); +#13=IFCBUILDING('3QbDo1yX9DbvOtppP64ZlL',$,'Demo pavilion',$,$,$,$,$,$,$,$,$); +#14=IFCBUILDINGSTOREY('1IGd$4nYXElgZB4GTNmdPP',$,'Level 1',$,$,$,$,$,$,0.); +#15=IFCBUILDINGSTOREY('0e5UlLDXfEv9G8siqzjE$o',$,'Level 2',$,$,$,$,$,$,3500.); +#16=IFCBUILDINGSTOREY('0hBDJ75zX6vhkU0IfkK4eR',$,'Roof',$,$,$,$,$,$,7000.); +#17=IFCRELAGGREGATES('30oHEC9az5PON_oe3_j$J9',$,$,$,#1,(#12)); +#18=IFCRELAGGREGATES('00rv0K0GnBZxU3bG3$KBeN',$,$,$,#12,(#13)); +#19=IFCRELAGGREGATES('2taN8XTvf2eRISXxTPCiLv',$,$,$,#13,(#14,#15,#16)); +#20=IFCMATERIAL('Concrete C30/37',$,$); +#21=IFCMATERIAL('Brick masonry',$,$); +#22=IFCMATERIAL('Steel S275',$,$); +#23=IFCMATERIAL('Timber',$,$); +#24=IFCMATERIAL('Glass',$,$); +#25=IFCMATERIAL('Galvanised steel',$,$); +#26=IFCCLASSIFICATION($,$,$,'Uniclass 2015',$,$,$); +#27=IFCRELASSOCIATESCLASSIFICATION('3nyuhTxGnAbQF7lGwBBqLz',$,$,$,(#1),#26); +#28=IFCSLAB('2C6Zza1SH2sAoeVxiVhF2t',$,'SL-101',$,$,#50,#39,$,.FLOOR.); +#29=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,8000.),(12000.,8000.),(12000.,0.),(0.,0.))); +#30=IFCINDEXEDPOLYCURVE(#29,$,.F.); +#31=IFCDIRECTION((0.,0.,1.)); +#32=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#30); +#33=IFCCARTESIANPOINT((0.,0.,0.)); +#34=IFCDIRECTION((0.,0.,1.)); +#35=IFCDIRECTION((1.,0.,0.)); +#36=IFCAXIS2PLACEMENT3D(#33,#34,#35); +#37=IFCEXTRUDEDAREASOLID(#32,#36,#31,250.); +#38=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#37)); +#39=IFCPRODUCTDEFINITIONSHAPE($,$,(#38)); +#45=IFCRELCONTAINEDINSPATIALSTRUCTURE('1$UIJPtvn0UfbMpGVVPQf5',$,$,$,(#145,#568,#258,#362,#467,#634,#801,#108,#28,#219,#430,#536,#328,#68,#599,#666,#767,#182,#396,#501,#294),#14); +#46=IFCCARTESIANPOINT((0.,0.,-250.)); +#47=IFCDIRECTION((0.,0.,1.)); +#48=IFCDIRECTION((1.,0.,0.)); +#49=IFCAXIS2PLACEMENT3D(#46,#47,#48); +#50=IFCLOCALPLACEMENT($,#49); +#51=IFCRELASSOCIATESMATERIAL('2ym_uAATP0JwozpUCFG2L9',$,$,$,(#219,#1410,#1153,#328,#1051,#258,#362,#1085,#832,#396,#1119,#294,#1017,#28),#20); +#52=IFCPROPERTYSET('175jOK_0LBSueW65sq1xQS',$,'Pset_SlabCommon',$,(#54,#55,#56,#57)); +#53=IFCRELDEFINESBYPROPERTIES('18uFT4bI5FzeexUw6ysuWc',$,$,$,(#28),#52); +#54=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#55=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#56=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI120'),$); +#57=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('SL-101'),$); +#58=IFCELEMENTQUANTITY('1_mC_JkrD0ahIiDb44b3u_',$,'Qto_SlabBaseQuantities',$,'BaseQuantities',(#60,#61,#62,#63,#64,#65)); +#59=IFCRELDEFINESBYPROPERTIES('3doJRBogTF191sQEFc$oyf',$,$,$,(#28),#58); +#60=IFCQUANTITYLENGTH('Depth',$,$,250.,$); +#61=IFCQUANTITYAREA('GrossArea',$,$,96.,$); +#62=IFCQUANTITYAREA('NetArea',$,$,96.,$); +#63=IFCQUANTITYVOLUME('GrossVolume',$,$,24.,$); +#64=IFCQUANTITYVOLUME('NetVolume',$,$,24.,$); +#65=IFCQUANTITYLENGTH('Perimeter',$,$,40000.,$); +#66=IFCCLASSIFICATIONREFERENCE($,'Ss_30_20_55','Floor and roof slab systems',#26,$,$); +#67=IFCRELASSOCIATESCLASSIFICATION('0eps$panz66wJDSrkZPBpp',$,$,$,(#832,#28),#66); +#68=IFCWALL('1HJhkG0qn7_e2xUUNgfN9m',$,'WL-101',$,$,#89,#79,$,.SOLIDWALL.); +#69=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,250.),(12000.,250.),(12000.,0.),(0.,0.))); +#70=IFCINDEXEDPOLYCURVE(#69,$,.F.); +#71=IFCDIRECTION((0.,0.,1.)); +#72=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#70); +#73=IFCCARTESIANPOINT((0.,0.,0.)); +#74=IFCDIRECTION((0.,0.,1.)); +#75=IFCDIRECTION((1.,0.,0.)); +#76=IFCAXIS2PLACEMENT3D(#73,#74,#75); +#77=IFCEXTRUDEDAREASOLID(#72,#76,#71,3500.); +#78=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#77)); +#79=IFCPRODUCTDEFINITIONSHAPE($,$,(#78)); +#85=IFCCARTESIANPOINT((0.,0.,0.)); +#86=IFCDIRECTION((0.,0.,1.)); +#87=IFCDIRECTION((1.,0.,0.)); +#88=IFCAXIS2PLACEMENT3D(#85,#86,#87); +#89=IFCLOCALPLACEMENT($,#88); +#90=IFCRELASSOCIATESMATERIAL('3PTcnIieHEWgMenJynFMjU',$,$,$,(#980,#108,#943,#182,#906,#145,#869,#68),#21); +#91=IFCPROPERTYSET('06lX2rvA1FtQvDCZke6Eiy',$,'Pset_WallCommon',$,(#93,#94,#95,#96)); +#92=IFCRELDEFINESBYPROPERTIES('28TKDJ0Uv5VRpGADS6vSm9',$,$,$,(#68),#91); +#93=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#94=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI90'),$); +#95=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#96=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('WL-101'),$); +#97=IFCELEMENTQUANTITY('2ND34TOZ5DxRvLoJ$JpSqZ',$,'Qto_WallBaseQuantities',$,'BaseQuantities',(#99,#100,#101,#102,#103,#104,#105)); +#98=IFCRELDEFINESBYPROPERTIES('1p1XLNr61ERxmFWXoYX6v$',$,$,$,(#68),#97); +#99=IFCQUANTITYLENGTH('Length',$,$,12000.,$); +#100=IFCQUANTITYLENGTH('Height',$,$,3500.,$); +#101=IFCQUANTITYLENGTH('Width',$,$,250.,$); +#102=IFCQUANTITYVOLUME('GrossVolume',$,$,10.5,$); +#103=IFCQUANTITYVOLUME('NetVolume',$,$,10.5,$); +#104=IFCQUANTITYAREA('GrossSideArea',$,$,42.,$); +#105=IFCQUANTITYAREA('NetSideArea',$,$,42.,$); +#106=IFCCLASSIFICATIONREFERENCE($,'Ss_25_10_30','External wall systems',#26,$,$); +#107=IFCRELASSOCIATESCLASSIFICATION('1FBtl4GTTCqvgHUcaspkfX',$,$,$,(#980,#108,#943,#182,#906,#145,#869,#68),#106); +#108=IFCWALL('39ciZbPH92sPimVDxxXZcp',$,'WL-102',$,$,#129,#119,$,.SOLIDWALL.); +#109=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,250.),(8000.,250.),(8000.,0.),(0.,0.))); +#110=IFCINDEXEDPOLYCURVE(#109,$,.F.); +#111=IFCDIRECTION((0.,0.,1.)); +#112=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#110); +#113=IFCCARTESIANPOINT((0.,0.,0.)); +#114=IFCDIRECTION((0.,0.,1.)); +#115=IFCDIRECTION((1.,0.,0.)); +#116=IFCAXIS2PLACEMENT3D(#113,#114,#115); +#117=IFCEXTRUDEDAREASOLID(#112,#116,#111,3500.); +#118=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#117)); +#119=IFCPRODUCTDEFINITIONSHAPE($,$,(#118)); +#125=IFCCARTESIANPOINT((12000.,0.,0.)); +#126=IFCDIRECTION((0.,0.,1.)); +#127=IFCDIRECTION((6.123233995736766E-17,1.,0.)); +#128=IFCAXIS2PLACEMENT3D(#125,#126,#127); +#129=IFCLOCALPLACEMENT($,#128); +#130=IFCPROPERTYSET('1tH1lMJzb7Tf9tm4OI1J9K',$,'Pset_WallCommon',$,(#132,#133,#134,#135)); +#131=IFCRELDEFINESBYPROPERTIES('0DseMfki1Box1kJgpBCGZr',$,$,$,(#108),#130); +#132=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#133=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI90'),$); +#134=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#135=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('WL-102'),$); +#136=IFCELEMENTQUANTITY('3_Q3lOJxPDBv1mhAMcO$1j',$,'Qto_WallBaseQuantities',$,'BaseQuantities',(#138,#139,#140,#141,#142,#143,#144)); +#137=IFCRELDEFINESBYPROPERTIES('1ae5HJf71B_Pq9eY6s7ONX',$,$,$,(#108),#136); +#138=IFCQUANTITYLENGTH('Length',$,$,8000.,$); +#139=IFCQUANTITYLENGTH('Height',$,$,3500.,$); +#140=IFCQUANTITYLENGTH('Width',$,$,250.,$); +#141=IFCQUANTITYVOLUME('GrossVolume',$,$,7.,$); +#142=IFCQUANTITYVOLUME('NetVolume',$,$,7.,$); +#143=IFCQUANTITYAREA('GrossSideArea',$,$,28.,$); +#144=IFCQUANTITYAREA('NetSideArea',$,$,28.,$); +#145=IFCWALL('0thzlZJ996k8RKzWt6IJG0',$,'WL-103',$,$,#166,#156,$,.SOLIDWALL.); +#146=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,250.),(12000.,250.),(12000.,0.),(0.,0.))); +#147=IFCINDEXEDPOLYCURVE(#146,$,.F.); +#148=IFCDIRECTION((0.,0.,1.)); +#149=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#147); +#150=IFCCARTESIANPOINT((0.,0.,0.)); +#151=IFCDIRECTION((0.,0.,1.)); +#152=IFCDIRECTION((1.,0.,0.)); +#153=IFCAXIS2PLACEMENT3D(#150,#151,#152); +#154=IFCEXTRUDEDAREASOLID(#149,#153,#148,3500.); +#155=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#154)); +#156=IFCPRODUCTDEFINITIONSHAPE($,$,(#155)); +#162=IFCCARTESIANPOINT((12000.,8000.,0.)); +#163=IFCDIRECTION((0.,0.,1.)); +#164=IFCDIRECTION((-1.,1.2246467991473532E-16,0.)); +#165=IFCAXIS2PLACEMENT3D(#162,#163,#164); +#166=IFCLOCALPLACEMENT($,#165); +#167=IFCPROPERTYSET('0q_wGZySLEzRzLgDsVpZqT',$,'Pset_WallCommon',$,(#169,#170,#171,#172)); +#168=IFCRELDEFINESBYPROPERTIES('02n8AX5Lb7khFV5GZ29OWq',$,$,$,(#145),#167); +#169=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#170=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI90'),$); +#171=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#172=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('WL-103'),$); +#173=IFCELEMENTQUANTITY('1k3qSu2aX4FeRH3xQ9v4mY',$,'Qto_WallBaseQuantities',$,'BaseQuantities',(#175,#176,#177,#178,#179,#180,#181)); +#174=IFCRELDEFINESBYPROPERTIES('23aVstWLvEU8Q9KeSLzD6P',$,$,$,(#145),#173); +#175=IFCQUANTITYLENGTH('Length',$,$,12000.,$); +#176=IFCQUANTITYLENGTH('Height',$,$,3500.,$); +#177=IFCQUANTITYLENGTH('Width',$,$,250.,$); +#178=IFCQUANTITYVOLUME('GrossVolume',$,$,10.5,$); +#179=IFCQUANTITYVOLUME('NetVolume',$,$,10.5,$); +#180=IFCQUANTITYAREA('GrossSideArea',$,$,42.,$); +#181=IFCQUANTITYAREA('NetSideArea',$,$,42.,$); +#182=IFCWALL('2C5NqrydjAxBezV$tAkmH6',$,'WL-104',$,$,#203,#193,$,.SOLIDWALL.); +#183=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,250.),(8000.,250.),(8000.,0.),(0.,0.))); +#184=IFCINDEXEDPOLYCURVE(#183,$,.F.); +#185=IFCDIRECTION((0.,0.,1.)); +#186=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#184); +#187=IFCCARTESIANPOINT((0.,0.,0.)); +#188=IFCDIRECTION((0.,0.,1.)); +#189=IFCDIRECTION((1.,0.,0.)); +#190=IFCAXIS2PLACEMENT3D(#187,#188,#189); +#191=IFCEXTRUDEDAREASOLID(#186,#190,#185,3500.); +#192=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#191)); +#193=IFCPRODUCTDEFINITIONSHAPE($,$,(#192)); +#199=IFCCARTESIANPOINT((0.,8000.,0.)); +#200=IFCDIRECTION((0.,0.,1.)); +#201=IFCDIRECTION((-1.8369701987210297E-16,-1.,0.)); +#202=IFCAXIS2PLACEMENT3D(#199,#200,#201); +#203=IFCLOCALPLACEMENT($,#202); +#204=IFCPROPERTYSET('39oe_2qoL8dAqfae9_JT0b',$,'Pset_WallCommon',$,(#206,#207,#208,#209)); +#205=IFCRELDEFINESBYPROPERTIES('2McXLqJzj8gR0nBDK4Qz_f',$,$,$,(#182),#204); +#206=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#207=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI90'),$); +#208=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#209=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('WL-104'),$); +#210=IFCELEMENTQUANTITY('0EJZMkmc51O81i1JJxLX7b',$,'Qto_WallBaseQuantities',$,'BaseQuantities',(#212,#213,#214,#215,#216,#217,#218)); +#211=IFCRELDEFINESBYPROPERTIES('3us$qUXYf2vutAgcLj6x8D',$,$,$,(#182),#210); +#212=IFCQUANTITYLENGTH('Length',$,$,8000.,$); +#213=IFCQUANTITYLENGTH('Height',$,$,3500.,$); +#214=IFCQUANTITYLENGTH('Width',$,$,250.,$); +#215=IFCQUANTITYVOLUME('GrossVolume',$,$,7.,$); +#216=IFCQUANTITYVOLUME('NetVolume',$,$,7.,$); +#217=IFCQUANTITYAREA('GrossSideArea',$,$,28.,$); +#218=IFCQUANTITYAREA('NetSideArea',$,$,28.,$); +#219=IFCWALL('2_1oS7szL6X8X3t$dennS6',$,'WL-105',$,$,#240,#230,$,.SOLIDWALL.); +#220=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,150.),(6000.,150.),(6000.,0.),(0.,0.))); +#221=IFCINDEXEDPOLYCURVE(#220,$,.F.); +#222=IFCDIRECTION((0.,0.,1.)); +#223=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#221); +#224=IFCCARTESIANPOINT((0.,0.,0.)); +#225=IFCDIRECTION((0.,0.,1.)); +#226=IFCDIRECTION((1.,0.,0.)); +#227=IFCAXIS2PLACEMENT3D(#224,#225,#226); +#228=IFCEXTRUDEDAREASOLID(#223,#227,#222,3500.); +#229=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#228)); +#230=IFCPRODUCTDEFINITIONSHAPE($,$,(#229)); +#236=IFCCARTESIANPOINT((6000.,250.,0.)); +#237=IFCDIRECTION((0.,0.,1.)); +#238=IFCDIRECTION((6.123233995736766E-17,1.,0.)); +#239=IFCAXIS2PLACEMENT3D(#236,#237,#238); +#240=IFCLOCALPLACEMENT($,#239); +#241=IFCPROPERTYSET('2711TbM1P1ahpHgr$HaewC',$,'Pset_WallCommon',$,(#243,#244,#245,#246)); +#242=IFCRELDEFINESBYPROPERTIES('3NTUMI755FpwC1$SE_pD7F',$,$,$,(#219),#241); +#243=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#244=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI60'),$); +#245=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.F.),$); +#246=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('WL-105'),$); +#247=IFCELEMENTQUANTITY('1qbVzGEyb9lBgvvq4YzLUQ',$,'Qto_WallBaseQuantities',$,'BaseQuantities',(#249,#250,#251,#252,#253,#254,#255)); +#248=IFCRELDEFINESBYPROPERTIES('1nCA_nj9f2APgOPV0MLWDw',$,$,$,(#219),#247); +#249=IFCQUANTITYLENGTH('Length',$,$,6000.,$); +#250=IFCQUANTITYLENGTH('Height',$,$,3500.,$); +#251=IFCQUANTITYLENGTH('Width',$,$,150.,$); +#252=IFCQUANTITYVOLUME('GrossVolume',$,$,3.15,$); +#253=IFCQUANTITYVOLUME('NetVolume',$,$,3.15,$); +#254=IFCQUANTITYAREA('GrossSideArea',$,$,21.,$); +#255=IFCQUANTITYAREA('NetSideArea',$,$,21.,$); +#256=IFCCLASSIFICATIONREFERENCE($,'Ss_25_10_32','Internal wall systems',#26,$,$); +#257=IFCRELASSOCIATESCLASSIFICATION('0efuTMblb1qxR0asyfP_rZ',$,$,$,(#219),#256); +#258=IFCCOLUMN('1KM8YeCcX9rRhYjBVMcMTD',$,'C-101',$,$,#279,#269,$,.COLUMN.); +#259=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,400.),(400.,400.),(400.,0.),(0.,0.))); +#260=IFCINDEXEDPOLYCURVE(#259,$,.F.); +#261=IFCDIRECTION((0.,0.,1.)); +#262=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#260); +#263=IFCCARTESIANPOINT((0.,0.,0.)); +#264=IFCDIRECTION((0.,0.,1.)); +#265=IFCDIRECTION((1.,0.,0.)); +#266=IFCAXIS2PLACEMENT3D(#263,#264,#265); +#267=IFCEXTRUDEDAREASOLID(#262,#266,#261,3500.); +#268=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#267)); +#269=IFCPRODUCTDEFINITIONSHAPE($,$,(#268)); +#275=IFCCARTESIANPOINT((300.,300.,0.)); +#276=IFCDIRECTION((0.,0.,1.)); +#277=IFCDIRECTION((1.,0.,0.)); +#278=IFCAXIS2PLACEMENT3D(#275,#276,#277); +#279=IFCLOCALPLACEMENT($,#278); +#280=IFCPROPERTYSET('2ykrTfHq52Cfv9pqFf9D7K',$,'Pset_ColumnCommon',$,(#282,#283,#284,#285)); +#281=IFCRELDEFINESBYPROPERTIES('025bLfPXbDw80qbC4JM5Ic',$,$,$,(#258),#280); +#282=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#283=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#284=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R120'),$); +#285=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('C-101'),$); +#286=IFCELEMENTQUANTITY('2TmuuJ$DHBdx$1qIZr7cnY',$,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#288,#289,#290,#291)); +#287=IFCRELDEFINESBYPROPERTIES('2685SBGx95Oxrj_EbfkFty',$,$,$,(#258),#286); +#288=IFCQUANTITYLENGTH('Length',$,$,3500.,$); +#289=IFCQUANTITYAREA('CrossSectionArea',$,$,0.16,$); +#290=IFCQUANTITYVOLUME('GrossVolume',$,$,0.56,$); +#291=IFCQUANTITYVOLUME('NetVolume',$,$,0.56,$); +#292=IFCCLASSIFICATIONREFERENCE($,'Ss_20_05_15','Concrete column systems',#26,$,$); +#293=IFCRELASSOCIATESCLASSIFICATION('2gegcQEvj2J9e$5mddD5OU',$,$,$,(#1153,#328,#1051,#258,#362,#1085,#396,#1119,#294,#1017),#292); +#294=IFCCOLUMN('3IbjUzHpjDRuP4kDWoBOdT',$,'C-102',$,$,#315,#305,$,.COLUMN.); +#295=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,400.),(400.,400.),(400.,0.),(0.,0.))); +#296=IFCINDEXEDPOLYCURVE(#295,$,.F.); +#297=IFCDIRECTION((0.,0.,1.)); +#298=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#296); +#299=IFCCARTESIANPOINT((0.,0.,0.)); +#300=IFCDIRECTION((0.,0.,1.)); +#301=IFCDIRECTION((1.,0.,0.)); +#302=IFCAXIS2PLACEMENT3D(#299,#300,#301); +#303=IFCEXTRUDEDAREASOLID(#298,#302,#297,3500.); +#304=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#303)); +#305=IFCPRODUCTDEFINITIONSHAPE($,$,(#304)); +#311=IFCCARTESIANPOINT((6000.,300.,0.)); +#312=IFCDIRECTION((0.,0.,1.)); +#313=IFCDIRECTION((1.,0.,0.)); +#314=IFCAXIS2PLACEMENT3D(#311,#312,#313); +#315=IFCLOCALPLACEMENT($,#314); +#316=IFCPROPERTYSET('3WAKK2a2X39eew8voeLOOf',$,'Pset_ColumnCommon',$,(#318,#319,#320,#321)); +#317=IFCRELDEFINESBYPROPERTIES('0hwEPMDS1BZBHGMUsUKNfM',$,$,$,(#294),#316); +#318=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#319=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#320=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R120'),$); +#321=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('C-102'),$); +#322=IFCELEMENTQUANTITY('1oYHiDEefByA0vkJOK2J2u',$,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#324,#325,#326,#327)); +#323=IFCRELDEFINESBYPROPERTIES('1dack51H5A9ONq$fta9NY_',$,$,$,(#294),#322); +#324=IFCQUANTITYLENGTH('Length',$,$,3500.,$); +#325=IFCQUANTITYAREA('CrossSectionArea',$,$,0.16,$); +#326=IFCQUANTITYVOLUME('GrossVolume',$,$,0.56,$); +#327=IFCQUANTITYVOLUME('NetVolume',$,$,0.56,$); +#328=IFCCOLUMN('1G20W5wmPEauz_nY7hwIyR',$,'C-103',$,$,#349,#339,$,.COLUMN.); +#329=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,400.),(400.,400.),(400.,0.),(0.,0.))); +#330=IFCINDEXEDPOLYCURVE(#329,$,.F.); +#331=IFCDIRECTION((0.,0.,1.)); +#332=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#330); +#333=IFCCARTESIANPOINT((0.,0.,0.)); +#334=IFCDIRECTION((0.,0.,1.)); +#335=IFCDIRECTION((1.,0.,0.)); +#336=IFCAXIS2PLACEMENT3D(#333,#334,#335); +#337=IFCEXTRUDEDAREASOLID(#332,#336,#331,3500.); +#338=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#337)); +#339=IFCPRODUCTDEFINITIONSHAPE($,$,(#338)); +#345=IFCCARTESIANPOINT((11300.,300.,0.)); +#346=IFCDIRECTION((0.,0.,1.)); +#347=IFCDIRECTION((1.,0.,0.)); +#348=IFCAXIS2PLACEMENT3D(#345,#346,#347); +#349=IFCLOCALPLACEMENT($,#348); +#350=IFCPROPERTYSET('19t8lUJtX68PI5Z5iKHA6N',$,'Pset_ColumnCommon',$,(#352,#353,#354,#355)); +#351=IFCRELDEFINESBYPROPERTIES('2IeyEM_r57tQ4IV9oVvcuD',$,$,$,(#328),#350); +#352=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#353=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#354=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R120'),$); +#355=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('C-103'),$); +#356=IFCELEMENTQUANTITY('0NfjNE5efAsg2WpVNMh1Ip',$,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#358,#359,#360,#361)); +#357=IFCRELDEFINESBYPROPERTIES('2Ylw89vPD4NfWxV81LSo$5',$,$,$,(#328),#356); +#358=IFCQUANTITYLENGTH('Length',$,$,3500.,$); +#359=IFCQUANTITYAREA('CrossSectionArea',$,$,0.16,$); +#360=IFCQUANTITYVOLUME('GrossVolume',$,$,0.56,$); +#361=IFCQUANTITYVOLUME('NetVolume',$,$,0.56,$); +#362=IFCCOLUMN('1kVIrL4QT4duEcQIZ0lU7H',$,'C-104',$,$,#383,#373,$,.COLUMN.); +#363=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,400.),(400.,400.),(400.,0.),(0.,0.))); +#364=IFCINDEXEDPOLYCURVE(#363,$,.F.); +#365=IFCDIRECTION((0.,0.,1.)); +#366=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#364); +#367=IFCCARTESIANPOINT((0.,0.,0.)); +#368=IFCDIRECTION((0.,0.,1.)); +#369=IFCDIRECTION((1.,0.,0.)); +#370=IFCAXIS2PLACEMENT3D(#367,#368,#369); +#371=IFCEXTRUDEDAREASOLID(#366,#370,#365,3500.); +#372=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#371)); +#373=IFCPRODUCTDEFINITIONSHAPE($,$,(#372)); +#379=IFCCARTESIANPOINT((300.,7300.,0.)); +#380=IFCDIRECTION((0.,0.,1.)); +#381=IFCDIRECTION((1.,0.,0.)); +#382=IFCAXIS2PLACEMENT3D(#379,#380,#381); +#383=IFCLOCALPLACEMENT($,#382); +#384=IFCPROPERTYSET('3M1mcWLZ5Fy8CbqeQBcACQ',$,'Pset_ColumnCommon',$,(#386,#387,#388,#389)); +#385=IFCRELDEFINESBYPROPERTIES('0i6QKE0mn5KOropZ_jFev4',$,$,$,(#362),#384); +#386=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#387=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#388=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R120'),$); +#389=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('C-104'),$); +#390=IFCELEMENTQUANTITY('2MUVIzPdX2DOq_B4y$dXQ6',$,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#392,#393,#394,#395)); +#391=IFCRELDEFINESBYPROPERTIES('1cGiZYyjH5J9$HBromHCAy',$,$,$,(#362),#390); +#392=IFCQUANTITYLENGTH('Length',$,$,3500.,$); +#393=IFCQUANTITYAREA('CrossSectionArea',$,$,0.16,$); +#394=IFCQUANTITYVOLUME('GrossVolume',$,$,0.56,$); +#395=IFCQUANTITYVOLUME('NetVolume',$,$,0.56,$); +#396=IFCCOLUMN('0Mkh683Qf2DAmyOPGNzkvr',$,'C-105',$,$,#417,#407,$,.COLUMN.); +#397=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,400.),(400.,400.),(400.,0.),(0.,0.))); +#398=IFCINDEXEDPOLYCURVE(#397,$,.F.); +#399=IFCDIRECTION((0.,0.,1.)); +#400=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#398); +#401=IFCCARTESIANPOINT((0.,0.,0.)); +#402=IFCDIRECTION((0.,0.,1.)); +#403=IFCDIRECTION((1.,0.,0.)); +#404=IFCAXIS2PLACEMENT3D(#401,#402,#403); +#405=IFCEXTRUDEDAREASOLID(#400,#404,#399,3500.); +#406=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#405)); +#407=IFCPRODUCTDEFINITIONSHAPE($,$,(#406)); +#413=IFCCARTESIANPOINT((11300.,7300.,0.)); +#414=IFCDIRECTION((0.,0.,1.)); +#415=IFCDIRECTION((1.,0.,0.)); +#416=IFCAXIS2PLACEMENT3D(#413,#414,#415); +#417=IFCLOCALPLACEMENT($,#416); +#418=IFCPROPERTYSET('2SpzsJTVP2fwWif2EGwn4l',$,'Pset_ColumnCommon',$,(#420,#421,#422,#423)); +#419=IFCRELDEFINESBYPROPERTIES('1dXW9kxOr3_8UEZLgMoH8S',$,$,$,(#396),#418); +#420=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#421=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#422=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R120'),$); +#423=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('C-105'),$); +#424=IFCELEMENTQUANTITY('06ICHRDazDbgN$CkXiSYyV',$,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#426,#427,#428,#429)); +#425=IFCRELDEFINESBYPROPERTIES('1KREbfZnv79AsY5NaXvu3f',$,$,$,(#396),#424); +#426=IFCQUANTITYLENGTH('Length',$,$,3500.,$); +#427=IFCQUANTITYAREA('CrossSectionArea',$,$,0.16,$); +#428=IFCQUANTITYVOLUME('GrossVolume',$,$,0.56,$); +#429=IFCQUANTITYVOLUME('NetVolume',$,$,0.56,$); +#430=IFCBEAM('0oSdlcRuvFW9jUDNjqWoWp',$,'B-101',$,$,#451,#441,$,.BEAM.); +#431=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,300.),(11000.,300.),(11000.,0.),(0.,0.))); +#432=IFCINDEXEDPOLYCURVE(#431,$,.F.); +#433=IFCDIRECTION((0.,0.,1.)); +#434=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#432); +#435=IFCCARTESIANPOINT((0.,0.,0.)); +#436=IFCDIRECTION((0.,0.,1.)); +#437=IFCDIRECTION((1.,0.,0.)); +#438=IFCAXIS2PLACEMENT3D(#435,#436,#437); +#439=IFCEXTRUDEDAREASOLID(#434,#438,#433,500.); +#440=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#439)); +#441=IFCPRODUCTDEFINITIONSHAPE($,$,(#440)); +#447=IFCCARTESIANPOINT((500.,300.,3000.)); +#448=IFCDIRECTION((0.,0.,1.)); +#449=IFCDIRECTION((1.,0.,0.)); +#450=IFCAXIS2PLACEMENT3D(#447,#448,#449); +#451=IFCLOCALPLACEMENT($,#450); +#452=IFCRELASSOCIATESMATERIAL('1XohTtNB50fgcGFepJpQsD',$,$,$,(#467,#1182,#430),#22); +#453=IFCPROPERTYSET('24qHKEXtvEPA8zKf0EIM0x',$,'Pset_BeamCommon',$,(#455,#456,#457,#458)); +#454=IFCRELDEFINESBYPROPERTIES('3Gn$iN1yv0hA742luXLCTf',$,$,$,(#430),#453); +#455=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#456=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#457=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R60'),$); +#458=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('B-101'),$); +#459=IFCELEMENTQUANTITY('0sAEZmTij9Lup8HvU0PzXp',$,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#461,#462,#463,#464)); +#460=IFCRELDEFINESBYPROPERTIES('3o8066RQXBDxuTH5MCIuCh',$,$,$,(#430),#459); +#461=IFCQUANTITYLENGTH('Length',$,$,11000.,$); +#462=IFCQUANTITYAREA('CrossSectionArea',$,$,0.15,$); +#463=IFCQUANTITYVOLUME('GrossVolume',$,$,1.65,$); +#464=IFCQUANTITYVOLUME('NetVolume',$,$,1.65,$); +#465=IFCCLASSIFICATIONREFERENCE($,'Ss_20_10_75','Steel beam systems',#26,$,$); +#466=IFCRELASSOCIATESCLASSIFICATION('1j22PWHWL2lAaUYdrnHFNH',$,$,$,(#467,#1182,#430),#465); +#467=IFCBEAM('3EA9ylAjf9eQeMFfDEbNIS',$,'B-102',$,$,#488,#478,$,.BEAM.); +#468=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,300.),(11000.,300.),(11000.,0.),(0.,0.))); +#469=IFCINDEXEDPOLYCURVE(#468,$,.F.); +#470=IFCDIRECTION((0.,0.,1.)); +#471=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#469); +#472=IFCCARTESIANPOINT((0.,0.,0.)); +#473=IFCDIRECTION((0.,0.,1.)); +#474=IFCDIRECTION((1.,0.,0.)); +#475=IFCAXIS2PLACEMENT3D(#472,#473,#474); +#476=IFCEXTRUDEDAREASOLID(#471,#475,#470,500.); +#477=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#476)); +#478=IFCPRODUCTDEFINITIONSHAPE($,$,(#477)); +#484=IFCCARTESIANPOINT((500.,7300.,3000.)); +#485=IFCDIRECTION((0.,0.,1.)); +#486=IFCDIRECTION((1.,0.,0.)); +#487=IFCAXIS2PLACEMENT3D(#484,#485,#486); +#488=IFCLOCALPLACEMENT($,#487); +#489=IFCPROPERTYSET('2GntKcFcP8Z8VpvSW4kiEe',$,'Pset_BeamCommon',$,(#491,#492,#493,#494)); +#490=IFCRELDEFINESBYPROPERTIES('3l3mQIw3v0VwpLJoxITbvj',$,$,$,(#467),#489); +#491=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#492=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#493=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R60'),$); +#494=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('B-102'),$); +#495=IFCELEMENTQUANTITY('0V14jtNSjBJA2vF4m1goxH',$,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#497,#498,#499,#500)); +#496=IFCRELDEFINESBYPROPERTIES('2z6JWIK8f5FffLhRHIaMN9',$,$,$,(#467),#495); +#497=IFCQUANTITYLENGTH('Length',$,$,11000.,$); +#498=IFCQUANTITYAREA('CrossSectionArea',$,$,0.15,$); +#499=IFCQUANTITYVOLUME('GrossVolume',$,$,1.65,$); +#500=IFCQUANTITYVOLUME('NetVolume',$,$,1.65,$); +#501=IFCDOOR('1rIJ4Q65D2SRFg1HcpfYfL',$,'D-101',$,$,#522,#512,$,$,$,.DOOR.,$,$); +#502=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,100.),(1000.,100.),(1000.,0.),(0.,0.))); +#503=IFCINDEXEDPOLYCURVE(#502,$,.F.); +#504=IFCDIRECTION((0.,0.,1.)); +#505=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#503); +#506=IFCCARTESIANPOINT((0.,0.,0.)); +#507=IFCDIRECTION((0.,0.,1.)); +#508=IFCDIRECTION((1.,0.,0.)); +#509=IFCAXIS2PLACEMENT3D(#506,#507,#508); +#510=IFCEXTRUDEDAREASOLID(#505,#509,#504,2100.); +#511=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#510)); +#512=IFCPRODUCTDEFINITIONSHAPE($,$,(#511)); +#518=IFCCARTESIANPOINT((2500.,0.,0.)); +#519=IFCDIRECTION((0.,0.,1.)); +#520=IFCDIRECTION((1.,0.,0.)); +#521=IFCAXIS2PLACEMENT3D(#518,#519,#520); +#522=IFCLOCALPLACEMENT($,#521); +#523=IFCRELASSOCIATESMATERIAL('2FMJNBocv18ggMEHYRTe_C',$,$,$,(#568,#501,#536,#1216),#23); +#524=IFCPROPERTYSET('1r0EUnC7H0cfendhopIE1K',$,'Pset_DoorCommon',$,(#526,#527,#528)); +#525=IFCRELDEFINESBYPROPERTIES('3r2GEU66z6EQXoLLtqpJma',$,$,$,(#501),#524); +#526=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#527=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('D-101'),$); +#528=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('EI30'),$); +#529=IFCELEMENTQUANTITY('2DVu8gBwz1luYUCLSe9xRE',$,'Qto_DoorBaseQuantities',$,'BaseQuantities',(#531,#532,#533)); +#530=IFCRELDEFINESBYPROPERTIES('2OFadajkrBZf7_03$ZyJQK',$,$,$,(#501),#529); +#531=IFCQUANTITYLENGTH('Width',$,$,1000.,$); +#532=IFCQUANTITYLENGTH('Height',$,$,2100.,$); +#533=IFCQUANTITYAREA('Area',$,$,2.1,$); +#534=IFCCLASSIFICATIONREFERENCE($,'Pr_30_59_24','Doorsets',#26,$,$); +#535=IFCRELASSOCIATESCLASSIFICATION('2tvk$sILLD9BoQYjMht_Ob',$,$,$,(#568,#501,#536,#1216),#534); +#536=IFCDOOR('1U$pK2R5TE79JLhNCeZiMc',$,'D-102',$,$,#557,#547,$,$,$,.DOOR.,$,$); +#537=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,100.),(1000.,100.),(1000.,0.),(0.,0.))); +#538=IFCINDEXEDPOLYCURVE(#537,$,.F.); +#539=IFCDIRECTION((0.,0.,1.)); +#540=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#538); +#541=IFCCARTESIANPOINT((0.,0.,0.)); +#542=IFCDIRECTION((0.,0.,1.)); +#543=IFCDIRECTION((1.,0.,0.)); +#544=IFCAXIS2PLACEMENT3D(#541,#542,#543); +#545=IFCEXTRUDEDAREASOLID(#540,#544,#539,2100.); +#546=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#545)); +#547=IFCPRODUCTDEFINITIONSHAPE($,$,(#546)); +#553=IFCCARTESIANPOINT((6000.,3000.,0.)); +#554=IFCDIRECTION((0.,0.,1.)); +#555=IFCDIRECTION((1.,0.,0.)); +#556=IFCAXIS2PLACEMENT3D(#553,#554,#555); +#557=IFCLOCALPLACEMENT($,#556); +#558=IFCPROPERTYSET('2rxEctX1fDCvpFuLBiA_OG',$,'Pset_DoorCommon',$,(#560,#561,#562)); +#559=IFCRELDEFINESBYPROPERTIES('2OcQ2znFrE$v4M8LtIz9Jm',$,$,$,(#536),#558); +#560=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#561=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('D-102'),$); +#562=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('EI60'),$); +#563=IFCELEMENTQUANTITY('3OzXhNaabDPgG8OIh0nquh',$,'Qto_DoorBaseQuantities',$,'BaseQuantities',(#565,#566,#567)); +#564=IFCRELDEFINESBYPROPERTIES('0819gUP99F385JNx4vXcS2',$,$,$,(#536),#563); +#565=IFCQUANTITYLENGTH('Width',$,$,1000.,$); +#566=IFCQUANTITYLENGTH('Height',$,$,2100.,$); +#567=IFCQUANTITYAREA('Area',$,$,2.1,$); +#568=IFCDOOR('1Y0DLMcffBEfFN6$xe3kNn',$,'D-103',$,$,#589,#579,$,$,$,.DOOR.,$,$); +#569=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,100.),(1000.,100.),(1000.,0.),(0.,0.))); +#570=IFCINDEXEDPOLYCURVE(#569,$,.F.); +#571=IFCDIRECTION((0.,0.,1.)); +#572=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#570); +#573=IFCCARTESIANPOINT((0.,0.,0.)); +#574=IFCDIRECTION((0.,0.,1.)); +#575=IFCDIRECTION((1.,0.,0.)); +#576=IFCAXIS2PLACEMENT3D(#573,#574,#575); +#577=IFCEXTRUDEDAREASOLID(#572,#576,#571,2100.); +#578=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#577)); +#579=IFCPRODUCTDEFINITIONSHAPE($,$,(#578)); +#585=IFCCARTESIANPOINT((9000.,0.,0.)); +#586=IFCDIRECTION((0.,0.,1.)); +#587=IFCDIRECTION((1.,0.,0.)); +#588=IFCAXIS2PLACEMENT3D(#585,#586,#587); +#589=IFCLOCALPLACEMENT($,#588); +#590=IFCPROPERTYSET('3exEcOyefDih8QH2G3RfRL',$,'Pset_DoorCommon',$,(#592,#593)); +#591=IFCRELDEFINESBYPROPERTIES('3RbBQlBDzAwBuOa4ewOlan',$,$,$,(#568),#590); +#592=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#593=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('D-103'),$); +#594=IFCELEMENTQUANTITY('0mkXahpLXDVBfKWmd7sFgL',$,'Qto_DoorBaseQuantities',$,'BaseQuantities',(#596,#597,#598)); +#595=IFCRELDEFINESBYPROPERTIES('0aiOCjS7z5OAuT6RQRGsOM',$,$,$,(#568),#594); +#596=IFCQUANTITYLENGTH('Width',$,$,1000.,$); +#597=IFCQUANTITYLENGTH('Height',$,$,2100.,$); +#598=IFCQUANTITYAREA('Area',$,$,2.1,$); +#599=IFCWINDOW('1QjNfC_MTAsuPIVwAd22mT',$,'W-101',$,$,#620,#610,$,$,$,.WINDOW.,$,$); +#600=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,80.),(1500.,80.),(1500.,0.),(0.,0.))); +#601=IFCINDEXEDPOLYCURVE(#600,$,.F.); +#602=IFCDIRECTION((0.,0.,1.)); +#603=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#601); +#604=IFCCARTESIANPOINT((0.,0.,0.)); +#605=IFCDIRECTION((0.,0.,1.)); +#606=IFCDIRECTION((1.,0.,0.)); +#607=IFCAXIS2PLACEMENT3D(#604,#605,#606); +#608=IFCEXTRUDEDAREASOLID(#603,#607,#602,1200.); +#609=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#608)); +#610=IFCPRODUCTDEFINITIONSHAPE($,$,(#609)); +#616=IFCCARTESIANPOINT((1000.,8000.,1000.)); +#617=IFCDIRECTION((0.,0.,1.)); +#618=IFCDIRECTION((1.,0.,0.)); +#619=IFCAXIS2PLACEMENT3D(#616,#617,#618); +#620=IFCLOCALPLACEMENT($,#619); +#621=IFCRELASSOCIATESMATERIAL('3_xrwFfYrDDh0GHQUeCef6',$,$,$,(#1280,#1344,#1312,#634,#1248,#666,#599),#24); +#622=IFCPROPERTYSET('11Xg9gv0XC8v9whgCqDI_3',$,'Pset_WindowCommon',$,(#624,#625,#626)); +#623=IFCRELDEFINESBYPROPERTIES('3uBm7OKi19Ouqx7PgIYuIA',$,$,$,(#599),#622); +#624=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#625=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('W-101'),$); +#626=IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(1.1),$); +#627=IFCELEMENTQUANTITY('0sZ9H$yeHB8ulNm4PEB3AV',$,'Qto_WindowBaseQuantities',$,'BaseQuantities',(#629,#630,#631)); +#628=IFCRELDEFINESBYPROPERTIES('2cn879$H105xBnMgVaQuc6',$,$,$,(#599),#627); +#629=IFCQUANTITYLENGTH('Width',$,$,1500.,$); +#630=IFCQUANTITYLENGTH('Height',$,$,1200.,$); +#631=IFCQUANTITYAREA('Area',$,$,1.8,$); +#632=IFCCLASSIFICATIONREFERENCE($,'Pr_30_59_98','Windows',#26,$,$); +#633=IFCRELASSOCIATESCLASSIFICATION('1OsvdssOr0UhRa0UGK9VON',$,$,$,(#1280,#1344,#1312,#634,#1248,#666,#599),#632); +#634=IFCWINDOW('2HLzUdE6vClBjocOde0hSP',$,'W-102',$,$,#655,#645,$,$,$,.WINDOW.,$,$); +#635=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,80.),(1500.,80.),(1500.,0.),(0.,0.))); +#636=IFCINDEXEDPOLYCURVE(#635,$,.F.); +#637=IFCDIRECTION((0.,0.,1.)); +#638=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#636); +#639=IFCCARTESIANPOINT((0.,0.,0.)); +#640=IFCDIRECTION((0.,0.,1.)); +#641=IFCDIRECTION((1.,0.,0.)); +#642=IFCAXIS2PLACEMENT3D(#639,#640,#641); +#643=IFCEXTRUDEDAREASOLID(#638,#642,#637,1200.); +#644=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#643)); +#645=IFCPRODUCTDEFINITIONSHAPE($,$,(#644)); +#651=IFCCARTESIANPOINT((4000.,8000.,1000.)); +#652=IFCDIRECTION((0.,0.,1.)); +#653=IFCDIRECTION((1.,0.,0.)); +#654=IFCAXIS2PLACEMENT3D(#651,#652,#653); +#655=IFCLOCALPLACEMENT($,#654); +#656=IFCPROPERTYSET('0pVowT$en82Okn0W7O_3bA',$,'Pset_WindowCommon',$,(#658,#659,#660)); +#657=IFCRELDEFINESBYPROPERTIES('1ilM53x1LFT95JYokNuyc9',$,$,$,(#634),#656); +#658=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#659=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('W-102'),$); +#660=IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(1.1),$); +#661=IFCELEMENTQUANTITY('2MEh1uak96Te4mlb3v956I',$,'Qto_WindowBaseQuantities',$,'BaseQuantities',(#663,#664,#665)); +#662=IFCRELDEFINESBYPROPERTIES('0f6PcOBxn62gMBQjkrMRkK',$,$,$,(#634),#661); +#663=IFCQUANTITYLENGTH('Width',$,$,1500.,$); +#664=IFCQUANTITYLENGTH('Height',$,$,1200.,$); +#665=IFCQUANTITYAREA('Area',$,$,1.8,$); +#666=IFCWINDOW('2ochKfqaX99ud1_2ByvWQf',$,'W-103',$,$,#687,#677,$,$,$,.WINDOW.,$,$); +#667=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,80.),(1500.,80.),(1500.,0.),(0.,0.))); +#668=IFCINDEXEDPOLYCURVE(#667,$,.F.); +#669=IFCDIRECTION((0.,0.,1.)); +#670=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#668); +#671=IFCCARTESIANPOINT((0.,0.,0.)); +#672=IFCDIRECTION((0.,0.,1.)); +#673=IFCDIRECTION((1.,0.,0.)); +#674=IFCAXIS2PLACEMENT3D(#671,#672,#673); +#675=IFCEXTRUDEDAREASOLID(#670,#674,#669,1200.); +#676=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#675)); +#677=IFCPRODUCTDEFINITIONSHAPE($,$,(#676)); +#683=IFCCARTESIANPOINT((8000.,8000.,1000.)); +#684=IFCDIRECTION((0.,0.,1.)); +#685=IFCDIRECTION((1.,0.,0.)); +#686=IFCAXIS2PLACEMENT3D(#683,#684,#685); +#687=IFCLOCALPLACEMENT($,#686); +#688=IFCPROPERTYSET('1rQt_gP511v9r$qk9A$pQv',$,'Pset_WindowCommon',$,(#690,#691,#692)); +#689=IFCRELDEFINESBYPROPERTIES('1pCK$5k3XE$haAZMoDq3Ik',$,$,$,(#666),#688); +#690=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#691=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('W-103'),$); +#692=IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(1.1),$); +#693=IFCELEMENTQUANTITY('1FRInVL5vFjPzA1Ue2Xamn',$,'Qto_WindowBaseQuantities',$,'BaseQuantities',(#695,#696,#697)); +#694=IFCRELDEFINESBYPROPERTIES('2ONfsSS$f4pw8RH6GrRAEo',$,$,$,(#666),#693); +#695=IFCQUANTITYLENGTH('Width',$,$,1500.,$); +#696=IFCQUANTITYLENGTH('Height',$,$,1200.,$); +#697=IFCQUANTITYAREA('Area',$,$,1.8,$); +#698=IFCSPACE('3yKaPu4HD4ExAZm$NkAkAb',$,'Office 1.01',$,$,#720,#709,$,$,.INTERNAL.,$); +#699=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,7500.),(5599.999999999999,7500.),(5599.999999999999,0.),(0.,0.))); +#700=IFCINDEXEDPOLYCURVE(#699,$,.F.); +#701=IFCDIRECTION((0.,0.,1.)); +#702=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#700); +#703=IFCCARTESIANPOINT((0.,0.,0.)); +#704=IFCDIRECTION((0.,0.,1.)); +#705=IFCDIRECTION((1.,0.,0.)); +#706=IFCAXIS2PLACEMENT3D(#703,#704,#705); +#707=IFCEXTRUDEDAREASOLID(#702,#706,#701,3250.); +#708=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#707)); +#709=IFCPRODUCTDEFINITIONSHAPE($,$,(#708)); +#715=IFCRELAGGREGATES('2LbMm_Ps96P81oHhJLTPf5',$,$,$,#14,(#698,#734)); +#716=IFCCARTESIANPOINT((250.,250.,0.)); +#717=IFCDIRECTION((0.,0.,1.)); +#718=IFCDIRECTION((1.,0.,0.)); +#719=IFCAXIS2PLACEMENT3D(#716,#717,#718); +#720=IFCLOCALPLACEMENT($,#719); +#721=IFCPROPERTYSET('0W2ZpwugjBPvyrCmygaut5',$,'Pset_SpaceCommon',$,(#723,#724,#725)); +#722=IFCRELDEFINESBYPROPERTIES('2sK6wmLF56ifeKMtKCC2YG',$,$,$,(#698),#721); +#723=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('Office 1.01'),$); +#724=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#725=IFCPROPERTYSINGLEVALUE('GrossPlannedArea',$,IFCAREAMEASURE(42.),$); +#726=IFCELEMENTQUANTITY('2ic0fpBRTCuf5qt6N9srg8',$,'Qto_SpaceBaseQuantities',$,'BaseQuantities',(#728,#729,#730,#731)); +#727=IFCRELDEFINESBYPROPERTIES('1hp_qKFkz5BOlICKNxHuNl',$,$,$,(#698),#726); +#728=IFCQUANTITYLENGTH('Height',$,$,3250.,$); +#729=IFCQUANTITYAREA('GrossFloorArea',$,$,42.,$); +#730=IFCQUANTITYAREA('NetFloorArea',$,$,39.9,$); +#731=IFCQUANTITYVOLUME('GrossVolume',$,$,136.5,$); +#732=IFCCLASSIFICATIONREFERENCE($,'SL_20_15_59','Office spaces',#26,$,$); +#733=IFCRELASSOCIATESCLASSIFICATION('2kzQTNd$P5nuCYaCyOxX9D',$,$,$,(#1376,#698,#734),#732); +#734=IFCSPACE('1Xh9cXiZb1BxwABhznR7IJ',$,'Office 1.02',$,$,#755,#745,$,$,.INTERNAL.,$); +#735=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,7500.),(5599.999999999999,7500.),(5599.999999999999,0.),(0.,0.))); +#736=IFCINDEXEDPOLYCURVE(#735,$,.F.); +#737=IFCDIRECTION((0.,0.,1.)); +#738=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#736); +#739=IFCCARTESIANPOINT((0.,0.,0.)); +#740=IFCDIRECTION((0.,0.,1.)); +#741=IFCDIRECTION((1.,0.,0.)); +#742=IFCAXIS2PLACEMENT3D(#739,#740,#741); +#743=IFCEXTRUDEDAREASOLID(#738,#742,#737,3250.); +#744=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#743)); +#745=IFCPRODUCTDEFINITIONSHAPE($,$,(#744)); +#751=IFCCARTESIANPOINT((6150.,250.,0.)); +#752=IFCDIRECTION((0.,0.,1.)); +#753=IFCDIRECTION((1.,0.,0.)); +#754=IFCAXIS2PLACEMENT3D(#751,#752,#753); +#755=IFCLOCALPLACEMENT($,#754); +#756=IFCPROPERTYSET('0lh2qZmAjE1g68Z2QIR0q6',$,'Pset_SpaceCommon',$,(#758,#759,#760)); +#757=IFCRELDEFINESBYPROPERTIES('2DR7jhHmvA8gZbpKGW0NuN',$,$,$,(#734),#756); +#758=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('Office 1.02'),$); +#759=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#760=IFCPROPERTYSINGLEVALUE('GrossPlannedArea',$,IFCAREAMEASURE(42.),$); +#761=IFCELEMENTQUANTITY('1v6H4NJgLEG9xIgJEubJt$',$,'Qto_SpaceBaseQuantities',$,'BaseQuantities',(#763,#764,#765,#766)); +#762=IFCRELDEFINESBYPROPERTIES('3uMhtWce14zAmIQa2793YM',$,$,$,(#734),#761); +#763=IFCQUANTITYLENGTH('Height',$,$,3250.,$); +#764=IFCQUANTITYAREA('GrossFloorArea',$,$,42.,$); +#765=IFCQUANTITYAREA('NetFloorArea',$,$,39.9,$); +#766=IFCQUANTITYVOLUME('GrossVolume',$,$,136.5,$); +#767=IFCDUCTSEGMENT('3bpgyhjRX00OaOufZGXVp8',$,'MEP-101',$,$,#788,#778,$,.RIGIDSEGMENT.); +#768=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,300.),(10000.,300.),(10000.,0.),(0.,0.))); +#769=IFCINDEXEDPOLYCURVE(#768,$,.F.); +#770=IFCDIRECTION((0.,0.,1.)); +#771=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#769); +#772=IFCCARTESIANPOINT((0.,0.,0.)); +#773=IFCDIRECTION((0.,0.,1.)); +#774=IFCDIRECTION((1.,0.,0.)); +#775=IFCAXIS2PLACEMENT3D(#772,#773,#774); +#776=IFCEXTRUDEDAREASOLID(#771,#775,#770,300.); +#777=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#776)); +#778=IFCPRODUCTDEFINITIONSHAPE($,$,(#777)); +#784=IFCCARTESIANPOINT((1000.,4000.,3100.)); +#785=IFCDIRECTION((0.,0.,1.)); +#786=IFCDIRECTION((1.,0.,0.)); +#787=IFCAXIS2PLACEMENT3D(#784,#785,#786); +#788=IFCLOCALPLACEMENT($,#787); +#789=IFCRELASSOCIATESMATERIAL('0C_bvOwM9DAuhzrc6J40Cj',$,$,$,(#801,#767),#25); +#790=IFCPROPERTYSET('3FwR2oXETF0B9BDWRyVa$z',$,'Pset_DuctSegmentTypeCommon',$,(#792,#793)); +#791=IFCRELDEFINESBYPROPERTIES('18Sx_7Crr4vv62r89BBfuH',$,$,$,(#767),#790); +#792=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('MEP-101'),$); +#793=IFCPROPERTYSINGLEVALUE('NominalDiameterOrWidth',$,IFCPOSITIVELENGTHMEASURE(300.),$); +#794=IFCELEMENTQUANTITY('1Ee8Gx3cf4dPYyMzl57UhF',$,'Qto_DuctSegmentBaseQuantities',$,'BaseQuantities',(#796,#797,#798)); +#795=IFCRELDEFINESBYPROPERTIES('3o6w2WRYHEP9Mqt2XOe0vF',$,$,$,(#767),#794); +#796=IFCQUANTITYLENGTH('Length',$,$,10000.,$); +#797=IFCQUANTITYAREA('GrossCrossSectionArea',$,$,0.09,$); +#798=IFCQUANTITYAREA('OuterSurfaceArea',$,$,12.,$); +#799=IFCCLASSIFICATIONREFERENCE($,'Ss_65_40_33','Ductwork systems',#26,$,$); +#800=IFCRELASSOCIATESCLASSIFICATION('1L$xL5gyP9r84JTMh5V4dK',$,$,$,(#767),#799); +#801=IFCDUCTSEGMENT('1a1bw1G7XEggO8ac3NDh54',$,'MEP-102',$,$,#822,#812,$,.RIGIDSEGMENT.); +#802=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,300.),(3000.,300.),(3000.,0.),(0.,0.))); +#803=IFCINDEXEDPOLYCURVE(#802,$,.F.); +#804=IFCDIRECTION((0.,0.,1.)); +#805=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#803); +#806=IFCCARTESIANPOINT((0.,0.,0.)); +#807=IFCDIRECTION((0.,0.,1.)); +#808=IFCDIRECTION((1.,0.,0.)); +#809=IFCAXIS2PLACEMENT3D(#806,#807,#808); +#810=IFCEXTRUDEDAREASOLID(#805,#809,#804,300.); +#811=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#810)); +#812=IFCPRODUCTDEFINITIONSHAPE($,$,(#811)); +#818=IFCCARTESIANPOINT((11000.,4000.,3100.)); +#819=IFCDIRECTION((0.,0.,1.)); +#820=IFCDIRECTION((6.123233995736766E-17,1.,0.)); +#821=IFCAXIS2PLACEMENT3D(#818,#819,#820); +#822=IFCLOCALPLACEMENT($,#821); +#823=IFCPROPERTYSET('0MWSNtsJP8Ef$hbt0CNNu9',$,'Pset_DuctSegmentTypeCommon',$,(#825,#826)); +#824=IFCRELDEFINESBYPROPERTIES('0rdv8dI1H42OHASodOJ82y',$,$,$,(#801),#823); +#825=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('MEP-102'),$); +#826=IFCPROPERTYSINGLEVALUE('NominalDiameterOrWidth',$,IFCPOSITIVELENGTHMEASURE(300.),$); +#827=IFCELEMENTQUANTITY('2E2CQCv416_P5mz5$MR66G',$,'Qto_DuctSegmentBaseQuantities',$,'BaseQuantities',(#829,#830,#831)); +#828=IFCRELDEFINESBYPROPERTIES('35JobHgWrFChLwDg3raVLl',$,$,$,(#801),#827); +#829=IFCQUANTITYLENGTH('Length',$,$,3000.,$); +#830=IFCQUANTITYAREA('GrossCrossSectionArea',$,$,0.09,$); +#831=IFCQUANTITYAREA('OuterSurfaceArea',$,$,3.6,$); +#832=IFCSLAB('22y566Bwb7UgQY4VJRrL3K',$,'SL-201',$,$,#854,#843,$,.FLOOR.); +#833=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,8000.),(12000.,8000.),(12000.,0.),(0.,0.))); +#834=IFCINDEXEDPOLYCURVE(#833,$,.F.); +#835=IFCDIRECTION((0.,0.,1.)); +#836=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#834); +#837=IFCCARTESIANPOINT((0.,0.,0.)); +#838=IFCDIRECTION((0.,0.,1.)); +#839=IFCDIRECTION((1.,0.,0.)); +#840=IFCAXIS2PLACEMENT3D(#837,#838,#839); +#841=IFCEXTRUDEDAREASOLID(#836,#840,#835,250.); +#842=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#841)); +#843=IFCPRODUCTDEFINITIONSHAPE($,$,(#842)); +#849=IFCRELCONTAINEDINSPATIALSTRUCTURE('2IzPN998nB6u4RD1DRW3XE',$,$,$,(#1280,#943,#1312,#1051,#869,#1182,#1344,#980,#1085,#1216,#906,#1248,#1119,#832,#1017),#15); +#850=IFCCARTESIANPOINT((0.,0.,3250.)); +#851=IFCDIRECTION((0.,0.,1.)); +#852=IFCDIRECTION((1.,0.,0.)); +#853=IFCAXIS2PLACEMENT3D(#850,#851,#852); +#854=IFCLOCALPLACEMENT($,#853); +#855=IFCPROPERTYSET('37jGu43kz0Oxf0BqLg4GZ6',$,'Pset_SlabCommon',$,(#857,#858,#859,#860)); +#856=IFCRELDEFINESBYPROPERTIES('05yIDgAeT2puS7BFLXLSvB',$,$,$,(#832),#855); +#857=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#858=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#859=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI120'),$); +#860=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('SL-201'),$); +#861=IFCELEMENTQUANTITY('26cCmlmAT8vux52OtD9bKl',$,'Qto_SlabBaseQuantities',$,'BaseQuantities',(#863,#864,#865,#866,#867,#868)); +#862=IFCRELDEFINESBYPROPERTIES('2xSlQqtnLEVxrSS8NotuT7',$,$,$,(#832),#861); +#863=IFCQUANTITYLENGTH('Depth',$,$,250.,$); +#864=IFCQUANTITYAREA('GrossArea',$,$,96.,$); +#865=IFCQUANTITYAREA('NetArea',$,$,96.,$); +#866=IFCQUANTITYVOLUME('GrossVolume',$,$,24.,$); +#867=IFCQUANTITYVOLUME('NetVolume',$,$,24.,$); +#868=IFCQUANTITYLENGTH('Perimeter',$,$,40000.,$); +#869=IFCWALL('1niwtJeqDDOhds1z$gNC_r',$,'WL-201',$,$,#890,#880,$,.SOLIDWALL.); +#870=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,250.),(12000.,250.),(12000.,0.),(0.,0.))); +#871=IFCINDEXEDPOLYCURVE(#870,$,.F.); +#872=IFCDIRECTION((0.,0.,1.)); +#873=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#871); +#874=IFCCARTESIANPOINT((0.,0.,0.)); +#875=IFCDIRECTION((0.,0.,1.)); +#876=IFCDIRECTION((1.,0.,0.)); +#877=IFCAXIS2PLACEMENT3D(#874,#875,#876); +#878=IFCEXTRUDEDAREASOLID(#873,#877,#872,3500.); +#879=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#878)); +#880=IFCPRODUCTDEFINITIONSHAPE($,$,(#879)); +#886=IFCCARTESIANPOINT((0.,0.,3500.)); +#887=IFCDIRECTION((0.,0.,1.)); +#888=IFCDIRECTION((1.,0.,0.)); +#889=IFCAXIS2PLACEMENT3D(#886,#887,#888); +#890=IFCLOCALPLACEMENT($,#889); +#891=IFCPROPERTYSET('2YWXQYLQb79fnL0vhN$iLg',$,'Pset_WallCommon',$,(#893,#894,#895,#896)); +#892=IFCRELDEFINESBYPROPERTIES('1hRiQqzTnA9upjf9fUMwrY',$,$,$,(#869),#891); +#893=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#894=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI90'),$); +#895=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#896=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('WL-201'),$); +#897=IFCELEMENTQUANTITY('1T6$qGedj8GxqRFOXtfEtI',$,'Qto_WallBaseQuantities',$,'BaseQuantities',(#899,#900,#901,#902,#903,#904,#905)); +#898=IFCRELDEFINESBYPROPERTIES('31NUHU9Br9qAvMwdGHqyZe',$,$,$,(#869),#897); +#899=IFCQUANTITYLENGTH('Length',$,$,12000.,$); +#900=IFCQUANTITYLENGTH('Height',$,$,3500.,$); +#901=IFCQUANTITYLENGTH('Width',$,$,250.,$); +#902=IFCQUANTITYVOLUME('GrossVolume',$,$,10.5,$); +#903=IFCQUANTITYVOLUME('NetVolume',$,$,10.5,$); +#904=IFCQUANTITYAREA('GrossSideArea',$,$,42.,$); +#905=IFCQUANTITYAREA('NetSideArea',$,$,42.,$); +#906=IFCWALL('3zdhRWbxDD1AraiGoQb0tH',$,'WL-202',$,$,#927,#917,$,.SOLIDWALL.); +#907=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,250.),(8000.,250.),(8000.,0.),(0.,0.))); +#908=IFCINDEXEDPOLYCURVE(#907,$,.F.); +#909=IFCDIRECTION((0.,0.,1.)); +#910=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#908); +#911=IFCCARTESIANPOINT((0.,0.,0.)); +#912=IFCDIRECTION((0.,0.,1.)); +#913=IFCDIRECTION((1.,0.,0.)); +#914=IFCAXIS2PLACEMENT3D(#911,#912,#913); +#915=IFCEXTRUDEDAREASOLID(#910,#914,#909,3500.); +#916=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#915)); +#917=IFCPRODUCTDEFINITIONSHAPE($,$,(#916)); +#923=IFCCARTESIANPOINT((12000.,0.,3500.)); +#924=IFCDIRECTION((0.,0.,1.)); +#925=IFCDIRECTION((6.123233995736766E-17,1.,0.)); +#926=IFCAXIS2PLACEMENT3D(#923,#924,#925); +#927=IFCLOCALPLACEMENT($,#926); +#928=IFCPROPERTYSET('1ClXJjPlf6N8FJ58A5GIPQ',$,'Pset_WallCommon',$,(#930,#931,#932,#933)); +#929=IFCRELDEFINESBYPROPERTIES('0ulAFEE6D5AATjfAIXW6Ht',$,$,$,(#906),#928); +#930=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#931=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI90'),$); +#932=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#933=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('WL-202'),$); +#934=IFCELEMENTQUANTITY('2mCsjc$ZfEixPtDGof_WVa',$,'Qto_WallBaseQuantities',$,'BaseQuantities',(#936,#937,#938,#939,#940,#941,#942)); +#935=IFCRELDEFINESBYPROPERTIES('1RzqlpmNP51uMoC2gLE2S$',$,$,$,(#906),#934); +#936=IFCQUANTITYLENGTH('Length',$,$,8000.,$); +#937=IFCQUANTITYLENGTH('Height',$,$,3500.,$); +#938=IFCQUANTITYLENGTH('Width',$,$,250.,$); +#939=IFCQUANTITYVOLUME('GrossVolume',$,$,7.,$); +#940=IFCQUANTITYVOLUME('NetVolume',$,$,7.,$); +#941=IFCQUANTITYAREA('GrossSideArea',$,$,28.,$); +#942=IFCQUANTITYAREA('NetSideArea',$,$,28.,$); +#943=IFCWALL('1K2ps1qyDEaAKz1F2vNd4l',$,'WL-201',$,$,#964,#954,$,.SOLIDWALL.); +#944=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,250.),(12000.,250.),(12000.,0.),(0.,0.))); +#945=IFCINDEXEDPOLYCURVE(#944,$,.F.); +#946=IFCDIRECTION((0.,0.,1.)); +#947=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#945); +#948=IFCCARTESIANPOINT((0.,0.,0.)); +#949=IFCDIRECTION((0.,0.,1.)); +#950=IFCDIRECTION((1.,0.,0.)); +#951=IFCAXIS2PLACEMENT3D(#948,#949,#950); +#952=IFCEXTRUDEDAREASOLID(#947,#951,#946,3500.); +#953=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#952)); +#954=IFCPRODUCTDEFINITIONSHAPE($,$,(#953)); +#960=IFCCARTESIANPOINT((12000.,8000.,3500.)); +#961=IFCDIRECTION((0.,0.,1.)); +#962=IFCDIRECTION((-1.,1.2246467991473532E-16,0.)); +#963=IFCAXIS2PLACEMENT3D(#960,#961,#962); +#964=IFCLOCALPLACEMENT($,#963); +#965=IFCPROPERTYSET('0Wli5oMpPFXPPFQOKLlUNi',$,'Pset_WallCommon',$,(#967,#968,#969,#970)); +#966=IFCRELDEFINESBYPROPERTIES('3kBZmsWFv95hL1f7fjD$gk',$,$,$,(#943),#965); +#967=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#968=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI90'),$); +#969=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#970=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('WL-201'),$); +#971=IFCELEMENTQUANTITY('1ySgAECtz0kPHWE3zOyH84',$,'Qto_WallBaseQuantities',$,'BaseQuantities',(#973,#974,#975,#976,#977,#978,#979)); +#972=IFCRELDEFINESBYPROPERTIES('1x_pS11DfBCPy3WoPAmeIX',$,$,$,(#943),#971); +#973=IFCQUANTITYLENGTH('Length',$,$,12000.,$); +#974=IFCQUANTITYLENGTH('Height',$,$,3500.,$); +#975=IFCQUANTITYLENGTH('Width',$,$,250.,$); +#976=IFCQUANTITYVOLUME('GrossVolume',$,$,10.5,$); +#977=IFCQUANTITYVOLUME('NetVolume',$,$,10.5,$); +#978=IFCQUANTITYAREA('GrossSideArea',$,$,42.,$); +#979=IFCQUANTITYAREA('NetSideArea',$,$,42.,$); +#980=IFCWALL('2Q97e$io96geok36GwMeWN',$,'WL-204',$,$,#1001,#991,$,.SOLIDWALL.); +#981=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,250.),(8000.,250.),(8000.,0.),(0.,0.))); +#982=IFCINDEXEDPOLYCURVE(#981,$,.F.); +#983=IFCDIRECTION((0.,0.,1.)); +#984=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#982); +#985=IFCCARTESIANPOINT((0.,0.,0.)); +#986=IFCDIRECTION((0.,0.,1.)); +#987=IFCDIRECTION((1.,0.,0.)); +#988=IFCAXIS2PLACEMENT3D(#985,#986,#987); +#989=IFCEXTRUDEDAREASOLID(#984,#988,#983,3500.); +#990=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#989)); +#991=IFCPRODUCTDEFINITIONSHAPE($,$,(#990)); +#997=IFCCARTESIANPOINT((0.,8000.,3500.)); +#998=IFCDIRECTION((0.,0.,1.)); +#999=IFCDIRECTION((-1.8369701987210297E-16,-1.,0.)); +#1000=IFCAXIS2PLACEMENT3D(#997,#998,#999); +#1001=IFCLOCALPLACEMENT($,#1000); +#1002=IFCPROPERTYSET('2JICkAR_T8IBmP8xws0JcR',$,'Pset_WallCommon',$,(#1004,#1005,#1006,#1007)); +#1003=IFCRELDEFINESBYPROPERTIES('1BG8y3borD$Rl52sB$aw4e',$,$,$,(#980),#1002); +#1004=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#1005=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI90'),$); +#1006=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#1007=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('WL-204'),$); +#1008=IFCELEMENTQUANTITY('2vZZUXthD1iBg$SaVe0N84',$,'Qto_WallBaseQuantities',$,'BaseQuantities',(#1010,#1011,#1012,#1013,#1014,#1015,#1016)); +#1009=IFCRELDEFINESBYPROPERTIES('1YHyPPhkr9RegseGmDeYhc',$,$,$,(#980),#1008); +#1010=IFCQUANTITYLENGTH('Length',$,$,8000.,$); +#1011=IFCQUANTITYLENGTH('Height',$,$,3500.,$); +#1012=IFCQUANTITYLENGTH('Width',$,$,250.,$); +#1013=IFCQUANTITYVOLUME('GrossVolume',$,$,7.,$); +#1014=IFCQUANTITYVOLUME('NetVolume',$,$,7.,$); +#1015=IFCQUANTITYAREA('GrossSideArea',$,$,28.,$); +#1016=IFCQUANTITYAREA('NetSideArea',$,$,28.,$); +#1017=IFCCOLUMN('36q0lTDMD7XfKdw0EmVC5R',$,'C-201',$,$,#1038,#1028,$,.COLUMN.); +#1018=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,400.),(400.,400.),(400.,0.),(0.,0.))); +#1019=IFCINDEXEDPOLYCURVE(#1018,$,.F.); +#1020=IFCDIRECTION((0.,0.,1.)); +#1021=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1019); +#1022=IFCCARTESIANPOINT((0.,0.,0.)); +#1023=IFCDIRECTION((0.,0.,1.)); +#1024=IFCDIRECTION((1.,0.,0.)); +#1025=IFCAXIS2PLACEMENT3D(#1022,#1023,#1024); +#1026=IFCEXTRUDEDAREASOLID(#1021,#1025,#1020,3500.); +#1027=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1026)); +#1028=IFCPRODUCTDEFINITIONSHAPE($,$,(#1027)); +#1034=IFCCARTESIANPOINT((300.,300.,3500.)); +#1035=IFCDIRECTION((0.,0.,1.)); +#1036=IFCDIRECTION((1.,0.,0.)); +#1037=IFCAXIS2PLACEMENT3D(#1034,#1035,#1036); +#1038=IFCLOCALPLACEMENT($,#1037); +#1039=IFCPROPERTYSET('3hrxc_NTjFYhdsPGRylMaZ',$,'Pset_ColumnCommon',$,(#1041,#1042,#1043,#1044)); +#1040=IFCRELDEFINESBYPROPERTIES('0jx7P9vVv5TwGhCncF21en',$,$,$,(#1017),#1039); +#1041=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#1042=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#1043=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R120'),$); +#1044=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('C-201'),$); +#1045=IFCELEMENTQUANTITY('1t_nwtcavFwejv6FZXzM3c',$,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#1047,#1048,#1049,#1050)); +#1046=IFCRELDEFINESBYPROPERTIES('2C3wM3SYT0xP6BQ7f$CDhW',$,$,$,(#1017),#1045); +#1047=IFCQUANTITYLENGTH('Length',$,$,3500.,$); +#1048=IFCQUANTITYAREA('CrossSectionArea',$,$,0.16,$); +#1049=IFCQUANTITYVOLUME('GrossVolume',$,$,0.56,$); +#1050=IFCQUANTITYVOLUME('NetVolume',$,$,0.56,$); +#1051=IFCCOLUMN('1viDl5r6rEfQnlKjcZks7h',$,'C-202',$,$,#1072,#1062,$,.COLUMN.); +#1052=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,400.),(400.,400.),(400.,0.),(0.,0.))); +#1053=IFCINDEXEDPOLYCURVE(#1052,$,.F.); +#1054=IFCDIRECTION((0.,0.,1.)); +#1055=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1053); +#1056=IFCCARTESIANPOINT((0.,0.,0.)); +#1057=IFCDIRECTION((0.,0.,1.)); +#1058=IFCDIRECTION((1.,0.,0.)); +#1059=IFCAXIS2PLACEMENT3D(#1056,#1057,#1058); +#1060=IFCEXTRUDEDAREASOLID(#1055,#1059,#1054,3500.); +#1061=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1060)); +#1062=IFCPRODUCTDEFINITIONSHAPE($,$,(#1061)); +#1068=IFCCARTESIANPOINT((6000.,300.,3500.)); +#1069=IFCDIRECTION((0.,0.,1.)); +#1070=IFCDIRECTION((1.,0.,0.)); +#1071=IFCAXIS2PLACEMENT3D(#1068,#1069,#1070); +#1072=IFCLOCALPLACEMENT($,#1071); +#1073=IFCPROPERTYSET('1FRu5_N2z5zgG0bwIN5GX0',$,'Pset_ColumnCommon',$,(#1075,#1076,#1077,#1078)); +#1074=IFCRELDEFINESBYPROPERTIES('1T2KoWstf4gunmKUDbzaAg',$,$,$,(#1051),#1073); +#1075=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#1076=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#1077=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R120'),$); +#1078=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('C-202'),$); +#1079=IFCELEMENTQUANTITY('2hktAy0eD7LQPvUmbHKK7l',$,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#1081,#1082,#1083,#1084)); +#1080=IFCRELDEFINESBYPROPERTIES('2WU37Q1bX0wxWcn5XZEpIy',$,$,$,(#1051),#1079); +#1081=IFCQUANTITYLENGTH('Length',$,$,3500.,$); +#1082=IFCQUANTITYAREA('CrossSectionArea',$,$,0.16,$); +#1083=IFCQUANTITYVOLUME('GrossVolume',$,$,0.56,$); +#1084=IFCQUANTITYVOLUME('NetVolume',$,$,0.56,$); +#1085=IFCCOLUMN('300_8l3vH4gh_FWaR8YDxW',$,'C-203',$,$,#1106,#1096,$,.COLUMN.); +#1086=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,400.),(400.,400.),(400.,0.),(0.,0.))); +#1087=IFCINDEXEDPOLYCURVE(#1086,$,.F.); +#1088=IFCDIRECTION((0.,0.,1.)); +#1089=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1087); +#1090=IFCCARTESIANPOINT((0.,0.,0.)); +#1091=IFCDIRECTION((0.,0.,1.)); +#1092=IFCDIRECTION((1.,0.,0.)); +#1093=IFCAXIS2PLACEMENT3D(#1090,#1091,#1092); +#1094=IFCEXTRUDEDAREASOLID(#1089,#1093,#1088,3500.); +#1095=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1094)); +#1096=IFCPRODUCTDEFINITIONSHAPE($,$,(#1095)); +#1102=IFCCARTESIANPOINT((11300.,300.,3500.)); +#1103=IFCDIRECTION((0.,0.,1.)); +#1104=IFCDIRECTION((1.,0.,0.)); +#1105=IFCAXIS2PLACEMENT3D(#1102,#1103,#1104); +#1106=IFCLOCALPLACEMENT($,#1105); +#1107=IFCPROPERTYSET('1J7PrDpd9E0xW9MtHwoUqd',$,'Pset_ColumnCommon',$,(#1109,#1110,#1111,#1112)); +#1108=IFCRELDEFINESBYPROPERTIES('0hRLRMZLL4Z8QWZwAqDBs7',$,$,$,(#1085),#1107); +#1109=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#1110=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#1111=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R120'),$); +#1112=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('C-203'),$); +#1113=IFCELEMENTQUANTITY('37X8QB8Eb2RxM9hZXKIaSK',$,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#1115,#1116,#1117,#1118)); +#1114=IFCRELDEFINESBYPROPERTIES('3Gx8eIlBv98fTyCR4euZNU',$,$,$,(#1085),#1113); +#1115=IFCQUANTITYLENGTH('Length',$,$,3500.,$); +#1116=IFCQUANTITYAREA('CrossSectionArea',$,$,0.16,$); +#1117=IFCQUANTITYVOLUME('GrossVolume',$,$,0.56,$); +#1118=IFCQUANTITYVOLUME('NetVolume',$,$,0.56,$); +#1119=IFCCOLUMN('1lRVY4w4TFZehBHIdtAXGT',$,'C-204',$,$,#1140,#1130,$,.COLUMN.); +#1120=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,400.),(400.,400.),(400.,0.),(0.,0.))); +#1121=IFCINDEXEDPOLYCURVE(#1120,$,.F.); +#1122=IFCDIRECTION((0.,0.,1.)); +#1123=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1121); +#1124=IFCCARTESIANPOINT((0.,0.,0.)); +#1125=IFCDIRECTION((0.,0.,1.)); +#1126=IFCDIRECTION((1.,0.,0.)); +#1127=IFCAXIS2PLACEMENT3D(#1124,#1125,#1126); +#1128=IFCEXTRUDEDAREASOLID(#1123,#1127,#1122,3500.); +#1129=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1128)); +#1130=IFCPRODUCTDEFINITIONSHAPE($,$,(#1129)); +#1136=IFCCARTESIANPOINT((300.,7300.,3500.)); +#1137=IFCDIRECTION((0.,0.,1.)); +#1138=IFCDIRECTION((1.,0.,0.)); +#1139=IFCAXIS2PLACEMENT3D(#1136,#1137,#1138); +#1140=IFCLOCALPLACEMENT($,#1139); +#1141=IFCPROPERTYSET('0CJnXl93T2EgvonG7DCWZh',$,'Pset_ColumnCommon',$,(#1143,#1144,#1145,#1146)); +#1142=IFCRELDEFINESBYPROPERTIES('03VToYAtn8ju1Cp8sqxIEt',$,$,$,(#1119),#1141); +#1143=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#1144=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#1145=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R120'),$); +#1146=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('C-204'),$); +#1147=IFCELEMENTQUANTITY('1Xf2Osa4L1H9nyLHwyxLa7',$,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#1149,#1150,#1151,#1152)); +#1148=IFCRELDEFINESBYPROPERTIES('1ZXxTVM$n70gid1m7UTjv0',$,$,$,(#1119),#1147); +#1149=IFCQUANTITYLENGTH('Length',$,$,3500.,$); +#1150=IFCQUANTITYAREA('CrossSectionArea',$,$,0.16,$); +#1151=IFCQUANTITYVOLUME('GrossVolume',$,$,0.56,$); +#1152=IFCQUANTITYVOLUME('NetVolume',$,$,0.56,$); +#1153=IFCCOLUMN('2FcEqYZEfBshSa5L3eGdFF',$,'C-205',$,$,#1169,#1164,$,.COLUMN.); +#1154=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,400.),(400.,400.),(400.,0.),(0.,0.))); +#1155=IFCINDEXEDPOLYCURVE(#1154,$,.F.); +#1156=IFCDIRECTION((0.,0.,1.)); +#1157=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1155); +#1158=IFCCARTESIANPOINT((0.,0.,0.)); +#1159=IFCDIRECTION((0.,0.,1.)); +#1160=IFCDIRECTION((1.,0.,0.)); +#1161=IFCAXIS2PLACEMENT3D(#1158,#1159,#1160); +#1162=IFCEXTRUDEDAREASOLID(#1157,#1161,#1156,3500.); +#1163=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1162)); +#1164=IFCPRODUCTDEFINITIONSHAPE($,$,(#1163)); +#1165=IFCCARTESIANPOINT((11300.,7300.,3500.)); +#1166=IFCDIRECTION((0.,0.,1.)); +#1167=IFCDIRECTION((1.,0.,0.)); +#1168=IFCAXIS2PLACEMENT3D(#1165,#1166,#1167); +#1169=IFCLOCALPLACEMENT($,#1168); +#1170=IFCPROPERTYSET('0XLFGfX5zFCuyHOVu5U_QX',$,'Pset_ColumnCommon',$,(#1172,#1173,#1174,#1175)); +#1171=IFCRELDEFINESBYPROPERTIES('2ZrwfuPaT4bP9YVLIGrhHp',$,$,$,(#1153),#1170); +#1172=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#1173=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#1174=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R120'),$); +#1175=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('C-205'),$); +#1176=IFCELEMENTQUANTITY('3BOuhsjQD7putHdGgN9Fgb',$,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#1178,#1179,#1180,#1181)); +#1177=IFCRELDEFINESBYPROPERTIES('1eCPCTc6r9AQ$Le7l6Dn5r',$,$,$,(#1153),#1176); +#1178=IFCQUANTITYLENGTH('Length',$,$,3500.,$); +#1179=IFCQUANTITYAREA('CrossSectionArea',$,$,0.16,$); +#1180=IFCQUANTITYVOLUME('GrossVolume',$,$,0.56,$); +#1181=IFCQUANTITYVOLUME('NetVolume',$,$,0.56,$); +#1182=IFCBEAM('3Qt_Yah3DBtxDS81XRmn_w',$,'B-201',$,$,#1203,#1193,$,.BEAM.); +#1183=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,300.),(11000.,300.),(11000.,0.),(0.,0.))); +#1184=IFCINDEXEDPOLYCURVE(#1183,$,.F.); +#1185=IFCDIRECTION((0.,0.,1.)); +#1186=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1184); +#1187=IFCCARTESIANPOINT((0.,0.,0.)); +#1188=IFCDIRECTION((0.,0.,1.)); +#1189=IFCDIRECTION((1.,0.,0.)); +#1190=IFCAXIS2PLACEMENT3D(#1187,#1188,#1189); +#1191=IFCEXTRUDEDAREASOLID(#1186,#1190,#1185,500.); +#1192=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1191)); +#1193=IFCPRODUCTDEFINITIONSHAPE($,$,(#1192)); +#1199=IFCCARTESIANPOINT((500.,300.,6500.)); +#1200=IFCDIRECTION((0.,0.,1.)); +#1201=IFCDIRECTION((1.,0.,0.)); +#1202=IFCAXIS2PLACEMENT3D(#1199,#1200,#1201); +#1203=IFCLOCALPLACEMENT($,#1202); +#1204=IFCPROPERTYSET('1OI79by450WAiGpte6Y$Lt',$,'Pset_BeamCommon',$,(#1206,#1207,#1208,#1209)); +#1205=IFCRELDEFINESBYPROPERTIES('3rKewce6j6kuV8cXO7Eu$b',$,$,$,(#1182),#1204); +#1206=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.T.),$); +#1207=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#1208=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('R60'),$); +#1209=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('B-201'),$); +#1210=IFCELEMENTQUANTITY('0RYlHcbi1FbuFUrjAx0pz1',$,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#1212,#1213,#1214,#1215)); +#1211=IFCRELDEFINESBYPROPERTIES('2v5SxD_15808irS349d8Kt',$,$,$,(#1182),#1210); +#1212=IFCQUANTITYLENGTH('Length',$,$,11000.,$); +#1213=IFCQUANTITYAREA('CrossSectionArea',$,$,0.15,$); +#1214=IFCQUANTITYVOLUME('GrossVolume',$,$,1.65,$); +#1215=IFCQUANTITYVOLUME('NetVolume',$,$,1.65,$); +#1216=IFCDOOR('1cgI3reEjAyukslRaG3D3f',$,'D-201',$,$,#1237,#1227,$,$,$,.DOOR.,$,$); +#1217=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,100.),(1000.,100.),(1000.,0.),(0.,0.))); +#1218=IFCINDEXEDPOLYCURVE(#1217,$,.F.); +#1219=IFCDIRECTION((0.,0.,1.)); +#1220=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1218); +#1221=IFCCARTESIANPOINT((0.,0.,0.)); +#1222=IFCDIRECTION((0.,0.,1.)); +#1223=IFCDIRECTION((1.,0.,0.)); +#1224=IFCAXIS2PLACEMENT3D(#1221,#1222,#1223); +#1225=IFCEXTRUDEDAREASOLID(#1220,#1224,#1219,2100.); +#1226=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1225)); +#1227=IFCPRODUCTDEFINITIONSHAPE($,$,(#1226)); +#1233=IFCCARTESIANPOINT((5500.,0.,3500.)); +#1234=IFCDIRECTION((0.,0.,1.)); +#1235=IFCDIRECTION((1.,0.,0.)); +#1236=IFCAXIS2PLACEMENT3D(#1233,#1234,#1235); +#1237=IFCLOCALPLACEMENT($,#1236); +#1238=IFCPROPERTYSET('2x_25Qhar9LAlveqTDe2xE',$,'Pset_DoorCommon',$,(#1240,#1241,#1242)); +#1239=IFCRELDEFINESBYPROPERTIES('2GytCK4VDDTwqiXxXzY5MP',$,$,$,(#1216),#1238); +#1240=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#1241=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('D-201'),$); +#1242=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('EI30'),$); +#1243=IFCELEMENTQUANTITY('37yCw78XP3kP5wB6ZiVfat',$,'Qto_DoorBaseQuantities',$,'BaseQuantities',(#1245,#1246,#1247)); +#1244=IFCRELDEFINESBYPROPERTIES('0O$sEP1PTCavyqOUVwXA_n',$,$,$,(#1216),#1243); +#1245=IFCQUANTITYLENGTH('Width',$,$,1000.,$); +#1246=IFCQUANTITYLENGTH('Height',$,$,2100.,$); +#1247=IFCQUANTITYAREA('Area',$,$,2.1,$); +#1248=IFCWINDOW('2GzpheZgH4OhQWIFAUhu5a',$,'W-201',$,$,#1269,#1259,$,$,$,.WINDOW.,$,$); +#1249=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,80.),(1500.,80.),(1500.,0.),(0.,0.))); +#1250=IFCINDEXEDPOLYCURVE(#1249,$,.F.); +#1251=IFCDIRECTION((0.,0.,1.)); +#1252=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1250); +#1253=IFCCARTESIANPOINT((0.,0.,0.)); +#1254=IFCDIRECTION((0.,0.,1.)); +#1255=IFCDIRECTION((1.,0.,0.)); +#1256=IFCAXIS2PLACEMENT3D(#1253,#1254,#1255); +#1257=IFCEXTRUDEDAREASOLID(#1252,#1256,#1251,1200.); +#1258=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1257)); +#1259=IFCPRODUCTDEFINITIONSHAPE($,$,(#1258)); +#1265=IFCCARTESIANPOINT((1000.,8000.,4500.)); +#1266=IFCDIRECTION((0.,0.,1.)); +#1267=IFCDIRECTION((1.,0.,0.)); +#1268=IFCAXIS2PLACEMENT3D(#1265,#1266,#1267); +#1269=IFCLOCALPLACEMENT($,#1268); +#1270=IFCPROPERTYSET('16uPLIGLrCQPnTWXvF0Oqh',$,'Pset_WindowCommon',$,(#1272,#1273,#1274)); +#1271=IFCRELDEFINESBYPROPERTIES('1coIyDpWH7M9w$3Wks4u_R',$,$,$,(#1248),#1270); +#1272=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#1273=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('W-201'),$); +#1274=IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(1.1),$); +#1275=IFCELEMENTQUANTITY('0LNMnKvL1FMu1wlQ25Vbog',$,'Qto_WindowBaseQuantities',$,'BaseQuantities',(#1277,#1278,#1279)); +#1276=IFCRELDEFINESBYPROPERTIES('3SBKK5xbz72AhwcIfnquWW',$,$,$,(#1248),#1275); +#1277=IFCQUANTITYLENGTH('Width',$,$,1500.,$); +#1278=IFCQUANTITYLENGTH('Height',$,$,1200.,$); +#1279=IFCQUANTITYAREA('Area',$,$,1.8,$); +#1280=IFCWINDOW('3aD8tPkOr8fuiaSy7P_p_X',$,'W-202',$,$,#1301,#1291,$,$,$,.WINDOW.,$,$); +#1281=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,80.),(1500.,80.),(1500.,0.),(0.,0.))); +#1282=IFCINDEXEDPOLYCURVE(#1281,$,.F.); +#1283=IFCDIRECTION((0.,0.,1.)); +#1284=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1282); +#1285=IFCCARTESIANPOINT((0.,0.,0.)); +#1286=IFCDIRECTION((0.,0.,1.)); +#1287=IFCDIRECTION((1.,0.,0.)); +#1288=IFCAXIS2PLACEMENT3D(#1285,#1286,#1287); +#1289=IFCEXTRUDEDAREASOLID(#1284,#1288,#1283,1200.); +#1290=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1289)); +#1291=IFCPRODUCTDEFINITIONSHAPE($,$,(#1290)); +#1297=IFCCARTESIANPOINT((4000.,8000.,4500.)); +#1298=IFCDIRECTION((0.,0.,1.)); +#1299=IFCDIRECTION((1.,0.,0.)); +#1300=IFCAXIS2PLACEMENT3D(#1297,#1298,#1299); +#1301=IFCLOCALPLACEMENT($,#1300); +#1302=IFCPROPERTYSET('2LghDl8z54y9g_WjSc4weh',$,'Pset_WindowCommon',$,(#1304,#1305,#1306)); +#1303=IFCRELDEFINESBYPROPERTIES('0t7S1zBhj7nutu3qt5bo18',$,$,$,(#1280),#1302); +#1304=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#1305=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('W-202'),$); +#1306=IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(1.1),$); +#1307=IFCELEMENTQUANTITY('33cuq61wX9g9UIB4XJ7_lg',$,'Qto_WindowBaseQuantities',$,'BaseQuantities',(#1309,#1310,#1311)); +#1308=IFCRELDEFINESBYPROPERTIES('0qkVEZKY50DfmmXMoCIPI8',$,$,$,(#1280),#1307); +#1309=IFCQUANTITYLENGTH('Width',$,$,1500.,$); +#1310=IFCQUANTITYLENGTH('Height',$,$,1200.,$); +#1311=IFCQUANTITYAREA('Area',$,$,1.8,$); +#1312=IFCWINDOW('2Zd$uPIzb10wSU4e1Lw8nw',$,'W-203',$,$,#1333,#1323,$,$,$,.WINDOW.,$,$); +#1313=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,80.),(1500.,80.),(1500.,0.),(0.,0.))); +#1314=IFCINDEXEDPOLYCURVE(#1313,$,.F.); +#1315=IFCDIRECTION((0.,0.,1.)); +#1316=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1314); +#1317=IFCCARTESIANPOINT((0.,0.,0.)); +#1318=IFCDIRECTION((0.,0.,1.)); +#1319=IFCDIRECTION((1.,0.,0.)); +#1320=IFCAXIS2PLACEMENT3D(#1317,#1318,#1319); +#1321=IFCEXTRUDEDAREASOLID(#1316,#1320,#1315,1200.); +#1322=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1321)); +#1323=IFCPRODUCTDEFINITIONSHAPE($,$,(#1322)); +#1329=IFCCARTESIANPOINT((8000.,8000.,4500.)); +#1330=IFCDIRECTION((0.,0.,1.)); +#1331=IFCDIRECTION((1.,0.,0.)); +#1332=IFCAXIS2PLACEMENT3D(#1329,#1330,#1331); +#1333=IFCLOCALPLACEMENT($,#1332); +#1334=IFCPROPERTYSET('3q$dp6E8X26B34WUTtNTCs',$,'Pset_WindowCommon',$,(#1336,#1337,#1338)); +#1335=IFCRELDEFINESBYPROPERTIES('2lDMEpwVb8HQNwdL_E0$zb',$,$,$,(#1312),#1334); +#1336=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#1337=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('W-203'),$); +#1338=IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(1.1),$); +#1339=IFCELEMENTQUANTITY('2vmaq6nRr03hXRB_v6SH5F',$,'Qto_WindowBaseQuantities',$,'BaseQuantities',(#1341,#1342,#1343)); +#1340=IFCRELDEFINESBYPROPERTIES('1KCl_P5bv9JQaRe9Q9vzao',$,$,$,(#1312),#1339); +#1341=IFCQUANTITYLENGTH('Width',$,$,1500.,$); +#1342=IFCQUANTITYLENGTH('Height',$,$,1200.,$); +#1343=IFCQUANTITYAREA('Area',$,$,1.8,$); +#1344=IFCWINDOW('24YJW4Vaj5cxAkwVPB9F0r',$,'W-204',$,$,#1365,#1355,$,$,$,.WINDOW.,$,$); +#1345=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,80.),(1500.,80.),(1500.,0.),(0.,0.))); +#1346=IFCINDEXEDPOLYCURVE(#1345,$,.F.); +#1347=IFCDIRECTION((0.,0.,1.)); +#1348=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1346); +#1349=IFCCARTESIANPOINT((0.,0.,0.)); +#1350=IFCDIRECTION((0.,0.,1.)); +#1351=IFCDIRECTION((1.,0.,0.)); +#1352=IFCAXIS2PLACEMENT3D(#1349,#1350,#1351); +#1353=IFCEXTRUDEDAREASOLID(#1348,#1352,#1347,1200.); +#1354=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1353)); +#1355=IFCPRODUCTDEFINITIONSHAPE($,$,(#1354)); +#1361=IFCCARTESIANPOINT((11000.,4000.,4500.)); +#1362=IFCDIRECTION((0.,0.,1.)); +#1363=IFCDIRECTION((1.,0.,0.)); +#1364=IFCAXIS2PLACEMENT3D(#1361,#1362,#1363); +#1365=IFCLOCALPLACEMENT($,#1364); +#1366=IFCPROPERTYSET('2oAB9ATIzE9hPxKRghyMLH',$,'Pset_WindowCommon',$,(#1368,#1369,#1370)); +#1367=IFCRELDEFINESBYPROPERTIES('3vqtgceeDENAvFF8au7nJD',$,$,$,(#1344),#1366); +#1368=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#1369=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER(''),$); +#1370=IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(1.1),$); +#1371=IFCELEMENTQUANTITY('0tH0Kr8cjBlvedldzdMnCm',$,'Qto_WindowBaseQuantities',$,'BaseQuantities',(#1373,#1374,#1375)); +#1372=IFCRELDEFINESBYPROPERTIES('1sLArk2f96aAJzz0bYz__$',$,$,$,(#1344),#1371); +#1373=IFCQUANTITYLENGTH('Width',$,$,1500.,$); +#1374=IFCQUANTITYLENGTH('Height',$,$,1200.,$); +#1375=IFCQUANTITYAREA('Area',$,$,1.8,$); +#1376=IFCSPACE('2k_XPRK0H7MBwX$trTsnKu',$,'Meeting 2.01',$,$,#1398,#1387,$,$,.INTERNAL.,$); +#1377=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,7500.),(11500.,7500.),(11500.,0.),(0.,0.))); +#1378=IFCINDEXEDPOLYCURVE(#1377,$,.F.); +#1379=IFCDIRECTION((0.,0.,1.)); +#1380=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1378); +#1381=IFCCARTESIANPOINT((0.,0.,0.)); +#1382=IFCDIRECTION((0.,0.,1.)); +#1383=IFCDIRECTION((1.,0.,0.)); +#1384=IFCAXIS2PLACEMENT3D(#1381,#1382,#1383); +#1385=IFCEXTRUDEDAREASOLID(#1380,#1384,#1379,3250.); +#1386=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1385)); +#1387=IFCPRODUCTDEFINITIONSHAPE($,$,(#1386)); +#1393=IFCRELAGGREGATES('0cAHzLlAvFK9oFEGXDYg$X',$,$,$,#15,(#1376)); +#1394=IFCCARTESIANPOINT((250.,250.,3500.)); +#1395=IFCDIRECTION((0.,0.,1.)); +#1396=IFCDIRECTION((1.,0.,0.)); +#1397=IFCAXIS2PLACEMENT3D(#1394,#1395,#1396); +#1398=IFCLOCALPLACEMENT($,#1397); +#1399=IFCPROPERTYSET('3XgBt1XfTFovkWqDbhmRao',$,'Pset_SpaceCommon',$,(#1401,#1402,#1403)); +#1400=IFCRELDEFINESBYPROPERTIES('1Hv1PSRSf14gmVVHqzTkA2',$,$,$,(#1376),#1399); +#1401=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('Meeting 2.01'),$); +#1402=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#1403=IFCPROPERTYSINGLEVALUE('GrossPlannedArea',$,IFCAREAMEASURE(86.25),$); +#1404=IFCELEMENTQUANTITY('0R8vF8s8r3dxDVSKy1EBES',$,'Qto_SpaceBaseQuantities',$,'BaseQuantities',(#1406,#1407,#1408,#1409)); +#1405=IFCRELDEFINESBYPROPERTIES('0m_ZsebwPEOhtqU788ai$j',$,$,$,(#1376),#1404); +#1406=IFCQUANTITYLENGTH('Height',$,$,3250.,$); +#1407=IFCQUANTITYAREA('GrossFloorArea',$,$,86.25,$); +#1408=IFCQUANTITYAREA('NetFloorArea',$,$,81.9375,$); +#1409=IFCQUANTITYVOLUME('GrossVolume',$,$,280.3125,$); +#1410=IFCROOF('0Ijn$vDv50fxv5Tp0EsZjv',$,'RF-301',$,$,#1432,#1421,$,.FLAT_ROOF.); +#1411=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,8400.),(12400.,8400.),(12400.,0.),(0.,0.))); +#1412=IFCINDEXEDPOLYCURVE(#1411,$,.F.); +#1413=IFCDIRECTION((0.,0.,1.)); +#1414=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#1412); +#1415=IFCCARTESIANPOINT((0.,0.,0.)); +#1416=IFCDIRECTION((0.,0.,1.)); +#1417=IFCDIRECTION((1.,0.,0.)); +#1418=IFCAXIS2PLACEMENT3D(#1415,#1416,#1417); +#1419=IFCEXTRUDEDAREASOLID(#1414,#1418,#1413,300.); +#1420=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#1419)); +#1421=IFCPRODUCTDEFINITIONSHAPE($,$,(#1420)); +#1427=IFCRELCONTAINEDINSPATIALSTRUCTURE('00IddyIPb6MBkbaNL_hnFL',$,$,$,(#1410),#16); +#1428=IFCCARTESIANPOINT((-200.,-200.,7000.)); +#1429=IFCDIRECTION((0.,0.,1.)); +#1430=IFCDIRECTION((1.,0.,0.)); +#1431=IFCAXIS2PLACEMENT3D(#1428,#1429,#1430); +#1432=IFCLOCALPLACEMENT($,#1431); +#1433=IFCPROPERTYSET('2ZSAYyfVnBPOkzzDLMKlS7',$,'Pset_RoofCommon',$,(#1435,#1436,#1437)); +#1434=IFCRELDEFINESBYPROPERTIES('3lYqY171z0EfJ5mzjn3vzp',$,$,$,(#1410),#1433); +#1435=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#1436=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI60'),$); +#1437=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('RF-301'),$); +#1438=IFCELEMENTQUANTITY('157LNqpab4a8oUg34ax1Uw',$,'Qto_RoofBaseQuantities',$,'BaseQuantities',(#1440,#1441,#1442)); +#1439=IFCRELDEFINESBYPROPERTIES('03eHaSBQ98N9kuaKiEO1Vg',$,$,$,(#1410),#1438); +#1440=IFCQUANTITYAREA('GrossArea',$,$,104.16,$); +#1441=IFCQUANTITYAREA('NetArea',$,$,104.16,$); +#1442=IFCQUANTITYAREA('ProjectedArea',$,$,104.16,$); +#1443=IFCCLASSIFICATIONREFERENCE($,'Ss_30_40','Roof covering systems',#26,$,$); +#1444=IFCRELASSOCIATESCLASSIFICATION('3xsjs9nA51uRYeVde11JNw',$,$,$,(#1410),#1443); +ENDSEC; +END-ISO-10303-21; diff --git a/examples/demo/make_demo.py b/examples/demo/make_demo.py new file mode 100644 index 0000000..0b1b1b9 --- /dev/null +++ b/examples/demo/make_demo.py @@ -0,0 +1,230 @@ +#!/usr/bin/env python3 +"""Generate `examples/demo/demo_building.ifc`: the model VeriModel ships as its +always-available demo. + +A small two-storey office pavilion written with the IfcOpenShell API (IFC4, +millimetres): walls, slabs, columns, beams, doors, windows, a roof, spaces, a +duct run, with property sets, base quantities, Uniclass classification and +materials. It is deliberately *almost* clean so a first run shows what a real +review looks like: a healthy score, three warnings and three real errors +(with examples/demo/project.yaml, where classification is required). + +Deliberate defects: + * ground-floor door D-003 has Pset_DoorCommon but no FireRating -> IDS / CFG-PSET + * column C-005 is not contained in any storey -> SP-001 (error) + * window W-004 carries an empty Pset_WindowCommon.Reference -> PR-001 (warning) + * duct segment MEP-002 has no classification -> CL-001 (error: the demo config requires classification) + * two walls on level 2 share the name "WL-201" -> ID-003 (warning) + +Run: python3 examples/demo/make_demo.py +""" +import os +import sys + +import numpy as np +import ifcopenshell +import ifcopenshell.api +import ifcopenshell.api.root +import ifcopenshell.api.unit +import ifcopenshell.api.context +import ifcopenshell.api.project +import ifcopenshell.api.aggregate +import ifcopenshell.api.spatial +import ifcopenshell.api.geometry +import ifcopenshell.api.pset +import ifcopenshell.api.material +import ifcopenshell.api.classification +import ifcopenshell.api.type + +OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "demo_building.ifc") + + +def main() -> None: + f = ifcopenshell.api.project.create_file(version="IFC4") + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="VeriModel demo pavilion") + mm = ifcopenshell.api.unit.add_si_unit(f, unit_type="LENGTHUNIT", prefix="MILLI") + area = ifcopenshell.api.unit.add_si_unit(f, unit_type="AREAUNIT") + vol = ifcopenshell.api.unit.add_si_unit(f, unit_type="VOLUMEUNIT") + ifcopenshell.api.unit.assign_unit(f, units=[mm, area, vol]) + model_ctx = ifcopenshell.api.context.add_context(f, context_type="Model") + body = ifcopenshell.api.context.add_context(f, context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model_ctx) + + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="Demo site") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="Demo pavilion") + l1 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Level 1") + l1.Elevation = 0.0 + l2 = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Level 2") + l2.Elevation = 3500.0 + roof_lvl = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Roof") + roof_lvl.Elevation = 7000.0 + ifcopenshell.api.aggregate.assign_object(f, relating_object=project, products=[site]) + ifcopenshell.api.aggregate.assign_object(f, relating_object=site, products=[building]) + ifcopenshell.api.aggregate.assign_object(f, relating_object=building, products=[l1, l2, roof_lvl]) + + concrete = ifcopenshell.api.material.add_material(f, name="Concrete C30/37") + brick = ifcopenshell.api.material.add_material(f, name="Brick masonry") + steel = ifcopenshell.api.material.add_material(f, name="Steel S275") + timber = ifcopenshell.api.material.add_material(f, name="Timber") + glass = ifcopenshell.api.material.add_material(f, name="Glass") + galv = ifcopenshell.api.material.add_material(f, name="Galvanised steel") + + system = ifcopenshell.api.classification.add_classification(f, classification="Uniclass 2015") + + def classify(products, code, name): + ifcopenshell.api.classification.add_reference(f, products=products, identification=code, name=name, classification=system) + + def box(element, length_mm, height_mm, thickness_mm, x=0.0, y=0.0, z=0.0, rot_deg=0.0): + rep = ifcopenshell.api.geometry.add_wall_representation(f, context=body, length=length_mm / 1000.0, height=height_mm / 1000.0, thickness=thickness_mm / 1000.0) + ifcopenshell.api.geometry.assign_representation(f, product=element, representation=rep) + m = np.eye(4) + a = np.deg2rad(rot_deg) + m[0:2, 0:2] = [[np.cos(a), -np.sin(a)], [np.sin(a), np.cos(a)]] + m[0:3, 3] = (x / 1000.0, y / 1000.0, z / 1000.0) + ifcopenshell.api.geometry.edit_object_placement(f, product=element, matrix=m, is_si=True) + + def add_qto(element, name, values): + q = ifcopenshell.api.pset.add_qto(f, product=element, name=name) + ifcopenshell.api.pset.edit_qto(f, qto=q, properties=values) + + def add_pset(element, name, values): + p = ifcopenshell.api.pset.add_pset(f, product=element, name=name) + ifcopenshell.api.pset.edit_pset(f, pset=p, properties=values) + + def wall(name, storey, length, x, y, z, rot=0.0, external=True, fire="REI90", thickness=250.0): + w = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name=name, predefined_type="SOLIDWALL") + box(w, length, 3500.0, thickness, x, y, z, rot) + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[w]) + ifcopenshell.api.material.assign_material(f, products=[w], material=brick if external else concrete) + add_pset(w, "Pset_WallCommon", {"IsExternal": external, "FireRating": fire, "LoadBearing": external, "Reference": name}) + add_qto(w, "Qto_WallBaseQuantities", {"Length": length, "Height": 3500.0, "Width": thickness, "GrossVolume": length * 3500.0 * thickness / 1e9, "NetVolume": length * 3500.0 * thickness / 1e9, "GrossSideArea": length * 3500.0 / 1e6, "NetSideArea": length * 3500.0 / 1e6}) + classify([w], "Ss_25_10_30" if external else "Ss_25_10_32", "External wall systems" if external else "Internal wall systems") + return w + + def slab(name, storey, z, kind="FLOOR"): + s = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSlab", name=name, predefined_type=kind) + box(s, 12000.0, 250.0, 8000.0, 0.0, 0.0, z - 250.0) + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[s]) + ifcopenshell.api.material.assign_material(f, products=[s], material=concrete) + add_pset(s, "Pset_SlabCommon", {"IsExternal": kind == "ROOF", "LoadBearing": True, "FireRating": "REI120", "Reference": name}) + add_qto(s, "Qto_SlabBaseQuantities", {"Depth": 250.0, "GrossArea": 96.0, "NetArea": 96.0, "GrossVolume": 24.0, "NetVolume": 24.0, "Perimeter": 40000.0}) + classify([s], "Ss_30_20_55", "Floor and roof slab systems" if kind != "ROOF" else "Roof structure systems") + return s + + def column(name, storey, x, y, z, contained=True): + c = ifcopenshell.api.root.create_entity(f, ifc_class="IfcColumn", name=name, predefined_type="COLUMN") + box(c, 400.0, 3500.0, 400.0, x, y, z) + if contained: + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[c]) + ifcopenshell.api.material.assign_material(f, products=[c], material=concrete) + add_pset(c, "Pset_ColumnCommon", {"LoadBearing": True, "IsExternal": False, "FireRating": "R120", "Reference": name}) + add_qto(c, "Qto_ColumnBaseQuantities", {"Length": 3500.0, "CrossSectionArea": 0.16, "GrossVolume": 0.56, "NetVolume": 0.56}) + classify([c], "Ss_20_05_15", "Concrete column systems") + return c + + def beam(name, storey, length, x, y, z, rot=0.0): + b = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBeam", name=name, predefined_type="BEAM") + box(b, length, 500.0, 300.0, x, y, z, rot) + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[b]) + ifcopenshell.api.material.assign_material(f, products=[b], material=steel) + add_pset(b, "Pset_BeamCommon", {"LoadBearing": True, "IsExternal": False, "FireRating": "R60", "Reference": name}) + add_qto(b, "Qto_BeamBaseQuantities", {"Length": length, "CrossSectionArea": 0.15, "GrossVolume": length * 0.15 / 1000.0, "NetVolume": length * 0.15 / 1000.0}) + classify([b], "Ss_20_10_75", "Steel beam systems") + return b + + def door(name, storey, x, y, z, fire="EI30", with_fire=True): + d = ifcopenshell.api.root.create_entity(f, ifc_class="IfcDoor", name=name, predefined_type="DOOR") + box(d, 1000.0, 2100.0, 100.0, x, y, z) + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[d]) + ifcopenshell.api.material.assign_material(f, products=[d], material=timber) + props = {"IsExternal": False, "Reference": name} + if with_fire: + props["FireRating"] = fire + add_pset(d, "Pset_DoorCommon", props) + add_qto(d, "Qto_DoorBaseQuantities", {"Width": 1000.0, "Height": 2100.0, "Area": 2.1}) + classify([d], "Pr_30_59_24", "Doorsets") + return d + + def window(name, storey, x, y, z, reference=None): + w = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWindow", name=name, predefined_type="WINDOW") + box(w, 1500.0, 1200.0, 80.0, x, y, z) + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[w]) + ifcopenshell.api.material.assign_material(f, products=[w], material=glass) + add_pset(w, "Pset_WindowCommon", {"IsExternal": True, "Reference": name if reference is None else reference, "ThermalTransmittance": 1.1}) + add_qto(w, "Qto_WindowBaseQuantities", {"Width": 1500.0, "Height": 1200.0, "Area": 1.8}) + classify([w], "Pr_30_59_98", "Windows") + return w + + def space(name, storey, x, y, z, lx, ly): + s = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSpace", name=name, predefined_type="INTERNAL") + box(s, lx, 3250.0, ly, x, y, z) + ifcopenshell.api.aggregate.assign_object(f, relating_object=storey, products=[s]) + add_pset(s, "Pset_SpaceCommon", {"Reference": name, "IsExternal": False, "GrossPlannedArea": lx * ly / 1e6}) + add_qto(s, "Qto_SpaceBaseQuantities", {"Height": 3250.0, "GrossFloorArea": lx * ly / 1e6, "NetFloorArea": lx * ly / 1e6 * 0.95, "GrossVolume": lx * ly * 3250.0 / 1e9}) + classify([s], "SL_20_15_59", "Office spaces") + return s + + def duct(name, storey, length, x, y, z, rot=0.0, classified=True): + d = ifcopenshell.api.root.create_entity(f, ifc_class="IfcDuctSegment", name=name, predefined_type="RIGIDSEGMENT") + box(d, length, 300.0, 300.0, x, y, z, rot) + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[d]) + ifcopenshell.api.material.assign_material(f, products=[d], material=galv) + add_pset(d, "Pset_DuctSegmentTypeCommon", {"Reference": name, "NominalDiameterOrWidth": 300.0}) + add_qto(d, "Qto_DuctSegmentBaseQuantities", {"Length": length, "GrossCrossSectionArea": 0.09, "OuterSurfaceArea": length * 1.2 / 1000.0}) + if classified: + classify([d], "Ss_65_40_33", "Ductwork systems") + return d + + # ---- Level 1 ----------------------------------------------------------- + slab("SL-101", l1, 0.0) + wall("WL-101", l1, 12000.0, 0, 0, 0) + wall("WL-102", l1, 8000.0, 12000, 0, 0, 90) + wall("WL-103", l1, 12000.0, 12000, 8000, 0, 180) + wall("WL-104", l1, 8000.0, 0, 8000, 0, 270) + wall("WL-105", l1, 6000.0, 6000, 250, 0, 90, external=False, fire="REI60", thickness=150.0) + for i, (x, y) in enumerate([(300, 300), (6000, 300), (11300, 300), (300, 7300), (11300, 7300)]): + column(f"C-10{i+1}", l1, x, y, 0) + beam("B-101", l1, 11000.0, 500, 300, 3000) + beam("B-102", l1, 11000.0, 500, 7300, 3000) + door("D-101", l1, 2500, 0, 0) + door("D-102", l1, 6000, 3000, 0, fire="EI60") + door("D-103", l1, 9000, 0, 0, with_fire=False) # defect: no FireRating + window("W-101", l1, 1000, 8000, 1000) + window("W-102", l1, 4000, 8000, 1000) + window("W-103", l1, 8000, 8000, 1000) + space("Office 1.01", l1, 250, 250, 0, 5600, 7500) + space("Office 1.02", l1, 6150, 250, 0, 5600, 7500) + duct("MEP-101", l1, 10000.0, 1000, 4000, 3100) + duct("MEP-102", l1, 3000.0, 11000, 4000, 3100, 90, classified=False) # defect: unclassified + + # ---- Level 2 ----------------------------------------------------------- + slab("SL-201", l2, 3500.0) + wall("WL-201", l2, 12000.0, 0, 0, 3500) + wall("WL-202", l2, 8000.0, 12000, 0, 3500, 90) + wall("WL-201", l2, 12000.0, 12000, 8000, 3500, 180) # defect: duplicate name + wall("WL-204", l2, 8000.0, 0, 8000, 3500, 270) + for i, (x, y) in enumerate([(300, 300), (6000, 300), (11300, 300), (300, 7300)]): + column(f"C-20{i+1}", l2, x, y, 3500) + column("C-205", l2, 11300, 7300, 3500, contained=False) # defect: orphan column + beam("B-201", l2, 11000.0, 500, 300, 6500) + door("D-201", l2, 5500, 0, 3500) + window("W-201", l2, 1000, 8000, 4500) + window("W-202", l2, 4000, 8000, 4500) + window("W-203", l2, 8000, 8000, 4500) + window("W-204", l2, 11000, 4000, 4500, reference="") # defect: empty Reference + space("Meeting 2.01", l2, 250, 250, 3500, 11500, 7500) + + # ---- Roof -------------------------------------------------------------- + roof = ifcopenshell.api.root.create_entity(f, ifc_class="IfcRoof", name="RF-301", predefined_type="FLAT_ROOF") + box(roof, 12400.0, 300.0, 8400.0, -200, -200, 7000) + ifcopenshell.api.spatial.assign_container(f, relating_structure=roof_lvl, products=[roof]) + ifcopenshell.api.material.assign_material(f, products=[roof], material=concrete) + add_pset(roof, "Pset_RoofCommon", {"IsExternal": True, "FireRating": "REI60", "Reference": "RF-301"}) + add_qto(roof, "Qto_RoofBaseQuantities", {"GrossArea": 104.16, "NetArea": 104.16, "ProjectedArea": 104.16}) + classify([roof], "Ss_30_40", "Roof covering systems") + + f.write(OUT) + print(f"wrote {OUT} ({os.path.getsize(OUT)} bytes, {len(f.by_type('IfcProduct'))} products)") + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/examples/demo/project.yaml b/examples/demo/project.yaml new file mode 100644 index 0000000..46e9770 --- /dev/null +++ b/examples/demo/project.yaml @@ -0,0 +1,48 @@ +# VeriModel demo project — used by "Load the demo" in the app and by the README walkthrough. +# A small two-storey office pavilion (examples/demo/demo_building.ifc) with a handful of +# deliberate defects so a first run shows a realistic review: a good score, three warnings +# and three real errors (missing FireRating on a door, an orphan column, an unclassified duct). Everything below is ordinary project.yaml; copy it for your own project. +project: + name: "VeriModel demo pavilion" + language: en + units: auto + classification_system: Uniclass + ifc_versions: [IFC2X3, IFC4, IFC4X3] +requirements: + ids_file: ../sample.ids + rule_pack: generic + required_psets: + - pset: Pset_WallCommon + applies_to: [IfcWall] + properties: [FireRating, IsExternal] + - pset: Pset_DoorCommon + applies_to: [IfcDoor] + properties: [FireRating] +tolerances: + far_from_origin_m: 10000 + geometry: + min_volume_m3: 0.000001 + min_area_m2: 0.000001 + max_extent_m: 5000 +qto: + group_by: [type, storey] + unit_rates_file: ../rates.csv + currency: EUR + sample_count: 5 +classification: + required: true + applies_to: [IfcElement] + code_pattern: '^[A-Za-z]{2}_[0-9]{2}(_[0-9]{2}){0,3}$' +naming: + patterns: + IfcWall: '^WL-[0-9]{3}$' + IfcDoor: '^D-[0-9]{3}$' + IfcWindow: '^W-[0-9]{3}$' + IfcColumn: '^C-[0-9]{3}$' + IfcBeam: '^B-[0-9]{3}$' +checks: + rules: + CL-001: true # classification is required in this demo (severity error); set to false to relax +output: + language: en + bcf_version: "2.1" diff --git a/examples/infrastructure/infrastructure_rules.yaml b/examples/infrastructure/infrastructure_rules.yaml new file mode 100644 index 0000000..eee133a --- /dev/null +++ b/examples/infrastructure/infrastructure_rules.yaml @@ -0,0 +1,124 @@ +# VeriModel example: custom rule pack for bridge and road models (IFC4X3). +# +# This is a CUSTOM rule pack. It has the same format as the built-in +# crates/core/rule_packs/generic.yaml, and project.yaml points to it with: +# requirements: +# rule_pack: infrastructure_rules.yaml +# The path is relative to the project.yaml file. Adding or changing a rule +# here needs no change to the engine code. +# +# Rule anatomy (every rule needs all of these): +# id stable identifier shown in reports and BCF titles +# category identity | spatial | properties | geometry | classification | naming | sanity | schema +# (a category can be switched off in project.yaml, under checks.categories) +# description what the rule checks, in plain language +# severity error | warning | info +# scope which elements the rule looks at (IFC type or supertype, exclusions) +# check one check kind from docs/RULES.md, with its parameters +# fix_hint plain-language advice for the modeller +# +# "$config." reads a value from project.yaml, so thresholds live in one place. +name: infrastructure_rules +version: 1 +description: Quality gate for bridge and road models (IFC4X3). Long linear projects, no storeys. +rules: + # --- Identity ------------------------------------------------------------- + - id: ID-001 + category: identity + description: Every element must have a unique GlobalId + severity: error + scope: { ifc_types: [IfcProduct], include_spatial: true } + check: { kind: unique_global_id } + fix_hint: Regenerate the GlobalId of the duplicated element in the authoring tool, or remove the duplicate copy. + + - id: ID-002 + category: identity + description: Every GlobalId must be a valid 22-character IFC identifier + severity: error + scope: { ifc_types: [IfcProduct], include_spatial: true } + check: { kind: valid_global_id } + fix_hint: Re-export the model; a malformed GlobalId usually comes from a hand-edited or truncated file. + + # --- Spatial structure ------------------------------------------------------ + - id: SP-001 + category: spatial + description: Every element must be contained in a spatial structure element (bridge part, road part, site, facility part) + severity: error + scope: { ifc_types: [IfcElement], exclude_types: [IfcFeatureElement, IfcVirtualElement] } + check: { kind: contained_in_spatial_structure } + fix_hint: Assign the element to a bridge part, road part or facility part in the authoring tool before exporting. + + - id: SP-002 + category: spatial + description: The model must declare a site, a bridge, road, railway or facility, and at least one matching part + severity: warning + scope: { include_spatial: true } + check: + kind: spatial_hierarchy + require: + - [IfcSite] + - [IfcBridge, IfcRoad, IfcRailway, IfcFacility] + - [IfcBridgePart, IfcRoadPart, IfcRailwayPart, IfcFacilityPart] + fix_hint: Export with the Site > Bridge (or Road, Railway, Facility) > Part structure enabled. + + - id: SP-003 + category: spatial + description: Elements must not be far from the project origin + severity: warning + scope: { ifc_types: [IfcElement] } + check: { kind: distance_from_origin, max_m: "$config.tolerances.far_from_origin_m" } + fix_hint: Long infrastructure is often placed on national coordinates. Set the shared coordinates correctly, or raise tolerances.far_from_origin_m if this is expected. + + - id: SP-004 + category: spatial + description: The model must contain at least one bridge element + severity: warning + scope: { include_spatial: true } + check: { kind: types_present, ifc_types: [IfcBridge] } + fix_hint: This pack is for bridge models. If the file is a road or railway model, disable this rule in project.yaml under checks.rules. + + # --- Geometry --------------------------------------------------------------- + - id: GEO-001 + category: geometry + description: Physical elements must have a geometric representation + severity: warning + scope: { ifc_types: [IfcElement], exclude_types: [IfcFeatureElement, IfcVirtualElement, IfcAnnotation] } + check: { kind: has_geometry } + fix_hint: The element has no 3D body; check that its geometry is not hidden or filtered out of the export. + + - id: GEO-002 + category: geometry + description: Elements with a representation must produce a non-degenerate shape (volume or area above tolerance) + severity: error + scope: { ifc_types: [IfcElement], exclude_types: [IfcFeatureElement, IfcVirtualElement, IfcAnnotation] } + check: + kind: non_degenerate_geometry + min_volume_m3: "$config.tolerances.geometry.min_volume_m3" + min_area_m2: "$config.tolerances.geometry.min_area_m2" + fix_hint: The element's solid collapsed to zero volume or area. Fix the geometry in the authoring tool. + + - id: GEO-003 + category: geometry + description: Element bounding boxes must stay within the configured project extent + severity: warning + scope: { ifc_types: [IfcElement] } + check: { kind: bbox_within_bounds, max_extent_m: "$config.tolerances.geometry.max_extent_m" } + fix_hint: An element longer than the whole project usually means a unit mismatch or a stray stretched solid. Raise tolerances.geometry.max_extent_m only if the length is real. + + # --- Properties ------------------------------------------------------------- + - id: INF-PSET-001 + category: properties + description: Beams and columns must carry the concrete element property set Pset_ConcreteElementGeneral + severity: warning + scope: { ifc_types: [IfcBeam, IfcColumn] } + check: { kind: pset_exists, pset: Pset_ConcreteElementGeneral } + fix_hint: Add Pset_ConcreteElementGeneral to the concrete beams and columns, or assign the material and property set in the authoring tool. + + # --- Schema ----------------------------------------------------------------- + - id: SCH-001 + category: schema + description: The IFC schema of the file must be one the project accepts + severity: error + scope: { include_spatial: true } + check: { kind: schema_allowed } + fix_hint: Export in one of the schemas listed in project.ifc_versions (IFC4X3 for this pack), or add the schema to the list. diff --git a/examples/infrastructure/project.yaml b/examples/infrastructure/project.yaml new file mode 100644 index 0000000..fd97e0b --- /dev/null +++ b/examples/infrastructure/project.yaml @@ -0,0 +1,106 @@ +# VeriModel example: bridge and road (infrastructure) project. +# +# This file is illustrative. Infrastructure models differ from buildings: +# they use IFC4X3, they are very long, they have no storeys, and they use +# facility parts (bridge parts, road parts) instead of building storeys. +# Every key is checked: an unknown key is an error. +# +# Run it with (from the repository root): +# verimodel check --ifc tests/fixtures/bsi_ifc4x3_infra_bridge.ifc \ +# --config examples/infrastructure/project.yaml --out ./out +# +# The custom rule pack used here is examples/infrastructure/infrastructure_rules.yaml. +# Full reference of every key: docs/CONFIG.md + +# --------------------------------------------------------------------------- +# project: the project itself. +# --------------------------------------------------------------------------- +project: + name: "Bridge and road - example" + language: en + # Metric. Infrastructure is almost always designed in metres. + units: metric + # The classification system used for infrastructure elements in this example. + classification_system: CCI + # Accept only IFC4X3. The file's IFC4X3_ADD2 schema is read as IFC4X3. + ifc_versions: [IFC4X3] + +# --------------------------------------------------------------------------- +# requirements: which rule pack to use and which property sets are required. +# --------------------------------------------------------------------------- +requirements: + # A custom rule pack in this folder, instead of the built-in generic pack. + # The path is relative to this file. The pack holds identity, spatial, + # geometry, property and schema rules tuned for bridges and roads. + rule_pack: infrastructure_rules.yaml + # No property set is required for every element in this example. The + # custom pack asks for one optional concrete property set instead. + required_psets: [] + +# --------------------------------------------------------------------------- +# tolerances: long linear projects need much larger limits. +# --------------------------------------------------------------------------- +tolerances: + clash_hard_mm: 10.0 + clash_clearance_mm: 50.0 + # 100 km. A road or a bridge can be far from the model origin, because + # coordinates often come from a national grid. This allows that distance. + far_from_origin_m: 100000.0 + geometry: + min_volume_m3: 0.000001 + min_area_m2: 0.000001 + # 20 km. An element longer than this (in any direction) is flagged by GEO-003. + max_extent_m: 20000.0 + +# --------------------------------------------------------------------------- +# qto: quantities for infrastructure. +# --------------------------------------------------------------------------- +qto: + # Group by IFC type, then by material, for example all concrete beams + # together and all steel members together. + group_by: [type, material] + # No unit rates file in this example. Quantities are reported without prices. + currency: EUR + sample_count: 5 + +# --------------------------------------------------------------------------- +# clash: not available yet. +# --------------------------------------------------------------------------- +clash: + enabled: false + +# --------------------------------------------------------------------------- +# output: report and BCF settings. +# --------------------------------------------------------------------------- +output: + language: en + include_3d_snapshot: true + bcf_version: "2.1" + bcf_author: "infra-coordination@example.com" + +# --------------------------------------------------------------------------- +# checks: rule switches. +# --------------------------------------------------------------------------- +checks: + rules: {} + # Naming conventions are not checked for infrastructure in this example. + # Setting the whole "naming" category to false switches off every rule in it. + categories: + naming: false + # Element names must be unique within the same type. Infrastructure models + # have no storeys, so "storey" is not used here. + unique_name_within: [type] + +# --------------------------------------------------------------------------- +# naming: no patterns, because the naming category is off. +# --------------------------------------------------------------------------- +naming: + patterns: {} + +# --------------------------------------------------------------------------- +# classification: not required for this example. +# --------------------------------------------------------------------------- +classification: + required: false + applies_to: [] + allowed_codes: [] diff --git a/examples/office/project.yaml b/examples/office/project.yaml new file mode 100644 index 0000000..e704ecb --- /dev/null +++ b/examples/office/project.yaml @@ -0,0 +1,124 @@ +# VeriModel example: office building, Spanish-language reports, imperial units. +# +# This file is illustrative. It shows a stricter setup than the residential +# example: tighter tolerances, a single IFC schema, classification by OmniClass, +# quantities grouped by classification, and USD pricing. Every key is checked: +# an unknown key is an error. +# +# Run it with (from the repository root): +# verimodel check --ifc tests/fixtures/bsi_ifc4_building_structural.ifc \ +# --config examples/office/project.yaml --out ./out +# +# Full reference of every key: docs/CONFIG.md + +# --------------------------------------------------------------------------- +# project: the project itself. +# --------------------------------------------------------------------------- +project: + # Name shown in reports. + name: "Office building - example" + # Language of the user interface: es (Spanish). Use en for English. + language: es + # Show quantities in imperial units (feet, square feet, cubic feet) in the + # reports. Data stays in SI units internally; only the display changes. + units: imperial + # The classification system this project uses. The name is matched against + # the classification references in the file, ignoring case. + classification_system: OmniClass + # This office project is delivered in IFC4 only. Any other schema fails SCH-001. + ifc_versions: [IFC4] + +# --------------------------------------------------------------------------- +# requirements: what each element must contain. +# --------------------------------------------------------------------------- +requirements: + # Optional IDS file, path relative to this file. Not read by the current + # command line (use --ids). Left out here on purpose. + rule_pack: generic + # Every slab must carry Pset_SlabCommon with a LoadBearing value (true or + # false), so structural and non-structural slabs are told apart. + # Every column must carry Pset_ColumnCommon with a LoadBearing value. + # Missing ones are errors (the default severity). + required_psets: + - pset: Pset_SlabCommon + applies_to: [IfcSlab] + properties: [LoadBearing] + - pset: Pset_ColumnCommon + applies_to: [IfcColumn] + properties: [LoadBearing] + +# --------------------------------------------------------------------------- +# tolerances: stricter than the defaults. +# --------------------------------------------------------------------------- +tolerances: + clash_hard_mm: 10.0 + clash_clearance_mm: 50.0 + # Stricter than the default (10 000 m). An element whose centre is more than + # 2 000 m from the origin is flagged. This is about a building, not a region. + far_from_origin_m: 2000.0 + geometry: + # Stricter than the default (0.000001 m3): any solid below 0.0001 m3 + # (0.1 litre) counts as degenerate. No real building part is that small. + min_volume_m3: 0.0001 + min_area_m2: 0.000001 + max_extent_m: 5000.0 + +# --------------------------------------------------------------------------- +# qto: quantities and pricing. +# --------------------------------------------------------------------------- +qto: + # Group quantities by IFC type, then by classification code, so the + # takeoff reads like a bill of quantities organised by classification. + group_by: [type, classification] + # No price list for this example, so no unit rates file is given. + # Quantities are still computed and reported. + currency: USD + sample_count: 5 + +# --------------------------------------------------------------------------- +# clash: not available yet. +# --------------------------------------------------------------------------- +clash: + enabled: false + +# --------------------------------------------------------------------------- +# output: report and BCF settings. +# --------------------------------------------------------------------------- +output: + # Reports and BCF titles are written in Spanish. + language: es + include_3d_snapshot: true + # BCF 2.1 is what most viewers read. Quotes keep it as text. + bcf_version: "2.1" + bcf_author: "coordinacion-bim@example.com" + +# --------------------------------------------------------------------------- +# checks: rule switches. +# --------------------------------------------------------------------------- +checks: + rules: + # Allow the same element name to repeat within a type and storey. + # Many office models reuse names such as "Puerta" for every door, so this + # rule (ID-003) is off for this project. + ID-003: false + categories: {} + unique_name_within: [type, storey] + +# --------------------------------------------------------------------------- +# naming: no naming convention is enforced in this example. +# --------------------------------------------------------------------------- +naming: + patterns: {} + +# --------------------------------------------------------------------------- +# classification: OmniClass codes. +# --------------------------------------------------------------------------- +classification: + # Classification is recommended for this project, not mandatory. + required: false + applies_to: [] + allowed_codes: [] + # OmniClass codes look like "23-13 11 11": two digits, a hyphen, two digits, + # then one to three groups of two digits separated by spaces. This checks the + # shape of each code. It does not check that the code exists in OmniClass. + code_pattern: "^[0-9]{2}-[0-9]{2}( [0-9]{2})+$" diff --git a/examples/rates.csv b/examples/rates.csv new file mode 100644 index 0000000..87e0f9a --- /dev/null +++ b/examples/rates.csv @@ -0,0 +1,13 @@ +code,description,unit,rate,currency,match_type,match_storey,match_classification +WALL-01,Wall construction supply and install excl finishes,m3,310.00,EUR,IfcWall,, +SLAB-01,Reinforced concrete slab supply and place excl formwork,m3,290.00,EUR,IfcSlab,, +BEAM-01,Reinforced concrete beam supply and place,m3,420.00,EUR,IfcBeam,, +COL-01,Reinforced concrete column supply and place,m3,460.00,EUR,IfcColumn,, +FTG-01,Strip or pad footing in concrete supply and place,m3,240.00,EUR,IfcFooting,, +DOOR-01,Internal door set supply and fit leaf frame and ironmongery,nr,650.00,EUR,IfcDoor,, +WIN-01,Window unit supply and install double glazed,nr,780.00,EUR,IfcWindow,, +ROOF-01,Roof covering system supply and install,m2,95.00,EUR,IfcRoof,, +COV-01,Floor covering supply and lay,m2,38.00,EUR,IfcCovering,, +DUCT-01,Rectangular ductwork supply and install,m,145.00,EUR,IfcDuctSegment,, +PIPE-01,Pipework supply and install mixed diameters,m,85.00,EUR,IfcPipeSegment,, +RAIL-01,Balustrade or railing supply and install,m,260.00,EUR,IfcRailing,, diff --git a/examples/residential/project.yaml b/examples/residential/project.yaml new file mode 100644 index 0000000..6b38339 --- /dev/null +++ b/examples/residential/project.yaml @@ -0,0 +1,153 @@ +# VeriModel example: residential project. +# +# This file is illustrative. It works with any IFC model (IFC2X3, IFC4 or +# IFC4X3) and shows the most common settings. Copy it, then change the values +# to match your own project. Every key is checked: an unknown key is an error, +# so a typo cannot silently switch a rule off. +# +# Run it with (from the repository root): +# verimodel check --ifc tests/fixtures/bsi_ifc4_building_structural.ifc \ +# --config examples/residential/project.yaml --ids examples/sample.ids --out ./out +# +# Full reference of every key: docs/CONFIG.md + +# --------------------------------------------------------------------------- +# project: who the project is and which rules about the file itself apply. +# --------------------------------------------------------------------------- +project: + # A name shown in reports. Free text. + name: "Residential example" + # Language of the user interface and reports: en (English) or es (Spanish). + language: en + # Units shown in reports: auto follows the units declared in the IFC file. + # Other choices: metric, imperial. Calculations are always stored in SI units. + units: auto + # The classification system the project expects. Used by the classification + # rule. Any text is accepted; a match is made against the system name in the + # file, ignoring case (so "Uniclass" matches "Uniclass 2015"). + classification_system: Uniclass + # IFC schemas the project accepts. A file written in another schema fails + # rule SCH-001. IFC4X1 and IFC4X2 are treated as IFC4 (see docs/ASSUMPTIONS.md). + ifc_versions: [IFC2X3, IFC4, IFC4X3] + +# --------------------------------------------------------------------------- +# requirements: what every element must contain. +# --------------------------------------------------------------------------- +requirements: + # An IDS file (buildingSMART Information Delivery Specification) with + # requirements written in the standard format. The path is relative to this + # file. The current command line reads the IDS from --ids, so this entry is + # recorded for the project but is not yet applied on its own. + ids_file: ../sample.ids + # "generic" uses the built-in rule pack. A path to a YAML rule pack replaces it. + rule_pack: generic + # Property sets that must exist on given element types. Each entry creates + # one rule per entry in the list, plus one rule per required property. + required_psets: + # Every wall must have the Pset_WallCommon set, with a FireRating and an + # IsExternal value. Missing ones are errors. + - pset: Pset_WallCommon + applies_to: [IfcWall] + properties: [FireRating, IsExternal] + severity: error + # Every door must have Pset_DoorCommon with a FireRating. A missing one is + # only a warning, so the verdict is "pass with warnings". + - pset: Pset_DoorCommon + applies_to: [IfcDoor] + properties: [FireRating] + severity: warning + +# --------------------------------------------------------------------------- +# tolerances: the numbers that decide when a geometry or position check fails. +# --------------------------------------------------------------------------- +tolerances: + # Clash distances (used only when clash checks are enabled later). + clash_hard_mm: 10.0 + clash_clearance_mm: 50.0 + # An element whose centre is farther than this from the model origin (in + # metres) is flagged by rule SP-004. + far_from_origin_m: 10000.0 + geometry: + # A solid with less volume than this (cubic metres) counts as degenerate. + min_volume_m3: 0.000001 + # A surface with less area than this (square metres) counts as degenerate. + min_area_m2: 0.000001 + # An element wider than this in any direction (metres) is flagged by GEO-003. + max_extent_m: 5000.0 + +# --------------------------------------------------------------------------- +# qto: quantity takeoff (how quantities are summed and priced). +# --------------------------------------------------------------------------- +qto: + # How the quantities are grouped in the tables. Any combination of: type, + # storey, classification, material, predefined_type, type_name. + group_by: [type, storey] + # Unit rates for pricing. The path is relative to this file. Each row of the + # CSV gives one price. See examples/README.md for the columns. + unit_rates_file: ../rates.csv + # Currency code printed with each cost (for example EUR, USD, GBP). + currency: EUR + # How many elements are listed as hand-check samples in the report. + sample_count: 5 + +# --------------------------------------------------------------------------- +# clash: clash detection between two models. Not available yet. +# --------------------------------------------------------------------------- +clash: + # Keep this off. Clash detection is planned for a later version. + enabled: false + +# --------------------------------------------------------------------------- +# output: what the generated report and the BCF issue file contain. +# --------------------------------------------------------------------------- +output: + # Language of the generated report and of BCF topic titles: en or es. + language: en + # Whether a 3D snapshot (viewpoint) is attached to BCF issues. + include_3d_snapshot: true + # BCF version of issues.bcfzip: "2.1" (default) or "3.0". Quotes keep it as text. + bcf_version: "2.1" + # The name written as the author of every BCF topic. + bcf_author: "bim-coordination@example.com" + +# --------------------------------------------------------------------------- +# checks: switch individual rules or whole groups on or off. +# --------------------------------------------------------------------------- +checks: + # Turn single rules off by id. Example: ID-003: false + # A rule set here overrides its category. + rules: {} + # Turn whole groups off by category. Categories are: identity, spatial, + # properties, geometry, classification, naming, sanity, schema. + categories: {} + # Element names must be unique within the same type and storey (the + # default). Use only "type" to require uniqueness across the whole model. + unique_name_within: [type, storey] + +# --------------------------------------------------------------------------- +# naming: the naming convention per element type. +# --------------------------------------------------------------------------- +naming: + # Each entry maps an IFC type (or a parent type) to a regular expression that + # every name of that type must match. This example is deliberately permissive + # (any name passes). Replace it with your own convention, for example + # "^W-[0-9]{3}$" for wall names such as W-001. + patterns: + IfcWall: "^.*$" + +# --------------------------------------------------------------------------- +# classification: the classification codes elements must carry. +# --------------------------------------------------------------------------- +classification: + # false: classification is recommended but not required. Set to true to make + # rule CL-001 (classification must exist) apply. + required: false + # Which element types must be classified. Empty means all elements. + applies_to: [] + # Codes accepted in this project, written out inline. Empty means no list. + allowed_codes: [] + # A regular expression that every classification code must match. This one + # accepts Uniclass 2015 style codes such as Ss_25_10_30 or EF_25_10 (two + # letters, then groups of two digits). It checks the shape of the code, not + # that the code exists in the Uniclass table. + code_pattern: "^[A-Za-z]{2}_[0-9]{2}(_[0-9]{2}){0,3}$" diff --git a/examples/sample.ids b/examples/sample.ids new file mode 100644 index 0000000..e068f37 --- /dev/null +++ b/examples/sample.ids @@ -0,0 +1,85 @@ + + + + + VeriModel sample requirements + Example file, MIT licence (see repository LICENSE) + 1.0 + Minimal example of a buildingSMART IDS 1.0 file used by the VeriModel examples. It asks that walls carry fire rating and external-wall information, and that beams carry a material. + examples@example.com + 2026-10-17 + Demonstrate how a project requirement is written as an IDS specification. + + + + + + + + IFCWALL + + + + + + + Pset_WallCommon + + + FireRating + + + + + + + + + + + IFCWALL + + + + + + + Pset_WallCommon + + + IsExternal + + + + + + + + + + + IFCBEAM + + + + + + + + + diff --git a/frontend/.gitkeep b/frontend/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..e82fab9 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,44 @@ +# VeriModel frontend + +Vanilla HTML + CSS + ES modules. No npm, no bundler, no framework, no CDN, no web fonts. The folder is served as-is. + +## Run in a browser (development, mock data) + +ES modules and `fetch` do not work over `file://`, so serve the folder with any static server: + +```sh +cd frontend +python3 -m http.server 8765 +# open http://localhost:8765 +``` + +When `window.__TAURI__` is undefined, `js/api.js` answers every command from `mock/*.json` +(`report.json`, `file_card.json`, `runs.json`, plus `examples.json`, `run_result.json`, `elements.json`). +Drop or pick any file to see the mock file card; a file whose name contains `broken` shows the parse-error card. +Use "Try with a sample" for the quickest walk-through. + +## How Tauri loads it + +`src-tauri/tauri.conf.json` sets `frontendDist` to `../frontend` and `withGlobalTauri: true`, so +`index.html` is served directly and `window.__TAURI__` is available. `js/api.js` is the only file that +calls `core.invoke`, `dialog.open/save` and `event.listen` (drag and drop). + +Commands used: `inspect_file`, `run_check`, `list_runs`, `default_config_yaml`, `validate_config_yaml`, +`list_examples`, `open_path`, `save_text_file`, `get_element`, `read_text_file`, `app_info`, and the assistant commands +`assistant_status`, `assistant_download_model` (emits the `assistant://download-progress` event `{ done, total }`), +`assistant_remove_model`, `assistant_ask({ task })`, `assistant_import_docs({ paths })`, `assistant_knowledge_yaml`. + +## Layout + +- `index.html`, `styles.css` (tokens on `:root[data-theme]`), `app.js` (boot, routing, run flow) +- `js/` modules: `api`, `i18n`, `state`, `units`, `yaml`, `settings`, `view-load`, `view-review`, `view-export`, `detail`, `table`, `dom`, `format` +- `i18n/en.json`, `i18n/es.json`: every user-facing string, same keys. Plurals use `key_one` / `key_other`. +- Preferences persisted in `localStorage`: `vm.theme`, `vm.lang`, `vm.units`. + +## Assistant panel (`js/assistant.js`) + +A right-hand drawer (420 px, Escape closes) opened from the header. In a browser the answers are canned +(`mock/assistant_status.json` plus per-kind answers in `js/api.js`): a question with "level 9" shows the +dropped-value note, "[raw]" shows the unstructured-answer note, "invalid" in a settings question shows the +Invalid badge. The panel never decides pass/fail; it only proposes filters, text and YAML that the user applies +with a button. The demo example (`id: demo`) is always the first sample and has a "Load the demo" button next to the drop zone. diff --git a/frontend/app.js b/frontend/app.js new file mode 100644 index 0000000..e470dae --- /dev/null +++ b/frontend/app.js @@ -0,0 +1,198 @@ +// VeriModel frontend entry point. +// +// Why vanilla HTML + CSS + ES modules (no framework, no bundler, no npm): +// * No build step to break: the folder is the product. Tauri serves these +// files as they are (frontendDist = ../frontend), and a developer can open +// them over any static server. +// * Nothing is fetched from a CDN or font host, so the app is fully offline +// and the UI cannot silently depend on a third party. +// * Auditable: a quality gate that BIM coordinators rely on should have a UI +// whose complete source can be read in an afternoon, with no transitive +// dependency tree to review. +import { $, $$, initTooltips, toast, hideTip } from './js/dom.js'; +import { setLanguage, applyI18n, t } from './js/i18n.js'; +import { state, actions, store } from './js/state.js'; +import * as api from './js/api.js'; +import { defaultSettings, effectiveYaml, loadDefaultYaml } from './js/settings.js'; +import { + initLoad, renderLoad, renderRunBar, renderSettingsPanel, updateSettingsBadge, + handleDropped, clearConfigFile, +} from './js/view-load.js'; +import { renderReview, refreshHead, setRuleFilter, closeVerdictPopover } from './js/view-review.js'; +import { renderExport } from './js/view-export.js'; +import { initAssistant, renderAssistant, refreshChips, isAssistantOpen, closeAssistant, explainFinding } from './js/assistant.js'; +import { initDetail, openDetail, closeDetail, isDetailOpen, renderDetail } from './js/detail.js'; + +const VIEWS = { 1: '#view-load', 2: '#view-review', 3: '#view-export' }; +const stepAvailable = (n) => n === 1 || Boolean(state.result); + +// ------------------------------------------------------------ preferences + +function applyTheme() { + document.documentElement.dataset.theme = state.theme; + $$('[data-theme-set]').forEach((b) => b.setAttribute('aria-pressed', String(b.dataset.themeSet === state.theme))); +} +function applyToggleState() { + applyTheme(); + $$('[data-lang-set]').forEach((b) => b.setAttribute('aria-pressed', String(b.dataset.langSet === state.lang))); + $$('[data-units-set]').forEach((b) => b.setAttribute('aria-pressed', String(b.dataset.unitsSet === state.units))); +} + +async function setLang(lang) { + state.lang = lang; + store.set('vm.lang', lang); + await setLanguage(lang); + applyI18n(); + applyToggleState(); + renderSettingsPanel(); + renderAll(); + renderAssistant(); +} + +// ---------------------------------------------------------------- routing + +function renderStepper() { + $$('#stepper .step').forEach((b) => { + const n = Number(b.dataset.step); + const current = n === state.step; + b.disabled = !stepAvailable(n); + b.classList.toggle('is-current', current); + b.classList.toggle('is-done', !current && (n === 1 ? Boolean(state.result) : n < state.step)); + if (current) b.setAttribute('aria-current', 'step'); else b.removeAttribute('aria-current'); + }); +} + +function renderAll() { + renderStepper(); + Object.entries(VIEWS).forEach(([n, sel]) => { $(sel).hidden = Number(n) !== state.step; }); + document.body.dataset.step = String(state.step); + if (state.step === 1) renderLoad(); + if (state.step === 2) renderReview(); + if (state.step === 3) renderExport(); +} + +async function goto(n, { focus = true } = {}) { + if (!stepAvailable(n)) return; + if (n !== 2) closeDetail(); + state.step = n; + if (n === 3) { + try { state.runs = await api.listRuns(null); state.runsError = null; } + catch (e) { state.runs = []; state.runsError = e; } + } + renderAll(); + window.scrollTo({ top: 0 }); + if (focus) $(`${VIEWS[n]} h1`).focus({ preventScroll: true }); +} + +// ------------------------------------------------------------------ run + +function setBusy(on) { $('#busy').hidden = !on; } + +async function run() { + if (state.running || !state.file) return; + state.running = true; + state.loadError = null; + state.runStage = t('run.stage.read'); + setBusy(true); + renderRunBar(); + refreshHead(); + const timer = setTimeout(() => { state.runStage = t('run.stage.check'); renderRunBar(); refreshHead(); }, 1100); + try { + const first = !state.result; + const res = await api.runCheck({ + ifc_path: state.file.path, + ids_path: state.idsPath, + config_yaml: effectiveYaml(), + out_dir: null, + }); + state.result = res; + state.review.filters = { sev: { ERROR: true, WARNING: true, INFO: true }, rule: '', storey: '', type: '', q: '' }; + state.review.page = { checks: 1, failures: 1, quantities: 1 }; + if (first) state.review.tab = 'checks'; + closeDetail(); + state.running = false; + await goto(2); + if (!first) toast(t('run.done_again'), 'success'); + } catch (e) { + state.running = false; + state.loadError = e; + await goto(1); + } finally { + clearTimeout(timer); + state.running = false; + state.runStage = ''; + setBusy(false); + if (state.step === 1) renderLoad(); else refreshHead(); + } +} + +function newCheck() { + // Fresh model, same configuration: settings, project.yaml and IDS stay. + state.file = null; + state.loadError = null; + goto(1); +} + +// ------------------------------------------------------------------ boot + +async function boot() { + initTooltips(); + state.settings = defaultSettings(); + await setLanguage(state.lang); + + Object.assign(actions, { + goto, run, newCheck, toast, openDetail, clearConfigFile, + filterByRule: setRuleFilter, + explainFinding, + assistantChanged: refreshChips, + // The assistant replaced the project settings with its YAML: show them on step 1. + settingsRefresh: () => { + renderSettingsPanel(); renderRunBar(); updateSettingsBadge(); + const d = $('#settings'); if (d) d.open = true; + if (state.step !== 1) goto(1, { focus: false }); + }, + settingsChanged: () => { renderRunBar(); updateSettingsBadge(); }, + }); + + // toggles + $$('[data-theme-set]').forEach((b) => b.addEventListener('click', () => { + state.theme = b.dataset.themeSet; store.set('vm.theme', state.theme); applyTheme(); + })); + $$('[data-lang-set]').forEach((b) => b.addEventListener('click', () => setLang(b.dataset.langSet))); + $$('[data-units-set]').forEach((b) => b.addEventListener('click', () => { + state.units = b.dataset.unitsSet; store.set('vm.units', state.units); applyToggleState(); renderAll(); + if (isDetailOpen()) renderDetail(); + })); + $$('#stepper .step').forEach((b) => b.addEventListener('click', () => goto(Number(b.dataset.step)))); + + applyI18n(); + applyToggleState(); + initLoad(); + initDetail(); + renderSettingsPanel(); + initAssistant(); + + document.addEventListener('keydown', (e) => { + if (e.key !== 'Escape') return; + hideTip(); + if (closeVerdictPopover()) { const b = $('#btn-verdict-info'); if (b) b.focus(); return; } + if (isAssistantOpen()) { closeAssistant(); e.preventDefault(); return; } + if (closeDetail()) e.preventDefault(); + }); + + const [examples] = await Promise.all([api.listExamples().catch(() => []), loadDefaultYaml()]); + state.examples = examples; + renderSettingsPanel(); + renderAll(); + + api.onDragDrop({ + enter: () => $('#dropzone').classList.add('is-dragging'), + leave: () => $('#dropzone').classList.remove('is-dragging'), + drop: async (paths) => { if (state.step !== 1) await goto(1, { focus: false }); handleDropped(paths); }, + }); +} + +boot().catch((e) => { + console.error(e); + document.body.insertAdjacentText('afterbegin', t('app.start_failed')); +}); diff --git a/frontend/assets/logo-mark.svg b/frontend/assets/logo-mark.svg new file mode 100644 index 0000000..09f6617 --- /dev/null +++ b/frontend/assets/logo-mark.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/frontend/assets/logo-wordmark.svg b/frontend/assets/logo-wordmark.svg new file mode 100644 index 0000000..5ceaf77 --- /dev/null +++ b/frontend/assets/logo-wordmark.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + VeriModel + IFC QA GATE · QTO · BCF + diff --git a/frontend/i18n/en.json b/frontend/i18n/en.json new file mode 100644 index 0000000..841fc8b --- /dev/null +++ b/frontend/i18n/en.json @@ -0,0 +1,488 @@ +{ + "app.tagline": "Your model does not pass unless it proves it passes.", + "app.privacy": "Everything runs on your computer. Your model never leaves it.", + "app.start_failed": "VeriModel could not start. Close and reopen the window.", + "a11y.skip": "Skip to main content", + "stepper.label": "Progress", + "stepper.load": "Load", + "stepper.review": "Review", + "stepper.export": "Export", + "toggle.theme": "Theme", + "toggle.theme.light": "Light", + "toggle.theme.dark": "Dark", + "toggle.lang": "Language", + "toggle.lang.en": "EN", + "toggle.lang.es": "ES", + "toggle.units": "Units", + "toggle.units.metric": "Metric", + "toggle.units.imperial": "Imperial", + "common.optional": "optional", + "common.remove": "Remove", + "common.browse": "Browse", + "common.dismiss": "Dismiss", + "common.close": "Close", + "common.none": "None", + "common.yes": "Yes", + "common.no": "No", + "term.ids": "IDS", + "tip.ids": "Information Delivery Specification: a standard file (buildingSMART) in which a client lists what information each kind of element must carry, such as \"every wall has a fire rating\".", + "tip.bcf": "BIM Collaboration Format: a standard file of issues. Each failure becomes an issue you can open in Revit, Navisworks, Solibri, BIMcollab and similar tools.", + "term.globalid": "GlobalId", + "tip.globalid": "The unique 22-character identifier of an element inside an IFC file. Paste it in your authoring tool to find the element.", + "term.pset": "Property set (pset)", + "tip.pset": "A named group of properties attached to an element, for example Pset_WallCommon holds FireRating and IsExternal.", + "term.schema": "Schema", + "tip.schema": "The IFC version the file was written in (IFC2X3, IFC4, IFC4X3). It decides which element types and properties can exist.", + "tip.qto": "Quantity takeoff: counting and measuring elements (number, length, area, volume) so they can be scheduled and priced.", + "term.config": "project.yaml", + "tip.config": "A small text file with your project settings: which rules to use, tolerances, classification and how quantities are grouped. Every field is optional.", + "load.title": "Load your model", + "load.lede": "Drop an IFC file to check it. There is nothing to configure: the defaults work for any project.", + "load.drop.title": "Drop your IFC model here", + "load.drop.sub": "You can also drop an IDS file and a project.yaml at the same time.", + "load.drop.title_loaded": "Drop another IFC file to replace this one", + "load.drop.sub_loaded": "Your IDS file and project settings are kept.", + "load.drop.extra_ifc": "Only one IFC file at a time. Ignored: {name}", + "load.drop.unsupported": "Unsupported file type: {name}. Use .ifc, .ifczip, .ids or .yaml files.", + "load.browse.ifc": "Browse for an IFC file", + "load.browse.ifc_replace": "Browse for another IFC file", + "load.browse.ids": "Browse for an IDS file", + "load.browse.config": "Browse for a project.yaml", + "load.ids.desc": "The information your client asks for, in the standard buildingSMART format.", + "load.config.desc": "Your project settings. Skip it to use sensible defaults.", + "load.config.unreadable": "Could not read {name}. The default settings will be used.", + "load.samples.title": "No file at hand? Try a sample", + "load.samples.sub": "Samples come with the app and run fully offline.", + "load.samples.use": "Use this sample", + "load.samples.use_named": "Use the sample {name}", + "load.samples.with_ids": "Includes an IDS", + "load.samples.no_ids": "No IDS", + "load.samples.with_config": "Own project.yaml", + "load.samples.default_config": "Default settings", + "load.reading": "Reading the file…", + "load.card.ready": "Ready to check", + "load.card.size": "File size", + "load.card.elements": "Elements", + "load.card.units": "Units", + "load.card.sha": "SHA-256", + "load.card.disciplines": "Disciplines", + "load.card.storeys": "Storeys", + "load.card.types": "Main element types", + "load.card.warnings_one": "1 warning while reading the file", + "load.card.warnings_other": "{n} warnings while reading the file", + "units.metric": "Metric", + "units.imperial": "Imperial", + "discipline.architecture": "Architecture", + "discipline.structure": "Structure", + "discipline.mep": "MEP", + "discipline.civil": "Civil", + "load.run": "Run quality check", + "run.running": "Checking your model…", + "run.running_btn": "Checking…", + "run.need_file": "Load an IFC file to begin", + "run.need_file_sub": "Then press Run quality check.", + "run.fix_settings": "Fix the project settings first", + "run.ready": "Ready to check {name}", + "run.ready_sub": "{count} elements · {ids} · {cfg}", + "run.with_ids": "with an IDS file", + "run.no_ids": "no IDS file", + "run.cfg_default": "default settings", + "run.cfg_edited": "your edited settings", + "run.cfg_file": "your project.yaml", + "run.stage.read": "Reading model…", + "run.stage.check": "Running checks…", + "run.done_again": "Check finished. Results are up to date.", + "error.title": "We could not use this file", + "error.check": "What to check:", + "error.generic_hint": "Make sure the file opens in your authoring tool, export it again and retry.", + "settings.title": "Project settings", + "settings.hint": "Optional. The defaults already work.", + "settings.badge.edited": "Edited", + "settings.badge.file": "From file", + "settings.badge.problem": "Needs attention", + "settings.sec.rules": "Rules and tolerances", + "settings.sec.classification": "Classification", + "settings.sec.qto": "Quantity takeoff (QTO)", + "settings.sec.report": "Report", + "settings.pack.label": "Rule pack", + "settings.pack.hint": "The built-in generic pack checks identity, spatial structure, geometry, classification and more.", + "settings.pack.generic": "Generic (built in)", + "settings.pack.custom": "Custom rule pack file", + "settings.pack.placeholder": "Path to your rule pack .yaml", + "settings.far.label": "Far from origin (metres)", + "settings.far.hint": "Elements farther than this from the project origin are flagged.", + "settings.minvol.label": "Minimum volume (m³)", + "settings.minvol.hint": "Shapes below this volume count as empty.", + "settings.cls.label": "Classification system", + "settings.cls.hint": "The system your project uses to classify elements.", + "settings.cls.none": "None", + "settings.cls.required": "Every element must be classified", + "settings.cls.required_hint": "Elements without a classification are reported as errors.", + "settings.group.label": "Group quantities by", + "settings.group.hint": "Choose at least one. The order in the table follows this list.", + "group.type": "Type", + "group.storey": "Storey", + "group.classification": "Classification", + "group.material": "Material", + "group.predefined_type": "Predefined type", + "group.type_name": "Type name", + "settings.currency.label": "Currency", + "settings.rates.label": "Unit rates file", + "settings.rates.hint": "A CSV with unit rates. Without it, quantities are listed with no cost.", + "settings.rates.placeholder": "Path to your rates .csv (optional)", + "settings.lang.label": "Language of the report", + "settings.lang.hint": "Applies to report.html. Follows the interface language until you change it.", + "settings.lang.en": "English", + "settings.lang.es": "Spanish", + "settings.preview.title": "project.yaml preview", + "settings.preview.label": "Generated project.yaml, read only", + "settings.preview.defaults": "Defaults", + "settings.preview.edited": "Edited", + "settings.preview.raw": "Your file", + "settings.download": "Download project.yaml", + "settings.reset": "Reset to defaults", + "settings.saved": "Saved {name}", + "settings.yaml.header": "# Generated by VeriModel. Every field is optional; edit freely.", + "settings.locked.title": "Using {name}", + "settings.locked.body": "The form below is off while your own file is in use. The preview shows the file as it will be sent.", + "settings.locked.use_form": "Use the form instead", + "settings.err.rule_pack_path": "Choose the rule pack file, or switch back to the generic pack.", + "settings.err.far": "Far from origin must be a number greater than 0.", + "settings.err.min_volume": "Minimum volume must be 0 or more.", + "settings.err.group_by": "Choose at least one way to group quantities.", + "settings.err.currency": "Currency must be a 3-letter code such as EUR or USD.", + "settings.err.generic": "The settings are not valid.", + "review.title": "Review results", + "review.score_aria": "Quality score {score} out of 100", + "review.score_of": "/ 100", + "review.verdict_how": "How is the verdict decided?", + "review.with_ids": "checked against an IDS", + "review.elements_n_one": "1 element", + "review.elements_n_other": "{n} elements", + "review.stat.elements": "Elements checked", + "review.stat.errors": "Errors", + "review.stat.warnings": "Warnings", + "review.stat.infos": "Info", + "review.stat.time": "Run time", + "review.rules_line": "Checks: {passed} passed, {failed} failed, {skipped} skipped, {na} not applicable", + "review.to_export": "Continue to export", + "review.rerun": "Re-run", + "review.change_settings": "Change settings", + "review.tabs": "Result sections", + "verdict.PASS": "PASS", + "verdict.PASS_WITH_WARNINGS": "PASS WITH WARNINGS", + "verdict.FAIL": "FAIL", + "verdict.NONE": "NO VERDICT", + "sev.ERROR": "Error", + "sev.WARNING": "Warning", + "sev.INFO": "Info", + "status.PASS": "Passed", + "status.FAIL": "Failed", + "status.SKIPPED": "Skipped", + "status.NOT_APPLICABLE": "Not applicable", + "tab.checks": "Checks", + "tab.failures": "Failures", + "tab.quantities": "Quantities", + "tab.ids": "IDS", + "tab.clash": "Clash", + "filter.severity": "Severity", + "filter.rule": "Rule", + "filter.storey": "Storey", + "filter.type": "Type", + "filter.search": "Search", + "filter.all_rules": "All rules", + "filter.all_storeys": "All storeys", + "filter.all_types": "All types", + "filter.no_storey": "(no storey)", + "filter.search_failures": "GlobalId or name", + "filter.search_checks": "Rule id or description", + "filter.search_qto": "Type or storey", + "filter.clear": "Clear filters", + "empty.filters.title": "Nothing matches these filters", + "empty.filters.body": "Try removing a filter or searching for something else.", + "empty.nofailures.title": "No failures", + "empty.nofailures.body": "Every check that ran passed. Skipped checks were not run and are listed under Checks.", + "col.rule": "Rule", + "col.category": "Category", + "col.description": "Description", + "col.severity": "Severity", + "col.status": "Status", + "col.checked": "Checked", + "col.failures": "Failures", + "col.globalid": "GlobalId", + "col.type": "Type", + "col.name": "Name", + "col.storey": "Storey", + "col.problem": "Problem", + "col.expected_actual": "Expected vs actual", + "col.fix": "How to fix", + "category.identity": "Identity", + "category.spatial": "Spatial", + "category.properties": "Properties", + "category.geometry": "Geometry", + "category.classification": "Classification", + "category.naming": "Naming", + "category.sanity": "Sanity", + "category.schema": "Schema", + "checks.skipped_because": "Skipped because:", + "checks.show_failures": "Show the {n} failures of rule {rule}", + "checks.hint": "Select a rule with failures to see them in the Failures tab.", + "failures.model_level": "Whole model", + "failures.open_element": "Open details of element {id}", + "failures.expected": "Expected", + "failures.actual": "Actual", + "qto.method_title": "How these quantities were calculated", + "qto.without_quantities_one": "1 element has no usable quantity and adds nothing to the totals.", + "qto.without_quantities_other": "{n} elements have no usable quantity and add nothing to the totals.", + "qto.count": "Count", + "qto.volume": "Volume", + "qto.area": "Area", + "qto.length": "Length", + "qto.weight": "Weight", + "qto.rate": "Unit rate", + "qto.cost": "Cost", + "qto.no_rate": "No unit rate matched this group", + "qto.total": "Total", + "qto.selection": "Selection", + "qto.volume_source": "Volume from", + "qto.area_source": "Area from", + "qto.length_source": "Length from", + "qto.sources_hint": "Hover a quantity to see whether it comes from the model or was computed from geometry.", + "qto.samples_title": "Hand-check samples", + "qto.samples_hint": "Pick any of these elements in your authoring tool and compare the numbers by hand. Each value says where it came from.", + "qto.qsets": "Quantity sets in the file", + "qto.no_qsets": "None", + "source.base_quantity.short": "from the model", + "source.geometry.short": "computed from geometry", + "source.none.short": "no value", + "source.base_quantity.label": "model", + "source.geometry.label": "geometry", + "source.none.label": "none", + "unit.metric.len": "m", + "unit.metric.area": "m²", + "unit.metric.vol": "m³", + "unit.metric.mass": "kg", + "unit.imperial.len": "ft", + "unit.imperial.area": "ft²", + "unit.imperial.vol": "ft³", + "unit.imperial.mass": "lb", + "unit.rate.nr": "each", + "ids.empty.title": "No IDS file was used in this check", + "ids.empty.what": "is a file in which your client or BIM execution plan states, in a standard format, what information each kind of element must carry.", + "ids.empty.example": "For example: \"every wall has a fire rating\" or \"every door has a material\". VeriModel then lists each requirement, quotes it, and shows which elements fail it.", + "ids.empty.how": "To use one, add it in step 1 under Load, then run the check again.", + "ids.summary": "{passed} of {total} specifications passed", + "ids.card.required": "Required", + "ids.card.optional": "Optional", + "ids.card.prohibited": "Prohibited", + "ids.applies_to": "Applies to", + "ids.applicable_count": "Elements it applies to", + "ids.failed_count": "Failing elements", + "ids.instructions": "Instructions:", + "ids.failed_entities": "Failing elements", + "ids.reason": "Reason", + "ids.failed_n": "{n} failed", + "ids.show_more": "Show more ({shown} of {total} shown)", + "ids.facet.entity": "Entity", + "ids.facet.attribute": "Attribute", + "ids.facet.property": "Property", + "ids.facet.classification": "Classification", + "ids.facet.material": "Material", + "ids.facet.partOf": "Part of", + "clash.title": "Clash detection", + "clash.phase2": "Coming in phase 2", + "clash.available": "Available", + "clash.found_one": "1 clash found.", + "clash.found_other": "{n} clashes found.", + "pager.showing": "Showing {from}–{to} of {total}", + "pager.none": "No rows", + "pager.per_page": "Rows per page", + "pager.prev": "Previous", + "pager.next": "Next", + "pager.page": "Page {page} of {pages}", + "detail.fix": "How to fix:", + "detail.loading": "Loading element details…", + "detail.unavailable": "Element details are not available", + "detail.model_level": "Whole model", + "detail.model_level_body": "This finding is about the model as a whole, not about one element.", + "detail.sec.identity": "Element", + "detail.sec.quantities": "Quantities", + "detail.sec.classifications": "Classifications", + "detail.sec.geometry": "Geometry", + "detail.step_id": "STEP line", + "detail.type_name": "Type name", + "detail.tag": "Tag", + "detail.container": "Contained in", + "detail.no_container": "Nothing (not placed in the spatial structure)", + "detail.materials": "Materials", + "detail.no_psets": "No property sets.", + "detail.no_quantities": "No quantity sets in the file.", + "detail.no_classifications": "No classification.", + "detail.null": "no value", + "detail.empty": "empty", + "detail.copy": "Copy", + "detail.copied": "GlobalId copied", + "detail.copy_failed": "Could not copy. Select the GlobalId and copy it by hand.", + "detail.geom.none": "The geometry kernel could not build a shape for this element.", + "detail.geom.no_rep": "This element has no geometric representation.", + "detail.geom.min": "Box minimum (x, y, z)", + "detail.geom.max": "Box maximum (x, y, z)", + "detail.geom.size": "Box size", + "detail.geom.distance": "Distance from origin", + "detail.geom.triangles": "Triangles", + "detail.other_findings_one": "1 other finding on this element", + "detail.other_findings_other": "{n} other findings on this element", + "export.title": "Export", + "export.lede": "Everything below was written to your output folder. Share the report, send the issues to your team, and keep the audit files as proof.", + "export.done": "Check complete", + "export.saved_to": "Files saved to", + "export.open_folder": "Open output folder", + "export.downloads": "Your files", + "export.downloads_sub": "Open any file with your usual program.", + "export.open": "Open", + "export.open_named": "Open {name}", + "export.browser_open": "In the desktop app this opens {path}.", + "export.bcf_line": "{topics} issues, {viewpoints} with a 3D viewpoint · BCF version {version}", + "export.back_review": "Back to review", + "export.new_check": "Start new check", + "export.kind.report_html.title": "Quality report", + "export.kind.report_html.desc": "A single page you can email or print: score, verdict, every check, failures, quantities and IDS results. No internet needed to open it.", + "export.kind.failures_csv.title": "Failures list", + "export.kind.failures_csv.desc": "One row per failure, ready for Excel: rule, element, problem and how to fix it.", + "export.kind.bcf.title": "Issues (BCF)", + "export.kind.bcf.desc": "One issue per failure with a 3D viewpoint. Import it in Revit, Navisworks, Solibri or BIMcollab to send the problems back to the modellers.", + "export.kind.issues_csv.title": "Issues list", + "export.kind.issues_csv.desc": "The same issues as the BCF file in a spreadsheet, for people who do not use a BIM viewer.", + "export.kind.qto_xlsx.title": "Quantities (Excel)", + "export.kind.qto_xlsx.desc": "The quantity takeoff as an Excel workbook, grouped as you chose, with totals and costs when unit rates were given.", + "export.kind.qto_csv.title": "Quantities (CSV)", + "export.kind.qto_csv.desc": "The same quantity takeoff as plain text, for importing into other tools.", + "export.kind.qto_json.title": "Quantities (JSON)", + "export.kind.qto_json.desc": "The quantity takeoff in a machine-readable form, for scripts and integrations.", + "export.kind.report_json.title": "Full result (JSON)", + "export.kind.report_json.desc": "Every number and finding in one machine-readable file. The same input always produces the same file.", + "export.kind.config.title": "Settings used", + "export.kind.config.desc": "The exact project settings of this run, so you or a colleague can repeat it.", + "export.kind.run_json.title": "Run record", + "export.kind.run_json.desc": "When the check ran, how long it took and fingerprints (SHA-256) of every input and of the report, as proof of what was checked.", + "export.kind.audit_log.title": "Audit log", + "export.kind.audit_log.desc": "A step-by-step text log of what the tool did, for audits and for diagnosing problems.", + "export.kind.other.desc": "An additional file produced by this run.", + "hist.title": "Run history", + "hist.sub": "Past checks on this computer, newest first. Each is compared with the previous run of the same file.", + "hist.empty": "No earlier runs yet.", + "hist.error": "The run history could not be loaded", + "hist.date": "Date", + "hist.file": "File", + "hist.score": "Score", + "hist.verdict": "Verdict", + "hist.errors": "Errors", + "hist.warnings": "Warnings", + "hist.change": "Compared with last run", + "hist.folder": "Folder", + "hist.open": "Open folder", + "hist.open_named": "Open the folder of the run from {date}", + "hist.this_run": "This run", + "hist.first": "First run of this file", + "hist.same": "Same as last run", + "hist.fewer_errors_one": "1 fewer error than last run", + "hist.fewer_errors_other": "{n} fewer errors than last run", + "hist.more_errors_one": "1 more error than last run", + "hist.more_errors_other": "{n} more errors than last run", + "hist.fewer_warnings_one": "1 fewer warning than last run", + "hist.fewer_warnings_other": "{n} fewer warnings than last run", + "hist.more_warnings_one": "1 more warning than last run", + "hist.more_warnings_other": "{n} more warnings than last run", + "app.about": "VeriModel is licensed under PolyForm Noncommercial 1.0.0. Required Notice: Copyright 2026 Grohle.", + "app.version_pill": "v{version}", + "app.version_aria": "Version {version}", + "header.assistant": "Assistant", + "header.assistant_aria": "Open the assistant panel", + "load.demo.btn": "Load the demo", + "load.demo.hint": "No file at hand? One click loads a ready-made model with its settings.", + "load.demo.aria": "Load the demo pavilion, a ready-made model with its project settings", + "load.samples.start_here": "Start here", + "detail.explain": "Explain with assistant", + "assistant.title": "Assistant", + "assistant.eyebrow": "Local copilot, optional", + "assistant.status.title": "Language model", + "assistant.status.ready": "Ready", + "assistant.status.ready_sub": "The model loads into memory when you ask your first question.", + "assistant.status.loaded_sub": "Loaded in memory.", + "assistant.status.missing": "Not installed", + "assistant.status.explain": "Optional. Runs fully on your computer. Downloads {size} once from Hugging Face. It never decides pass/fail; it only helps you search, understand and configure.", + "assistant.status.error": "Could not read the assistant status.", + "assistant.status.size": "Size", + "assistant.status.license": "License", + "assistant.status.ram": "Memory", + "assistant.status.ram_value": "~{mb} MB", + "assistant.status.backend": "Engine", + "assistant.status.backend_none": "none in this build", + "assistant.download": "Download model", + "assistant.downloading": "Downloading… {pct}%", + "assistant.download_progress": "Model download progress", + "assistant.downloaded": "Assistant model installed.", + "assistant.remove": "Remove model", + "assistant.remove_confirm": "Click again to remove", + "assistant.removed": "Assistant model removed.", + "assistant.quick": "Quick actions", + "assistant.chip.find_errors": "Find errors on a storey", + "assistant.chip.explain": "Explain this failure", + "assistant.chip.config": "Help me write project.yaml", + "assistant.chip.rule": "What does rule … check?", + "assistant.chip.explain_disabled": "Open a finding from the Failures table first, then explain it.", + "assistant.prefill.find_errors": "Show the errors on {storey}", + "assistant.prefill.explain": "Explain this failure in plain language", + "assistant.prefill.config": "Help me write project.yaml: ", + "assistant.prefill.rule": "What does rule {rule} check?", + "assistant.mode.ask": "Sent as a general question", + "assistant.mode.filter": "Sent as a search in the report", + "assistant.mode.explain": "Sent as an explanation of the selected finding", + "assistant.mode.config": "Sent as help with project settings", + "assistant.convo": "Conversation", + "assistant.empty": "Ask about your report, a failure or the project settings. Answers are suggestions: nothing changes until you press a button.", + "assistant.you": "You", + "assistant.assistant": "Assistant", + "assistant.thinking": "Thinking…", + "assistant.need_report": "Run a check first, so there is a report to search.", + "assistant.need_finding": "Open a finding from the Failures table first.", + "assistant.answer_error": "The assistant could not answer", + "assistant.filter.apply": "Apply filter", + "assistant.filter.applied": "Filter applied in Review", + "assistant.filter.need_report": "Run a check to apply a filter.", + "assistant.filter.none": "No filter proposed.", + "assistant.filter.severity": "Severity", + "assistant.filter.rule": "Rule", + "assistant.filter.storey": "Storey", + "assistant.filter.type": "Type", + "assistant.filter.search": "Search", + "assistant.filter.dropped": "ignored: {values} (not in this report)", + "assistant.config.valid": "Valid", + "assistant.config.invalid": "Invalid: {error}", + "assistant.config.use": "Use in settings", + "assistant.config.use_hint": "Replaces the project settings with this YAML. Only offered when it is valid.", + "assistant.config.copy": "Copy YAML", + "assistant.config.copied": "YAML copied", + "assistant.config.applied": "Project settings now use this YAML. Run the check again to apply them.", + "assistant.sources": "Sources: {list}", + "assistant.unstructured": "The assistant could not give a structured answer; shown as text.", + "assistant.input.label": "Your question", + "assistant.input.placeholder": "Ask a question. Enter sends, Shift+Enter adds a line.", + "assistant.send": "Send", + "assistant.input.disabled": "Download the model above to ask questions.", + "assistant.import.files": "Import documentation…", + "assistant.import.folder": "Import folder…", + "assistant.import.hint": "Adds your project documents (.md .txt .yaml .json .docx .pdf) to what the assistant can look up.", + "assistant.import.working": "Reading documents…", + "assistant.import.summary": "{files}, {chunks} added", + "assistant.import.files_one": "1 file", + "assistant.import.files_other": "{n} files", + "assistant.import.chunks_one": "1 chunk", + "assistant.import.chunks_other": "{n} chunks", + "assistant.import.skipped": "skipped: {list}", + "assistant.import.save": "Save knowledge.yaml", + "assistant.import.saved": "Saved {name}", + "assistant.disclaimer": "Read-only copilot. Verdicts, scores and quantities never come from the assistant.", + "load.demo.card_name": "Demo pavilion (start here)", + "load.demo.card_desc": "Two-storey office pavilion with properties, quantities, classification and five deliberate defects — the fastest way to see VeriModel at work." +} diff --git a/frontend/i18n/es.json b/frontend/i18n/es.json new file mode 100644 index 0000000..f752fe3 --- /dev/null +++ b/frontend/i18n/es.json @@ -0,0 +1,488 @@ +{ + "app.tagline": "Tu modelo no aprueba a menos que demuestre que aprueba.", + "app.privacy": "Todo se ejecuta en tu ordenador. Tu modelo nunca sale de él.", + "app.start_failed": "VeriModel no pudo iniciarse. Cierra y vuelve a abrir la ventana.", + "a11y.skip": "Saltar al contenido principal", + "stepper.label": "Progreso", + "stepper.load": "Cargar", + "stepper.review": "Revisar", + "stepper.export": "Exportar", + "toggle.theme": "Tema", + "toggle.theme.light": "Claro", + "toggle.theme.dark": "Oscuro", + "toggle.lang": "Idioma", + "toggle.lang.en": "EN", + "toggle.lang.es": "ES", + "toggle.units": "Unidades", + "toggle.units.metric": "Métrico", + "toggle.units.imperial": "Imperial", + "common.optional": "opcional", + "common.remove": "Quitar", + "common.browse": "Examinar", + "common.dismiss": "Descartar", + "common.close": "Cerrar", + "common.none": "Ninguno", + "common.yes": "Sí", + "common.no": "No", + "term.ids": "IDS", + "tip.ids": "Information Delivery Specification: un archivo estándar (buildingSMART) donde el cliente indica qué información debe llevar cada tipo de elemento, por ejemplo \"todo muro tiene resistencia al fuego\".", + "tip.bcf": "BIM Collaboration Format: un archivo estándar de incidencias. Cada fallo se convierte en una incidencia que puedes abrir en Revit, Navisworks, Solibri, BIMcollab y similares.", + "term.globalid": "GlobalId", + "tip.globalid": "El identificador único de 22 caracteres de un elemento dentro de un archivo IFC. Pégalo en tu herramienta de autoría para encontrar el elemento.", + "term.pset": "Conjunto de propiedades (pset)", + "tip.pset": "Un grupo con nombre de propiedades de un elemento; por ejemplo, Pset_WallCommon contiene FireRating e IsExternal.", + "term.schema": "Esquema", + "tip.schema": "La versión de IFC en la que se escribió el archivo (IFC2X3, IFC4, IFC4X3). Determina qué tipos de elemento y propiedades pueden existir.", + "tip.qto": "Quantity takeoff (mediciones): contar y medir elementos (número, longitud, área, volumen) para poder planificarlos y valorarlos.", + "term.config": "project.yaml", + "tip.config": "Un pequeño archivo de texto con los ajustes de tu proyecto: qué reglas usar, tolerancias, clasificación y cómo se agrupan las mediciones. Todos los campos son opcionales.", + "load.title": "Carga tu modelo", + "load.lede": "Suelta un archivo IFC para comprobarlo. No hay nada que configurar: los valores por defecto sirven para cualquier proyecto.", + "load.drop.title": "Suelta aquí tu modelo IFC", + "load.drop.sub": "También puedes soltar a la vez un archivo IDS y un project.yaml.", + "load.drop.title_loaded": "Suelta otro archivo IFC para reemplazar este", + "load.drop.sub_loaded": "Se conservan tu archivo IDS y los ajustes del proyecto.", + "load.drop.extra_ifc": "Solo un archivo IFC a la vez. Ignorado: {name}", + "load.drop.unsupported": "Tipo de archivo no admitido: {name}. Usa archivos .ifc, .ifczip, .ids o .yaml.", + "load.browse.ifc": "Buscar un archivo IFC", + "load.browse.ifc_replace": "Buscar otro archivo IFC", + "load.browse.ids": "Buscar un archivo IDS", + "load.browse.config": "Buscar un project.yaml", + "load.ids.desc": "La información que pide tu cliente, en el formato estándar de buildingSMART.", + "load.config.desc": "Los ajustes de tu proyecto. Omítelo para usar valores por defecto sensatos.", + "load.config.unreadable": "No se pudo leer {name}. Se usarán los ajustes por defecto.", + "load.samples.title": "¿No tienes un archivo a mano? Prueba un ejemplo", + "load.samples.sub": "Los ejemplos vienen con la aplicación y funcionan sin conexión.", + "load.samples.use": "Usar este ejemplo", + "load.samples.use_named": "Usar el ejemplo {name}", + "load.samples.with_ids": "Incluye un IDS", + "load.samples.no_ids": "Sin IDS", + "load.samples.with_config": "project.yaml propio", + "load.samples.default_config": "Ajustes por defecto", + "load.reading": "Leyendo el archivo…", + "load.card.ready": "Listo para comprobar", + "load.card.size": "Tamaño", + "load.card.elements": "Elementos", + "load.card.units": "Unidades", + "load.card.sha": "SHA-256", + "load.card.disciplines": "Disciplinas", + "load.card.storeys": "Plantas", + "load.card.types": "Tipos de elemento principales", + "load.card.warnings_one": "1 aviso al leer el archivo", + "load.card.warnings_other": "{n} avisos al leer el archivo", + "units.metric": "Métrico", + "units.imperial": "Imperial", + "discipline.architecture": "Arquitectura", + "discipline.structure": "Estructura", + "discipline.mep": "MEP (instalaciones)", + "discipline.civil": "Obra civil", + "load.run": "Ejecutar control de calidad", + "run.running": "Comprobando tu modelo…", + "run.running_btn": "Comprobando…", + "run.need_file": "Carga un archivo IFC para empezar", + "run.need_file_sub": "Después pulsa Ejecutar control de calidad.", + "run.fix_settings": "Corrige primero los ajustes del proyecto", + "run.ready": "Listo para comprobar {name}", + "run.ready_sub": "{count} elementos · {ids} · {cfg}", + "run.with_ids": "con un archivo IDS", + "run.no_ids": "sin archivo IDS", + "run.cfg_default": "ajustes por defecto", + "run.cfg_edited": "tus ajustes editados", + "run.cfg_file": "tu project.yaml", + "run.stage.read": "Leyendo el modelo…", + "run.stage.check": "Ejecutando comprobaciones…", + "run.done_again": "Comprobación terminada. Los resultados están actualizados.", + "error.title": "No hemos podido usar este archivo", + "error.check": "Qué revisar:", + "error.generic_hint": "Comprueba que el archivo se abre en tu herramienta de autoría, expórtalo de nuevo y reinténtalo.", + "settings.title": "Ajustes del proyecto", + "settings.hint": "Opcional. Los valores por defecto ya funcionan.", + "settings.badge.edited": "Editado", + "settings.badge.file": "Desde archivo", + "settings.badge.problem": "Requiere atención", + "settings.sec.rules": "Reglas y tolerancias", + "settings.sec.classification": "Clasificación", + "settings.sec.qto": "Mediciones (QTO)", + "settings.sec.report": "Informe", + "settings.pack.label": "Paquete de reglas", + "settings.pack.hint": "El paquete genérico incluido comprueba identidad, estructura espacial, geometría, clasificación y más.", + "settings.pack.generic": "Genérico (incluido)", + "settings.pack.custom": "Archivo de reglas propio", + "settings.pack.placeholder": "Ruta a tu paquete de reglas .yaml", + "settings.far.label": "Lejos del origen (metros)", + "settings.far.hint": "Se señalan los elementos más lejos que esto del origen del proyecto.", + "settings.minvol.label": "Volumen mínimo (m³)", + "settings.minvol.hint": "Las formas con menos volumen que este valor se consideran vacías.", + "settings.cls.label": "Sistema de clasificación", + "settings.cls.hint": "El sistema que usa tu proyecto para clasificar los elementos.", + "settings.cls.none": "Ninguno", + "settings.cls.required": "Todos los elementos deben estar clasificados", + "settings.cls.required_hint": "Los elementos sin clasificación se notifican como errores.", + "settings.group.label": "Agrupar mediciones por", + "settings.group.hint": "Elige al menos uno. El orden en la tabla sigue esta lista.", + "group.type": "Tipo", + "group.storey": "Planta", + "group.classification": "Clasificación", + "group.material": "Material", + "group.predefined_type": "Tipo predefinido", + "group.type_name": "Nombre de tipo", + "settings.currency.label": "Moneda", + "settings.rates.label": "Archivo de precios unitarios", + "settings.rates.hint": "Un CSV con precios unitarios. Sin él, las mediciones se listan sin coste.", + "settings.rates.placeholder": "Ruta a tu .csv de precios (opcional)", + "settings.lang.label": "Idioma del informe", + "settings.lang.hint": "Se aplica a report.html. Sigue el idioma de la interfaz hasta que lo cambies.", + "settings.lang.en": "Inglés", + "settings.lang.es": "Español", + "settings.preview.title": "Vista previa de project.yaml", + "settings.preview.label": "project.yaml generado, solo lectura", + "settings.preview.defaults": "Valores por defecto", + "settings.preview.edited": "Editado", + "settings.preview.raw": "Tu archivo", + "settings.download": "Descargar project.yaml", + "settings.reset": "Restablecer valores por defecto", + "settings.saved": "Guardado {name}", + "settings.yaml.header": "# Generado por VeriModel. Todos los campos son opcionales; edítalo libremente.", + "settings.locked.title": "Usando {name}", + "settings.locked.body": "El formulario está desactivado mientras se usa tu propio archivo. La vista previa muestra el archivo tal como se enviará.", + "settings.locked.use_form": "Usar el formulario", + "settings.err.rule_pack_path": "Elige el archivo del paquete de reglas o vuelve al paquete genérico.", + "settings.err.far": "\"Lejos del origen\" debe ser un número mayor que 0.", + "settings.err.min_volume": "El volumen mínimo debe ser 0 o más.", + "settings.err.group_by": "Elige al menos una forma de agrupar las mediciones.", + "settings.err.currency": "La moneda debe ser un código de 3 letras, como EUR o USD.", + "settings.err.generic": "Los ajustes no son válidos.", + "review.title": "Revisar resultados", + "review.score_aria": "Puntuación de calidad {score} de 100", + "review.score_of": "/ 100", + "review.verdict_how": "¿Cómo se decide el veredicto?", + "review.with_ids": "comprobado contra un IDS", + "review.elements_n_one": "1 elemento", + "review.elements_n_other": "{n} elementos", + "review.stat.elements": "Elementos comprobados", + "review.stat.errors": "Errores", + "review.stat.warnings": "Avisos", + "review.stat.infos": "Información", + "review.stat.time": "Tiempo de ejecución", + "review.rules_line": "Comprobaciones: {passed} superadas, {failed} fallidas, {skipped} omitidas, {na} no aplicables", + "review.to_export": "Continuar a exportar", + "review.rerun": "Volver a ejecutar", + "review.change_settings": "Cambiar ajustes", + "review.tabs": "Secciones de resultados", + "verdict.PASS": "APROBADO", + "verdict.PASS_WITH_WARNINGS": "APROBADO CON AVISOS", + "verdict.FAIL": "SUSPENDIDO", + "verdict.NONE": "SIN VEREDICTO", + "sev.ERROR": "Error", + "sev.WARNING": "Aviso", + "sev.INFO": "Info", + "status.PASS": "Superada", + "status.FAIL": "Fallida", + "status.SKIPPED": "Omitida", + "status.NOT_APPLICABLE": "No aplicable", + "tab.checks": "Comprobaciones", + "tab.failures": "Fallos", + "tab.quantities": "Mediciones", + "tab.ids": "IDS", + "tab.clash": "Interferencias", + "filter.severity": "Gravedad", + "filter.rule": "Regla", + "filter.storey": "Planta", + "filter.type": "Tipo", + "filter.search": "Buscar", + "filter.all_rules": "Todas las reglas", + "filter.all_storeys": "Todas las plantas", + "filter.all_types": "Todos los tipos", + "filter.no_storey": "(sin planta)", + "filter.search_failures": "GlobalId o nombre", + "filter.search_checks": "Id de regla o descripción", + "filter.search_qto": "Tipo o planta", + "filter.clear": "Quitar filtros", + "empty.filters.title": "Nada coincide con estos filtros", + "empty.filters.body": "Prueba a quitar un filtro o a buscar otra cosa.", + "empty.nofailures.title": "Sin fallos", + "empty.nofailures.body": "Todas las comprobaciones que se ejecutaron se superaron. Las omitidas no se ejecutaron y aparecen en Comprobaciones.", + "col.rule": "Regla", + "col.category": "Categoría", + "col.description": "Descripción", + "col.severity": "Gravedad", + "col.status": "Estado", + "col.checked": "Comprobados", + "col.failures": "Fallos", + "col.globalid": "GlobalId", + "col.type": "Tipo", + "col.name": "Nombre", + "col.storey": "Planta", + "col.problem": "Problema", + "col.expected_actual": "Esperado y real", + "col.fix": "Cómo corregirlo", + "category.identity": "Identidad", + "category.spatial": "Espacial", + "category.properties": "Propiedades", + "category.geometry": "Geometría", + "category.classification": "Clasificación", + "category.naming": "Nomenclatura", + "category.sanity": "Coherencia", + "category.schema": "Esquema", + "checks.skipped_because": "Omitida porque:", + "checks.show_failures": "Mostrar los {n} fallos de la regla {rule}", + "checks.hint": "Selecciona una regla con fallos para verlos en la pestaña Fallos.", + "failures.model_level": "Modelo completo", + "failures.open_element": "Abrir detalles del elemento {id}", + "failures.expected": "Esperado", + "failures.actual": "Real", + "qto.method_title": "Cómo se calcularon estas mediciones", + "qto.without_quantities_one": "1 elemento no tiene ninguna medición utilizable y no suma a los totales.", + "qto.without_quantities_other": "{n} elementos no tienen ninguna medición utilizable y no suman a los totales.", + "qto.count": "Cantidad", + "qto.volume": "Volumen", + "qto.area": "Área", + "qto.length": "Longitud", + "qto.weight": "Peso", + "qto.rate": "Precio unitario", + "qto.cost": "Coste", + "qto.no_rate": "Ningún precio unitario coincide con este grupo", + "qto.total": "Total", + "qto.selection": "Selección", + "qto.volume_source": "Volumen de", + "qto.area_source": "Área de", + "qto.length_source": "Longitud de", + "qto.sources_hint": "Pasa el cursor sobre una medición para ver si viene del modelo o se calculó desde la geometría.", + "qto.samples_title": "Muestras para comprobar a mano", + "qto.samples_hint": "Elige cualquiera de estos elementos en tu herramienta de autoría y compara las cifras a mano. Cada valor indica de dónde procede.", + "qto.qsets": "Conjuntos de cantidades en el archivo", + "qto.no_qsets": "Ninguno", + "source.base_quantity.short": "del modelo", + "source.geometry.short": "calculados desde la geometría", + "source.none.short": "sin valor", + "source.base_quantity.label": "modelo", + "source.geometry.label": "geometría", + "source.none.label": "ninguno", + "unit.metric.len": "m", + "unit.metric.area": "m²", + "unit.metric.vol": "m³", + "unit.metric.mass": "kg", + "unit.imperial.len": "ft", + "unit.imperial.area": "ft²", + "unit.imperial.vol": "ft³", + "unit.imperial.mass": "lb", + "unit.rate.nr": "ud", + "ids.empty.title": "En esta comprobación no se usó ningún archivo IDS", + "ids.empty.what": "es un archivo en el que tu cliente o el plan de ejecución BIM indica, en un formato estándar, qué información debe llevar cada tipo de elemento.", + "ids.empty.example": "Por ejemplo: \"todo muro tiene resistencia al fuego\" o \"toda puerta tiene un material\". VeriModel lista cada requisito, lo cita y muestra qué elementos lo incumplen.", + "ids.empty.how": "Para usar uno, añádelo en el paso 1 (Cargar) y vuelve a ejecutar la comprobación.", + "ids.summary": "{passed} de {total} especificaciones superadas", + "ids.card.required": "Obligatorio", + "ids.card.optional": "Opcional", + "ids.card.prohibited": "Prohibido", + "ids.applies_to": "Se aplica a", + "ids.applicable_count": "Elementos a los que se aplica", + "ids.failed_count": "Elementos que fallan", + "ids.instructions": "Instrucciones:", + "ids.failed_entities": "Elementos que fallan", + "ids.reason": "Motivo", + "ids.failed_n": "{n} fallan", + "ids.show_more": "Mostrar más ({shown} de {total})", + "ids.facet.entity": "Entidad", + "ids.facet.attribute": "Atributo", + "ids.facet.property": "Propiedad", + "ids.facet.classification": "Clasificación", + "ids.facet.material": "Material", + "ids.facet.partOf": "Parte de", + "clash.title": "Detección de interferencias", + "clash.phase2": "Llegará en la fase 2", + "clash.available": "Disponible", + "clash.found_one": "Se encontró 1 interferencia.", + "clash.found_other": "Se encontraron {n} interferencias.", + "pager.showing": "Mostrando {from}–{to} de {total}", + "pager.none": "Sin filas", + "pager.per_page": "Filas por página", + "pager.prev": "Anterior", + "pager.next": "Siguiente", + "pager.page": "Página {page} de {pages}", + "detail.fix": "Cómo corregirlo:", + "detail.loading": "Cargando detalles del elemento…", + "detail.unavailable": "Los detalles del elemento no están disponibles", + "detail.model_level": "Modelo completo", + "detail.model_level_body": "Este hallazgo afecta al modelo en conjunto, no a un único elemento.", + "detail.sec.identity": "Elemento", + "detail.sec.quantities": "Cantidades", + "detail.sec.classifications": "Clasificaciones", + "detail.sec.geometry": "Geometría", + "detail.step_id": "Línea STEP", + "detail.type_name": "Nombre de tipo", + "detail.tag": "Etiqueta", + "detail.container": "Contenido en", + "detail.no_container": "Nada (no está en la estructura espacial)", + "detail.materials": "Materiales", + "detail.no_psets": "Sin conjuntos de propiedades.", + "detail.no_quantities": "Sin conjuntos de cantidades en el archivo.", + "detail.no_classifications": "Sin clasificación.", + "detail.null": "sin valor", + "detail.empty": "vacío", + "detail.copy": "Copiar", + "detail.copied": "GlobalId copiado", + "detail.copy_failed": "No se pudo copiar. Selecciona el GlobalId y cópialo a mano.", + "detail.geom.none": "El motor de geometría no pudo construir una forma para este elemento.", + "detail.geom.no_rep": "Este elemento no tiene representación geométrica.", + "detail.geom.min": "Mínimo de la caja (x, y, z)", + "detail.geom.max": "Máximo de la caja (x, y, z)", + "detail.geom.size": "Tamaño de la caja", + "detail.geom.distance": "Distancia al origen", + "detail.geom.triangles": "Triángulos", + "detail.other_findings_one": "1 otro hallazgo en este elemento", + "detail.other_findings_other": "{n} otros hallazgos en este elemento", + "export.title": "Exportar", + "export.lede": "Todo lo de abajo se guardó en tu carpeta de salida. Comparte el informe, envía las incidencias a tu equipo y conserva los archivos de auditoría como prueba.", + "export.done": "Comprobación completada", + "export.saved_to": "Archivos guardados en", + "export.open_folder": "Abrir carpeta de salida", + "export.downloads": "Tus archivos", + "export.downloads_sub": "Abre cualquier archivo con tu programa habitual.", + "export.open": "Abrir", + "export.open_named": "Abrir {name}", + "export.browser_open": "En la aplicación de escritorio esto abre {path}.", + "export.bcf_line": "{topics} incidencias, {viewpoints} con vista 3D · BCF versión {version}", + "export.back_review": "Volver a la revisión", + "export.new_check": "Iniciar nueva comprobación", + "export.kind.report_html.title": "Informe de calidad", + "export.kind.report_html.desc": "Una sola página para enviar por correo o imprimir: puntuación, veredicto, todas las comprobaciones, fallos, mediciones y resultados IDS. No necesita internet para abrirse.", + "export.kind.failures_csv.title": "Lista de fallos", + "export.kind.failures_csv.desc": "Una fila por fallo, lista para Excel: regla, elemento, problema y cómo corregirlo.", + "export.kind.bcf.title": "Incidencias (BCF)", + "export.kind.bcf.desc": "Una incidencia por fallo con vista 3D. Impórtalo en Revit, Navisworks, Solibri o BIMcollab para devolver los problemas a los modeladores.", + "export.kind.issues_csv.title": "Lista de incidencias", + "export.kind.issues_csv.desc": "Las mismas incidencias del archivo BCF en una hoja de cálculo, para quien no usa un visor BIM.", + "export.kind.qto_xlsx.title": "Mediciones (Excel)", + "export.kind.qto_xlsx.desc": "Las mediciones en un libro de Excel, agrupadas como elegiste, con totales y costes si se dieron precios unitarios.", + "export.kind.qto_csv.title": "Mediciones (CSV)", + "export.kind.qto_csv.desc": "Las mismas mediciones como texto plano, para importarlas en otras herramientas.", + "export.kind.qto_json.title": "Mediciones (JSON)", + "export.kind.qto_json.desc": "Las mediciones en formato legible por máquinas, para scripts e integraciones.", + "export.kind.report_json.title": "Resultado completo (JSON)", + "export.kind.report_json.desc": "Cada cifra y hallazgo en un único archivo legible por máquinas. La misma entrada produce siempre el mismo archivo.", + "export.kind.config.title": "Ajustes utilizados", + "export.kind.config.desc": "Los ajustes exactos de esta ejecución, para que tú o un compañero podáis repetirla.", + "export.kind.run_json.title": "Registro de ejecución", + "export.kind.run_json.desc": "Cuándo se ejecutó, cuánto tardó y las huellas (SHA-256) de cada entrada y del informe, como prueba de lo que se comprobó.", + "export.kind.audit_log.title": "Registro de auditoría", + "export.kind.audit_log.desc": "Un registro de texto paso a paso de lo que hizo la herramienta, para auditorías y diagnóstico de problemas.", + "export.kind.other.desc": "Un archivo adicional generado en esta ejecución.", + "hist.title": "Historial de ejecuciones", + "hist.sub": "Comprobaciones anteriores en este ordenador, de la más reciente a la más antigua. Cada una se compara con la ejecución anterior del mismo archivo.", + "hist.empty": "Aún no hay ejecuciones anteriores.", + "hist.error": "No se pudo cargar el historial de ejecuciones", + "hist.date": "Fecha", + "hist.file": "Archivo", + "hist.score": "Puntuación", + "hist.verdict": "Veredicto", + "hist.errors": "Errores", + "hist.warnings": "Avisos", + "hist.change": "Frente a la ejecución anterior", + "hist.folder": "Carpeta", + "hist.open": "Abrir carpeta", + "hist.open_named": "Abrir la carpeta de la ejecución del {date}", + "hist.this_run": "Esta ejecución", + "hist.first": "Primera ejecución de este archivo", + "hist.same": "Igual que la ejecución anterior", + "hist.fewer_errors_one": "1 error menos que la ejecución anterior", + "hist.fewer_errors_other": "{n} errores menos que la ejecución anterior", + "hist.more_errors_one": "1 error más que la ejecución anterior", + "hist.more_errors_other": "{n} errores más que la ejecución anterior", + "hist.fewer_warnings_one": "1 aviso menos que la ejecución anterior", + "hist.fewer_warnings_other": "{n} avisos menos que la ejecución anterior", + "hist.more_warnings_one": "1 aviso más que la ejecución anterior", + "hist.more_warnings_other": "{n} avisos más que la ejecución anterior", + "app.about": "VeriModel se distribuye bajo PolyForm Noncommercial 1.0.0. Aviso requerido: Copyright 2026 Grohle.", + "app.version_pill": "v{version}", + "app.version_aria": "Versión {version}", + "header.assistant": "Asistente", + "header.assistant_aria": "Abrir el panel del asistente", + "load.demo.btn": "Cargar la demo", + "load.demo.hint": "¿Sin archivo a mano? Un clic carga un modelo listo con su configuración.", + "load.demo.aria": "Cargar el pabellón de demostración, un modelo listo con su configuración de proyecto", + "load.samples.start_here": "Empieza aquí", + "detail.explain": "Explicar con el asistente", + "assistant.title": "Asistente", + "assistant.eyebrow": "Copiloto local, opcional", + "assistant.status.title": "Modelo de lenguaje", + "assistant.status.ready": "Listo", + "assistant.status.ready_sub": "El modelo se carga en memoria al hacer la primera pregunta.", + "assistant.status.loaded_sub": "Cargado en memoria.", + "assistant.status.missing": "No instalado", + "assistant.status.explain": "Opcional. Funciona por completo en tu equipo. Descarga {size} una sola vez desde Hugging Face. Nunca decide si algo aprueba o falla; solo te ayuda a buscar, entender y configurar.", + "assistant.status.error": "No se pudo leer el estado del asistente.", + "assistant.status.size": "Tamaño", + "assistant.status.license": "Licencia", + "assistant.status.ram": "Memoria", + "assistant.status.ram_value": "~{mb} MB", + "assistant.status.backend": "Motor", + "assistant.status.backend_none": "ninguno en esta compilación", + "assistant.download": "Descargar modelo", + "assistant.downloading": "Descargando… {pct}%", + "assistant.download_progress": "Progreso de la descarga del modelo", + "assistant.downloaded": "Modelo del asistente instalado.", + "assistant.remove": "Quitar modelo", + "assistant.remove_confirm": "Pulsa de nuevo para quitarlo", + "assistant.removed": "Modelo del asistente quitado.", + "assistant.quick": "Acciones rápidas", + "assistant.chip.find_errors": "Buscar errores en una planta", + "assistant.chip.explain": "Explicar este fallo", + "assistant.chip.config": "Ayuda con project.yaml", + "assistant.chip.rule": "¿Qué comprueba la regla …?", + "assistant.chip.explain_disabled": "Abre antes un hallazgo de la tabla de fallos y luego explícalo.", + "assistant.prefill.find_errors": "Muestra los errores de {storey}", + "assistant.prefill.explain": "Explica este fallo en lenguaje sencillo", + "assistant.prefill.config": "Ayúdame a escribir project.yaml: ", + "assistant.prefill.rule": "¿Qué comprueba la regla {rule}?", + "assistant.mode.ask": "Se envía como pregunta general", + "assistant.mode.filter": "Se envía como búsqueda en el informe", + "assistant.mode.explain": "Se envía como explicación del hallazgo seleccionado", + "assistant.mode.config": "Se envía como ayuda con la configuración", + "assistant.convo": "Conversación", + "assistant.empty": "Pregunta por tu informe, un fallo o la configuración del proyecto. Las respuestas son sugerencias: nada cambia hasta que pulses un botón.", + "assistant.you": "Tú", + "assistant.assistant": "Asistente", + "assistant.thinking": "Pensando…", + "assistant.need_report": "Ejecuta antes una comprobación, para que haya un informe donde buscar.", + "assistant.need_finding": "Abre antes un hallazgo de la tabla de fallos.", + "assistant.answer_error": "El asistente no pudo responder", + "assistant.filter.apply": "Aplicar filtro", + "assistant.filter.applied": "Filtro aplicado en Revisión", + "assistant.filter.need_report": "Ejecuta una comprobación para aplicar un filtro.", + "assistant.filter.none": "No se propuso ningún filtro.", + "assistant.filter.severity": "Gravedad", + "assistant.filter.rule": "Regla", + "assistant.filter.storey": "Planta", + "assistant.filter.type": "Tipo", + "assistant.filter.search": "Búsqueda", + "assistant.filter.dropped": "ignorado: {values} (no está en este informe)", + "assistant.config.valid": "Válido", + "assistant.config.invalid": "No válido: {error}", + "assistant.config.use": "Usar en la configuración", + "assistant.config.use_hint": "Sustituye la configuración del proyecto por este YAML. Solo disponible si es válido.", + "assistant.config.copy": "Copiar YAML", + "assistant.config.copied": "YAML copiado", + "assistant.config.applied": "La configuración del proyecto usa ahora este YAML. Vuelve a ejecutar la comprobación para aplicarla.", + "assistant.sources": "Fuentes: {list}", + "assistant.unstructured": "El asistente no pudo dar una respuesta estructurada; se muestra como texto.", + "assistant.input.label": "Tu pregunta", + "assistant.input.placeholder": "Haz una pregunta. Intro envía, Mayús+Intro añade una línea.", + "assistant.send": "Enviar", + "assistant.input.disabled": "Descarga el modelo arriba para poder preguntar.", + "assistant.import.files": "Importar documentación…", + "assistant.import.folder": "Importar carpeta…", + "assistant.import.hint": "Añade los documentos de tu proyecto (.md .txt .yaml .json .docx .pdf) a lo que el asistente puede consultar.", + "assistant.import.working": "Leyendo documentos…", + "assistant.import.summary": "{files}, {chunks} añadidos", + "assistant.import.files_one": "1 archivo", + "assistant.import.files_other": "{n} archivos", + "assistant.import.chunks_one": "1 fragmento", + "assistant.import.chunks_other": "{n} fragmentos", + "assistant.import.skipped": "omitidos: {list}", + "assistant.import.save": "Guardar knowledge.yaml", + "assistant.import.saved": "Guardado {name}", + "assistant.disclaimer": "Copiloto de solo lectura. Los veredictos, las puntuaciones y las cantidades nunca vienen del asistente.", + "load.demo.card_name": "Pabellón de demostración (empieza aquí)", + "load.demo.card_desc": "Pabellón de oficinas de dos plantas con propiedades, cantidades, clasificación y cinco defectos deliberados: la forma más rápida de ver VeriModel en acción." +} diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..8b14fc8 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,225 @@ + + + + + + + VeriModel + + + + + + + +
+
+
+ + VeriModel + +
+ + + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+ + +
+
+

+

+
+ + + +
+
+
+

+

+
+
+ + +
+
+
+
+
+ + +
+
+ + + +
+
+
+
+ + +
+
+ + + +
+
+
+
+ +
+
+

+

+
+
+
+ + + +
+ + + + + +
+
+ +
+
+ + +
+ + +
+
+ + + + + + +
+ + + + + +
+
+ + + + diff --git a/frontend/js/api.js b/frontend/js/api.js new file mode 100644 index 0000000..397794b --- /dev/null +++ b/frontend/js/api.js @@ -0,0 +1,359 @@ +// Single gateway to the Rust engine. Every call goes through Tauri's invoke +// when running inside the desktop app and falls back to JSON in mock/ when +// window.__TAURI__ is undefined, so the whole UI runs in a plain browser for +// development and screenshots. + +const tauri = () => window.__TAURI__; +export const isDesktop = () => Boolean(tauri() && tauri().core && tauri().core.invoke); + +const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); +const cache = new Map(); + +async function mockJson(name) { + if (!cache.has(name)) { + cache.set(name, fetch(`mock/${name}.json`).then((r) => { + if (!r.ok) throw new Error(`mock/${name}.json: ${r.status}`); + return r.json(); + })); + } + return cache.get(name); +} +const fresh = async (name) => structuredClone(await mockJson(name)); + +// Errors from the engine arrive as { code, message, hint }. Anything else is +// wrapped so the UI never shows a stack trace. +export function normaliseError(e) { + if (e && typeof e === 'object' && typeof e.message === 'string' && ('code' in e || 'hint' in e)) { + return { code: e.code || 'error', message: e.message, hint: e.hint || '' }; + } + if (typeof e === 'string') return { code: 'error', message: e, hint: '' }; + return { code: 'error', message: String(e && e.message ? e.message : e), hint: '' }; +} + +async function invoke(cmd, args) { + try { + return await tauri().core.invoke(cmd, args); + } catch (e) { + throw normaliseError(e); + } +} + +// ---------------------------------------------------------------- commands + +export async function inspectFile(path) { + if (isDesktop()) return invoke('inspect_file', { path }); + await sleep(450); + if (/broken|corrupt/i.test(path)) { + throw { + code: 'ifc_parse_error', + message: 'This file could not be read as an IFC model. It stops in the middle of the DATA section (line 1,204).', + hint: 'Re-export the model from your authoring tool as IFC4 or IFC2x3 and check the export finished without errors. If the file was copied or downloaded, check it is not truncated.', + }; + } + return fresh('file_card'); +} + +export async function runCheck(args) { + if (isDesktop()) return invoke('run_check', args); + await sleep(2400); + const [report, runs, extra] = await Promise.all([fresh('report'), fresh('runs'), fresh('run_result')]); + return { report, ledger: runs[0], files: extra.files, bcf: extra.bcf, out_dir: extra.out_dir }; +} + +export async function listRuns(root = null) { + if (isDesktop()) return invoke('list_runs', { root }); + await sleep(120); + return fresh('runs'); +} + +const MOCK_DEFAULT_YAML = `# VeriModel project.yaml (defaults) +project: + name: Generic Project + classification_system: none +requirements: + rule_pack: generic +tolerances: + far_from_origin_m: 10000 + geometry: + min_volume_m3: 0.000001 +classification: + required: false +qto: + group_by: [type, storey] + currency: EUR +output: + language: en +`; + +export async function defaultConfigYaml() { + if (isDesktop()) return invoke('default_config_yaml'); + return MOCK_DEFAULT_YAML; +} + +export async function validateConfigYaml(yaml) { + if (isDesktop()) return invoke('validate_config_yaml', { yaml }); + if (/group_by:\s*\[\s*\]/.test(yaml)) return { ok: false, error: 'qto.group_by must contain at least one key' }; + return { ok: true, error: null }; +} + +export async function listExamples() { + if (isDesktop()) return invoke('list_examples'); + return fresh('examples'); +} + +export async function getElement(globalId) { + if (isDesktop()) return invoke('get_element', { global_id: globalId }); + const all = await mockJson('elements'); + const el = all[globalId]; + if (!el) throw { code: 'element_not_found', message: 'This element is not in the loaded model.', hint: 'Run the check again to refresh the model data.' }; + return el; +} + +// Returns true when the OS was asked to open the path. +export async function openPath(path) { + if (isDesktop()) { await invoke('open_path', { path }); return true; } + return false; +} + +// PROPOSED command (not in the original contract): read_text_file({ path }) -> string. +// Needed to load a dropped project.yaml or a sample's project.yaml. +export async function readTextFile(path) { + if (isDesktop()) return invoke('read_text_file', { path }); + const f = browserFiles.get(path); + if (f) return f.text(); + await sleep(80); + return '# project.yaml of the selected sample\nclassification:\n required: true\nproject:\n classification_system: Uniclass\n'; +} + +export async function saveTextFile(contents, defaultName) { + if (isDesktop()) { + const dlg = tauri().dialog; + const path = dlg && dlg.save ? await dlg.save({ defaultPath: defaultName }) : null; + if (!path) return null; + await invoke('save_text_file', { path, contents }); + return path; + } + const url = URL.createObjectURL(new Blob([contents], { type: 'text/yaml' })); + const a = document.createElement('a'); + a.href = url; + a.download = defaultName; + document.body.appendChild(a); + a.click(); + a.remove(); + setTimeout(() => URL.revokeObjectURL(url), 1000); + return defaultName; +} + +// ------------------------------------------------------------ file pickers + +const browserFiles = new Map(); // name -> File (browser fallback only) + +const KINDS = { + ifc: { name: 'IFC', extensions: ['ifc', 'ifczip'] }, + ids: { name: 'IDS', extensions: ['ids', 'xml'] }, + yaml: { name: 'YAML', extensions: ['yaml', 'yml'] }, + csv: { name: 'CSV', extensions: ['csv'] }, +}; + +export async function pickFile(kind) { + const filter = KINDS[kind]; + if (isDesktop() && tauri().dialog) { + const r = await tauri().dialog.open({ multiple: false, filters: [filter] }); + if (!r) return null; + return typeof r === 'string' ? r : r.path || null; + } + return new Promise((resolve) => { + const input = document.createElement('input'); + input.type = 'file'; + input.accept = filter.extensions.map((e) => `.${e}`).join(','); + input.addEventListener('change', () => { + const f = input.files && input.files[0]; + if (!f) return resolve(null); + browserFiles.set(f.name, f); + resolve(f.name); + }); + input.addEventListener('cancel', () => resolve(null)); + input.click(); + }); +} + +// handlers: { enter(), leave(), drop(paths: string[]) } +export async function onDragDrop(handlers) { + if (isDesktop() && tauri().event) { + const ev = tauri().event; + await ev.listen('tauri://drag-enter', () => handlers.enter()); + await ev.listen('tauri://drag-leave', () => handlers.leave()); + await ev.listen('tauri://drag-drop', (e) => { + handlers.leave(); + const paths = (e.payload && e.payload.paths) || []; + if (paths.length) handlers.drop(paths); + }); + return; + } + let depth = 0; + const hasFiles = (e) => e.dataTransfer && Array.from(e.dataTransfer.types || []).includes('Files'); + window.addEventListener('dragenter', (e) => { if (!hasFiles(e)) return; e.preventDefault(); if (depth++ === 0) handlers.enter(); }); + window.addEventListener('dragover', (e) => { if (hasFiles(e)) e.preventDefault(); }); + window.addEventListener('dragleave', (e) => { if (!hasFiles(e)) return; if (--depth <= 0) { depth = 0; handlers.leave(); } }); + window.addEventListener('drop', (e) => { + if (!hasFiles(e)) return; + e.preventDefault(); + depth = 0; + handlers.leave(); + const files = Array.from(e.dataTransfer.files || []); + files.forEach((f) => browserFiles.set(f.name, f)); + if (files.length) handlers.drop(files.map((f) => f.name)); + }); +} + +// --------------------------------------------------------------- assistant +// Optional local copilot. It is read-only: it never produces a verdict, a +// score or a quantity. In a plain browser the answers below are canned so the +// panel can be demoed and screenshotted. + +export async function appInfo() { + if (isDesktop()) return invoke('app_info'); + return fresh('app_info'); +} + +let mockInstalled = true; +let mockLoaded = false; + +export async function assistantStatus() { + if (isDesktop()) return invoke('assistant_status'); + const s = await fresh('assistant_status'); + s.installed = mockInstalled; + s.loaded = mockInstalled && mockLoaded; + return s; +} + +// onProgress({ done, total }) is called while the model downloads. +export async function assistantDownloadModel(onProgress) { + if (isDesktop()) { + const ev = tauri().event; + const unlisten = ev && ev.listen ? await ev.listen('assistant://download-progress', (e) => onProgress(e.payload)) : null; + try { return await invoke('assistant_download_model'); } finally { if (unlisten) unlisten(); } + } + const total = 491400032; + for (let i = 1; i <= 20; i++) { await sleep(130); onProgress({ done: Math.round((total * i) / 20), total }); } + mockInstalled = true; + mockLoaded = false; + return assistantStatus(); +} + +export async function assistantRemoveModel() { + if (isDesktop()) return invoke('assistant_remove_model'); + await sleep(200); + mockInstalled = false; + mockLoaded = false; + return assistantStatus(); +} + +// task: the JSON of the Rust `Task` enum, tagged by `kind`. +export async function assistantAsk(task) { + if (isDesktop()) return invoke('assistant_ask', { task }); + await sleep(1100); + mockLoaded = true; + return mockAnswer(task); +} + +export async function assistantKnowledgeYaml() { + if (isDesktop()) return invoke('assistant_knowledge_yaml'); + return mockKnowledgeYaml; +} + +const DOC_EXTENSIONS = ['md', 'markdown', 'txt', 'yaml', 'yml', 'json', 'docx', 'pdf']; + +// Returns an array of paths (files, or one folder) or null when cancelled. +export async function pickDocs({ directory = false } = {}) { + if (isDesktop() && tauri().dialog) { + const r = await tauri().dialog.open(directory + ? { multiple: true, directory: true } + : { multiple: true, filters: [{ name: 'Documents', extensions: DOC_EXTENSIONS }] }); + if (!r) return null; + const list = (Array.isArray(r) ? r : [r]).map((x) => (typeof x === 'string' ? x : x.path)).filter(Boolean); + return list.length ? list : null; + } + return new Promise((resolve) => { + const input = document.createElement('input'); + input.type = 'file'; + input.multiple = true; + if (directory) input.webkitdirectory = true; else input.accept = DOC_EXTENSIONS.map((e) => `.${e}`).join(','); + input.addEventListener('change', () => { + const files = Array.from(input.files || []); + resolve(files.length ? (directory ? [files[0].webkitRelativePath.split('/')[0] || 'folder'] : files.map((f) => f.name)) : null); + }); + input.addEventListener('cancel', () => resolve(null)); + input.click(); + }); +} + +let mockKnowledgeYaml = 'chunks: []\n'; + +export async function assistantImportDocs(paths) { + if (isDesktop()) return invoke('assistant_import_docs', { paths }); + await sleep(700); + const ok = paths.filter((p) => DOC_EXTENSIONS.includes((/\.([A-Za-z0-9]+)$/.exec(p) || [])[1]?.toLowerCase()) || !/\.[A-Za-z0-9]+$/.test(p)); + const skipped = paths.filter((p) => !ok.includes(p)); + const chunks = ok.length * 14; + mockKnowledgeYaml = `chunks:\n${ok.map((p) => ` - source: ${p}\n title: "${p} \u203a Overview"\n text: "(imported text of ${p})"\n keywords: []\n`).join('')}`; + return { files_read: ok, skipped, chunks_added: chunks, knowledge_yaml: mockKnowledgeYaml }; +} + +// Canned answers for the browser fallback, one per task kind. Type "[raw]" in a +// question to see the "not structured" note. +function mockAnswer(task) { + const q = String(task.question || ''); + if (/\[raw\]/i.test(q)) { + return { kind: 'text', text: 'Probably the wall fire ratings; I could not produce a clean filter for that.', sources: [], structured: false }; + } + switch (task.kind) { + case 'filter': { + const ctx = task.context || {}; + const storeys = ctx.storeys || []; + const asked = /level\s*(\d+)/i.exec(q); + const named = storeys.find((s) => q.toLowerCase().includes(String(s).toLowerCase())); + const storey = named || (asked ? storeys.find((s) => s.toLowerCase() === `level ${asked[1]}`) : null) || null; + const dropped = asked && !storey ? [`Level ${asked[1]}`] : []; + const wantsWarnings = /warning/i.test(q); + const filter = { + severity: wantsWarnings ? ['WARNING'] : ['ERROR'], + rule_id: null, + storey: storey || (dropped.length ? null : storeys[0] || null), + ifc_type: null, + search: null, + explanation: `Shows ${wantsWarnings ? 'warnings' : 'errors'}${storey || !dropped.length ? ` on ${storey || storeys[0] || 'every storey'}` : ''}. Press Apply filter to see them in the Failures table.`, + dropped, + }; + return { kind: 'filter', filter }; + } + case 'explain': { + const f = task.finding || {}; + const where = f.name ? `${f.name}${f.global_id ? ` (${f.global_id})` : ''}` : (f.global_id || 'the model'); + return { kind: 'explanation', text: [`${where}${f.storey ? ` on ${f.storey}` : ''} failed rule ${f.rule_id}.`, f.message, f.fix_hint ? `To fix it: ${f.fix_hint}` : ''].filter(Boolean).map((x) => (/[.!?]$/.test(x) ? x : `${x}.`)).join(' ') }; + } + case 'config_help': { + if (/\binvalid\b/i.test(q)) { + return { kind: 'config_snippet', yaml: 'naming:\n patterns:\n IfcWall: [unclosed\n', valid: false, validation_error: 'naming.patterns.IfcWall: expected a regular expression string', explanation: 'This is deliberately broken to show the validity badge.' }; + } + return { + kind: 'config_snippet', + yaml: "naming:\n patterns:\n IfcWall: '^WL-[0-9]{3}$'\n IfcDoor: '^D-[0-9]{3}$'\nrequirements:\n required_psets:\n - pset: Pset_WallCommon\n applies_to: [IfcWall]\n properties: [FireRating, IsExternal]\n", + valid: true, + validation_error: null, + explanation: 'Walls and doors must follow the naming pattern, and every wall needs FireRating and IsExternal. Paste it into your project settings.', + }; + } + case 'draft_rules': + return { kind: 'config_snippet', yaml: 'requirements:\n required_psets: []\n', valid: true, validation_error: null, explanation: 'No requirements found in the text.' }; + default: + return { + kind: 'text', + text: /CL-001/i.test(q) + ? 'CL-001 checks that every element carries a classification reference from the configured system (Uniclass in this project). Elements without one are reported as errors.' + : 'VeriModel checks the model against rules and IDS requirements, then produces a score, a quantity takeoff and BCF issues. The assistant only helps you read them.', + sources: ['docs/RULES.md', 'docs/CONFIG.md'], + structured: true, + }; + } +} diff --git a/frontend/js/assistant.js b/frontend/js/assistant.js new file mode 100644 index 0000000..31e0ca6 --- /dev/null +++ b/frontend/js/assistant.js @@ -0,0 +1,439 @@ +// Assistant side panel: a local, optional, READ-ONLY copilot. +// It helps you search the report, understand a finding and write settings. +// It never decides pass/fail and never produces a score or a quantity: every +// answer is a suggestion the user applies with a button. +import { h, clear, $, toast } from './dom.js'; +import { t, tn } from './i18n.js'; +import { state, actions } from './state.js'; +import * as api from './api.js'; +import { nf, basename } from './format.js'; +import { applyFilterSpec } from './view-review.js'; +import { effectiveYaml } from './settings.js'; + +const A = state.assistant; +const SEVERITIES = ['ERROR', 'WARNING', 'INFO']; +let opener = null; +let removeTimer = null; +let nextId = 1; + +export const isAssistantOpen = () => A.open; + +// ------------------------------------------------------------------ helpers + +const gb = (n) => `${nf(n / 1e9, 2)} GB`; +const hasFinding = () => Boolean(state.detail && state.detail.finding); +const reportOf = () => (state.result ? state.result.report : null); + +// Allowed values for a filter answer, taken from the current report. +function reportContext() { + const r = reportOf(); + if (!r) return { rule_ids: [], storeys: [], ifc_types: [], severities: SEVERITIES }; + const uniq = (list) => [...new Set(list.filter(Boolean))]; + return { + rule_ids: r.rules.map((x) => x.rule_id), + storeys: uniq([...r.model.storeys, ...r.findings.map((x) => x.storey)]), + ifc_types: uniq(r.findings.map((x) => x.ifc_type)).sort(), + severities: SEVERITIES, + }; +} + +function buildTask(mode, text) { + if (mode === 'filter') return { kind: 'filter', question: text, context: reportContext() }; + if (mode === 'explain') { + const finding = state.detail.finding; + const rule = reportOf().rules.find((r) => r.rule_id === finding.rule_id) || null; + return { kind: 'explain', finding, rule }; + } + if (mode === 'config') { + return { kind: 'config_help', question: text, current_yaml: effectiveYaml() }; + } + return { kind: 'ask', question: text }; +} + +function prefillFor(mode) { + const r = reportOf(); + if (mode === 'filter') { + const storey = r && (r.model.storeys[0] || (r.findings.find((f) => f.storey) || {}).storey); + return t('assistant.prefill.find_errors', { storey: storey || '…' }); + } + if (mode === 'explain') return t('assistant.prefill.explain'); + if (mode === 'config') return t('assistant.prefill.config'); + return ''; +} + +// ------------------------------------------------------------------- status + +export async function refreshStatus() { + try { A.status = await api.assistantStatus(); A.statusError = null; } + catch (e) { A.statusError = e; } + renderStatus(); + renderComposer(); +} + +function renderStatus() { + const host = $('#as-status'); + clear(host); + const s = A.status; + if (!s) { + host.appendChild(h('p', { class: 'muted small' }, A.statusError ? A.statusError.message || t('assistant.status.error') : '…')); + return; + } + const noBackend = s.backend === 'none' || !s.backend; + const facts = h('dl', { class: 'as-facts' }, + h('div', null, h('dt', null, t('assistant.status.size')), h('dd', null, gb(s.gguf_size_bytes))), + h('div', null, h('dt', null, t('assistant.status.license')), h('dd', null, s.license)), + h('div', null, h('dt', null, t('assistant.status.ram')), h('dd', null, t('assistant.status.ram_value', { mb: nf(s.approx_ram_mb) }))), + h('div', null, h('dt', null, t('assistant.status.backend')), h('dd', null, noBackend ? t('assistant.status.backend_none') : s.backend))); + const dl = A.download; + const stateLabel = s.installed + ? h('span', { class: 'as-state is-ready' }, h('span', { class: 'as-dot', 'aria-hidden': 'true' }), t('assistant.status.ready')) + : h('span', { class: 'as-state' }, h('span', { class: 'as-dot', 'aria-hidden': 'true' }), t('assistant.status.missing')); + host.appendChild(h('div', { class: 'as-card-head' }, h('h3', null, t('assistant.status.title')), stateLabel)); + host.appendChild(h('p', { class: 'as-model' }, s.name)); + host.appendChild(facts); + + if (s.installed) { + host.appendChild(h('p', { class: 'muted small' }, s.loaded ? t('assistant.status.loaded_sub') : t('assistant.status.ready_sub'))); + host.appendChild(h('div', { class: 'as-actions' }, + h('button', { type: 'button', id: 'as-remove', class: `btn btn-ghost btn-sm`, disabled: A.busy || Boolean(dl), onclick: onRemove }, + A.confirmRemove ? t('assistant.remove_confirm') : t('assistant.remove')))); + return; + } + + host.appendChild(h('p', { class: 'as-explain' }, t('assistant.status.explain', { size: gb(s.gguf_size_bytes) }))); + if (dl) { + const pct = dl.total ? Math.min(100, Math.floor((dl.done * 100) / dl.total)) : 0; + host.appendChild(h('div', { class: 'as-progress' }, + h('div', { class: 'progress-track', role: 'progressbar', 'aria-valuemin': '0', 'aria-valuemax': '100', 'aria-valuenow': String(pct), 'aria-label': t('assistant.download_progress'), id: 'as-progressbar' }, + h('div', { class: 'progress-bar', style: `width:${pct}%` })), + h('p', { class: 'small muted', id: 'as-progress-text' }, t('assistant.downloading', { pct })))); + } else { + host.appendChild(h('div', { class: 'as-actions' }, + h('button', { type: 'button', id: 'as-download', class: 'btn btn-primary', disabled: noBackend, onclick: onDownload }, t('assistant.download')))); + if (noBackend) host.appendChild(h('p', { class: 'small muted' }, t('assistant.status.backend_none'))); + if (A.statusError) host.appendChild(h('p', { class: 'small', style: 'color:var(--error)' }, [A.statusError.message, ' ', A.statusError.hint || ''].join(''))); + } +} + +function updateProgress() { + const dl = A.download; + const bar = $('#as-progressbar'); + if (!dl || !bar) return; + const pct = dl.total ? Math.min(100, Math.floor((dl.done * 100) / dl.total)) : 0; + bar.setAttribute('aria-valuenow', String(pct)); + bar.firstChild.style.width = `${pct}%`; + $('#as-progress-text').textContent = t('assistant.downloading', { pct }); +} + +async function onDownload() { + A.download = { done: 0, total: (A.status && A.status.gguf_size_bytes) || 0 }; + A.statusError = null; + renderStatus(); + try { + A.status = await api.assistantDownloadModel((p) => { A.download = { done: p.done, total: p.total || A.download.total }; updateProgress(); }); + toast(t('assistant.downloaded'), 'success'); + } catch (e) { + A.statusError = e; + } finally { + A.download = null; + renderStatus(); + renderComposer(); + } +} + +async function onRemove() { + if (!A.confirmRemove) { + A.confirmRemove = true; + renderStatus(); + clearTimeout(removeTimer); + removeTimer = setTimeout(() => { A.confirmRemove = false; renderStatus(); }, 4000); + $('#as-remove').focus(); + return; + } + clearTimeout(removeTimer); + A.confirmRemove = false; + try { A.status = await api.assistantRemoveModel(); toast(t('assistant.removed'), 'info'); } + catch (e) { A.statusError = e; } + renderStatus(); + renderComposer(); +} + +// -------------------------------------------------------------------- chips + +function renderChips() { + const host = $('#as-chips'); + clear(host); + const r = reportOf(); + const chip = (mode, label, onclick, { disabled = false, tip = null } = {}) => + h('button', { type: 'button', class: 'chip-btn', 'aria-pressed': String(A.mode === mode), disabled, title: tip, onclick }, label); + host.append( + chip('filter', t('assistant.chip.find_errors'), () => pickMode('filter')), + chip('explain', t('assistant.chip.explain'), () => pickMode('explain'), { disabled: !hasFinding(), tip: hasFinding() ? null : t('assistant.chip.explain_disabled') }), + chip('config', t('assistant.chip.config'), () => pickMode('config')), + h('button', { type: 'button', class: 'chip-btn', onclick: () => { + const failing = r && r.rules.find((x) => x.failures > 0); + pickMode('ask', t('assistant.prefill.rule', { rule: failing ? failing.rule_id : (r && r.rules[0] ? r.rules[0].rule_id : 'CL-001') })); + } }, t('assistant.chip.rule'))); +} + +function pickMode(mode, text) { + // Clicking the active chip again goes back to a general question. + if (A.mode === mode && mode !== 'ask' && !text) { A.mode = 'ask'; renderChips(); renderComposer(); return; } + A.mode = mode; + const input = $('#as-input'); + input.value = text != null ? text : prefillFor(mode); + renderChips(); + renderComposer(); + input.focus(); + input.setSelectionRange(input.value.length, input.value.length); +} + +// --------------------------------------------------------------- conversation + +function filterChips(filter) { + const items = []; + if (filter.severity && filter.severity.length) items.push([t('assistant.filter.severity'), filter.severity.map((x) => t(`sev.${x}`)).join(', ')]); + if (filter.rule_id) items.push([t('assistant.filter.rule'), filter.rule_id]); + if (filter.storey) items.push([t('assistant.filter.storey'), filter.storey]); + if (filter.ifc_type) items.push([t('assistant.filter.type'), filter.ifc_type]); + if (filter.search) items.push([t('assistant.filter.search'), filter.search]); + return items; +} + +async function copyText(text, doneKey) { + try { await navigator.clipboard.writeText(text); toast(t(doneKey), 'success'); } + catch { toast(t('detail.copy_failed'), 'error'); } +} + +function useYaml(msg) { + state.configRaw = msg.answer.yaml; + state.configPath = null; + state.configError = null; + msg.applied = true; + actions.settingsRefresh(); + toast(t('assistant.config.applied'), 'success'); + renderConvo(); +} + +function applyFilter(msg) { + if (!reportOf()) return; + applyFilterSpec(msg.answer.filter); + if (state.step !== 2) actions.goto(2, { focus: false }); + msg.applied = true; + toast(t('assistant.filter.applied'), 'success'); + renderConvo(); +} + +function renderAnswer(msg) { + const a = msg.answer; + const kids = []; + if (a.kind === 'filter') { + const items = filterChips(a.filter); + kids.push(items.length + ? h('ul', { class: 'filter-chips' }, items.map(([k, v]) => h('li', { class: 'chip' }, h('b', null, `${k}:`), v))) + : h('p', { class: 'muted' }, t('assistant.filter.none'))); + if (a.filter.explanation) kids.push(h('p', null, a.filter.explanation)); + if (a.filter.dropped && a.filter.dropped.length) kids.push(h('p', { class: 'note-dropped' }, t('assistant.filter.dropped', { values: a.filter.dropped.join(', ') }))); + kids.push(h('div', { class: 'answer-actions' }, + h('button', { type: 'button', class: 'btn btn-secondary btn-sm', disabled: !reportOf() || !items.length, onclick: () => applyFilter(msg) }, t('assistant.filter.apply')), + msg.applied ? h('span', { class: 'done' }, t('assistant.filter.applied')) : (!reportOf() ? h('span', { class: 'small muted' }, t('assistant.filter.need_report')) : null))); + } else if (a.kind === 'explanation') { + kids.push(h('p', null, a.text)); + } else if (a.kind === 'config_snippet') { + kids.push(h('div', { class: 'answer-actions' }, + a.valid ? h('span', { class: 'badge badge-ok' }, t('assistant.config.valid')) + : h('span', { class: 'badge sev-error' }, t('assistant.config.invalid', { error: a.validation_error || '?' })))); + if (a.explanation) kids.push(h('p', null, a.explanation)); + kids.push(h('pre', { class: 'yaml-block mono', tabindex: '0' }, a.yaml)); + kids.push(h('div', { class: 'answer-actions' }, + h('button', { type: 'button', class: 'btn btn-secondary btn-sm', disabled: !a.valid, title: t('assistant.config.use_hint'), onclick: () => useYaml(msg) }, t('assistant.config.use')), + h('button', { type: 'button', class: 'btn btn-ghost btn-sm', onclick: () => copyText(a.yaml, 'assistant.config.copied') }, t('assistant.config.copy')), + msg.applied ? h('span', { class: 'done' }, t('assistant.config.applied')) : null)); + } else { + if (a.structured === false) kids.push(h('p', { class: 'note-warn' }, t('assistant.unstructured'))); + kids.push(h('p', null, a.text)); + if (a.sources && a.sources.length) kids.push(h('p', { class: 'sources' }, t('assistant.sources', { list: a.sources.join(', ') }))); + } + return h('div', { class: 'answer' }, kids); +} + +function renderMessage(m) { + if (m.role === 'user') return h('div', { class: 'msg msg-user' }, h('span', { class: 'msg-who' }, t('assistant.you')), h('div', { class: 'bubble' }, m.text)); + if (m.role === 'note') return h('div', { class: 'msg msg-assistant' }, h('div', { class: 'answer' }, h('p', null, m.text))); + if (m.role === 'error') { + return h('div', { class: 'msg msg-error' }, h('div', { class: 'answer' }, + h('strong', null, t('assistant.answer_error')), h('p', null, m.error.message), m.error.hint ? h('p', { class: 'muted' }, m.error.hint) : null)); + } + return h('div', { class: 'msg msg-assistant' }, h('span', { class: 'msg-who' }, t('assistant.assistant')), renderAnswer(m)); +} + +function renderConvo({ scroll = true } = {}) { + const host = $('#as-convo'); + clear(host); + if (!A.messages.length && !A.busy) host.appendChild(h('p', { class: 'as-empty' }, t('assistant.empty'))); + A.messages.forEach((m) => host.appendChild(renderMessage(m))); + if (A.busy) host.appendChild(h('div', { class: 'msg msg-assistant' }, h('div', { class: 'thinking', role: 'status' }, h('i'), h('i'), h('i'), h('span', null, t('assistant.thinking'))))); + if (scroll) { const sc = $('#assistant-scroll'); sc.scrollTop = sc.scrollHeight; } +} + +// ------------------------------------------------------------------ composer + +function renderComposer() { + const installed = Boolean(A.status && A.status.installed); + const input = $('#as-input'); + const locked = !installed || A.busy; + input.disabled = locked; + $('#as-send').disabled = locked; + const hint = $('#as-hint'); + hint.hidden = installed; + hint.textContent = installed ? '' : t('assistant.input.disabled'); + $('#as-mode').textContent = installed ? t(`assistant.mode.${A.mode}`) : ''; +} + +export async function send(modeOverride, textOverride) { + const mode = modeOverride || A.mode; + const input = $('#as-input'); + const text = (textOverride != null ? textOverride : input.value).trim(); + if (A.busy || !A.status || !A.status.installed) return; + if (mode !== 'explain' && !text) return; + const userText = mode === 'explain' ? (text || t('assistant.prefill.explain')) : text; + if (mode === 'filter' && !reportOf()) { + A.messages.push({ role: 'user', text: userText }, { role: 'note', text: t('assistant.need_report') }); + input.value = ''; + renderConvo(); + return; + } + if (mode === 'explain' && !hasFinding()) { + A.messages.push({ role: 'user', text: userText }, { role: 'note', text: t('assistant.need_finding') }); + renderConvo(); + return; + } + const task = buildTask(mode, text); + A.messages.push({ role: 'user', text: userText }); + input.value = ''; + A.busy = true; + renderConvo(); + renderComposer(); + renderStatus(); + try { + const answer = await api.assistantAsk(task); + A.messages.push({ role: 'assistant', id: nextId++, answer, applied: false }); + } catch (e) { + A.messages.push({ role: 'error', error: e }); + } finally { + A.busy = false; + renderConvo(); + renderComposer(); + await refreshStatus(); + if (A.open && !input.disabled) input.focus(); + } +} + +// ------------------------------------------------------------ import + panel + +async function onImport(directory) { + const paths = await api.pickDocs({ directory }); + if (!paths) return; + A.importing = true; + A.importResult = null; + renderImport(); + try { A.importResult = await api.assistantImportDocs(paths); } + catch (e) { A.importResult = { error: e }; } + A.importing = false; + renderImport(); +} + +function renderImport() { + const host = $('#as-import-result'); + clear(host); + $('#as-import-files').disabled = A.importing; + $('#as-import-folder').disabled = A.importing; + if (A.importing) { host.appendChild(h('p', { class: 'muted' }, t('assistant.import.working'))); return; } + const r = A.importResult; + if (!r) return; + if (r.error) { host.appendChild(h('p', { style: 'color:var(--error)' }, [r.error.message, ' ', r.error.hint || ''].join(''))); return; } + const summary = t('assistant.import.summary', { files: tn('assistant.import.files', r.files_read.length), chunks: tn('assistant.import.chunks', r.chunks_added) }); + host.appendChild(h('p', null, r.skipped.length ? `${summary}; ${t('assistant.import.skipped', { list: r.skipped.map(basename).join(', ') })}` : summary)); + host.appendChild(h('div', { class: 'as-actions' }, + h('button', { type: 'button', class: 'btn btn-secondary btn-sm', onclick: async () => { + try { + let yaml; + try { yaml = await api.assistantKnowledgeYaml(); } catch { yaml = r.knowledge_yaml; } + const saved = await api.saveTextFile(yaml || r.knowledge_yaml, 'knowledge.yaml'); + if (saved) toast(t('assistant.import.saved', { name: basename(saved) }), 'success'); + } catch (e) { toast(e.message, 'error'); } + } }, t('assistant.import.save')))); +} + +export function renderAssistant() { + renderStatus(); + renderChips(); + renderConvo({ scroll: false }); + renderComposer(); + renderImport(); + renderVersion(); +} + +export function refreshChips() { + if (A.mode === 'explain' && !hasFinding()) { A.mode = 'ask'; renderComposer(); } + renderChips(); +} + +function renderVersion() { + const pill = $('#version-pill'); + if (!state.appVersion) { pill.hidden = true; return; } + pill.hidden = false; + pill.textContent = t('app.version_pill', { version: state.appVersion }); + pill.setAttribute('aria-label', t('app.version_aria', { version: state.appVersion })); +} + +export function openAssistant({ focusInput = true } = {}) { + if (A.open) return; + opener = document.activeElement; + A.open = true; + $('#assistant').hidden = false; + document.body.classList.add('assistant-open'); + $('#btn-assistant').setAttribute('aria-expanded', 'true'); + renderAssistant(); + refreshStatus(); + if (focusInput) { + const input = $('#as-input'); + (input.disabled ? ($('#as-download') || $('#assistant-close')) : input).focus(); + } +} + +export function closeAssistant() { + if (!A.open) return false; + A.open = false; + $('#assistant').hidden = true; + document.body.classList.remove('assistant-open'); + $('#btn-assistant').setAttribute('aria-expanded', 'false'); + const back = opener && document.contains(opener) && !opener.closest('#assistant') ? opener : $('#btn-assistant'); + if (back && back.focus) back.focus(); + return true; +} + +// "Explain with assistant" in the finding detail. +export async function explainFinding() { + openAssistant({ focusInput: false }); + A.mode = 'explain'; + renderChips(); + renderComposer(); + if (!A.status) await refreshStatus(); + await send('explain', ''); +} + +export async function initAssistant() { + $('#btn-assistant').addEventListener('click', () => (A.open ? closeAssistant() : openAssistant())); + $('#assistant-close').addEventListener('click', closeAssistant); + $('#as-composer').addEventListener('submit', (e) => { e.preventDefault(); send(); }); + $('#as-input').addEventListener('keydown', (e) => { + if (e.key === 'Enter' && !e.shiftKey && !e.isComposing) { e.preventDefault(); send(); } + }); + $('#as-import-files').addEventListener('click', () => onImport(false)); + $('#as-import-folder').addEventListener('click', () => onImport(true)); + renderAssistant(); + try { state.appVersion = (await api.appInfo()).version; } catch { state.appVersion = null; } + renderVersion(); + refreshStatus(); +} diff --git a/frontend/js/detail.js b/frontend/js/detail.js new file mode 100644 index 0000000..c0ae995 --- /dev/null +++ b/frontend/js/detail.js @@ -0,0 +1,170 @@ +// Right-hand detail panel: the selected finding plus everything the engine +// knows about the element (properties, quantities, classifications, ...). +import { h, clear, $, toast } from './dom.js'; +import { t, tn } from './i18n.js'; +import { state, actions } from './state.js'; +import * as api from './api.js'; +import { nf } from './format.js'; +import { fmtQty, kindForQuantityName, unitLabel } from './units.js'; +import { sevBadge, updateSelectionHighlight } from './view-review.js'; + +export function isDetailOpen() { return Boolean(state.detail); } + +export async function openDetail(finding, opts = {}) { + const globalId = finding ? finding.global_id : opts.globalId; + const opener = document.activeElement; + state.detail = { finding, globalId, element: null, status: globalId ? 'loading' : 'none', error: null, opener }; + document.body.classList.add('detail-open'); + $('#detail').hidden = false; + renderDetail(); + updateSelectionHighlight(); + if (actions.assistantChanged) actions.assistantChanged(); + $('#detail-close').focus(); + if (!globalId) return; + const mine = state.detail; + try { + const el = await api.getElement(globalId); + if (state.detail !== mine) return; + mine.element = el; mine.status = 'ready'; + } catch (e) { + if (state.detail !== mine) return; + mine.status = 'error'; mine.error = e; + } + renderDetail(); +} + +export function closeDetail() { + const d = state.detail; + if (!d) return false; + state.detail = null; + document.body.classList.remove('detail-open'); + $('#detail').hidden = true; + updateSelectionHighlight(); + if (actions.assistantChanged) actions.assistantChanged(); + if (d.opener && document.contains(d.opener) && typeof d.opener.focus === 'function') d.opener.focus(); + return true; +} + +const dash = '–'; + +function propText(v) { + if (v === null || v === undefined) return h('span', { class: 'empty-val' }, t('detail.null')); + if (typeof v === 'boolean') return v ? t('common.yes') : t('common.no'); + if (typeof v === 'number') return nf(v, Number.isInteger(v) ? 0 : 3); + if (Array.isArray(v)) return v.length ? v.map((x) => (typeof x === 'object' ? JSON.stringify(x) : String(x))).join(', ') : h('span', { class: 'empty-val' }, t('detail.empty')); + if (String(v).trim() === '') return h('span', { class: 'empty-val' }, t('detail.empty')); + return String(v); +} + +function kv(rows) { + return h('dl', { class: 'kv' }, rows.map(([k, v]) => h('div', null, h('dt', null, k), h('dd', null, v)))); +} + +function section(titleNode, ...kids) { + return h('section', { class: 'd-sec' }, h('h3', null, titleNode), ...kids); +} + +function findingBlock(f) { + const rule = state.result.report.rules.find((r) => r.rule_id === f.rule_id); + return h('section', { class: `d-finding sev-${f.severity.toLowerCase()}` }, + h('div', { class: 'd-finding-head' }, sevBadge(f.severity), h('span', { class: 'mono' }, f.rule_id), + rule ? h('span', { class: 'muted' }, rule.description) : null), + h('p', { class: 'd-message' }, f.message), + f.expected || f.actual ? kv([[t('failures.expected'), f.expected || dash], [t('failures.actual'), f.actual || dash]]) : null, + f.fix_hint ? h('p', { class: 'd-fix' }, h('strong', null, t('detail.fix')), ' ', f.fix_hint) : null, + h('button', { type: 'button', class: 'btn btn-secondary btn-sm d-explain', onclick: () => actions.explainFinding(f) }, t('detail.explain'))); +} + +function geometryBlock(el) { + const g = el.geometry; + if (!g) return h('p', { class: 'muted' }, el.has_representation ? t('detail.geom.none') : t('detail.geom.no_rep')); + const len = (v) => fmtQty('len', v, 3, true); + const ext = g.bbox_max.map((v, i) => v - g.bbox_min[i]); + const c = g.bbox_min.map((v, i) => (v + g.bbox_max[i]) / 2); + const dist = Math.sqrt(c[0] ** 2 + c[1] ** 2 + c[2] ** 2); + return kv([ + [t('detail.geom.min'), g.bbox_min.map((v) => fmtQty('len', v, 2)).join(' , ')], + [t('detail.geom.max'), g.bbox_max.map((v) => fmtQty('len', v, 2)).join(' , ')], + [t('detail.geom.size'), `${ext.map((v) => fmtQty('len', v, 2)).join(' × ')} ${unitLabel('len')}`], + [t('detail.geom.distance'), len(dist)], + [t('qto.volume'), g.volume_m3 == null ? dash : fmtQty('vol', g.volume_m3, 3, true)], + [t('qto.area'), g.area_m2 == null ? dash : fmtQty('area', g.area_m2, 3, true)], + [t('detail.geom.triangles'), nf(g.triangle_count)], + ]); +} + +function elementBlocks(el) { + const out = []; + out.push(section(t('detail.sec.identity'), kv([ + [h('span', { class: 'term', tip: t('tip.globalid') }, t('term.globalid')), h('span', { class: 'copy-row' }, h('span', { class: 'mono' }, el.global_id), + h('button', { type: 'button', class: 'btn btn-ghost btn-sm', onclick: async () => { + try { await navigator.clipboard.writeText(el.global_id); toast(t('detail.copied'), 'success'); } catch { toast(t('detail.copy_failed'), 'error'); } + } }, t('detail.copy')))], + [t('detail.step_id'), `#${el.step_id}`], + [t('col.type'), el.ifc_type + (el.predefined_type ? ` · ${el.predefined_type}` : '')], + [t('col.name'), el.name || dash], + [t('detail.type_name'), el.type_name || dash], + [t('detail.tag'), el.tag || dash], + [t('col.storey'), el.storey || dash], + [t('detail.container'), el.container ? `${el.container.ifc_type}${el.container.name ? ` · ${el.container.name}` : ''}` : t('detail.no_container')], + [t('detail.materials'), el.materials && el.materials.length ? el.materials.join(', ') : dash], + ]))); + + const psets = Object.entries(el.psets || {}); + out.push(section(h('span', null, h('span', { class: 'term', tip: t('tip.pset') }, t('term.pset')), ` · ${nf(psets.length)}`), + psets.length ? psets.map(([name, props], i) => h('details', { class: 'pset', open: i < 2 }, + h('summary', null, h('span', { class: 'mono' }, name), h('span', { class: 'muted' }, ` ${nf(Object.keys(props).length)}`)), + kv(Object.entries(props).map(([k, v]) => [k, propText(v)])))) + : h('p', { class: 'muted' }, t('detail.no_psets')))); + + const qsets = Object.entries(el.quantities || {}); + out.push(section(t('detail.sec.quantities'), + qsets.length ? qsets.map(([name, qs]) => h('details', { class: 'pset', open: true }, + h('summary', null, h('span', { class: 'mono' }, name)), + kv(Object.entries(qs).map(([k, v]) => { + const kind = kindForQuantityName(k); + return [k, kind ? `${fmtQty(kind, v, 3)} ${unitLabel(kind)}` : nf(v, 3)]; + })))) : h('p', { class: 'muted' }, t('detail.no_quantities')))); + + const cls = el.classifications || []; + out.push(section(t('detail.sec.classifications'), + cls.length ? h('ul', { class: 'plain' }, cls.map((c) => h('li', null, h('span', { class: 'mono' }, c.code || dash), ' ', c.name || '', h('span', { class: 'muted' }, c.system ? ` · ${c.system}` : '')))) + : h('p', { class: 'muted' }, t('detail.no_classifications')))); + + out.push(section(t('detail.sec.geometry'), geometryBlock(el))); + return out; +} + +export function renderDetail() { + const d = state.detail; + const root = $('#detail-body'); + clear(root); + if (!d) return; + const f = d.finding; + const el = d.element; + const title = (el && el.name) || (f && f.name) || (f && f.global_id) || d.globalId || t('detail.model_level'); + const subtitle = (el && el.ifc_type) || (f && f.ifc_type) || ''; + $('#detail-title').textContent = title; + $('#detail-sub').textContent = subtitle; + + if (f) root.appendChild(findingBlock(f)); + if (d.status === 'loading') root.appendChild(h('div', { class: 'skeleton-stack', role: 'status' }, h('div', { class: 'skeleton w60' }), h('div', { class: 'skeleton w80' }), h('div', { class: 'skeleton w40' }), h('p', { class: 'muted' }, t('detail.loading')))); + else if (d.status === 'none') root.appendChild(h('p', { class: 'muted' }, t('detail.model_level_body'))); + else if (d.status === 'error') root.appendChild(h('div', { class: 'notice notice-warning' }, h('div', { class: 'notice-body' }, h('strong', null, t('detail.unavailable')), h('p', null, d.error.message), d.error.hint ? h('p', { class: 'muted' }, d.error.hint) : null))); + else if (el) root.append(...elementBlocks(el)); + + // other findings on the same element + if (d.globalId) { + const others = state.result.report.findings.filter((x) => x.global_id === d.globalId && x !== f); + if (others.length) { + root.appendChild(section(tn('detail.other_findings', others.length), + h('ul', { class: 'plain other-findings' }, others.map((o) => h('li', null, + h('button', { type: 'button', class: 'linklike', onclick: () => actions.openDetail(o) }, h('span', { class: 'mono' }, o.rule_id), ' ', o.message), + ' ', sevBadge(o.severity)))))); + } + } +} + +export function initDetail() { + $('#detail-close').addEventListener('click', closeDetail); +} diff --git a/frontend/js/dom.js b/frontend/js/dom.js new file mode 100644 index 0000000..4e82156 --- /dev/null +++ b/frontend/js/dom.js @@ -0,0 +1,111 @@ +// Tiny DOM helpers: element builder, SVG builder, tooltips and toasts. +// Text is always inserted with textContent / text nodes, never innerHTML, +// so file names, element names and engine messages cannot inject markup. + +const PROPS = new Set(['value', 'checked', 'disabled', 'hidden', 'selected']); + +function append(node, kids) { + for (const k of kids) { + if (k == null || k === false) continue; + if (Array.isArray(k)) append(node, k); + else if (k instanceof Node) node.appendChild(k); + else node.appendChild(document.createTextNode(String(k))); + } +} + +export function h(tag, props, ...kids) { + const n = document.createElement(tag); + if (props) { + for (const [k, v] of Object.entries(props)) { + if (v == null || v === false) continue; + if (k === 'class') n.className = v; + else if (k === 'text') n.textContent = v; + else if (k === 'tip') setTip(n, v); + else if (k === 'dataset') Object.assign(n.dataset, v); + else if (k.startsWith('on') && typeof v === 'function') n.addEventListener(k.slice(2), v); + else if (PROPS.has(k)) n[k] = v; + else if (v === true) n.setAttribute(k, ''); + else n.setAttribute(k, v); + } + } + append(n, kids); + return n; +} + +const SVG_NS = 'http://www.w3.org/2000/svg'; +export function svg(tag, props, ...kids) { + const n = document.createElementNS(SVG_NS, tag); + if (props) for (const [k, v] of Object.entries(props)) if (v != null) n.setAttribute(k, v); + append(n, kids); + return n; +} + +export function clear(node) { + while (node.firstChild) node.removeChild(node.firstChild); + return node; +} + +export const $ = (sel, root = document) => root.querySelector(sel); +export const $$ = (sel, root = document) => Array.from(root.querySelectorAll(sel)); + +// ---------------------------------------------------------------- tooltips + +export function setTip(node, text) { + if (!text) return; + node.dataset.tip = text; + if (!node.matches('button, a, input, select, textarea, [tabindex]')) node.tabIndex = 0; +} + +let tipEl = null; +let tipTarget = null; + +function showTip(target) { + const text = target.dataset.tip; + if (!text || !tipEl) return; + tipTarget = target; + tipEl.textContent = text; + tipEl.hidden = false; + target.setAttribute('aria-describedby', 'tooltip'); + const r = target.getBoundingClientRect(); + const w = tipEl.offsetWidth; + const hgt = tipEl.offsetHeight; + let top = r.bottom + 8; + if (top + hgt > window.innerHeight - 8) top = Math.max(8, r.top - hgt - 8); + let left = r.left + r.width / 2 - w / 2; + left = Math.max(8, Math.min(left, window.innerWidth - w - 8)); + tipEl.style.top = `${top}px`; + tipEl.style.left = `${left}px`; +} + +export function hideTip() { + if (!tipEl) return; + tipEl.hidden = true; + if (tipTarget) tipTarget.removeAttribute('aria-describedby'); + tipTarget = null; +} + +export function initTooltips() { + tipEl = h('div', { id: 'tooltip', role: 'tooltip', hidden: true }); + document.body.appendChild(tipEl); + document.addEventListener('mouseover', (e) => { + const t = e.target.closest ? e.target.closest('[data-tip]') : null; + if (t) { if (t !== tipTarget) showTip(t); } else hideTip(); + }); + document.addEventListener('focusin', (e) => { + const t = e.target.closest ? e.target.closest('[data-tip]') : null; + if (t) showTip(t); else hideTip(); + }); + document.addEventListener('focusout', hideTip); + document.addEventListener('scroll', hideTip, true); + document.addEventListener('keydown', (e) => { if (e.key === 'Escape') hideTip(); }); +} + +// ------------------------------------------------------------------ toasts + +export function toast(message, kind = 'info') { + const host = document.getElementById('toasts'); + if (!host) return; + const n = h('div', { class: `toast toast-${kind}` }, message); + host.appendChild(n); + setTimeout(() => n.remove(), 5200); +} diff --git a/frontend/js/format.js b/frontend/js/format.js new file mode 100644 index 0000000..d79acba --- /dev/null +++ b/frontend/js/format.js @@ -0,0 +1,35 @@ +import { locale } from './i18n.js'; + +export const nf = (n, d = 0) => + new Intl.NumberFormat(locale(), { minimumFractionDigits: d, maximumFractionDigits: d }).format(n); + +export function bytes(n) { + if (n == null) return '–'; + if (n < 1024) return `${nf(n)} B`; + if (n < 1024 * 1024) return `${nf(n / 1024, 1)} KB`; + if (n < 1024 * 1024 * 1024) return `${nf(n / 1024 / 1024, 1)} MB`; + return `${nf(n / 1024 / 1024 / 1024, 2)} GB`; +} + +export function dateTime(iso) { + const d = new Date(iso); + if (Number.isNaN(d.getTime())) return String(iso); + return new Intl.DateTimeFormat(locale(), { dateStyle: 'medium', timeStyle: 'short' }).format(d); +} + +export function duration(ms) { + if (ms == null) return '–'; + return ms < 1000 ? `${nf(ms)} ms` : `${nf(ms / 1000, 1)} s`; +} + +export const basename = (p) => String(p ?? '').split(/[\\/]/).pop(); + +export function joinPath(dir, name) { + const sep = dir.includes('\\') && !dir.includes('/') ? '\\' : '/'; + return dir.replace(/[\\/]+$/, '') + sep + name; +} + +export function extOf(p) { + const m = /\.([A-Za-z0-9]+)$/.exec(String(p)); + return m ? m[1].toLowerCase() : ''; +} diff --git a/frontend/js/i18n.js b/frontend/js/i18n.js new file mode 100644 index 0000000..6b3ae02 --- /dev/null +++ b/frontend/js/i18n.js @@ -0,0 +1,40 @@ +// Minimal i18n: JSON dictionaries in i18n/.json, a t(key, args) lookup +// with {placeholder} substitution, plural helper tn() and a DOM applier for +// data-i18n attributes. English is always loaded as the fallback. +import { setTip } from './dom.js'; + +let base = {}; +let dict = {}; +let current = 'en'; + +export async function setLanguage(lang) { + if (!Object.keys(base).length) base = await (await fetch('i18n/en.json')).json(); + dict = lang === 'en' ? base : await (await fetch(`i18n/${lang}.json`)).json(); + current = lang; + document.documentElement.lang = lang; +} + +export const getLanguage = () => current; +export const locale = () => (current === 'es' ? 'es-ES' : 'en-GB'); + +export function t(key, args) { + let s = dict[key] ?? base[key] ?? key; + if (args) for (const [k, v] of Object.entries(args)) s = s.split(`{${k}}`).join(String(v)); + return s; +} + +// Plural helper: looks up key_one / key_other, always provides {n}. +export function tn(key, n, args) { + return t(`${key}_${n === 1 ? 'one' : 'other'}`, { n: new Intl.NumberFormat(locale()).format(n), ...args }); +} + +export function applyI18n(root = document) { + root.querySelectorAll('[data-i18n]').forEach((n) => { n.textContent = t(n.dataset.i18n); }); + root.querySelectorAll('[data-i18n-attr]').forEach((n) => { + n.dataset.i18nAttr.split(';').forEach((pair) => { + const [attr, key] = pair.split(':'); + if (attr && key) n.setAttribute(attr.trim(), t(key.trim())); + }); + }); + root.querySelectorAll('[data-tip-key]').forEach((n) => setTip(n, t(n.dataset.tipKey))); +} diff --git a/frontend/js/settings.js b/frontend/js/settings.js new file mode 100644 index 0000000..bd4c956 --- /dev/null +++ b/frontend/js/settings.js @@ -0,0 +1,222 @@ +// Project settings: the form model, its YAML projection and the form itself. +// Defaults reproduce the engine defaults, so an untouched form sends no +// config at all (config_yaml = null) and the engine runs with zero config. +import { h, clear, setTip } from './dom.js'; +import { t } from './i18n.js'; +import { emitYaml } from './yaml.js'; +import { state, actions } from './state.js'; +import * as api from './api.js'; +import { basename } from './format.js'; + +export const GROUP_KEYS = ['type', 'storey', 'classification', 'material', 'predefined_type', 'type_name']; +export const CLASSIFICATION_SYSTEMS = ['none', 'Uniclass', 'OmniClass', 'CCI', 'DIN276']; + +export function defaultSettings() { + return { + rulePack: 'generic', rulePackPath: '', + farFromOrigin: 10000, minVolume: 0.000001, + classificationSystem: 'none', classificationRequired: false, + groupBy: ['type', 'storey'], currency: 'EUR', ratesFile: '', + reportLanguage: null, // null = follow the interface language + }; +} + +const reportLang = (s) => s.reportLanguage || state.lang; + +export function settingsToTree(s) { + const qto = { group_by: GROUP_KEYS.filter((k) => s.groupBy.includes(k)), currency: s.currency.toUpperCase() }; + if (s.ratesFile.trim()) qto.unit_rates_file = s.ratesFile.trim(); + return { + project: { classification_system: s.classificationSystem }, + requirements: { rule_pack: s.rulePack === 'custom' ? s.rulePackPath.trim() : 'generic' }, + tolerances: { far_from_origin_m: s.farFromOrigin, geometry: { min_volume_m3: s.minVolume } }, + classification: { required: s.classificationRequired }, + qto, + output: { language: reportLang(s) }, + }; +} + +export function settingsToYaml(s) { + return `${t('settings.yaml.header')}\n${emitYaml(settingsToTree(s))}\n`; +} + +export function isDirty(s) { + const base = { ...defaultSettings(), reportLanguage: 'en' }; + return JSON.stringify(settingsToTree(s)) !== JSON.stringify(settingsToTree(base)); +} + +// The YAML sent to run_check: raw file > edited form > null (engine defaults). +export function effectiveYaml() { + if (state.configRaw != null) return state.configRaw; + return isDirty(state.settings) ? settingsToYaml(state.settings) : null; +} + +export function localProblems(s) { + const p = []; + if (s.rulePack === 'custom' && !s.rulePackPath.trim()) p.push('settings.err.rule_pack_path'); + if (!(s.farFromOrigin > 0)) p.push('settings.err.far'); + if (!(s.minVolume >= 0)) p.push('settings.err.min_volume'); + if (!s.groupBy.length) p.push('settings.err.group_by'); + if (!/^[A-Za-z]{3}$/.test(s.currency.trim())) p.push('settings.err.currency'); + return p; +} + +// ------------------------------------------------------------------- form + +let validateTimer = null; + +export function renderSettings(root) { + clear(root); + const s = state.settings; + const locked = state.configRaw != null; + + const onChange = () => { refresh(); actions.settingsChanged(); }; + + const field = (id, labelKey, hintKey, control, tipKey) => + h('div', { class: 'field' }, + h('label', { for: id }, h('span', tipKey ? { class: 'term', tip: t(tipKey) } : null, t(labelKey))), + control, + hintKey ? h('p', { class: 'hint' }, t(hintKey)) : null); + + const numInput = (id, key, step, min) => h('input', { + id, type: 'number', step, min, value: String(s[key]), inputmode: 'decimal', + oninput: (e) => { s[key] = e.target.value === '' ? NaN : Number(e.target.value); onChange(); }, + }); + + // --- rule pack + const packPath = h('div', { class: 'path-row', hidden: s.rulePack !== 'custom' }, + h('input', { id: 'set-pack-path', type: 'text', value: s.rulePackPath, placeholder: t('settings.pack.placeholder'), + oninput: (e) => { s.rulePackPath = e.target.value; onChange(); } }), + h('button', { type: 'button', class: 'btn btn-secondary', onclick: async () => { + const p = await api.pickFile('yaml'); if (p) { s.rulePackPath = p; renderSettings(root); onChange(); } + } }, t('common.browse'))); + const packSelect = h('select', { id: 'set-pack', onchange: (e) => { + s.rulePack = e.target.value; packPath.hidden = s.rulePack !== 'custom'; onChange(); + } }, + h('option', { value: 'generic', selected: s.rulePack === 'generic' }, t('settings.pack.generic')), + h('option', { value: 'custom', selected: s.rulePack === 'custom' }, t('settings.pack.custom'))); + + // --- classification + const clsSelect = h('select', { id: 'set-cls', onchange: (e) => { s.classificationSystem = e.target.value; onChange(); } }, + CLASSIFICATION_SYSTEMS.map((c) => h('option', { value: c, selected: s.classificationSystem === c }, c === 'none' ? t('settings.cls.none') : c))); + const clsRequired = h('label', { class: 'switch' }, + h('input', { type: 'checkbox', id: 'set-cls-required', checked: s.classificationRequired, onchange: (e) => { s.classificationRequired = e.target.checked; onChange(); } }), + h('span', { class: 'switch-track', 'aria-hidden': 'true' }), + h('span', null, t('settings.cls.required'))); + + // --- QTO + const groupChecks = h('div', { class: 'check-grid', role: 'group', 'aria-labelledby': 'set-group-label' }, + GROUP_KEYS.map((k) => h('label', { class: 'check' }, + h('input', { type: 'checkbox', value: k, checked: s.groupBy.includes(k), onchange: (e) => { + s.groupBy = e.target.checked ? [...s.groupBy, k] : s.groupBy.filter((x) => x !== k); onChange(); + } }), + h('span', null, t(`group.${k}`))))); + const rates = h('div', { class: 'path-row' }, + h('input', { id: 'set-rates', type: 'text', value: s.ratesFile, placeholder: t('settings.rates.placeholder'), + oninput: (e) => { s.ratesFile = e.target.value; onChange(); } }), + h('button', { type: 'button', class: 'btn btn-secondary', onclick: async () => { + const p = await api.pickFile('csv'); if (p) { s.ratesFile = p; renderSettings(root); onChange(); } + } }, t('common.browse'))); + + const langSelect = h('select', { id: 'set-lang', onchange: (e) => { s.reportLanguage = e.target.value; onChange(); } }, + h('option', { value: 'en', selected: reportLang(s) === 'en' }, t('settings.lang.en')), + h('option', { value: 'es', selected: reportLang(s) === 'es' }, t('settings.lang.es'))); + + const form = h('fieldset', { class: 'settings-form', disabled: locked }, + h('legend', { class: 'sr-only' }, t('settings.title')), + h('div', { class: 'settings-col' }, + h('h3', null, t('settings.sec.rules')), + field('set-pack', 'settings.pack.label', 'settings.pack.hint', packSelect), + packPath, + field('set-far', 'settings.far.label', 'settings.far.hint', numInput('set-far', 'farFromOrigin', 'any', '0')), + field('set-minvol', 'settings.minvol.label', 'settings.minvol.hint', numInput('set-minvol', 'minVolume', 'any', '0')), + h('h3', null, t('settings.sec.classification')), + field('set-cls', 'settings.cls.label', 'settings.cls.hint', clsSelect), + h('div', { class: 'field' }, clsRequired, h('p', { class: 'hint' }, t('settings.cls.required_hint')))), + h('div', { class: 'settings-col' }, + h('h3', null, h('span', { class: 'term', tip: t('tip.qto') }, t('settings.sec.qto'))), + h('div', { class: 'field' }, + h('span', { class: 'label', id: 'set-group-label' }, t('settings.group.label')), + groupChecks, + h('p', { class: 'hint' }, t('settings.group.hint'))), + field('set-currency', 'settings.currency.label', null, h('input', { id: 'set-currency', type: 'text', maxlength: '3', value: s.currency, class: 'short', + oninput: (e) => { s.currency = e.target.value; onChange(); } })), + field('set-rates', 'settings.rates.label', 'settings.rates.hint', rates), + h('h3', null, t('settings.sec.report')), + field('set-lang', 'settings.lang.label', 'settings.lang.hint', langSelect))); + + const banner = locked + ? h('div', { class: 'notice notice-info' }, + h('div', null, h('strong', null, t('settings.locked.title', { name: basename(state.configPath || 'project.yaml') })), h('p', null, t('settings.locked.body'))), + h('button', { type: 'button', class: 'btn btn-secondary', onclick: () => actions.clearConfigFile() }, t('settings.locked.use_form'))) + : null; + + const preview = h('pre', { id: 'yaml-preview', class: 'yaml', tabindex: '0', 'aria-label': t('settings.preview.label') }); + const problems = h('ul', { id: 'settings-problems', class: 'problems', role: 'status' }); + + const side = h('div', { class: 'settings-side' }, + h('div', { class: 'yaml-head' }, + h('h3', null, t('settings.preview.title')), + h('span', { class: 'muted small', id: 'yaml-note' })), + preview, + problems, + h('div', { class: 'settings-actions' }, + h('button', { type: 'button', class: 'btn btn-secondary', id: 'btn-download-yaml', onclick: async () => { + try { + const saved = await api.saveTextFile(currentYamlText(), 'project.yaml'); + if (saved) actions.toast(t('settings.saved', { name: basename(saved) }), 'success'); + } catch (e) { actions.toast(e.message, 'error'); } + } }, t('settings.download')), + h('button', { type: 'button', class: 'btn btn-ghost', onclick: () => { state.settings = defaultSettings(); renderSettings(root); onChange(); } }, t('settings.reset')))); + + if (banner) root.appendChild(banner); + root.appendChild(h('div', { class: 'settings-grid' }, form, side)); + refresh(); + + function currentYamlText() { + if (state.configRaw != null) return state.configRaw; + return isDirty(state.settings) ? settingsToYaml(state.settings) : defaultYamlCache; + } + + function refresh() { + const raw = state.configRaw != null; + const dirty = isDirty(state.settings); + preview.textContent = currentYamlText(); + root.querySelector('#yaml-note').textContent = raw ? t('settings.preview.raw') : dirty ? t('settings.preview.edited') : t('settings.preview.defaults'); + const probs = raw ? [] : localProblems(state.settings); + clear(problems); + probs.forEach((k) => problems.appendChild(h('li', null, t(k)))); + if (state.configError) problems.appendChild(h('li', null, state.configError)); + clearTimeout(validateTimer); + validateTimer = setTimeout(async () => { + const yaml = effectiveYaml(); + if (yaml == null || localProblems(state.settings).length && !raw) { state.configError = null; actions.settingsChanged(); return; } + try { + const r = await api.validateConfigYaml(yaml); + state.configError = r.ok ? null : (r.error || t('settings.err.generic')); + } catch (e) { state.configError = e.message; } + refreshProblemsOnly(); + actions.settingsChanged(); + }, 350); + } + + function refreshProblemsOnly() { + const raw = state.configRaw != null; + clear(problems); + (raw ? [] : localProblems(state.settings)).forEach((k) => problems.appendChild(h('li', null, t(k)))); + if (state.configError) problems.appendChild(h('li', null, state.configError)); + } +} + +// Default YAML text shown while nothing was edited (comes from the engine). +let defaultYamlCache = ''; +export async function loadDefaultYaml() { + try { defaultYamlCache = await api.defaultConfigYaml(); } catch { defaultYamlCache = settingsToYaml(defaultSettings()); } +} + +export function blockingProblem() { + if (state.configRaw != null) return state.configError ? state.configError : null; + const p = localProblems(state.settings); + if (p.length) return t(p[0]); + return state.configError; +} diff --git a/frontend/js/state.js b/frontend/js/state.js new file mode 100644 index 0000000..af7ffd4 --- /dev/null +++ b/frontend/js/state.js @@ -0,0 +1,63 @@ +// Single mutable application state + persisted preferences. +// Views read from `state` and are re-rendered by app.js; cross-view calls go +// through `actions` (filled by app.js) to avoid circular imports. + +export const store = { + get(key, fallback) { + try { return localStorage.getItem(key) ?? fallback; } catch { return fallback; } + }, + set(key, value) { + try { localStorage.setItem(key, value); } catch { /* storage unavailable: preference lasts this session only */ } + }, +}; + +const prefersDark = () => { + try { return window.matchMedia('(prefers-color-scheme: dark)').matches; } catch { return false; } +}; + +export const state = { + step: 1, + theme: store.get('vm.theme', prefersDark() ? 'dark' : 'light'), + lang: store.get('vm.lang', (navigator.language || 'en').toLowerCase().startsWith('es') ? 'es' : 'en'), + units: store.get('vm.units', 'metric'), + + examples: [], + file: null, // FileCard from inspect_file + inspecting: false, + idsPath: null, + configPath: null, // path of a dropped/picked project.yaml + configRaw: null, // its text; when set the form is bypassed + settings: null, // filled by app.js with defaultSettings() + configError: null, // plain-language problem found by validation + loadError: null, // {code, message, hint} + + running: false, + runStage: '', + result: null, // { report, ledger, files, bcf, out_dir } + runs: [], + runsError: null, + + review: { + tab: 'checks', + filters: { sev: { ERROR: true, WARNING: true, INFO: true }, rule: '', storey: '', type: '', q: '' }, + page: { checks: 1, failures: 1, quantities: 1 }, + pageSize: 50, + }, + detail: null, // { finding, element, status } + + appVersion: null, // from app_info + assistant: { + open: false, + status: null, // ModelStatus + { loaded } + statusError: null, + download: null, // { done, total } while the model downloads + confirmRemove: false, + busy: false, // a question is being answered + mode: 'ask', // how the next question is sent: ask | filter | explain | config + messages: [], // { role: 'user'|'assistant'|'error'|'note', ... } + importing: false, + importResult: null, // { files_read, skipped, chunks_added } + }, +}; + +export const actions = {}; diff --git a/frontend/js/table.js b/frontend/js/table.js new file mode 100644 index 0000000..469afad --- /dev/null +++ b/frontend/js/table.js @@ -0,0 +1,28 @@ +// Pagination: tables never render more than one page of rows. +import { h } from './dom.js'; +import { t } from './i18n.js'; +import { nf } from './format.js'; + +export const PAGE_SIZES = [50, 100, 250]; + +export function paginate(items, page, size) { + const pages = Math.max(1, Math.ceil(items.length / size)); + const p = Math.min(Math.max(1, page), pages); + const start = (p - 1) * size; + return { rows: items.slice(start, start + size), page: p, pages, start, end: Math.min(items.length, start + size), total: items.length }; +} + +export function pager(info, size, { onPage, onSize }) { + const range = info.total + ? t('pager.showing', { from: nf(info.start + 1), to: nf(info.end), total: nf(info.total) }) + : t('pager.none'); + return h('div', { class: 'pager' }, + h('span', { class: 'pager-range', role: 'status' }, range), + h('div', { class: 'pager-controls' }, + h('label', { class: 'pager-size' }, t('pager.per_page'), + h('select', { onchange: (e) => onSize(Number(e.target.value)) }, + PAGE_SIZES.map((n) => h('option', { value: String(n), selected: n === size }, String(n))))), + h('button', { type: 'button', class: 'btn btn-ghost', disabled: info.page <= 1, onclick: () => onPage(info.page - 1) }, t('pager.prev')), + h('span', { class: 'pager-page' }, t('pager.page', { page: nf(info.page), pages: nf(info.pages) })), + h('button', { type: 'button', class: 'btn btn-ghost', disabled: info.page >= info.pages, onclick: () => onPage(info.page + 1) }, t('pager.next')))); +} diff --git a/frontend/js/theme-init.js b/frontend/js/theme-init.js new file mode 100644 index 0000000..317235e --- /dev/null +++ b/frontend/js/theme-init.js @@ -0,0 +1,10 @@ +// Runs before first paint (loaded synchronously in ) so the saved theme +// is applied without a flash of the wrong colours. +(function () { + var theme = 'light'; + try { + theme = localStorage.getItem('vm.theme') || + (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + } catch (e) { /* storage blocked: keep default */ } + document.documentElement.setAttribute('data-theme', theme); +})(); diff --git a/frontend/js/units.js b/frontend/js/units.js new file mode 100644 index 0000000..91ffef2 --- /dev/null +++ b/frontend/js/units.js @@ -0,0 +1,36 @@ +// Display-only unit conversion. Engine data is always SI (m, m², m³, kg); +// nothing here changes what is stored, exported or sent to the engine. +import { state } from './state.js'; +import { t } from './i18n.js'; +import { nf } from './format.js'; + +const K = { len: 3.280839895013123, area: 10.763910416709722, vol: 35.31466672148859, mass: 2.2046226218487757 }; +export const KINDS_BY_RATE_UNIT = { m: 'len', m2: 'area', m3: 'vol', kg: 'mass' }; + +export const unitLabel = (kind) => t(`unit.${state.units}.${kind}`); + +export const toDisplay = (kind, v) => (state.units === 'imperial' ? v * K[kind] : v); + +export function fmtQty(kind, v, digits = 2, withUnit = false) { + if (v == null || Number.isNaN(v)) return '–'; + const s = nf(toDisplay(kind, v), digits); + return withUnit ? `${s} ${unitLabel(kind)}` : s; +} + +// A price per m³ becomes a price per ft³ when the display is imperial. +export function fmtRate(rate, rateUnit, currency) { + const kind = KINDS_BY_RATE_UNIT[rateUnit]; + const shown = kind && state.units === 'imperial' ? rate / K[kind] : rate; + const unit = kind ? unitLabel(kind) : t(`unit.rate.${rateUnit}`); + return `${nf(shown, 2)} ${currency}/${unit}`; +} + +// Map a quantity name from an IFC quantity set to a conversion kind. +export function kindForQuantityName(name) { + const n = name.toLowerCase(); + if (n.includes('volume')) return 'vol'; + if (n.includes('area')) return 'area'; + if (n.includes('weight') || n.includes('mass')) return 'mass'; + if (/(length|height|width|depth|perimeter|thickness|diameter|radius)/.test(n)) return 'len'; + return null; +} diff --git a/frontend/js/view-export.js b/frontend/js/view-export.js new file mode 100644 index 0000000..6e37f17 --- /dev/null +++ b/frontend/js/view-export.js @@ -0,0 +1,113 @@ +// Step 3: downloads, BCF summary, run history with run-to-run diff. +import { h, clear, $ } from './dom.js'; +import { t, tn } from './i18n.js'; +import { state, actions } from './state.js'; +import * as api from './api.js'; +import { bytes, nf, dateTime, basename, joinPath } from './format.js'; +import { paginate, pager } from './table.js'; + +// Display order of the output kinds; unknown kinds go last. +const KIND_ORDER = ['report_html', 'failures_csv', 'bcf', 'issues_csv', 'qto_xlsx', 'qto_csv', 'qto_json', 'report_json', 'config', 'run_json', 'audit_log']; +const VERDICT_CLASS = { PASS: 'v-pass', PASS_WITH_WARNINGS: 'v-warn', FAIL: 'v-fail' }; +let histPage = 1; + +async function open(path) { + try { + const ok = await api.openPath(path); + if (!ok) actions.toast(t('export.browser_open', { path }), 'info'); + } catch (e) { + actions.toast(`${e.message}${e.hint ? ` ${e.hint}` : ''}`, 'error'); + } +} + +function kindRank(k) { const i = KIND_ORDER.indexOf(k); return i < 0 ? 99 : i; } + +function fileRow(f, outDir, bcf) { + const known = KIND_ORDER.includes(f.kind); + const title = known ? t(`export.kind.${f.kind}.title`) : f.name; + const desc = known ? t(`export.kind.${f.kind}.desc`) : t('export.kind.other.desc'); + const bcfLine = f.kind === 'bcf' && bcf + ? h('p', { class: 'file-extra' }, t('export.bcf_line', { topics: nf(bcf.topics), viewpoints: nf(bcf.with_viewpoint), version: bcf.version })) + : null; + return h('li', { class: 'download' }, + h('div', { class: 'download-main' }, + h('h3', null, f.kind === 'bcf' ? h('span', { class: 'term', tip: t('tip.bcf') }, title) : title), + h('p', null, desc), + bcfLine, + h('p', { class: 'file-name mono' }, f.name)), + h('span', { class: 'file-size' }, bytes(f.bytes)), + h('button', { type: 'button', class: 'btn btn-secondary', 'aria-label': t('export.open_named', { name: f.name }), onclick: () => open(joinPath(outDir, f.name)) }, t('export.open'))); +} + +export function diffFor(runs, i) { + const run = runs[i]; + const prev = runs.slice(i + 1).find((r) => basename(r.ifc_file) === basename(run.ifc_file)); + if (!prev) return { text: t('hist.first'), cls: 'muted' }; + const dE = run.errors - prev.errors; + const dW = run.warnings - prev.warnings; + if (dE < 0) return { text: tn('hist.fewer_errors', -dE), cls: 'good' }; + if (dE > 0) return { text: tn('hist.more_errors', dE), cls: 'bad' }; + if (dW < 0) return { text: tn('hist.fewer_warnings', -dW), cls: 'good' }; + if (dW > 0) return { text: tn('hist.more_warnings', dW), cls: 'bad' }; + return { text: t('hist.same'), cls: 'muted' }; +} + +function historyTable() { + const runs = state.runs; + if (state.runsError) return h('div', { class: 'notice notice-warning' }, h('div', { class: 'notice-body' }, h('strong', null, t('hist.error')), h('p', null, state.runsError.message))); + if (!runs.length) return h('p', { class: 'muted' }, t('hist.empty')); + const info = paginate(runs, histPage, state.review.pageSize); + histPage = info.page; + const current = state.result.ledger.timestamp; + const th = (k, cls = '') => h('th', { scope: 'col', class: cls }, t(k)); + return h('div', null, + h('div', { class: 'table-wrap' }, h('table', { class: 'data-table history-table' }, + h('caption', { class: 'sr-only' }, t('hist.title')), + h('thead', null, h('tr', null, th('hist.date'), th('hist.file'), th('hist.score', 'num'), th('hist.verdict'), th('hist.errors', 'num'), th('hist.warnings', 'num'), th('hist.change'), th('hist.folder'))), + h('tbody', null, info.rows.map((r) => { + const idx = runs.indexOf(r); + const d = diffFor(runs, idx); + return h('tr', { class: r.timestamp === current ? 'is-current' : '' }, + h('td', null, dateTime(r.timestamp), r.timestamp === current ? h('span', { class: 'chip chip-accent' }, t('hist.this_run')) : null), + h('td', { class: 'wrap' }, basename(r.ifc_file)), + h('td', { class: 'num strong' }, String(r.score)), + h('td', null, h('span', { class: `badge verdict ${VERDICT_CLASS[r.verdict] || 'v-none'}` }, t(`verdict.${r.verdict || 'NONE'}`))), + h('td', { class: 'num' }, nf(r.errors)), + h('td', { class: 'num' }, nf(r.warnings)), + h('td', { class: `diff ${d.cls}` }, d.text), + h('td', null, h('button', { type: 'button', class: 'btn btn-ghost', 'aria-label': t('hist.open_named', { date: dateTime(r.timestamp) }), onclick: () => open(r.output_dir) }, t('hist.open')))); + })))), + pager(info, state.review.pageSize, { + onPage: (p) => { histPage = p; renderExport(); }, + onSize: (n) => { state.review.pageSize = n; histPage = 1; renderExport(); }, + })); +} + +export function renderExport() { + const root = $('#export-root'); + clear(root); + const res = state.result; + if (!res) return; + const { report, files, bcf, out_dir } = res; + const s = report.summary; + const sorted = [...files].sort((a, b) => kindRank(a.kind) - kindRank(b.kind)); + root.append( + h('div', { class: 'export-top card' }, + h('div', null, + h('p', { class: 'eyebrow' }, t('export.done')), + h('h2', null, report.model.file_name), + h('p', { class: 'muted' }, t('export.saved_to')), + h('p', { class: 'mono out-dir' }, out_dir)), + h('div', { class: 'export-top-actions' }, + h('span', { class: `badge verdict ${VERDICT_CLASS[s.verdict] || 'v-none'}` }, `${t(`verdict.${s.verdict || 'NONE'}`)} · ${s.score}`), + h('button', { type: 'button', class: 'btn btn-secondary', onclick: () => open(out_dir) }, t('export.open_folder')))), + h('section', { 'aria-labelledby': 'dl-title' }, + h('div', { class: 'section-head' }, h('h2', { id: 'dl-title' }, t('export.downloads')), h('p', { class: 'muted' }, t('export.downloads_sub'))), + h('ul', { class: 'downloads' }, sorted.map((f) => fileRow(f, out_dir, bcf)))), + h('section', { 'aria-labelledby': 'hist-title' }, + h('div', { class: 'section-head' }, h('h2', { id: 'hist-title' }, t('hist.title')), h('p', { class: 'muted' }, t('hist.sub'))), + historyTable()), + h('div', { class: 'export-footer' }, + h('button', { type: 'button', class: 'btn btn-secondary', onclick: () => actions.goto(2) }, t('export.back_review')), + h('button', { type: 'button', class: 'btn btn-primary', onclick: () => actions.newCheck() }, t('export.new_check')))); +} diff --git a/frontend/js/view-load.js b/frontend/js/view-load.js new file mode 100644 index 0000000..a824c77 --- /dev/null +++ b/frontend/js/view-load.js @@ -0,0 +1,238 @@ +// Step 1: load a model (drop / browse / sample), inspect it, tune settings, run. +import { h, clear, $, setTip } from './dom.js'; +import { t, tn } from './i18n.js'; +import { state, actions } from './state.js'; +import * as api from './api.js'; +import { bytes, nf, basename, extOf } from './format.js'; +import { renderSettings, isDirty, blockingProblem, localProblems } from './settings.js'; + +const cap = (s) => (s ? s.charAt(0).toUpperCase() + s.slice(1).toLowerCase() : s); +const tOr = (key, fallback) => { const v = t(key); return v === key ? fallback : v; }; + +// ------------------------------------------------------------ data actions + +export async function loadIfc(path) { + state.inspecting = true; + state.loadError = null; + state.file = null; + renderLoad(); + try { + state.file = await api.inspectFile(path); + } catch (e) { + state.loadError = e; + state.file = null; + } finally { + state.inspecting = false; + renderLoad(); + } +} + +export async function attachConfig(path) { + try { + state.configRaw = await api.readTextFile(path); + state.configPath = path; + state.configError = null; + } catch (e) { + actions.toast(t('load.config.unreadable', { name: basename(path) }), 'error'); + return; + } + renderSettingsPanel(); + actions.settingsChanged(); +} + +export function clearConfigFile() { + state.configRaw = null; + state.configPath = null; + state.configError = null; + renderSettingsPanel(); + actions.settingsChanged(); +} + +export function attachIds(path) { + state.idsPath = path; + renderLoad(); +} + +export async function useExample(ex) { + state.idsPath = ex.ids_path || null; + state.configRaw = null; + state.configPath = null; + await loadIfc(ex.ifc_path); + if (ex.config_path) await attachConfig(ex.config_path); + else { renderSettingsPanel(); actions.settingsChanged(); } + renderLoad(); +} + +// Classify dropped paths by extension and route them. +export async function handleDropped(paths) { + let ifc = null; + for (const p of paths) { + const ext = extOf(p); + if (ext === 'ifc' || ext === 'ifczip') { if (!ifc) ifc = p; else actions.toast(t('load.drop.extra_ifc', { name: basename(p) }), 'info'); } + else if (ext === 'ids' || ext === 'xml') attachIds(p); + else if (ext === 'yaml' || ext === 'yml') await attachConfig(p); + else actions.toast(t('load.drop.unsupported', { name: basename(p) }), 'error'); + } + if (ifc) await loadIfc(ifc); +} + +// ---------------------------------------------------------------- rendering + +export function renderSettingsPanel() { + renderSettings($('#settings-body')); + updateSettingsBadge(); +} + +export function updateSettingsBadge() { + const badge = $('#settings-badge'); + const problems = state.configRaw != null ? 0 : localProblems(state.settings).length; + if (problems || state.configError) { badge.textContent = t('settings.badge.problem'); badge.className = 'badge-count is-problem'; badge.hidden = false; } + else if (state.configRaw != null) { badge.textContent = t('settings.badge.file'); badge.className = 'badge-count'; badge.hidden = false; } + else if (isDirty(state.settings)) { badge.textContent = t('settings.badge.edited'); badge.className = 'badge-count'; badge.hidden = false; } + else badge.hidden = true; +} + +const demoExample = () => state.examples.find((x) => x.id === 'demo') || null; + +export function renderSampleList() { + const host = $('#sample-list'); + clear(host); + state.examples.forEach((ex) => { + const isDemo = ex.id === 'demo'; + const meta = h('p', { class: 'sample-meta' }, + isDemo ? h('span', { class: 'chip chip-accent' }, t('load.samples.start_here')) : null, + h('span', { class: 'chip' }, ex.ids_path ? t('load.samples.with_ids') : t('load.samples.no_ids')), + h('span', { class: 'chip' }, ex.config_path ? t('load.samples.with_config') : t('load.samples.default_config'))); + const btn = h('button', { type: 'button', class: 'btn btn-secondary', disabled: state.inspecting || state.running, 'aria-label': t('load.samples.use_named', { name: isDemo ? t('load.demo.card_name') : ex.name }), onclick: () => useExample(ex) }, t('load.samples.use')); + host.appendChild(isDemo + ? h('article', { class: 'sample is-demo' }, h('div', { class: 'sample-body' }, h('h3', null, t('load.demo.card_name')), h('p', null, t('load.demo.card_desc')), meta), btn) + : h('article', { class: 'sample' }, h('h3', null, ex.name), h('p', null, ex.description), meta, btn)); + }); +} + +function renderAttachments() { + const set = (idName, btnClear, name) => { + const pill = $(idName); + pill.hidden = !name; + pill.textContent = name ? basename(name) : ''; + if (name) setTip(pill, name); + $(btnClear).hidden = !name; + }; + set('#ids-name', '#btn-clear-ids', state.idsPath); + set('#yaml-name', '#btn-clear-yaml', state.configRaw != null ? (state.configPath || 'project.yaml') : null); +} + +function renderErrorCard() { + const host = $('#load-error'); + const e = state.loadError; + host.hidden = !e; + clear(host); + if (!e) return; + host.append( + h('div', { class: 'notice-body' }, + h('h2', null, t('error.title')), + h('p', { class: 'error-message' }, e.message), + h('p', { class: 'error-hint' }, h('strong', null, t('error.check')), ' ', e.hint || t('error.generic_hint'))), + h('button', { type: 'button', class: 'btn btn-secondary', onclick: () => { state.loadError = null; renderLoad(); } }, t('common.dismiss'))); +} + +function chipList(items, className = '') { + return h('ul', { class: `chips ${className}` }, items.map((c) => h('li', { class: 'chip' }, c))); +} + +function renderFileCard() { + const host = $('#file-section'); + clear(host); + host.hidden = !state.file && !state.inspecting; + if (state.inspecting) { + host.appendChild(h('div', { class: 'file-card is-loading', role: 'status' }, h('div', { class: 'skeleton w60' }), h('div', { class: 'skeleton w40' }), h('p', { class: 'muted' }, t('load.reading')))); + return; + } + const f = state.file; + if (!f) return; + const fact = (labelNode, valueNode) => h('div', { class: 'fact' }, h('dt', null, labelNode), h('dd', null, valueNode)); + const sha = h('span', { class: 'mono', tip: f.sha256 }, f.sha256_short); + const types = Object.entries(f.type_counts || {}).sort((a, b) => b[1] - a[1]); + host.appendChild(h('section', { class: 'file-card', 'aria-labelledby': 'file-card-title' }, + h('div', { class: 'file-card-head' }, + h('div', null, h('h2', { id: 'file-card-title' }, f.file_name), h('p', { class: 'path mono', tip: f.path }, f.path)), + h('span', { class: 'badge badge-ok' }, t('load.card.ready'))), + h('dl', { class: 'facts' }, + fact(h('span', { class: 'term', tip: t('tip.schema') }, t('term.schema')), f.schema), + fact(t('load.card.size'), bytes(f.size_bytes)), + fact(t('load.card.elements'), nf(f.element_count)), + fact(t('load.card.units'), `${t(`units.${f.units.system}`)} · ${cap(f.units.length_unit || '')}`), + fact(t('load.card.sha'), sha)), + h('div', { class: 'chip-rows' }, + h('div', { class: 'chip-row' }, h('span', { class: 'chip-label' }, t('load.card.disciplines')), + f.disciplines.length ? chipList(f.disciplines.map((d) => tOr(`discipline.${d}`, d))) : h('span', { class: 'muted' }, t('common.none'))), + h('div', { class: 'chip-row' }, h('span', { class: 'chip-label' }, t('load.card.storeys')), + f.storeys.length ? chipList(f.storeys) : h('span', { class: 'muted' }, t('common.none'))), + h('div', { class: 'chip-row' }, h('span', { class: 'chip-label' }, t('load.card.types')), + types.length ? chipList(types.slice(0, 8).map(([k, v]) => `${k} · ${nf(v)}`), 'mono-chips') : h('span', { class: 'muted' }, t('common.none')))), + f.reader_warnings && f.reader_warnings.length + ? h('div', { class: 'notice notice-warning' }, h('div', { class: 'notice-body' }, + h('strong', null, tn('load.card.warnings', f.reader_warnings.length)), + h('ul', null, f.reader_warnings.map((w) => h('li', null, w))))) + : null)); +} + +export function renderRunBar() { + const btn = $('#btn-run'); + const title = $('#run-status-title'); + const sub = $('#run-status-sub'); + const prog = $('#run-progress'); + const block = blockingProblem(); + prog.hidden = !state.running; + $('#run-stage').textContent = state.runStage; + if (state.running) { + title.textContent = t('run.running'); + sub.textContent = ''; + btn.disabled = true; + btn.textContent = t('run.running_btn'); + return; + } + btn.textContent = t('load.run'); + if (!state.file) { + title.textContent = t('run.need_file'); + sub.textContent = t('run.need_file_sub'); + btn.disabled = true; + } else if (block) { + title.textContent = t('run.fix_settings'); + sub.textContent = block; + btn.disabled = true; + } else { + const cfg = state.configRaw != null ? t('run.cfg_file') : isDirty(state.settings) ? t('run.cfg_edited') : t('run.cfg_default'); + title.textContent = t('run.ready', { name: state.file.file_name }); + sub.textContent = t('run.ready_sub', { count: nf(state.file.element_count), ids: state.idsPath ? t('run.with_ids') : t('run.no_ids'), cfg }); + btn.disabled = false; + } +} + +export function renderLoad() { + const dz = $('#dropzone'); + dz.classList.toggle('is-loaded', Boolean(state.file)); + $('#view-load').classList.toggle('has-file', Boolean(state.file || state.inspecting)); + $('#dz-title').textContent = state.file ? t('load.drop.title_loaded') : t('load.drop.title'); + $('#dz-sub').textContent = state.file ? t('load.drop.sub_loaded') : t('load.drop.sub'); + $('#btn-browse-ifc').textContent = state.file ? t('load.browse.ifc_replace') : t('load.browse.ifc'); + $('#btn-browse-ifc').disabled = state.inspecting || state.running; + $('#demo-cta').hidden = !demoExample(); + $('#btn-demo').disabled = state.inspecting || state.running; + renderAttachments(); + renderErrorCard(); + renderFileCard(); + renderSampleList(); + updateSettingsBadge(); + renderRunBar(); +} + +export function initLoad() { + $('#btn-browse-ifc').addEventListener('click', async () => { const p = await api.pickFile('ifc'); if (p) loadIfc(p); }); + $('#btn-browse-ids').addEventListener('click', async () => { const p = await api.pickFile('ids'); if (p) attachIds(p); }); + $('#btn-browse-yaml').addEventListener('click', async () => { const p = await api.pickFile('yaml'); if (p) attachConfig(p); }); + $('#btn-clear-ids').addEventListener('click', () => { state.idsPath = null; renderLoad(); }); + $('#btn-clear-yaml').addEventListener('click', clearConfigFile); + $('#btn-demo').addEventListener('click', () => { const ex = demoExample(); if (ex) useExample(ex); }); + $('#btn-run').addEventListener('click', () => actions.run()); +} diff --git a/frontend/js/view-review.js b/frontend/js/view-review.js new file mode 100644 index 0000000..5d18392 --- /dev/null +++ b/frontend/js/view-review.js @@ -0,0 +1,566 @@ +// Step 2: score + verdict header, five tabs, filters, paginated tables. +import { h, clear, $, $$, svg } from './dom.js'; +import { t, tn } from './i18n.js'; +import { state, actions } from './state.js'; +import { nf, duration, basename } from './format.js'; +import { fmtQty, fmtRate, unitLabel } from './units.js'; +import { paginate, pager } from './table.js'; + +const SEVS = ['ERROR', 'WARNING', 'INFO']; +const TABS = ['checks', 'failures', 'quantities', 'ids', 'clash']; +const NONE_STOREY = '__none__'; +const VERDICT_CLASS = { PASS: 'v-pass', PASS_WITH_WARNINGS: 'v-warn', FAIL: 'v-fail' }; + +const tOr = (key, fb) => { const v = t(key); return v === key ? fb : v; }; +export const sevBadge = (sev) => h('span', { class: `badge sev-${sev.toLowerCase()}` }, t(`sev.${sev}`)); +export const statusBadge = (st) => h('span', { class: `badge st-${st.toLowerCase()}` }, t(`status.${st}`)); +const verdictKey = (v) => v || 'NONE'; + +// ---------------------------------------------------------------- derived + +let derivedFor = null; +let derived = null; +function ctx() { + const report = state.result.report; + if (derivedFor !== report) { + const findingIndex = new Map(report.findings.map((f, i) => [f, i])); + derived = { report, findingIndex, rulesById: new Map(report.rules.map((r) => [r.rule_id, r])) }; + derivedFor = report; + } + return derived; +} +export const findingIndexOf = (f) => ctx().findingIndex.get(f); + +const flt = () => state.review.filters; +const filtersActive = () => { + const f = flt(); + return Boolean(f.rule || f.storey || f.type || f.q || SEVS.some((s) => !f.sev[s])); +}; + +function matchText(q, ...parts) { + const needle = q.trim().toLowerCase(); + return !needle || parts.some((p) => p && String(p).toLowerCase().includes(needle)); +} + +function filteredFindings({ ignoreSev = false } = {}) { + const f = flt(); + return ctx().report.findings.filter((x) => + (ignoreSev || f.sev[x.severity]) && + (!f.rule || x.rule_id === f.rule) && + (!f.storey || (f.storey === NONE_STOREY ? !x.storey : x.storey === f.storey)) && + (!f.type || x.ifc_type === f.type) && + matchText(f.q, x.global_id, x.name)); +} + +function filteredRules({ ignoreSev = false } = {}) { + const f = flt(); + return ctx().report.rules.filter((r) => (ignoreSev || f.sev[r.severity]) && matchText(f.q, r.rule_id, r.description, r.category)); +} + +function qtoIndexes() { + const gb = ctx().report.qto.group_by; + return { type: gb.indexOf('type'), storey: gb.indexOf('storey') }; +} + +function filteredQtoRows() { + const f = flt(); + const ix = qtoIndexes(); + return ctx().report.qto.rows.filter((r) => + (!f.type || ix.type < 0 || r.group[ix.type] === f.type) && + (!f.storey || ix.storey < 0 || (f.storey === NONE_STOREY ? !r.group[ix.storey] : r.group[ix.storey] === f.storey)) && + matchText(f.q, r.group.join(' '))); +} + +// ------------------------------------------------------------------- head + +function scoreRing(score, cls) { + const C = 2 * Math.PI * 54; + return h('div', { class: `score ${cls}` }, + svg('svg', { viewBox: '0 0 128 128', class: 'ring', role: 'img', 'aria-label': t('review.score_aria', { score }) }, + svg('circle', { class: 'ring-track', cx: 64, cy: 64, r: 54, fill: 'none', 'stroke-width': 10 }), + svg('circle', { class: 'ring-value', cx: 64, cy: 64, r: 54, fill: 'none', 'stroke-width': 10, 'stroke-linecap': 'round', + transform: 'rotate(-90 64 64)', 'stroke-dasharray': C.toFixed(2), 'stroke-dashoffset': (C * (1 - score / 100)).toFixed(2) })), + h('div', { class: 'score-text' }, h('span', { class: 'score-num' }, String(score)), h('span', { class: 'score-of' }, t('review.score_of')))); +} + +function closeVerdictPopover() { + const pop = $('#verdict-pop'); + const btn = $('#btn-verdict-info'); + if (pop && !pop.hidden) { pop.hidden = true; if (btn) btn.setAttribute('aria-expanded', 'false'); return true; } + return false; +} +export { closeVerdictPopover }; + +function renderHead() { + const { report, ledger } = state.result; + const s = report.summary; + const vcls = VERDICT_CLASS[s.verdict] || 'v-none'; + const stat = (labelKey, value, cls = '') => h('div', { class: `stat ${cls}` }, h('dt', null, t(labelKey)), h('dd', null, value)); + + const pop = h('div', { id: 'verdict-pop', class: 'popover', role: 'dialog', 'aria-label': t('review.verdict_how'), hidden: true }, + h('h3', null, t('review.verdict_how')), + h('p', { class: 'verdict-rule' }, s.verdict_rule), + h('button', { type: 'button', class: 'btn btn-secondary', onclick: () => { closeVerdictPopover(); $('#btn-verdict-info').focus(); } }, t('common.close'))); + const infoBtn = h('button', { type: 'button', id: 'btn-verdict-info', class: 'btn btn-link', 'aria-expanded': 'false', 'aria-controls': 'verdict-pop', + onclick: (e) => { e.stopPropagation(); const open = pop.hidden; pop.hidden = !open; infoBtn.setAttribute('aria-expanded', String(open)); } }, t('review.verdict_how')); + + const busy = state.running; + const head = $('#review-head'); + clear(head); + head.append( + scoreRing(s.score, vcls), + h('div', { class: 'rh-body' }, + h('div', { class: 'rh-title' }, + h('h2', null, report.model.file_name), + h('p', { class: 'muted' }, `${report.model.schema} · ${tn('review.elements_n', report.model.element_count)}${report.ids ? ` · ${t('review.with_ids')}` : ''}`)), + h('div', { class: 'verdict-row' }, + h('span', { class: `badge verdict ${vcls}`, 'data-testid': 'verdict' }, t(`verdict.${verdictKey(s.verdict)}`)), + h('div', { class: 'verdict-wrap' }, infoBtn, pop)), + h('dl', { class: 'stats' }, + stat('review.stat.elements', nf(s.elements_checked)), + stat('review.stat.errors', nf(s.errors), 'is-error'), + stat('review.stat.warnings', nf(s.warnings), 'is-warning'), + stat('review.stat.infos', nf(s.infos), 'is-info'), + stat('review.stat.time', duration(ledger.duration_ms))), + h('p', { class: 'muted small' }, t('review.rules_line', { passed: s.rules_passed, failed: s.rules_failed, skipped: s.rules_skipped, na: s.rules_not_applicable }))), + h('div', { class: 'rh-actions' }, + busy ? h('p', { class: 'muted', role: 'status' }, state.runStage || t('run.running')) : null, + h('button', { type: 'button', class: 'btn btn-primary', disabled: busy, onclick: () => actions.goto(3) }, t('review.to_export')), + h('button', { type: 'button', class: 'btn btn-secondary', disabled: busy, onclick: () => actions.run() }, t('review.rerun')), + h('button', { type: 'button', class: 'btn btn-secondary', disabled: busy, onclick: () => actions.goto(1) }, t('review.change_settings')))); +} + +// ------------------------------------------------------------------- tabs + +function tabCount(id) { + const r = ctx().report; + if (id === 'checks') return r.rules.length; + if (id === 'failures') return r.findings.length; + if (id === 'quantities') return r.qto.rows.length; + if (id === 'ids') return r.ids ? r.ids.specifications.length : null; + return null; +} + +function renderTabs() { + const list = $('#tablist'); + clear(list); + const cur = state.review.tab; + TABS.forEach((id, i) => { + const n = tabCount(id); + list.appendChild(h('button', { + type: 'button', role: 'tab', id: `tab-${id}`, class: 'tab', tip: id === 'ids' ? t('tip.ids') : id === 'quantities' ? t('tip.qto') : null, 'aria-selected': String(id === cur), 'aria-controls': 'tabpanel', tabindex: id === cur ? '0' : '-1', + onclick: () => setTab(id), + onkeydown: (e) => { + const move = { ArrowRight: 1, ArrowLeft: -1 }[e.key]; + let next = null; + if (move) next = TABS[(i + move + TABS.length) % TABS.length]; + else if (e.key === 'Home') next = TABS[0]; + else if (e.key === 'End') next = TABS[TABS.length - 1]; + if (next) { e.preventDefault(); setTab(next); $(`#tab-${next}`).focus(); } + }, + }, t(`tab.${id}`), n != null ? h('span', { class: 'tab-count' }, nf(n)) : null)); + }); +} + +export function setTab(id) { + state.review.tab = id; + renderTabs(); + renderFilterbar(); + renderPanel(); +} + +// ---------------------------------------------------------------- filters + +function select(id, labelKey, value, options, onChange) { + return h('label', { class: 'filter-field', for: id }, h('span', null, t(labelKey)), + h('select', { id, onchange: (e) => onChange(e.target.value) }, + options.map(([v, label]) => h('option', { value: v, selected: v === value }, label)))); +} + +function sevCount(sev) { + const tab = state.review.tab; + if (tab === 'checks') return filteredRules({ ignoreSev: true }).filter((r) => r.severity === sev).length; + return filteredFindings({ ignoreSev: true }).filter((x) => x.severity === sev).length; +} + +function updateFilterUi() { + $$('#filterbar [data-sev]').forEach((b) => { + const sev = b.dataset.sev; + b.setAttribute('aria-pressed', String(flt().sev[sev])); + b.querySelector('.count').textContent = nf(sevCount(sev)); + }); + const clearBtn = $('#btn-clear-filters'); + if (clearBtn) clearBtn.hidden = !filtersActive(); +} + +function onFilterChange() { + state.review.page = { checks: 1, failures: 1, quantities: 1 }; + updateFilterUi(); + renderPanel(); +} + +export function setRuleFilter(ruleId) { + const f = flt(); + f.rule = ruleId; f.storey = ''; f.type = ''; f.q = ''; + SEVS.forEach((s) => { f.sev[s] = true; }); + state.review.page.failures = 1; + setTab('failures'); +} + +// Apply a filter proposed by the assistant (after the user pressed "Apply filter"). +// `spec` is FilterSpec: severity[], rule_id, storey, ifc_type, search. +export function applyFilterSpec(spec) { + const f = flt(); + f.rule = spec.rule_id || ''; + f.storey = spec.storey || ''; + f.type = spec.ifc_type || ''; + f.q = spec.search || ''; + const sevs = (spec.severity || []).map((x) => String(x).toUpperCase()).filter((x) => SEVS.includes(x)); + SEVS.forEach((s) => { f.sev[s] = sevs.length ? sevs.includes(s) : true; }); + state.review.page = { checks: 1, failures: 1, quantities: 1 }; + setTab('failures'); +} + +function renderFilterbar() { + const bar = $('#filterbar'); + clear(bar); + const tab = state.review.tab; + const show = { checks: ['sev', 'q'], failures: ['sev', 'rule', 'storey', 'type', 'q'], quantities: ['storey', 'type', 'q'] }[tab]; + bar.hidden = !show; + if (!show) return; + const f = flt(); + const r = ctx().report; + const all = (key) => ['', t(key)]; + + if (show.includes('sev')) { + bar.appendChild(h('div', { class: 'filter-group', role: 'group', 'aria-label': t('filter.severity') }, + SEVS.map((sev) => h('button', { type: 'button', class: `filter-chip sev-${sev.toLowerCase()}`, 'data-sev': sev, 'aria-pressed': String(f.sev[sev]), + onclick: () => { f.sev[sev] = !f.sev[sev]; onFilterChange(); } }, + h('span', { class: 'dot', 'aria-hidden': 'true' }), t(`sev.${sev}`), h('span', { class: 'count' }, '0'))))); + } + if (show.includes('rule')) { + const opts = [all('filter.all_rules'), ...r.rules.filter((x) => x.failures > 0).map((x) => [x.rule_id, x.rule_id])]; + if (!opts.some(([v]) => v === f.rule)) f.rule = ''; + bar.appendChild(select('flt-rule', 'filter.rule', f.rule, opts, (v) => { f.rule = v; onFilterChange(); })); + } + if (show.includes('storey')) { + let storeys; + if (tab === 'quantities') { + const ix = qtoIndexes().storey; + storeys = ix < 0 ? [] : [...new Set(r.qto.rows.map((x) => x.group[ix]))]; + } else { + storeys = [...new Set([...r.model.storeys, ...r.findings.map((x) => x.storey).filter(Boolean)])]; + if (r.findings.some((x) => !x.storey && x.global_id)) storeys.push(NONE_STOREY); + } + const opts = [all('filter.all_storeys'), ...storeys.map((s) => [s, s === NONE_STOREY ? t('filter.no_storey') : s])]; + if (!opts.some(([v]) => v === f.storey)) f.storey = ''; + bar.appendChild(select('flt-storey', 'filter.storey', f.storey, opts, (v) => { f.storey = v; onFilterChange(); })); + } + if (show.includes('type')) { + let types; + if (tab === 'quantities') { const ix = qtoIndexes().type; types = ix < 0 ? [] : [...new Set(r.qto.rows.map((x) => x.group[ix]))]; } + else types = [...new Set(r.findings.map((x) => x.ifc_type).filter(Boolean))].sort(); + const opts = [all('filter.all_types'), ...types.map((x) => [x, x])]; + if (!opts.some(([v]) => v === f.type)) f.type = ''; + bar.appendChild(select('flt-type', 'filter.type', f.type, opts, (v) => { f.type = v; onFilterChange(); })); + } + if (show.includes('q')) { + const ph = tab === 'failures' ? 'filter.search_failures' : tab === 'checks' ? 'filter.search_checks' : 'filter.search_qto'; + bar.appendChild(h('label', { class: 'filter-field filter-search', for: 'flt-q' }, h('span', null, t('filter.search')), + h('input', { id: 'flt-q', type: 'search', value: f.q, placeholder: t(ph), autocomplete: 'off', oninput: (e) => { f.q = e.target.value; onFilterChange(); } }))); + } + bar.appendChild(h('button', { type: 'button', id: 'btn-clear-filters', class: 'btn btn-ghost', hidden: !filtersActive(), onclick: () => { + f.rule = ''; f.storey = ''; f.type = ''; f.q = ''; SEVS.forEach((s) => { f.sev[s] = true; }); renderFilterbar(); onFilterChange(); + } }, t('filter.clear'))); + updateFilterUi(); +} + +// ----------------------------------------------------------------- panels + +function emptyState(titleKey, bodyKey, action) { + return h('div', { class: 'empty' }, h('h3', null, t(titleKey)), bodyKey ? h('p', null, t(bodyKey)) : null, action || null); +} + +function tableWrap(...kids) { return h('div', { class: 'table-wrap', tabindex: '-1' }, ...kids); } + +function pageSlice(tab, items) { + const info = paginate(items, state.review.page[tab], state.review.pageSize); + state.review.page[tab] = info.page; + return info; +} + +function pagerEl(tab, info) { + return pager(info, state.review.pageSize, { + onPage: (p) => { state.review.page[tab] = p; renderPanel(); }, + onSize: (n) => { state.review.pageSize = n; state.review.page = { checks: 1, failures: 1, quantities: 1 }; renderPanel(); }, + }); +} + +function panelChecks() { + const rules = filteredRules(); + if (!rules.length) return emptyState('empty.filters.title', 'empty.filters.body', clearButton()); + const info = pageSlice('checks', rules); + const th = (k, cls = '') => h('th', { scope: 'col', class: cls }, t(k)); + return h('div', null, + tableWrap(h('table', { class: 'data-table checks-table' }, + h('caption', { class: 'sr-only' }, t('tab.checks')), + h('thead', null, h('tr', null, th('col.rule'), th('col.category'), th('col.description'), th('col.severity'), th('col.status'), th('col.checked', 'num'), th('col.failures', 'num'))), + h('tbody', null, info.rows.map((r) => { + const clickable = r.failures > 0; + const go = () => actions.filterByRule(r.rule_id); + return h('tr', { class: clickable ? 'is-clickable' : '', onclick: clickable ? go : null }, + h('td', null, clickable + ? h('button', { type: 'button', class: 'linklike mono', 'aria-label': t('checks.show_failures', { rule: r.rule_id, n: r.failures }), onclick: (e) => { e.stopPropagation(); go(); } }, r.rule_id) + : h('span', { class: 'mono' }, r.rule_id)), + h('td', null, tOr(`category.${r.category}`, r.category)), + h('td', { class: 'wrap' }, r.description, + r.status === 'SKIPPED' && r.skipped_reason ? h('p', { class: 'reason' }, h('strong', null, t('checks.skipped_because')), ' ', r.skipped_reason) : null), + h('td', null, sevBadge(r.severity)), + h('td', null, statusBadge(r.status)), + h('td', { class: 'num' }, nf(r.elements_checked)), + h('td', { class: `num ${r.failures ? 'fail-count' : ''}` }, nf(r.failures))); + })))), + pagerEl('checks', info), + h('p', { class: 'muted small tab-hint' }, t('checks.hint'))); +} + +function clearButton() { + return h('button', { type: 'button', class: 'btn btn-secondary', onclick: () => { + const f = flt(); f.rule = ''; f.storey = ''; f.type = ''; f.q = ''; SEVS.forEach((s) => { f.sev[s] = true; }); renderFilterbar(); onFilterChange(); + } }, t('filter.clear')); +} + +function globalIdCell(f) { + if (!f.global_id) return h('button', { type: 'button', class: 'linklike', onclick: (e) => { e.stopPropagation(); actions.openDetail(f); } }, t('failures.model_level')); + return h('button', { type: 'button', class: 'linklike mono', 'aria-label': t('failures.open_element', { id: f.global_id }), onclick: (e) => { e.stopPropagation(); actions.openDetail(f); } }, f.global_id); +} + +const gidHead = () => h('th', { scope: 'col' }, h('span', { class: 'term', tip: t('tip.globalid') }, t('col.globalid'))); + +function panelFailures() { + const r = ctx().report; + if (!r.findings.length) { + return emptyState('empty.nofailures.title', 'empty.nofailures.body'); + } + const list = filteredFindings(); + if (!list.length) return emptyState('empty.filters.title', 'empty.filters.body', clearButton()); + const info = pageSlice('failures', list); + const th = (k, cls = '') => h('th', { scope: 'col', class: cls }, t(k)); + const sel = state.detail && state.detail.finding; + return h('div', null, + tableWrap(h('table', { class: 'data-table failures-table' }, + h('caption', { class: 'sr-only' }, t('tab.failures')), + h('thead', null, h('tr', null, th('col.severity'), th('col.rule'), gidHead(), th('col.type'), th('col.name'), th('col.storey'), th('col.problem'), th('col.expected_actual', 'col-ea'), th('col.fix', 'col-fix'))), + h('tbody', null, info.rows.map((f) => { + const rule = ctx().rulesById.get(f.rule_id); + return h('tr', { class: `is-clickable ${f === sel ? 'is-selected' : ''}`, 'data-fi': String(findingIndexOf(f)), onclick: () => actions.openDetail(f) }, + h('td', null, sevBadge(f.severity)), + h('td', null, h('span', { class: 'mono', tip: rule ? rule.description : '' }, f.rule_id)), + h('td', null, globalIdCell(f)), + h('td', null, f.ifc_type || '–'), + h('td', { class: 'wrap name' }, f.name || '–'), + h('td', null, f.storey || '–'), + h('td', { class: 'wrap' }, f.message), + h('td', { class: 'wrap ea col-ea' }, + f.expected ? h('div', null, h('span', { class: 'ea-label' }, t('failures.expected')), f.expected) : null, + f.actual ? h('div', null, h('span', { class: 'ea-label' }, t('failures.actual')), f.actual) : null), + h('td', { class: 'wrap hint-cell col-fix' }, f.fix_hint || '–')); + })))), + pagerEl('failures', info)); +} + +export function updateSelectionHighlight() { + const sel = state.detail && state.detail.finding; + const idx = sel ? String(findingIndexOf(sel)) : null; + $$('#tabpanel tr[data-fi]').forEach((tr) => tr.classList.toggle('is-selected', tr.dataset.fi === idx)); +} + +function sourcesTip(label, map) { + const parts = Object.entries(map || {}).map(([k, n]) => `${n} ${t(`source.${k}.short`)}`); + return parts.length ? `${label}: ${parts.join(' · ')}` : ''; +} + +function panelQuantities() { + const q = ctx().report.qto; + const rows = filteredQtoRows(); + const hasCost = q.rows.some((x) => x.cost); + const cur = q.currency || (q.rows.find((x) => x.cost) || {}).cost?.currency || ''; + const parts = []; + parts.push(h('div', { class: 'callout' }, + h('h3', null, t('qto.method_title')), + h('p', null, q.method), + q.elements_without_quantities + ? h('p', { class: 'callout-warn' }, tn('qto.without_quantities', q.elements_without_quantities)) + : null)); + + if (!rows.length) { + parts.push(emptyState('empty.filters.title', 'empty.filters.body', clearButton())); + } else { + const info = pageSlice('quantities', rows); + const th = (label, cls = '') => h('th', { scope: 'col', class: cls }, label); + const num = (kind, v) => (v ? fmtQty(kind, v) : '–'); + const sub = rows.length !== q.rows.length + ? rows.reduce((a, r) => ({ count: a.count + r.count, volume_m3: a.volume_m3 + r.volume_m3, area_m2: a.area_m2 + r.area_m2, length_m: a.length_m + r.length_m, weight_kg: a.weight_kg + r.weight_kg, cost: a.cost + (r.cost ? r.cost.amount : 0) }), + { count: 0, volume_m3: 0, area_m2: 0, length_m: 0, weight_kg: 0, cost: 0 }) + : null; + const totalRow = (labelKey, tot, cls) => h('tr', { class: `total-row ${cls}` }, + h('th', { scope: 'row', colspan: String(q.group_by.length) }, t(labelKey)), + h('td', { class: 'num' }, nf(tot.count)), + h('td', { class: 'num' }, num('vol', tot.volume_m3)), + h('td', { class: 'num' }, num('area', tot.area_m2)), + h('td', { class: 'num' }, num('len', tot.length_m)), + h('td', { class: 'num' }, num('mass', tot.weight_kg)), + hasCost ? h('td', null) : null, + hasCost ? h('td', { class: 'num' }, tot.cost ? nf(tot.cost, 2) : '–') : null); + parts.push(h('div', null, + tableWrap(h('table', { class: 'data-table qto-table' }, + h('caption', { class: 'sr-only' }, t('tab.quantities')), + h('thead', null, h('tr', null, + q.group_by.map((g) => th(t(`group.${g}`))), + th(t('qto.count'), 'num'), + th(`${t('qto.volume')} (${unitLabel('vol')})`, 'num'), + th(`${t('qto.area')} (${unitLabel('area')})`, 'num'), + th(`${t('qto.length')} (${unitLabel('len')})`, 'num'), + th(`${t('qto.weight')} (${unitLabel('mass')})`, 'num'), + hasCost ? th(t('qto.rate'), 'num') : null, + hasCost ? th(`${t('qto.cost')} (${cur})`, 'num') : null)), + h('tbody', null, info.rows.map((r) => h('tr', null, + r.group.map((g) => h('td', null, g || '–')), + h('td', { class: 'num' }, nf(r.count)), + h('td', { class: 'num', tip: sourcesTip(t('qto.volume_source'), r.volume_sources) }, num('vol', r.volume_m3)), + h('td', { class: 'num', tip: sourcesTip(t('qto.area_source'), r.area_sources) }, num('area', r.area_m2)), + h('td', { class: 'num', tip: sourcesTip(t('qto.length_source'), r.length_sources) }, num('len', r.length_m)), + h('td', { class: 'num' }, num('mass', r.weight_kg)), + hasCost ? h('td', { class: 'num rate', tip: r.cost ? `${r.cost.rate_code} · ${r.cost.rate_description} · ${r.cost.source}` : t('qto.no_rate') }, r.cost ? fmtRate(r.cost.rate, r.cost.unit, r.cost.currency) : '–') : null, + hasCost ? h('td', { class: 'num strong' }, r.cost ? nf(r.cost.amount, 2) : '–') : null))), + h('tfoot', null, + sub ? totalRow('qto.selection', sub, 'selection') : null, + totalRow('qto.total', { count: q.total_count, volume_m3: q.total_volume_m3, area_m2: q.total_area_m2, length_m: q.total_length_m, weight_kg: q.total_weight_kg, cost: q.total_cost }, '')))), + pagerEl('quantities', info), + h('p', { class: 'muted small tab-hint' }, t('qto.sources_hint')))); + } + + // Hand-check samples + const f = flt(); + const samples = q.samples.filter((s) => (!f.type || s.ifc_type === f.type) && (!f.storey || (f.storey === NONE_STOREY ? !s.storey : s.storey === f.storey)) && matchText(f.q, s.global_id, s.name)); + if (samples.length) { + const cell = (kind, v, source) => h('td', { class: 'num' }, + v == null ? '–' : fmtQty(kind, v, 3), + h('span', { class: `src src-${source}` }, t(`source.${source}.label`))); + parts.push(h('section', { class: 'samples-block', 'aria-labelledby': 'samples-h' }, + h('h3', { id: 'samples-h' }, t('qto.samples_title')), + h('p', { class: 'muted' }, t('qto.samples_hint')), + tableWrap(h('table', { class: 'data-table samples-table' }, + h('caption', { class: 'sr-only' }, t('qto.samples_title')), + h('thead', null, h('tr', null, + [t('col.globalid'), t('col.type'), t('col.name'), t('col.storey')].map((x) => h('th', { scope: 'col' }, x)), + h('th', { scope: 'col', class: 'num' }, `${t('qto.volume')} (${unitLabel('vol')})`), + h('th', { scope: 'col', class: 'num' }, `${t('qto.area')} (${unitLabel('area')})`), + h('th', { scope: 'col', class: 'num' }, `${t('qto.length')} (${unitLabel('len')})`), + h('th', { scope: 'col' }, t('qto.qsets')))), + h('tbody', null, samples.map((s) => h('tr', null, + h('td', null, h('button', { type: 'button', class: 'linklike mono', onclick: () => actions.openDetail(null, { globalId: s.global_id }) }, s.global_id)), + h('td', null, s.ifc_type), h('td', { class: 'wrap' }, s.name || '–'), h('td', null, s.storey || '–'), + cell('vol', s.volume_m3, s.volume_source), cell('area', s.area_m2, s.area_source), cell('len', s.length_m, s.length_source), + h('td', { class: 'wrap mono small' }, s.quantity_sets.length ? s.quantity_sets.join(', ') : t('qto.no_qsets'))))))))); + } + return h('div', { class: 'stack' }, ...parts); +} + +function panelIds() { + const ids = ctx().report.ids; + if (!ids) { + return h('div', { class: 'empty empty-explain' }, + h('h3', null, t('ids.empty.title')), + h('p', null, h('span', { class: 'term', tip: t('tip.ids') }, t('term.ids')), ' ', t('ids.empty.what')), + h('p', null, t('ids.empty.example')), + h('p', null, t('ids.empty.how')), + h('button', { type: 'button', class: 'btn btn-secondary', onclick: () => actions.goto(1) }, t('review.change_settings'))); + } + return h('div', { class: 'stack' }, + h('div', { class: 'ids-head' }, + h('div', null, h('h3', null, ids.title || ids.ids_file), h('p', { class: 'muted mono small' }, ids.ids_file)), + h('span', { class: `badge ${ids.specifications_passed === ids.specifications_total ? 'st-pass' : 'st-fail'}` }, + t('ids.summary', { passed: ids.specifications_passed, total: ids.specifications_total }))), + ...ids.specifications.map((spec, si) => idsSpec(spec, si))); +} + +function idsSpec(spec, si) { + const failedTotal = spec.requirements.reduce((a, r) => a + r.failed_entities.length, 0); + return h('article', { class: 'card ids-spec' }, + h('header', { class: 'ids-spec-head' }, + h('div', null, + h('h4', null, spec.name), + spec.description ? h('p', { class: 'muted' }, spec.description) : null), + h('div', { class: 'ids-badges' }, + spec.cardinality ? h('span', { class: 'chip' }, t(`ids.card.${spec.cardinality}`)) : null, + h('span', { class: `badge ${spec.passed ? 'st-pass' : 'st-fail'}` }, spec.passed ? t('status.PASS') : t('status.FAIL')))), + h('dl', { class: 'ids-meta' }, + h('div', null, h('dt', null, t('ids.applies_to')), h('dd', null, spec.applicability.join('; ') || '–')), + h('div', null, h('dt', null, t('ids.applicable_count')), h('dd', null, nf(spec.applicable_count))), + h('div', null, h('dt', null, t('ids.failed_count')), h('dd', { class: failedTotal ? 'fail-count' : '' }, nf(failedTotal)))), + spec.instructions ? h('p', { class: 'ids-instructions' }, h('strong', null, t('ids.instructions')), ' ', spec.instructions) : null, + h('ol', { class: 'ids-reqs' }, spec.requirements.map((req, ri) => idsReq(req, `${si}-${ri}`)))); +} + +function idsReq(req, key) { + const limit = { n: 5 }; + const list = h('div', { class: 'ids-failed' }); + const draw = () => { + clear(list); + if (!req.failed_entities.length) return; + const shownRows = req.failed_entities.slice(0, limit.n); + list.appendChild(tableWrap(h('table', { class: 'data-table compact' }, + h('caption', { class: 'sr-only' }, t('ids.failed_entities')), + h('thead', null, h('tr', null, [t('col.globalid'), t('col.type'), t('col.name'), t('ids.reason')].map((x) => h('th', { scope: 'col' }, x)))), + h('tbody', null, shownRows.map((e) => h('tr', null, + h('td', null, h('button', { type: 'button', class: 'linklike mono', onclick: () => actions.openDetail({ rule_id: `IDS: ${req.description}`, severity: 'ERROR', global_id: e.global_id, ifc_type: e.ifc_type, name: e.name, storey: null, message: e.reason, source: { kind: 'ids' } }) }, e.global_id)), + h('td', null, e.ifc_type || '–'), h('td', { class: 'wrap' }, e.name || '–'), h('td', { class: 'wrap' }, e.reason))))))); + if (req.failed_entities.length > limit.n) { + list.appendChild(h('button', { type: 'button', class: 'btn btn-ghost', onclick: () => { limit.n += 25; draw(); } }, + t('ids.show_more', { shown: Math.min(limit.n, req.failed_entities.length), total: req.failed_entities.length }))); + } + }; + draw(); + return h('li', { class: 'ids-req', 'data-key': key }, + h('div', { class: 'ids-req-head' }, + h('blockquote', null, req.description), + h('div', { class: 'ids-badges' }, + req.facet ? h('span', { class: 'chip' }, tOr(`ids.facet.${req.facet}`, req.facet)) : null, + h('span', { class: `badge ${req.passed ? 'st-pass' : 'st-fail'}` }, req.passed ? t('status.PASS') : t('ids.failed_n', { n: req.failed_entities.length })))), + list); +} + +function panelClash() { + const c = ctx().report.clash; + return h('div', { class: 'empty empty-explain' }, + h('span', { class: 'badge st-na' }, c.implemented ? t('clash.available') : t('clash.phase2')), + h('h3', null, t('clash.title')), + h('p', null, c.message), + c.clashes && c.clashes.length ? h('p', { class: 'muted' }, tn('clash.found', c.clashes.length)) : null); +} + +export function renderPanel() { + const panel = $('#tabpanel'); + const tab = state.review.tab; + panel.setAttribute('aria-labelledby', `tab-${tab}`); + clear(panel); + const body = { checks: panelChecks, failures: panelFailures, quantities: panelQuantities, ids: panelIds, clash: panelClash }[tab](); + panel.appendChild(body); +} + +export function renderReview() { + if (!state.result) return; + renderHead(); + renderTabs(); + renderFilterbar(); + renderPanel(); +} + +export function refreshHead() { if (state.result) renderHead(); } + +// Close the verdict popover when clicking elsewhere. +document.addEventListener('click', (e) => { + if (!e.target.closest || e.target.closest('.verdict-wrap')) return; + closeVerdictPopover(); +}); diff --git a/frontend/js/yaml.js b/frontend/js/yaml.js new file mode 100644 index 0000000..0760a9f --- /dev/null +++ b/frontend/js/yaml.js @@ -0,0 +1,36 @@ +// A deliberately tiny YAML emitter for the project.yaml the settings panel +// edits: nested maps, inline lists, scalars. No parser, no library. + +const RESERVED = new Set(['true', 'false', 'null', 'yes', 'no', 'on', 'off', '~', '']); + +function numberText(n) { + if (!Number.isFinite(n)) return '0'; + let s = String(n); + if (/e/i.test(s)) s = n.toFixed(12).replace(/0+$/, '').replace(/\.$/, ''); + return s; +} + +function scalar(v) { + if (v === null || v === undefined) return 'null'; + if (typeof v === 'boolean') return v ? 'true' : 'false'; + if (typeof v === 'number') return numberText(v); + if (Array.isArray(v)) return `[${v.map(scalar).join(', ')}]`; + const s = String(v); + const plain = /^[A-Za-z_][A-Za-z0-9_./ -]*$/.test(s) && !/\s$/.test(s) && !RESERVED.has(s.toLowerCase()); + return plain ? s : JSON.stringify(s); +} + +const isMap = (v) => v && typeof v === 'object' && !Array.isArray(v); + +export function emitYaml(obj, level = 0) { + const pad = ' '.repeat(level); + const out = []; + for (const [k, v] of Object.entries(obj)) { + if (v === undefined) continue; + if (isMap(v)) { + if (!Object.keys(v).length) out.push(`${pad}${k}: {}`); + else { out.push(`${pad}${k}:`); out.push(emitYaml(v, level + 1)); } + } else out.push(`${pad}${k}: ${scalar(v)}`); + } + return out.join('\n'); +} diff --git a/frontend/mock/app_info.json b/frontend/mock/app_info.json new file mode 100644 index 0000000..7d69aff --- /dev/null +++ b/frontend/mock/app_info.json @@ -0,0 +1 @@ +{ "name": "VeriModel", "version": "1.0.0" } diff --git a/frontend/mock/assistant_status.json b/frontend/mock/assistant_status.json new file mode 100644 index 0000000..cf1f1bc --- /dev/null +++ b/frontend/mock/assistant_status.json @@ -0,0 +1,13 @@ +{ + "model_id": "qwen2.5-0.5b-instruct-q4_k_m", + "name": "Qwen2.5 0.5B Instruct (Q4_K_M)", + "installed": true, + "model_dir": "/home/anna/.local/share/io.verimodel.desktop/assistant/qwen2.5-0.5b-instruct-q4_k_m", + "gguf_path": "/home/anna/.local/share/io.verimodel.desktop/assistant/qwen2.5-0.5b-instruct-q4_k_m/model.gguf", + "tokenizer_path": "/home/anna/.local/share/io.verimodel.desktop/assistant/qwen2.5-0.5b-instruct-q4_k_m/tokenizer.json", + "gguf_size_bytes": 491400032, + "license": "Apache-2.0", + "approx_ram_mb": 700, + "backend": "candle", + "loaded": true +} diff --git a/frontend/mock/elements.json b/frontend/mock/elements.json new file mode 100644 index 0000000..3d75c2b --- /dev/null +++ b/frontend/mock/elements.json @@ -0,0 +1,2935 @@ +{ + "0Ijn$vDv50fxv5Tp0EsZjv": { + "global_id": "0Ijn$vDv50fxv5Tp0EsZjv", + "step_id": 1410, + "ifc_type": "IfcRoof", + "ancestors": [ + "IfcRoof", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "FLAT_ROOF", + "name": "RF-301", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Roof", + "container": { + "global_id": "0hBDJ75zX6vhkU0IfkK4eR", + "ifc_type": "IfcBuildingStorey", + "name": "Roof" + }, + "psets": { + "Pset_RoofCommon": { + "FireRating": "REI60", + "IsExternal": true, + "Reference": "RF-301" + } + }, + "quantities": { + "Qto_RoofBaseQuantities": { + "GrossArea": 104.16, + "NetArea": 104.16, + "ProjectedArea": 104.16 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_30_40", + "name": "Roof covering systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + -0.2, + -0.2, + 7.0 + ], + "bbox_max": [ + 12.2, + 8.200000000000001, + 7.3 + ], + "volume_m3": 31.247999999999905, + "area_m2": 220.80000000000004, + "triangle_count": 12 + } + }, + "0Mkh683Qf2DAmyOPGNzkvr": { + "global_id": "0Mkh683Qf2DAmyOPGNzkvr", + "step_id": 396, + "ifc_type": "IfcColumn", + "ancestors": [ + "IfcColumn", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "COLUMN", + "name": "C-105", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_ColumnCommon": { + "FireRating": "R120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "C-105" + } + }, + "quantities": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": 0.16, + "GrossVolume": 0.56, + "Length": 3.5, + "NetVolume": 0.56 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_05_15", + "name": "Concrete column systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 11.3, + 7.3, + 0.0 + ], + "bbox_max": [ + 11.7, + 7.7, + 3.5 + ], + "volume_m3": 0.5599999999999455, + "area_m2": 5.920000000000005, + "triangle_count": 12 + } + }, + "0e5UlLDXfEv9G8siqzjE$o": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "step_id": 15, + "ifc_type": "IfcBuildingStorey", + "ancestors": [ + "IfcBuildingStorey", + "IfcSpatialStructureElement", + "IfcSpatialElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": null, + "name": "Level 2", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": null, + "container": { + "global_id": "3QbDo1yX9DbvOtppP64ZlL", + "ifc_type": "IfcBuilding", + "name": "Demo pavilion" + }, + "psets": {}, + "quantities": {}, + "classifications": [], + "materials": [], + "has_representation": false, + "geometry": null + }, + "0hBDJ75zX6vhkU0IfkK4eR": { + "global_id": "0hBDJ75zX6vhkU0IfkK4eR", + "step_id": 16, + "ifc_type": "IfcBuildingStorey", + "ancestors": [ + "IfcBuildingStorey", + "IfcSpatialStructureElement", + "IfcSpatialElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": null, + "name": "Roof", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": null, + "container": { + "global_id": "3QbDo1yX9DbvOtppP64ZlL", + "ifc_type": "IfcBuilding", + "name": "Demo pavilion" + }, + "psets": {}, + "quantities": {}, + "classifications": [], + "materials": [], + "has_representation": false, + "geometry": null + }, + "0oSdlcRuvFW9jUDNjqWoWp": { + "global_id": "0oSdlcRuvFW9jUDNjqWoWp", + "step_id": 430, + "ifc_type": "IfcBeam", + "ancestors": [ + "IfcBeam", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "BEAM", + "name": "B-101", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_BeamCommon": { + "FireRating": "R60", + "IsExternal": false, + "LoadBearing": true, + "Reference": "B-101" + } + }, + "quantities": { + "Qto_BeamBaseQuantities": { + "CrossSectionArea": 0.15, + "GrossVolume": 1.65, + "Length": 11.0, + "NetVolume": 1.65 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_10_75", + "name": "Steel beam systems" + } + ], + "materials": [ + "Steel S275" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.5, + 0.3, + 3.0 + ], + "bbox_max": [ + 11.5, + 0.6, + 3.5 + ], + "volume_m3": 1.6499999999999997, + "area_m2": 17.9, + "triangle_count": 12 + } + }, + "0thzlZJ996k8RKzWt6IJG0": { + "global_id": "0thzlZJ996k8RKzWt6IJG0", + "step_id": 145, + "ifc_type": "IfcWall", + "ancestors": [ + "IfcWall", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "SOLIDWALL", + "name": "WL-103", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_WallCommon": { + "FireRating": "REI90", + "IsExternal": true, + "LoadBearing": true, + "Reference": "WL-103" + } + }, + "quantities": { + "Qto_WallBaseQuantities": { + "GrossSideArea": 42.0, + "GrossVolume": 10.5, + "Height": 3.5, + "Length": 12.0, + "NetSideArea": 42.0, + "NetVolume": 10.5, + "Width": 0.25 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_25_10_30", + "name": "External wall systems" + } + ], + "materials": [ + "Brick masonry" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.0, + 7.75, + 0.0 + ], + "bbox_max": [ + 12.0, + 8.000000000000002, + 3.5 + ], + "volume_m3": 10.5, + "area_m2": 91.75, + "triangle_count": 12 + } + }, + "1EpypJIb12CfdN9VsEREsE": { + "global_id": "1EpypJIb12CfdN9VsEREsE", + "step_id": 12, + "ifc_type": "IfcSite", + "ancestors": [ + "IfcSite", + "IfcSpatialStructureElement", + "IfcSpatialElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": null, + "name": "Demo site", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": null, + "container": { + "global_id": "1Ox8RLg6TBi9PBWFYEYuFl", + "ifc_type": "IfcProject", + "name": "VeriModel demo pavilion" + }, + "psets": {}, + "quantities": {}, + "classifications": [], + "materials": [], + "has_representation": false, + "geometry": null + }, + "1G20W5wmPEauz_nY7hwIyR": { + "global_id": "1G20W5wmPEauz_nY7hwIyR", + "step_id": 328, + "ifc_type": "IfcColumn", + "ancestors": [ + "IfcColumn", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "COLUMN", + "name": "C-103", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_ColumnCommon": { + "FireRating": "R120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "C-103" + } + }, + "quantities": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": 0.16, + "GrossVolume": 0.56, + "Length": 3.5, + "NetVolume": 0.56 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_05_15", + "name": "Concrete column systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 11.3, + 0.3, + 0.0 + ], + "bbox_max": [ + 11.7, + 0.7, + 3.5 + ], + "volume_m3": 0.5599999999999966, + "area_m2": 5.920000000000003, + "triangle_count": 12 + } + }, + "1HJhkG0qn7_e2xUUNgfN9m": { + "global_id": "1HJhkG0qn7_e2xUUNgfN9m", + "step_id": 68, + "ifc_type": "IfcWall", + "ancestors": [ + "IfcWall", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "SOLIDWALL", + "name": "WL-101", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_WallCommon": { + "FireRating": "REI90", + "IsExternal": true, + "LoadBearing": true, + "Reference": "WL-101" + } + }, + "quantities": { + "Qto_WallBaseQuantities": { + "GrossSideArea": 42.0, + "GrossVolume": 10.5, + "Height": 3.5, + "Length": 12.0, + "NetSideArea": 42.0, + "NetVolume": 10.5, + "Width": 0.25 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_25_10_30", + "name": "External wall systems" + } + ], + "materials": [ + "Brick masonry" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.0, + 0.0, + 0.0 + ], + "bbox_max": [ + 12.0, + 0.25, + 3.5 + ], + "volume_m3": 10.5, + "area_m2": 91.75, + "triangle_count": 12 + } + }, + "1IGd$4nYXElgZB4GTNmdPP": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "step_id": 14, + "ifc_type": "IfcBuildingStorey", + "ancestors": [ + "IfcBuildingStorey", + "IfcSpatialStructureElement", + "IfcSpatialElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": null, + "name": "Level 1", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": null, + "container": { + "global_id": "3QbDo1yX9DbvOtppP64ZlL", + "ifc_type": "IfcBuilding", + "name": "Demo pavilion" + }, + "psets": {}, + "quantities": {}, + "classifications": [], + "materials": [], + "has_representation": false, + "geometry": null + }, + "1K2ps1qyDEaAKz1F2vNd4l": { + "global_id": "1K2ps1qyDEaAKz1F2vNd4l", + "step_id": 943, + "ifc_type": "IfcWall", + "ancestors": [ + "IfcWall", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "SOLIDWALL", + "name": "WL-201", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_WallCommon": { + "FireRating": "REI90", + "IsExternal": true, + "LoadBearing": true, + "Reference": "WL-201" + } + }, + "quantities": { + "Qto_WallBaseQuantities": { + "GrossSideArea": 42.0, + "GrossVolume": 10.5, + "Height": 3.5, + "Length": 12.0, + "NetSideArea": 42.0, + "NetVolume": 10.5, + "Width": 0.25 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_25_10_30", + "name": "External wall systems" + } + ], + "materials": [ + "Brick masonry" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.0, + 7.75, + 3.5 + ], + "bbox_max": [ + 12.0, + 8.000000000000002, + 7.0 + ], + "volume_m3": 10.5, + "area_m2": 91.75, + "triangle_count": 12 + } + }, + "1KM8YeCcX9rRhYjBVMcMTD": { + "global_id": "1KM8YeCcX9rRhYjBVMcMTD", + "step_id": 258, + "ifc_type": "IfcColumn", + "ancestors": [ + "IfcColumn", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "COLUMN", + "name": "C-101", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_ColumnCommon": { + "FireRating": "R120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "C-101" + } + }, + "quantities": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": 0.16, + "GrossVolume": 0.56, + "Length": 3.5, + "NetVolume": 0.56 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_05_15", + "name": "Concrete column systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.3, + 0.3, + 0.0 + ], + "bbox_max": [ + 0.7, + 0.7, + 3.5 + ], + "volume_m3": 0.5599999999999998, + "area_m2": 5.92, + "triangle_count": 12 + } + }, + "1QjNfC_MTAsuPIVwAd22mT": { + "global_id": "1QjNfC_MTAsuPIVwAd22mT", + "step_id": 599, + "ifc_type": "IfcWindow", + "ancestors": [ + "IfcWindow", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "WINDOW", + "name": "W-101", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_WindowCommon": { + "IsExternal": true, + "Reference": "W-101", + "ThermalTransmittance": 1.1 + } + }, + "quantities": { + "Qto_WindowBaseQuantities": { + "Area": 1.8, + "Height": 1.2, + "Width": 1.5 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_98", + "name": "Windows" + } + ], + "materials": [ + "Glass" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 1.0, + 8.0, + 1.0 + ], + "bbox_max": [ + 2.5, + 8.08, + 2.2 + ], + "volume_m3": 0.1440000000000022, + "area_m2": 4.032000000000001, + "triangle_count": 12 + } + }, + "1U$pK2R5TE79JLhNCeZiMc": { + "global_id": "1U$pK2R5TE79JLhNCeZiMc", + "step_id": 536, + "ifc_type": "IfcDoor", + "ancestors": [ + "IfcDoor", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "DOOR", + "name": "D-102", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_DoorCommon": { + "FireRating": "EI60", + "IsExternal": false, + "Reference": "D-102" + } + }, + "quantities": { + "Qto_DoorBaseQuantities": { + "Area": 2.1, + "Height": 2.1, + "Width": 1.0 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_24", + "name": "Doorsets" + } + ], + "materials": [ + "Timber" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 6.0, + 3.0, + 0.0 + ], + "bbox_max": [ + 7.0, + 3.1, + 2.1 + ], + "volume_m3": 0.21000000000000085, + "area_m2": 4.82, + "triangle_count": 12 + } + }, + "1Xh9cXiZb1BxwABhznR7IJ": { + "global_id": "1Xh9cXiZb1BxwABhznR7IJ", + "step_id": 734, + "ifc_type": "IfcSpace", + "ancestors": [ + "IfcSpace", + "IfcSpatialStructureElement", + "IfcSpatialElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "INTERNAL", + "name": "Office 1.02", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_SpaceCommon": { + "GrossPlannedArea": 42.0, + "IsExternal": false, + "Reference": "Office 1.02" + } + }, + "quantities": { + "Qto_SpaceBaseQuantities": { + "GrossFloorArea": 42.0, + "GrossVolume": 136.5, + "Height": 3.25, + "NetFloorArea": 39.9 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "SL_20_15_59", + "name": "Office spaces" + } + ], + "materials": [], + "has_representation": true, + "geometry": { + "bbox_min": [ + 6.15, + 0.25, + 0.0 + ], + "bbox_max": [ + 11.75, + 7.75, + 3.25 + ], + "volume_m3": 136.49999999999997, + "area_m2": 169.15, + "triangle_count": 12 + } + }, + "1Y0DLMcffBEfFN6$xe3kNn": { + "global_id": "1Y0DLMcffBEfFN6$xe3kNn", + "step_id": 568, + "ifc_type": "IfcDoor", + "ancestors": [ + "IfcDoor", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "DOOR", + "name": "D-103", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_DoorCommon": { + "IsExternal": false, + "Reference": "D-103" + } + }, + "quantities": { + "Qto_DoorBaseQuantities": { + "Area": 2.1, + "Height": 2.1, + "Width": 1.0 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_24", + "name": "Doorsets" + } + ], + "materials": [ + "Timber" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 9.0, + 0.0, + 0.0 + ], + "bbox_max": [ + 10.0, + 0.1, + 2.1 + ], + "volume_m3": 0.2099999999999999, + "area_m2": 4.819999999999999, + "triangle_count": 12 + } + }, + "1a1bw1G7XEggO8ac3NDh54": { + "global_id": "1a1bw1G7XEggO8ac3NDh54", + "step_id": 801, + "ifc_type": "IfcDuctSegment", + "ancestors": [ + "IfcDuctSegment", + "IfcFlowSegment", + "IfcDistributionFlowElement", + "IfcDistributionElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "RIGIDSEGMENT", + "name": "MEP-102", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_DuctSegmentTypeCommon": { + "NominalDiameterOrWidth": 300.0, + "Reference": "MEP-102" + } + }, + "quantities": { + "Qto_DuctSegmentBaseQuantities": { + "GrossCrossSectionArea": 0.09, + "Length": 3.0, + "OuterSurfaceArea": 3.6 + } + }, + "classifications": [], + "materials": [ + "Galvanised steel" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 10.7, + 4.0, + 3.1 + ], + "bbox_max": [ + 11.0, + 7.0, + 3.4 + ], + "volume_m3": 0.26999999999997687, + "area_m2": 3.780000000000004, + "triangle_count": 12 + } + }, + "1cgI3reEjAyukslRaG3D3f": { + "global_id": "1cgI3reEjAyukslRaG3D3f", + "step_id": 1216, + "ifc_type": "IfcDoor", + "ancestors": [ + "IfcDoor", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "DOOR", + "name": "D-201", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_DoorCommon": { + "FireRating": "EI30", + "IsExternal": false, + "Reference": "D-201" + } + }, + "quantities": { + "Qto_DoorBaseQuantities": { + "Area": 2.1, + "Height": 2.1, + "Width": 1.0 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_24", + "name": "Doorsets" + } + ], + "materials": [ + "Timber" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 5.5, + 0.0, + 3.5 + ], + "bbox_max": [ + 6.5, + 0.1, + 5.6 + ], + "volume_m3": 0.21, + "area_m2": 4.8199999999999985, + "triangle_count": 12 + } + }, + "1kVIrL4QT4duEcQIZ0lU7H": { + "global_id": "1kVIrL4QT4duEcQIZ0lU7H", + "step_id": 362, + "ifc_type": "IfcColumn", + "ancestors": [ + "IfcColumn", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "COLUMN", + "name": "C-104", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_ColumnCommon": { + "FireRating": "R120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "C-104" + } + }, + "quantities": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": 0.16, + "GrossVolume": 0.56, + "Length": 3.5, + "NetVolume": 0.56 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_05_15", + "name": "Concrete column systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.3, + 7.3, + 0.0 + ], + "bbox_max": [ + 0.7, + 7.7, + 3.5 + ], + "volume_m3": 0.5599999999999989, + "area_m2": 5.920000000000003, + "triangle_count": 12 + } + }, + "1lRVY4w4TFZehBHIdtAXGT": { + "global_id": "1lRVY4w4TFZehBHIdtAXGT", + "step_id": 1119, + "ifc_type": "IfcColumn", + "ancestors": [ + "IfcColumn", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "COLUMN", + "name": "C-204", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_ColumnCommon": { + "FireRating": "R120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "C-204" + } + }, + "quantities": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": 0.16, + "GrossVolume": 0.56, + "Length": 3.5, + "NetVolume": 0.56 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_05_15", + "name": "Concrete column systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.3, + 7.3, + 3.5 + ], + "bbox_max": [ + 0.7, + 7.7, + 7.0 + ], + "volume_m3": 0.5599999999999993, + "area_m2": 5.920000000000003, + "triangle_count": 12 + } + }, + "1niwtJeqDDOhds1z$gNC_r": { + "global_id": "1niwtJeqDDOhds1z$gNC_r", + "step_id": 869, + "ifc_type": "IfcWall", + "ancestors": [ + "IfcWall", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "SOLIDWALL", + "name": "WL-201", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_WallCommon": { + "FireRating": "REI90", + "IsExternal": true, + "LoadBearing": true, + "Reference": "WL-201" + } + }, + "quantities": { + "Qto_WallBaseQuantities": { + "GrossSideArea": 42.0, + "GrossVolume": 10.5, + "Height": 3.5, + "Length": 12.0, + "NetSideArea": 42.0, + "NetVolume": 10.5, + "Width": 0.25 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_25_10_30", + "name": "External wall systems" + } + ], + "materials": [ + "Brick masonry" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.0, + 0.0, + 3.5 + ], + "bbox_max": [ + 12.0, + 0.25, + 7.0 + ], + "volume_m3": 10.5, + "area_m2": 91.75, + "triangle_count": 12 + } + }, + "1rIJ4Q65D2SRFg1HcpfYfL": { + "global_id": "1rIJ4Q65D2SRFg1HcpfYfL", + "step_id": 501, + "ifc_type": "IfcDoor", + "ancestors": [ + "IfcDoor", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "DOOR", + "name": "D-101", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_DoorCommon": { + "FireRating": "EI30", + "IsExternal": false, + "Reference": "D-101" + } + }, + "quantities": { + "Qto_DoorBaseQuantities": { + "Area": 2.1, + "Height": 2.1, + "Width": 1.0 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_24", + "name": "Doorsets" + } + ], + "materials": [ + "Timber" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 2.5, + 0.0, + 0.0 + ], + "bbox_max": [ + 3.5, + 0.1, + 2.1 + ], + "volume_m3": 0.21000000000000008, + "area_m2": 4.819999999999999, + "triangle_count": 12 + } + }, + "1viDl5r6rEfQnlKjcZks7h": { + "global_id": "1viDl5r6rEfQnlKjcZks7h", + "step_id": 1051, + "ifc_type": "IfcColumn", + "ancestors": [ + "IfcColumn", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "COLUMN", + "name": "C-202", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_ColumnCommon": { + "FireRating": "R120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "C-202" + } + }, + "quantities": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": 0.16, + "GrossVolume": 0.56, + "Length": 3.5, + "NetVolume": 0.56 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_05_15", + "name": "Concrete column systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 6.0, + 0.3, + 3.5 + ], + "bbox_max": [ + 6.4, + 0.7, + 7.0 + ], + "volume_m3": 0.56, + "area_m2": 5.920000000000003, + "triangle_count": 12 + } + }, + "22y566Bwb7UgQY4VJRrL3K": { + "global_id": "22y566Bwb7UgQY4VJRrL3K", + "step_id": 832, + "ifc_type": "IfcSlab", + "ancestors": [ + "IfcSlab", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "FLOOR", + "name": "SL-201", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_SlabCommon": { + "FireRating": "REI120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "SL-201" + } + }, + "quantities": { + "Qto_SlabBaseQuantities": { + "Depth": 0.25, + "GrossArea": 96.0, + "GrossVolume": 24.0, + "NetArea": 96.0, + "NetVolume": 24.0, + "Perimeter": 40.0 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_30_20_55", + "name": "Floor and roof slab systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.0, + 0.0, + 3.25 + ], + "bbox_max": [ + 12.0, + 8.0, + 3.5 + ], + "volume_m3": 24.0, + "area_m2": 202.0, + "triangle_count": 12 + } + }, + "24YJW4Vaj5cxAkwVPB9F0r": { + "global_id": "24YJW4Vaj5cxAkwVPB9F0r", + "step_id": 1344, + "ifc_type": "IfcWindow", + "ancestors": [ + "IfcWindow", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "WINDOW", + "name": "W-204", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_WindowCommon": { + "IsExternal": true, + "Reference": "", + "ThermalTransmittance": 1.1 + } + }, + "quantities": { + "Qto_WindowBaseQuantities": { + "Area": 1.8, + "Height": 1.2, + "Width": 1.5 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_98", + "name": "Windows" + } + ], + "materials": [ + "Glass" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 11.0, + 4.0, + 4.5 + ], + "bbox_max": [ + 12.5, + 4.08, + 5.7 + ], + "volume_m3": 0.14399999999998192, + "area_m2": 4.032000000000001, + "triangle_count": 12 + } + }, + "2C5NqrydjAxBezV$tAkmH6": { + "global_id": "2C5NqrydjAxBezV$tAkmH6", + "step_id": 182, + "ifc_type": "IfcWall", + "ancestors": [ + "IfcWall", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "SOLIDWALL", + "name": "WL-104", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_WallCommon": { + "FireRating": "REI90", + "IsExternal": true, + "LoadBearing": true, + "Reference": "WL-104" + } + }, + "quantities": { + "Qto_WallBaseQuantities": { + "GrossSideArea": 28.0, + "GrossVolume": 7.0, + "Height": 3.5, + "Length": 8.0, + "NetSideArea": 28.0, + "NetVolume": 7.0, + "Width": 0.25 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_25_10_30", + "name": "External wall systems" + } + ], + "materials": [ + "Brick masonry" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + -1.469576158976824e-15, + 0.0, + 0.0 + ], + "bbox_max": [ + 0.25, + 8.0, + 3.5 + ], + "volume_m3": 6.999999999999999, + "area_m2": 61.75, + "triangle_count": 12 + } + }, + "2C6Zza1SH2sAoeVxiVhF2t": { + "global_id": "2C6Zza1SH2sAoeVxiVhF2t", + "step_id": 28, + "ifc_type": "IfcSlab", + "ancestors": [ + "IfcSlab", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "FLOOR", + "name": "SL-101", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_SlabCommon": { + "FireRating": "REI120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "SL-101" + } + }, + "quantities": { + "Qto_SlabBaseQuantities": { + "Depth": 0.25, + "GrossArea": 96.0, + "GrossVolume": 24.0, + "NetArea": 96.0, + "NetVolume": 24.0, + "Perimeter": 40.0 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_30_20_55", + "name": "Floor and roof slab systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.0, + 0.0, + -0.25 + ], + "bbox_max": [ + 12.0, + 8.0, + 0.0 + ], + "volume_m3": 24.0, + "area_m2": 202.0, + "triangle_count": 12 + } + }, + "2FcEqYZEfBshSa5L3eGdFF": { + "global_id": "2FcEqYZEfBshSa5L3eGdFF", + "step_id": 1153, + "ifc_type": "IfcColumn", + "ancestors": [ + "IfcColumn", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "COLUMN", + "name": "C-205", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": null, + "container": null, + "psets": { + "Pset_ColumnCommon": { + "FireRating": "R120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "C-205" + } + }, + "quantities": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": 0.16, + "GrossVolume": 0.56, + "Length": 3.5, + "NetVolume": 0.56 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_05_15", + "name": "Concrete column systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 11.3, + 7.3, + 3.5 + ], + "bbox_max": [ + 11.7, + 7.7, + 7.0 + ], + "volume_m3": 0.5599999999999828, + "area_m2": 5.920000000000005, + "triangle_count": 12 + } + }, + "2GzpheZgH4OhQWIFAUhu5a": { + "global_id": "2GzpheZgH4OhQWIFAUhu5a", + "step_id": 1248, + "ifc_type": "IfcWindow", + "ancestors": [ + "IfcWindow", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "WINDOW", + "name": "W-201", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_WindowCommon": { + "IsExternal": true, + "Reference": "W-201", + "ThermalTransmittance": 1.1 + } + }, + "quantities": { + "Qto_WindowBaseQuantities": { + "Area": 1.8, + "Height": 1.2, + "Width": 1.5 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_98", + "name": "Windows" + } + ], + "materials": [ + "Glass" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 1.0, + 8.0, + 4.5 + ], + "bbox_max": [ + 2.5, + 8.08, + 5.7 + ], + "volume_m3": 0.1439999999999988, + "area_m2": 4.032000000000001, + "triangle_count": 12 + } + }, + "2HLzUdE6vClBjocOde0hSP": { + "global_id": "2HLzUdE6vClBjocOde0hSP", + "step_id": 634, + "ifc_type": "IfcWindow", + "ancestors": [ + "IfcWindow", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "WINDOW", + "name": "W-102", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_WindowCommon": { + "IsExternal": true, + "Reference": "W-102", + "ThermalTransmittance": 1.1 + } + }, + "quantities": { + "Qto_WindowBaseQuantities": { + "Area": 1.8, + "Height": 1.2, + "Width": 1.5 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_98", + "name": "Windows" + } + ], + "materials": [ + "Glass" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 4.0, + 8.0, + 1.0 + ], + "bbox_max": [ + 5.5, + 8.08, + 2.2 + ], + "volume_m3": 0.14399999999997912, + "area_m2": 4.032000000000001, + "triangle_count": 12 + } + }, + "2Q97e$io96geok36GwMeWN": { + "global_id": "2Q97e$io96geok36GwMeWN", + "step_id": 980, + "ifc_type": "IfcWall", + "ancestors": [ + "IfcWall", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "SOLIDWALL", + "name": "WL-204", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_WallCommon": { + "FireRating": "REI90", + "IsExternal": true, + "LoadBearing": true, + "Reference": "WL-204" + } + }, + "quantities": { + "Qto_WallBaseQuantities": { + "GrossSideArea": 28.0, + "GrossVolume": 7.0, + "Height": 3.5, + "Length": 8.0, + "NetSideArea": 28.0, + "NetVolume": 7.0, + "Width": 0.25 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_25_10_30", + "name": "External wall systems" + } + ], + "materials": [ + "Brick masonry" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + -1.469576158976824e-15, + 0.0, + 3.5 + ], + "bbox_max": [ + 0.25, + 8.0, + 7.0 + ], + "volume_m3": 6.999999999999999, + "area_m2": 61.75, + "triangle_count": 12 + } + }, + "2Zd$uPIzb10wSU4e1Lw8nw": { + "global_id": "2Zd$uPIzb10wSU4e1Lw8nw", + "step_id": 1312, + "ifc_type": "IfcWindow", + "ancestors": [ + "IfcWindow", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "WINDOW", + "name": "W-203", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_WindowCommon": { + "IsExternal": true, + "Reference": "W-203", + "ThermalTransmittance": 1.1 + } + }, + "quantities": { + "Qto_WindowBaseQuantities": { + "Area": 1.8, + "Height": 1.2, + "Width": 1.5 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_98", + "name": "Windows" + } + ], + "materials": [ + "Glass" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 8.0, + 8.0, + 4.5 + ], + "bbox_max": [ + 9.5, + 8.08, + 5.7 + ], + "volume_m3": 0.14400000000000546, + "area_m2": 4.032000000000001, + "triangle_count": 12 + } + }, + "2_1oS7szL6X8X3t$dennS6": { + "global_id": "2_1oS7szL6X8X3t$dennS6", + "step_id": 219, + "ifc_type": "IfcWall", + "ancestors": [ + "IfcWall", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "SOLIDWALL", + "name": "WL-105", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_WallCommon": { + "FireRating": "REI60", + "IsExternal": false, + "LoadBearing": false, + "Reference": "WL-105" + } + }, + "quantities": { + "Qto_WallBaseQuantities": { + "GrossSideArea": 21.0, + "GrossVolume": 3.15, + "Height": 3.5, + "Length": 6.0, + "NetSideArea": 21.0, + "NetVolume": 3.15, + "Width": 0.15 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_25_10_32", + "name": "Internal wall systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 5.85, + 0.25, + 0.0 + ], + "bbox_max": [ + 6.0, + 6.25, + 3.5 + ], + "volume_m3": 3.1500000000000057, + "area_m2": 44.849999999999994, + "triangle_count": 12 + } + }, + "2k_XPRK0H7MBwX$trTsnKu": { + "global_id": "2k_XPRK0H7MBwX$trTsnKu", + "step_id": 1376, + "ifc_type": "IfcSpace", + "ancestors": [ + "IfcSpace", + "IfcSpatialStructureElement", + "IfcSpatialElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "INTERNAL", + "name": "Meeting 2.01", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_SpaceCommon": { + "GrossPlannedArea": 86.25, + "IsExternal": false, + "Reference": "Meeting 2.01" + } + }, + "quantities": { + "Qto_SpaceBaseQuantities": { + "GrossFloorArea": 86.25, + "GrossVolume": 280.3125, + "Height": 3.25, + "NetFloorArea": 81.9375 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "SL_20_15_59", + "name": "Office spaces" + } + ], + "materials": [], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.25, + 0.25, + 3.5 + ], + "bbox_max": [ + 11.75, + 7.75, + 6.75 + ], + "volume_m3": 280.3125, + "area_m2": 296.0, + "triangle_count": 12 + } + }, + "2ochKfqaX99ud1_2ByvWQf": { + "global_id": "2ochKfqaX99ud1_2ByvWQf", + "step_id": 666, + "ifc_type": "IfcWindow", + "ancestors": [ + "IfcWindow", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "WINDOW", + "name": "W-103", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_WindowCommon": { + "IsExternal": true, + "Reference": "W-103", + "ThermalTransmittance": 1.1 + } + }, + "quantities": { + "Qto_WindowBaseQuantities": { + "Area": 1.8, + "Height": 1.2, + "Width": 1.5 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_98", + "name": "Windows" + } + ], + "materials": [ + "Glass" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 8.0, + 8.0, + 1.0 + ], + "bbox_max": [ + 9.5, + 8.08, + 2.2 + ], + "volume_m3": 0.1439999999999673, + "area_m2": 4.032000000000001, + "triangle_count": 12 + } + }, + "300_8l3vH4gh_FWaR8YDxW": { + "global_id": "300_8l3vH4gh_FWaR8YDxW", + "step_id": 1085, + "ifc_type": "IfcColumn", + "ancestors": [ + "IfcColumn", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "COLUMN", + "name": "C-203", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_ColumnCommon": { + "FireRating": "R120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "C-203" + } + }, + "quantities": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": 0.16, + "GrossVolume": 0.56, + "Length": 3.5, + "NetVolume": 0.56 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_05_15", + "name": "Concrete column systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 11.3, + 0.3, + 3.5 + ], + "bbox_max": [ + 11.7, + 0.7, + 7.0 + ], + "volume_m3": 0.5599999999999962, + "area_m2": 5.920000000000003, + "triangle_count": 12 + } + }, + "36q0lTDMD7XfKdw0EmVC5R": { + "global_id": "36q0lTDMD7XfKdw0EmVC5R", + "step_id": 1017, + "ifc_type": "IfcColumn", + "ancestors": [ + "IfcColumn", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "COLUMN", + "name": "C-201", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_ColumnCommon": { + "FireRating": "R120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "C-201" + } + }, + "quantities": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": 0.16, + "GrossVolume": 0.56, + "Length": 3.5, + "NetVolume": 0.56 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_05_15", + "name": "Concrete column systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.3, + 0.3, + 3.5 + ], + "bbox_max": [ + 0.7, + 0.7, + 7.0 + ], + "volume_m3": 0.5599999999999999, + "area_m2": 5.92, + "triangle_count": 12 + } + }, + "39ciZbPH92sPimVDxxXZcp": { + "global_id": "39ciZbPH92sPimVDxxXZcp", + "step_id": 108, + "ifc_type": "IfcWall", + "ancestors": [ + "IfcWall", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "SOLIDWALL", + "name": "WL-102", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_WallCommon": { + "FireRating": "REI90", + "IsExternal": true, + "LoadBearing": true, + "Reference": "WL-102" + } + }, + "quantities": { + "Qto_WallBaseQuantities": { + "GrossSideArea": 28.0, + "GrossVolume": 7.0, + "Height": 3.5, + "Length": 8.0, + "NetSideArea": 28.0, + "NetVolume": 7.0, + "Width": 0.25 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_25_10_30", + "name": "External wall systems" + } + ], + "materials": [ + "Brick masonry" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 11.75, + 0.0, + 0.0 + ], + "bbox_max": [ + 12.0, + 8.0, + 3.5 + ], + "volume_m3": 7.000000000000009, + "area_m2": 61.75, + "triangle_count": 12 + } + }, + "3EA9ylAjf9eQeMFfDEbNIS": { + "global_id": "3EA9ylAjf9eQeMFfDEbNIS", + "step_id": 467, + "ifc_type": "IfcBeam", + "ancestors": [ + "IfcBeam", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "BEAM", + "name": "B-102", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_BeamCommon": { + "FireRating": "R60", + "IsExternal": false, + "LoadBearing": true, + "Reference": "B-102" + } + }, + "quantities": { + "Qto_BeamBaseQuantities": { + "CrossSectionArea": 0.15, + "GrossVolume": 1.65, + "Length": 11.0, + "NetVolume": 1.65 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_10_75", + "name": "Steel beam systems" + } + ], + "materials": [ + "Steel S275" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.5, + 7.3, + 3.0 + ], + "bbox_max": [ + 11.5, + 7.6, + 3.5 + ], + "volume_m3": 1.6500000000000326, + "area_m2": 17.899999999999995, + "triangle_count": 12 + } + }, + "3IbjUzHpjDRuP4kDWoBOdT": { + "global_id": "3IbjUzHpjDRuP4kDWoBOdT", + "step_id": 294, + "ifc_type": "IfcColumn", + "ancestors": [ + "IfcColumn", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "COLUMN", + "name": "C-102", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_ColumnCommon": { + "FireRating": "R120", + "IsExternal": false, + "LoadBearing": true, + "Reference": "C-102" + } + }, + "quantities": { + "Qto_ColumnBaseQuantities": { + "CrossSectionArea": 0.16, + "GrossVolume": 0.56, + "Length": 3.5, + "NetVolume": 0.56 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_05_15", + "name": "Concrete column systems" + } + ], + "materials": [ + "Concrete C30/37" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 6.0, + 0.3, + 0.0 + ], + "bbox_max": [ + 6.4, + 0.7, + 3.5 + ], + "volume_m3": 0.5599999999999993, + "area_m2": 5.920000000000003, + "triangle_count": 12 + } + }, + "3QbDo1yX9DbvOtppP64ZlL": { + "global_id": "3QbDo1yX9DbvOtppP64ZlL", + "step_id": 13, + "ifc_type": "IfcBuilding", + "ancestors": [ + "IfcBuilding", + "IfcSpatialStructureElement", + "IfcSpatialElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": null, + "name": "Demo pavilion", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": null, + "container": { + "global_id": "1EpypJIb12CfdN9VsEREsE", + "ifc_type": "IfcSite", + "name": "Demo site" + }, + "psets": {}, + "quantities": {}, + "classifications": [], + "materials": [], + "has_representation": false, + "geometry": null + }, + "3Qt_Yah3DBtxDS81XRmn_w": { + "global_id": "3Qt_Yah3DBtxDS81XRmn_w", + "step_id": 1182, + "ifc_type": "IfcBeam", + "ancestors": [ + "IfcBeam", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "BEAM", + "name": "B-201", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_BeamCommon": { + "FireRating": "R60", + "IsExternal": false, + "LoadBearing": true, + "Reference": "B-201" + } + }, + "quantities": { + "Qto_BeamBaseQuantities": { + "CrossSectionArea": 0.15, + "GrossVolume": 1.65, + "Length": 11.0, + "NetVolume": 1.65 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_20_10_75", + "name": "Steel beam systems" + } + ], + "materials": [ + "Steel S275" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.5, + 0.3, + 6.5 + ], + "bbox_max": [ + 11.5, + 0.6, + 7.0 + ], + "volume_m3": 1.65, + "area_m2": 17.9, + "triangle_count": 12 + } + }, + "3aD8tPkOr8fuiaSy7P_p_X": { + "global_id": "3aD8tPkOr8fuiaSy7P_p_X", + "step_id": 1280, + "ifc_type": "IfcWindow", + "ancestors": [ + "IfcWindow", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "WINDOW", + "name": "W-202", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_WindowCommon": { + "IsExternal": true, + "Reference": "W-202", + "ThermalTransmittance": 1.1 + } + }, + "quantities": { + "Qto_WindowBaseQuantities": { + "Area": 1.8, + "Height": 1.2, + "Width": 1.5 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Pr_30_59_98", + "name": "Windows" + } + ], + "materials": [ + "Glass" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 4.0, + 8.0, + 4.5 + ], + "bbox_max": [ + 5.5, + 8.08, + 5.7 + ], + "volume_m3": 0.14399999999997676, + "area_m2": 4.032000000000001, + "triangle_count": 12 + } + }, + "3bpgyhjRX00OaOufZGXVp8": { + "global_id": "3bpgyhjRX00OaOufZGXVp8", + "step_id": 767, + "ifc_type": "IfcDuctSegment", + "ancestors": [ + "IfcDuctSegment", + "IfcFlowSegment", + "IfcDistributionFlowElement", + "IfcDistributionElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "RIGIDSEGMENT", + "name": "MEP-101", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_DuctSegmentTypeCommon": { + "NominalDiameterOrWidth": 300.0, + "Reference": "MEP-101" + } + }, + "quantities": { + "Qto_DuctSegmentBaseQuantities": { + "GrossCrossSectionArea": 0.09, + "Length": 10.0, + "OuterSurfaceArea": 12.0 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_65_40_33", + "name": "Ductwork systems" + } + ], + "materials": [ + "Galvanised steel" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 1.0, + 4.0, + 3.1 + ], + "bbox_max": [ + 11.0, + 4.3, + 3.4 + ], + "volume_m3": 0.900000000000006, + "area_m2": 12.179999999999993, + "triangle_count": 12 + } + }, + "3yKaPu4HD4ExAZm$NkAkAb": { + "global_id": "3yKaPu4HD4ExAZm$NkAkAb", + "step_id": 698, + "ifc_type": "IfcSpace", + "ancestors": [ + "IfcSpace", + "IfcSpatialStructureElement", + "IfcSpatialElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "INTERNAL", + "name": "Office 1.01", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 1", + "container": { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1" + }, + "psets": { + "Pset_SpaceCommon": { + "GrossPlannedArea": 42.0, + "IsExternal": false, + "Reference": "Office 1.01" + } + }, + "quantities": { + "Qto_SpaceBaseQuantities": { + "GrossFloorArea": 42.0, + "GrossVolume": 136.5, + "Height": 3.25, + "NetFloorArea": 39.9 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "SL_20_15_59", + "name": "Office spaces" + } + ], + "materials": [], + "has_representation": true, + "geometry": { + "bbox_min": [ + 0.25, + 0.25, + 0.0 + ], + "bbox_max": [ + 5.85, + 7.75, + 3.25 + ], + "volume_m3": 136.49999999999997, + "area_m2": 169.15, + "triangle_count": 12 + } + }, + "3zdhRWbxDD1AraiGoQb0tH": { + "global_id": "3zdhRWbxDD1AraiGoQb0tH", + "step_id": 906, + "ifc_type": "IfcWall", + "ancestors": [ + "IfcWall", + "IfcBuildingElement", + "IfcElement", + "IfcProduct", + "IfcObject", + "IfcObjectDefinition", + "IfcRoot" + ], + "predefined_type": "SOLIDWALL", + "name": "WL-202", + "description": null, + "object_type": null, + "tag": null, + "type_name": null, + "storey": "Level 2", + "container": { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2" + }, + "psets": { + "Pset_WallCommon": { + "FireRating": "REI90", + "IsExternal": true, + "LoadBearing": true, + "Reference": "WL-202" + } + }, + "quantities": { + "Qto_WallBaseQuantities": { + "GrossSideArea": 28.0, + "GrossVolume": 7.0, + "Height": 3.5, + "Length": 8.0, + "NetSideArea": 28.0, + "NetVolume": 7.0, + "Width": 0.25 + } + }, + "classifications": [ + { + "system": "Uniclass 2015", + "code": "Ss_25_10_30", + "name": "External wall systems" + } + ], + "materials": [ + "Brick masonry" + ], + "has_representation": true, + "geometry": { + "bbox_min": [ + 11.75, + 0.0, + 3.5 + ], + "bbox_max": [ + 12.0, + 8.0, + 7.0 + ], + "volume_m3": 7.000000000000009, + "area_m2": 61.75, + "triangle_count": 12 + } + } +} diff --git a/frontend/mock/examples.json b/frontend/mock/examples.json new file mode 100644 index 0000000..819d163 --- /dev/null +++ b/frontend/mock/examples.json @@ -0,0 +1,34 @@ +[ + { + "id": "demo", + "name": "Demo pavilion (start here)", + "description": "Two-storey office pavilion with properties, quantities, classification and five deliberate defects — the fastest way to see VeriModel at work.", + "ifc_path": "examples/demo/demo_building.ifc", + "config_path": "examples/demo/project.yaml", + "ids_path": "examples/sample.ids" + }, + { + "id": "residential", + "name": "Residential building", + "description": "Architecture model in IFC2X3 with an IDS file and a unit rates table: walls, doors, windows and slabs.", + "ifc_path": "tests/fixtures/bsi_ifc2x3_building_architecture.ifc", + "config_path": "examples/residential/project.yaml", + "ids_path": "examples/sample.ids" + }, + { + "id": "office", + "name": "Office building", + "description": "Structural model in IFC4: columns, beams and slabs checked against load-bearing and classification requirements.", + "ifc_path": "tests/fixtures/bsi_ifc4_building_structural.ifc", + "config_path": "examples/office/project.yaml", + "ids_path": "examples/sample.ids" + }, + { + "id": "infrastructure", + "name": "Infrastructure (bridge)", + "description": "Bridge in IFC4X3: shows the checks on a non-building model with its own spatial structure.", + "ifc_path": "tests/fixtures/bsi_ifc4x3_infra_bridge.ifc", + "config_path": "examples/infrastructure/project.yaml", + "ids_path": "examples/sample.ids" + } +] diff --git a/frontend/mock/file_card.json b/frontend/mock/file_card.json new file mode 100644 index 0000000..1a164c8 --- /dev/null +++ b/frontend/mock/file_card.json @@ -0,0 +1,38 @@ +{ + "file_name": "demo_building.ifc", + "path": "/home/anna/VeriModel/examples/demo/demo_building.ifc", + "size_bytes": 69674, + "sha256": "c64a0cb3e46fc24539d8e67df4a3243029bef6ce92b741006119cfe0f4a1c582", + "sha256_short": "c64a0cb3e46f", + "schema": "IFC4", + "element_count": 46, + "units": { + "system": "metric", + "length_unit": "MILLIMETRE" + }, + "disciplines": [ + "architecture", + "mep", + "structure" + ], + "storeys": [ + "Level 1", + "Level 2", + "Roof" + ], + "type_counts": { + "IfcBeam": 3, + "IfcBuilding": 1, + "IfcBuildingStorey": 3, + "IfcColumn": 10, + "IfcDoor": 4, + "IfcDuctSegment": 2, + "IfcRoof": 1, + "IfcSite": 1, + "IfcSlab": 2, + "IfcSpace": 3, + "IfcWall": 9, + "IfcWindow": 7 + }, + "reader_warnings": [] +} diff --git a/frontend/mock/report.json b/frontend/mock/report.json new file mode 100644 index 0000000..6bc03e5 --- /dev/null +++ b/frontend/mock/report.json @@ -0,0 +1,1301 @@ +{ + "tool": { + "name": "VeriModel", + "version": "1.0.0" + }, + "model": { + "file_name": "demo_building.ifc", + "file_size_bytes": 69674, + "sha256": "c64a0cb3e46fc24539d8e67df4a3243029bef6ce92b741006119cfe0f4a1c582", + "schema": "IFC4", + "mvd": "ViewDefinition[DesignTransferView]", + "authoring_tool": "IfcOpenShell 0.9.0.post1", + "project_name": "VeriModel demo pavilion", + "units": { + "length_unit": "MILLIMETRE", + "length_to_m": 0.001, + "area_unit": "SQUARE_METRE", + "area_to_m2": 1.0, + "volume_unit": "CUBIC_METRE", + "volume_to_m3": 1.0, + "system": "metric" + }, + "element_count": 46, + "spatial_tree": [ + { + "global_id": "1EpypJIb12CfdN9VsEREsE", + "ifc_type": "IfcSite", + "name": "Demo site", + "elevation_m": null, + "children": [ + { + "global_id": "3QbDo1yX9DbvOtppP64ZlL", + "ifc_type": "IfcBuilding", + "name": "Demo pavilion", + "elevation_m": null, + "children": [ + { + "global_id": "1IGd$4nYXElgZB4GTNmdPP", + "ifc_type": "IfcBuildingStorey", + "name": "Level 1", + "elevation_m": 0.0, + "children": [ + { + "global_id": "3yKaPu4HD4ExAZm$NkAkAb", + "ifc_type": "IfcSpace", + "name": "Office 1.01", + "elevation_m": null, + "children": [] + }, + { + "global_id": "1Xh9cXiZb1BxwABhznR7IJ", + "ifc_type": "IfcSpace", + "name": "Office 1.02", + "elevation_m": null, + "children": [] + } + ] + }, + { + "global_id": "0e5UlLDXfEv9G8siqzjE$o", + "ifc_type": "IfcBuildingStorey", + "name": "Level 2", + "elevation_m": 3.5, + "children": [ + { + "global_id": "2k_XPRK0H7MBwX$trTsnKu", + "ifc_type": "IfcSpace", + "name": "Meeting 2.01", + "elevation_m": null, + "children": [] + } + ] + }, + { + "global_id": "0hBDJ75zX6vhkU0IfkK4eR", + "ifc_type": "IfcBuildingStorey", + "name": "Roof", + "elevation_m": 7.0, + "children": [] + } + ] + } + ] + } + ], + "type_counts": { + "IfcBeam": 3, + "IfcBuilding": 1, + "IfcBuildingStorey": 3, + "IfcColumn": 10, + "IfcDoor": 4, + "IfcDuctSegment": 2, + "IfcRoof": 1, + "IfcSite": 1, + "IfcSlab": 2, + "IfcSpace": 3, + "IfcWall": 9, + "IfcWindow": 7 + }, + "storeys": [ + "Level 1", + "Level 2", + "Roof" + ], + "disciplines": [ + "architecture", + "mep", + "structure" + ], + "reader_warnings": [], + "geometry_available": true + }, + "config": { + "project": { + "name": "VeriModel demo pavilion", + "language": "en", + "units": "auto", + "classification_system": "Uniclass", + "ifc_versions": [ + "IFC2X3", + "IFC4", + "IFC4X3" + ] + }, + "requirements": { + "ids_file": "../sample.ids", + "rule_pack": "generic", + "required_psets": [ + { + "pset": "Pset_WallCommon", + "applies_to": [ + "IfcWall" + ], + "properties": [ + "FireRating", + "IsExternal" + ], + "severity": null + }, + { + "pset": "Pset_DoorCommon", + "applies_to": [ + "IfcDoor" + ], + "properties": [ + "FireRating" + ], + "severity": null + } + ] + }, + "tolerances": { + "clash_hard_mm": 10.0, + "clash_clearance_mm": 50.0, + "far_from_origin_m": 10000.0, + "geometry": { + "min_volume_m3": 1e-06, + "min_area_m2": 1e-06, + "max_extent_m": 5000.0 + } + }, + "qto": { + "group_by": [ + "type", + "storey" + ], + "unit_rates_file": "../rates.csv", + "currency": "EUR", + "sample_count": 5 + }, + "clash": { + "enabled": false, + "set_a_filter": { + "ifc_type": null, + "name_pattern": null, + "storey": null, + "property_equals": {} + }, + "set_b_filter": { + "ifc_type": null, + "name_pattern": null, + "storey": null, + "property_equals": {} + } + }, + "output": { + "language": "en", + "include_3d_snapshot": true, + "bcf_version": "2.1", + "bcf_author": "verimodel@local" + }, + "checks": { + "rules": { + "CL-001": true + }, + "categories": {}, + "unique_name_within": [] + }, + "naming": { + "patterns": { + "IfcBeam": "^B-[0-9]{3}$", + "IfcColumn": "^C-[0-9]{3}$", + "IfcDoor": "^D-[0-9]{3}$", + "IfcWall": "^WL-[0-9]{3}$", + "IfcWindow": "^W-[0-9]{3}$" + } + }, + "classification": { + "required": true, + "applies_to": [ + "IfcElement" + ], + "allowed_codes": [], + "allowed_codes_file": null, + "code_pattern": "^[A-Za-z]{2}_[0-9]{2}(_[0-9]{2}){0,3}$" + } + }, + "summary": { + "score": 99, + "verdict": "FAIL", + "elements_checked": 46, + "element_checks": 734, + "errors": 3, + "warnings": 3, + "infos": 0, + "rules_total": 25, + "rules_passed": 20, + "rules_failed": 5, + "rules_skipped": 0, + "rules_not_applicable": 0, + "verdict_rule": "FAIL = at least one ERROR. PASS WITH WARNINGS = no errors, at least one WARNING. PASS = no errors and no warnings. Score = 100 × (1 − (errors + 0.25 × warnings) / element checks). Skipped rules are never counted as passed." + }, + "rules": [ + { + "rule_id": "CFG-PSET-001", + "category": "properties", + "description": "Property set Pset_WallCommon must exist on IfcWall", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 9, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "project_config" + } + }, + { + "rule_id": "CFG-PSET-001-01", + "category": "properties", + "description": "Property Pset_WallCommon.FireRating must exist and have a value on IfcWall", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 9, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "project_config" + } + }, + { + "rule_id": "CFG-PSET-001-02", + "category": "properties", + "description": "Property Pset_WallCommon.IsExternal must exist and have a value on IfcWall", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 9, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "project_config" + } + }, + { + "rule_id": "CFG-PSET-002", + "category": "properties", + "description": "Property set Pset_DoorCommon must exist on IfcDoor", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 4, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "project_config" + } + }, + { + "rule_id": "CFG-PSET-002-01", + "category": "properties", + "description": "Property Pset_DoorCommon.FireRating must exist and have a value on IfcDoor", + "severity": "ERROR", + "status": "FAIL", + "elements_checked": 4, + "failures": 1, + "skipped_reason": null, + "source": { + "kind": "project_config" + } + }, + { + "rule_id": "CL-001", + "category": "classification", + "description": "Elements must carry a classification reference from the configured system", + "severity": "ERROR", + "status": "FAIL", + "elements_checked": 38, + "failures": 1, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "CL-002", + "category": "classification", + "description": "Classification codes must belong to the configured classification list or pattern", + "severity": "WARNING", + "status": "PASS", + "elements_checked": 38, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "GEO-001", + "category": "geometry", + "description": "Physical elements must have a geometric representation", + "severity": "WARNING", + "status": "PASS", + "elements_checked": 38, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "GEO-002", + "category": "geometry", + "description": "Elements with a representation must produce a non-degenerate shape (volume or area above tolerance)", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 38, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "GEO-003", + "category": "geometry", + "description": "Element bounding boxes must stay within the configured project bounds", + "severity": "WARNING", + "status": "PASS", + "elements_checked": 38, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "ID-001", + "category": "identity", + "description": "Every element must have a unique GlobalId", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 46, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "ID-002", + "category": "identity", + "description": "Every GlobalId must be a valid 22-character IFC identifier", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 46, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "ID-003", + "category": "identity", + "description": "Element names must be unique within the same type and storey", + "severity": "WARNING", + "status": "FAIL", + "elements_checked": 38, + "failures": 2, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "IDS-01-01", + "category": "ids", + "description": "Walls have a fire rating: FireRating data shall be provided in the dataset Pset_WallCommon", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 9, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "ids", + "specification": "Walls have a fire rating", + "requirement": "FireRating data shall be provided in the dataset Pset_WallCommon" + } + }, + { + "rule_id": "IDS-02-01", + "category": "ids", + "description": "Walls state IsExternal: IsExternal data shall be provided in the dataset Pset_WallCommon", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 9, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "ids", + "specification": "Walls state IsExternal", + "requirement": "IsExternal data shall be provided in the dataset Pset_WallCommon" + } + }, + { + "rule_id": "IDS-03-01", + "category": "ids", + "description": "Beams have a material: Shall have a material", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 3, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "ids", + "specification": "Beams have a material", + "requirement": "Shall have a material" + } + }, + { + "rule_id": "NAM-001", + "category": "naming", + "description": "Element names must follow the project naming convention", + "severity": "WARNING", + "status": "PASS", + "elements_checked": 38, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "PR-001", + "category": "properties", + "description": "Properties that exist must carry a value (no empty or null values)", + "severity": "WARNING", + "status": "FAIL", + "elements_checked": 38, + "failures": 1, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "QT-001", + "category": "sanity", + "description": "Elements that report a volume must report a positive volume", + "severity": "WARNING", + "status": "PASS", + "elements_checked": 38, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "QT-002", + "category": "sanity", + "description": "Elements that report an area must report a positive area", + "severity": "WARNING", + "status": "PASS", + "elements_checked": 38, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "SCH-001", + "category": "schema", + "description": "The IFC schema of the file must be one the project accepts", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 46, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "SP-001", + "category": "spatial", + "description": "Every element must be contained in a spatial structure element (storey, space, site, facility part)", + "severity": "ERROR", + "status": "FAIL", + "elements_checked": 38, + "failures": 1, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "SP-002", + "category": "spatial", + "description": "The container of every element must exist in the spatial hierarchy", + "severity": "ERROR", + "status": "PASS", + "elements_checked": 38, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "SP-003", + "category": "spatial", + "description": "The model must declare a site, a building or facility, and at least one storey or facility part", + "severity": "WARNING", + "status": "PASS", + "elements_checked": 46, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "SP-004", + "category": "spatial", + "description": "Elements must not be far from the project origin", + "severity": "WARNING", + "status": "PASS", + "elements_checked": 38, + "failures": 0, + "skipped_reason": null, + "source": { + "kind": "rule_pack", + "pack": "generic" + } + } + ], + "findings": [ + { + "rule_id": "CFG-PSET-002-01", + "severity": "ERROR", + "global_id": "1Y0DLMcffBEfFN6$xe3kNn", + "step_id": 568, + "ifc_type": "IfcDoor", + "name": "D-103", + "storey": "Level 1", + "message": "IfcDoor 'D-103' is missing property Pset_DoorCommon.FireRating", + "expected": "property Pset_DoorCommon.FireRating present", + "actual": "missing", + "fix_hint": "Fill in Pset_DoorCommon.FireRating on the element.", + "source": { + "kind": "project_config" + } + }, + { + "rule_id": "CL-001", + "severity": "ERROR", + "global_id": "1a1bw1G7XEggO8ac3NDh54", + "step_id": 801, + "ifc_type": "IfcDuctSegment", + "name": "MEP-102", + "storey": "Level 1", + "message": "IfcDuctSegment 'MEP-102' has no Uniclass classification", + "expected": "classification from system 'Uniclass'", + "actual": "none", + "fix_hint": "Assign a classification code (Uniclass, OmniClass, CCI, DIN 276...) to the element or its type.", + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "SP-001", + "severity": "ERROR", + "global_id": "2FcEqYZEfBshSa5L3eGdFF", + "step_id": 1153, + "ifc_type": "IfcColumn", + "name": "C-205", + "storey": null, + "message": "IfcColumn 'C-205' is not contained in any storey, space, site or other spatial element", + "expected": "IfcRelContainedInSpatialStructure to a spatial element", + "actual": "no spatial container", + "fix_hint": "Assign the element to a level / storey in the authoring tool before exporting.", + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "ID-003", + "severity": "WARNING", + "global_id": "1K2ps1qyDEaAKz1F2vNd4l", + "step_id": 943, + "ifc_type": "IfcWall", + "name": "WL-201", + "storey": "Level 2", + "message": "Name 'WL-201' is shared by 2 elements of the same type and storey", + "expected": "unique name", + "actual": "2 elements named 'WL-201'", + "fix_hint": "Give each element a distinct name (type + number), or disable this rule in project.yaml if names are intentionally shared.", + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "ID-003", + "severity": "WARNING", + "global_id": "1niwtJeqDDOhds1z$gNC_r", + "step_id": 869, + "ifc_type": "IfcWall", + "name": "WL-201", + "storey": "Level 2", + "message": "Name 'WL-201' is shared by 2 elements of the same type and storey", + "expected": "unique name", + "actual": "2 elements named 'WL-201'", + "fix_hint": "Give each element a distinct name (type + number), or disable this rule in project.yaml if names are intentionally shared.", + "source": { + "kind": "rule_pack", + "pack": "generic" + } + }, + { + "rule_id": "PR-001", + "severity": "WARNING", + "global_id": "24YJW4Vaj5cxAkwVPB9F0r", + "step_id": 1344, + "ifc_type": "IfcWindow", + "name": "W-204", + "storey": "Level 2", + "message": "IfcWindow 'W-204' has 1 empty property: Pset_WindowCommon.Reference", + "expected": "every property carries a value", + "actual": "1 empty", + "fix_hint": "Fill in the empty property or remove it from the export mapping.", + "source": { + "kind": "rule_pack", + "pack": "generic" + } + } + ], + "qto": { + "group_by": [ + "type", + "storey" + ], + "rows": [ + { + "group": [ + "IfcBeam", + "Level 1" + ], + "count": 2, + "volume_m3": 3.3, + "area_m2": 35.8, + "length_m": 22.0, + "weight_kg": 0.0, + "volume_sources": { + "base_quantity": 2 + }, + "area_sources": { + "geometry": 2 + }, + "length_sources": { + "base_quantity": 2 + }, + "cost": { + "rate_code": "BEAM-01", + "rate_description": "Reinforced concrete beam supply and place", + "unit": "m3", + "rate": 420.0, + "quantity": 3.3, + "amount": 1386.0, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcBeam", + "Level 2" + ], + "count": 1, + "volume_m3": 1.65, + "area_m2": 17.9, + "length_m": 11.0, + "weight_kg": 0.0, + "volume_sources": { + "base_quantity": 1 + }, + "area_sources": { + "geometry": 1 + }, + "length_sources": { + "base_quantity": 1 + }, + "cost": { + "rate_code": "BEAM-01", + "rate_description": "Reinforced concrete beam supply and place", + "unit": "m3", + "rate": 420.0, + "quantity": 1.65, + "amount": 693.0, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcColumn", + "(no storey)" + ], + "count": 1, + "volume_m3": 0.56, + "area_m2": 5.920000000000005, + "length_m": 3.5, + "weight_kg": 0.0, + "volume_sources": { + "base_quantity": 1 + }, + "area_sources": { + "geometry": 1 + }, + "length_sources": { + "base_quantity": 1 + }, + "cost": { + "rate_code": "COL-01", + "rate_description": "Reinforced concrete column supply and place", + "unit": "m3", + "rate": 460.0, + "quantity": 0.56, + "amount": 257.6, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcColumn", + "Level 1" + ], + "count": 5, + "volume_m3": 2.8000000000000003, + "area_m2": 29.60000000000001, + "length_m": 17.5, + "weight_kg": 0.0, + "volume_sources": { + "base_quantity": 5 + }, + "area_sources": { + "geometry": 5 + }, + "length_sources": { + "base_quantity": 5 + }, + "cost": { + "rate_code": "COL-01", + "rate_description": "Reinforced concrete column supply and place", + "unit": "m3", + "rate": 460.0, + "quantity": 2.8000000000000003, + "amount": 1288.0, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcColumn", + "Level 2" + ], + "count": 4, + "volume_m3": 2.24, + "area_m2": 23.680000000000007, + "length_m": 14.0, + "weight_kg": 0.0, + "volume_sources": { + "base_quantity": 4 + }, + "area_sources": { + "geometry": 4 + }, + "length_sources": { + "base_quantity": 4 + }, + "cost": { + "rate_code": "COL-01", + "rate_description": "Reinforced concrete column supply and place", + "unit": "m3", + "rate": 460.0, + "quantity": 2.24, + "amount": 1030.4, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcDoor", + "Level 1" + ], + "count": 3, + "volume_m3": 0.6300000000000008, + "area_m2": 6.300000000000001, + "length_m": 6.300000000000001, + "weight_kg": 0.0, + "volume_sources": { + "geometry": 3 + }, + "area_sources": { + "base_quantity": 3 + }, + "length_sources": { + "base_quantity": 3 + }, + "cost": { + "rate_code": "DOOR-01", + "rate_description": "Internal door set supply and fit leaf frame and ironmongery", + "unit": "nr", + "rate": 650.0, + "quantity": 3.0, + "amount": 1950.0, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcDoor", + "Level 2" + ], + "count": 1, + "volume_m3": 0.21, + "area_m2": 2.1, + "length_m": 2.1, + "weight_kg": 0.0, + "volume_sources": { + "geometry": 1 + }, + "area_sources": { + "base_quantity": 1 + }, + "length_sources": { + "base_quantity": 1 + }, + "cost": { + "rate_code": "DOOR-01", + "rate_description": "Internal door set supply and fit leaf frame and ironmongery", + "unit": "nr", + "rate": 650.0, + "quantity": 1.0, + "amount": 650.0, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcDuctSegment", + "Level 1" + ], + "count": 2, + "volume_m3": 1.1699999999999828, + "area_m2": 15.6, + "length_m": 13.0, + "weight_kg": 0.0, + "volume_sources": { + "geometry": 2 + }, + "area_sources": { + "base_quantity": 2 + }, + "length_sources": { + "base_quantity": 2 + }, + "cost": { + "rate_code": "DUCT-01", + "rate_description": "Rectangular ductwork supply and install", + "unit": "m", + "rate": 145.0, + "quantity": 13.0, + "amount": 1885.0, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcRoof", + "Roof" + ], + "count": 1, + "volume_m3": 31.247999999999905, + "area_m2": 104.16, + "length_m": 12.399999999999999, + "weight_kg": 0.0, + "volume_sources": { + "geometry": 1 + }, + "area_sources": { + "base_quantity": 1 + }, + "length_sources": { + "geometry": 1 + }, + "cost": { + "rate_code": "ROOF-01", + "rate_description": "Roof covering system supply and install", + "unit": "m2", + "rate": 95.0, + "quantity": 104.16, + "amount": 9895.2, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcSlab", + "Level 1" + ], + "count": 1, + "volume_m3": 24.0, + "area_m2": 96.0, + "length_m": 0.25, + "weight_kg": 0.0, + "volume_sources": { + "base_quantity": 1 + }, + "area_sources": { + "base_quantity": 1 + }, + "length_sources": { + "base_quantity": 1 + }, + "cost": { + "rate_code": "SLAB-01", + "rate_description": "Reinforced concrete slab supply and place excl formwork", + "unit": "m3", + "rate": 290.0, + "quantity": 24.0, + "amount": 6960.0, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcSlab", + "Level 2" + ], + "count": 1, + "volume_m3": 24.0, + "area_m2": 96.0, + "length_m": 0.25, + "weight_kg": 0.0, + "volume_sources": { + "base_quantity": 1 + }, + "area_sources": { + "base_quantity": 1 + }, + "length_sources": { + "base_quantity": 1 + }, + "cost": { + "rate_code": "SLAB-01", + "rate_description": "Reinforced concrete slab supply and place excl formwork", + "unit": "m3", + "rate": 290.0, + "quantity": 24.0, + "amount": 6960.0, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcWall", + "Level 1" + ], + "count": 5, + "volume_m3": 38.15, + "area_m2": 161.0, + "length_m": 46.0, + "weight_kg": 0.0, + "volume_sources": { + "base_quantity": 5 + }, + "area_sources": { + "base_quantity": 5 + }, + "length_sources": { + "base_quantity": 5 + }, + "cost": { + "rate_code": "WALL-01", + "rate_description": "Wall construction supply and install excl finishes", + "unit": "m3", + "rate": 310.0, + "quantity": 38.15, + "amount": 11826.5, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcWall", + "Level 2" + ], + "count": 4, + "volume_m3": 35.0, + "area_m2": 140.0, + "length_m": 40.0, + "weight_kg": 0.0, + "volume_sources": { + "base_quantity": 4 + }, + "area_sources": { + "base_quantity": 4 + }, + "length_sources": { + "base_quantity": 4 + }, + "cost": { + "rate_code": "WALL-01", + "rate_description": "Wall construction supply and install excl finishes", + "unit": "m3", + "rate": 310.0, + "quantity": 35.0, + "amount": 10850.0, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcWindow", + "Level 1" + ], + "count": 3, + "volume_m3": 0.43199999999994865, + "area_m2": 5.4, + "length_m": 3.5999999999999996, + "weight_kg": 0.0, + "volume_sources": { + "geometry": 3 + }, + "area_sources": { + "base_quantity": 3 + }, + "length_sources": { + "base_quantity": 3 + }, + "cost": { + "rate_code": "WIN-01", + "rate_description": "Window unit supply and install double glazed", + "unit": "nr", + "rate": 780.0, + "quantity": 3.0, + "amount": 2340.0, + "currency": "EUR", + "source": "rates.csv" + } + }, + { + "group": [ + "IfcWindow", + "Level 2" + ], + "count": 4, + "volume_m3": 0.575999999999963, + "area_m2": 7.2, + "length_m": 4.8, + "weight_kg": 0.0, + "volume_sources": { + "geometry": 4 + }, + "area_sources": { + "base_quantity": 4 + }, + "length_sources": { + "base_quantity": 4 + }, + "cost": { + "rate_code": "WIN-01", + "rate_description": "Window unit supply and install double glazed", + "unit": "nr", + "rate": 780.0, + "quantity": 4.0, + "amount": 3120.0, + "currency": "EUR", + "source": "rates.csv" + } + } + ], + "total_count": 38, + "total_volume_m3": 165.9659999999998, + "total_area_m2": 746.66, + "total_length_m": 196.7, + "total_weight_kg": 0.0, + "total_cost": 61091.7, + "currency": "EUR", + "elements_without_quantities": 0, + "method": "38 element(s) were measured and grouped by IFC entity type, then by building storey; 15 groups resulted. Spatial elements (sites, buildings, storeys, spaces) and non-physical elements (openings and other feature elements, virtual elements, annotations, grids) are not takeoff items; 8 such entries were left out. For each element, volume, area, length and weight were taken first from the base quantities stored in the IFC file (IfcElementQuantity, e.g. NetVolume, NetArea, Length, NetWeight). When a base quantity was missing, volume and area were computed from the tessellated geometry and length was taken as the longest side of the bounding box; weight is only reported when the file provides it. All values are in SI units, converted from the units declared in the file: cubic metres (m³), square metres (m²), metres (m) and kilograms (kg). Volume: 24 from base quantities, 14 from geometry, 0 not available. Area: 25 from base quantities, 13 from geometry, 0 not available. Length: 37 from base quantities, 1 from geometry, 0 not available. Weight was available for 0 element(s). 0 element(s) had no quantity at all; they are counted in their group but add nothing to the totals. Cost was estimated with the unit rates in rates.csv (12 rates): for each group the first rate, in file order, whose match columns all apply (match_type: the IFC type or one of its supertypes; match_storey: the exact storey name; match_classification: a prefix of the classification code; an empty column matches anything) was used. Amount = group quantity in the rate's unit (nr = element count) × rate, rounded to 2 decimals. 15 of 15 groups matched a rate; groups without a rate have no cost. Total estimated cost: 61091.70 EUR.", + "samples": [ + { + "global_id": "0Ijn$vDv50fxv5Tp0EsZjv", + "ifc_type": "IfcRoof", + "name": "RF-301", + "storey": "Roof", + "volume_m3": 31.247999999999905, + "volume_source": "geometry", + "area_m2": 104.16, + "area_source": "base_quantity", + "length_m": 12.399999999999999, + "length_source": "geometry", + "quantity_sets": [ + "Qto_RoofBaseQuantities" + ] + }, + { + "global_id": "0Mkh683Qf2DAmyOPGNzkvr", + "ifc_type": "IfcColumn", + "name": "C-105", + "storey": "Level 1", + "volume_m3": 0.56, + "volume_source": "base_quantity", + "area_m2": 5.920000000000005, + "area_source": "geometry", + "length_m": 3.5, + "length_source": "base_quantity", + "quantity_sets": [ + "Qto_ColumnBaseQuantities" + ] + }, + { + "global_id": "0oSdlcRuvFW9jUDNjqWoWp", + "ifc_type": "IfcBeam", + "name": "B-101", + "storey": "Level 1", + "volume_m3": 1.65, + "volume_source": "base_quantity", + "area_m2": 17.9, + "area_source": "geometry", + "length_m": 11.0, + "length_source": "base_quantity", + "quantity_sets": [ + "Qto_BeamBaseQuantities" + ] + }, + { + "global_id": "0thzlZJ996k8RKzWt6IJG0", + "ifc_type": "IfcWall", + "name": "WL-103", + "storey": "Level 1", + "volume_m3": 10.5, + "volume_source": "base_quantity", + "area_m2": 42.0, + "area_source": "base_quantity", + "length_m": 12.0, + "length_source": "base_quantity", + "quantity_sets": [ + "Qto_WallBaseQuantities" + ] + }, + { + "global_id": "1G20W5wmPEauz_nY7hwIyR", + "ifc_type": "IfcColumn", + "name": "C-103", + "storey": "Level 1", + "volume_m3": 0.56, + "volume_source": "base_quantity", + "area_m2": 5.920000000000003, + "area_source": "geometry", + "length_m": 3.5, + "length_source": "base_quantity", + "quantity_sets": [ + "Qto_ColumnBaseQuantities" + ] + } + ] + }, + "ids": { + "ids_file": "sample.ids", + "title": "VeriModel sample requirements", + "specifications_total": 3, + "specifications_passed": 3, + "specifications": [ + { + "name": "Walls have a fire rating", + "description": "Each wall must carry a Pset_WallCommon.FireRating value.", + "instructions": "Add the FireRating property to Pset_WallCommon on every wall type or occurrence.", + "applicability": [ + "All IFCWALL data" + ], + "cardinality": "optional", + "applicable_count": 9, + "passed": true, + "requirements": [ + { + "description": "FireRating data shall be provided in the dataset Pset_WallCommon", + "facet": "property", + "passed": true, + "failed_entities": [] + } + ] + }, + { + "name": "Walls state IsExternal", + "description": "Each wall must carry a Pset_WallCommon.IsExternal flag.", + "instructions": "", + "applicability": [ + "All IFCWALL data" + ], + "cardinality": "optional", + "applicable_count": 9, + "passed": true, + "requirements": [ + { + "description": "IsExternal data shall be provided in the dataset Pset_WallCommon", + "facet": "property", + "passed": true, + "failed_entities": [] + } + ] + }, + { + "name": "Beams have a material", + "description": "Each beam must be associated with at least one material.", + "instructions": "", + "applicability": [ + "All IFCBEAM data" + ], + "cardinality": "optional", + "applicable_count": 3, + "passed": true, + "requirements": [ + { + "description": "Shall have a material", + "facet": "material", + "passed": true, + "failed_entities": [] + } + ] + } + ] + }, + "clash": { + "enabled": false, + "implemented": false, + "message": "Clash detection is disabled in project.yaml (clash.enabled: false).", + "clashes": [] + } +} diff --git a/frontend/mock/run_result.json b/frontend/mock/run_result.json new file mode 100644 index 0000000..29a242e --- /dev/null +++ b/frontend/mock/run_result.json @@ -0,0 +1,65 @@ +{ + "files": [ + { + "name": "report.json", + "kind": "report_json", + "bytes": 36474 + }, + { + "name": "report.html", + "kind": "report_html", + "bytes": 33461 + }, + { + "name": "failures.csv", + "kind": "failures_csv", + "bytes": 1810 + }, + { + "name": "qto.csv", + "kind": "qto_csv", + "bytes": 1718 + }, + { + "name": "qto.xlsx", + "kind": "qto_xlsx", + "bytes": 10098 + }, + { + "name": "qto.json", + "kind": "qto_json", + "bytes": 14125 + }, + { + "name": "issues.bcfzip", + "kind": "bcf", + "bytes": 9445 + }, + { + "name": "issues.csv", + "kind": "issues_csv", + "bytes": 4151 + }, + { + "name": "project.yaml", + "kind": "config", + "bytes": 1458 + }, + { + "name": "run.json", + "kind": "run_json", + "bytes": 986 + }, + { + "name": "audit.log", + "kind": "audit_log", + "bytes": 318 + } + ], + "bcf": { + "topics": 6, + "with_viewpoint": 6, + "version": "2.1" + }, + "out_dir": "/home/anna/VeriModel/runs/demo_building-20261017-171234" +} diff --git a/frontend/mock/runs.json b/frontend/mock/runs.json new file mode 100644 index 0000000..10fb4e5 --- /dev/null +++ b/frontend/mock/runs.json @@ -0,0 +1,86 @@ +[ + { + "tool": { + "name": "VeriModel", + "version": "1.0.0" + }, + "timestamp": "2026-10-17T17:12:34Z", + "duration_ms": 1747, + "ifc_file": "demo_building.ifc", + "ifc_sha256": "c64a0cb3e46fc24539d8e67df4a3243029bef6ce92b741006119cfe0f4a1c582", + "ids_file": "sample.ids", + "ids_sha256": "10c5191c82017cea07ae3a40ce16f4fa8c6b66a74d6c3e81d1d2506580162074", + "config_file": "project.yaml", + "config_sha256": "7b70a86f1773d150277ee6fa526382ad014672ac01e49a23fe55bd8b1af0cb27", + "rates_file": "../rates.csv", + "rates_sha256": "d4044bf7eaa37a7e3e9e574f3cbc23f4beb6c795001a40fcb176085080073367", + "schema": "IFC4", + "element_count": 46, + "score": 99, + "verdict": "FAIL", + "errors": 3, + "warnings": 3, + "infos": 0, + "rules_passed": 20, + "rules_failed": 5, + "rules_skipped": 0, + "report_sha256": "d96463a8ced0c92fbcd8e714cd76fb8a6d3ceb580383e66682b0922b3d5c7388", + "output_dir": "/home/anna/VeriModel/runs/demo_building-20261017-171234" + }, + { + "tool": { + "name": "verimodel", + "version": "1.0.0" + }, + "timestamp": "2026-10-14T15:03:51Z", + "duration_ms": 1391, + "ifc_file": "Clinic_Block_A.ifc", + "ifc_sha256": "b81c4d0e5a27f93601de48ab7c15f2093e6d84a1b07c5329fe18d60a4b3c7e52", + "ids_file": "clinic_requirements.ids", + "ids_sha256": "a11c4d0e5a27f93601de48ab7c15f2093e6d84a1b07c5329fe18d60a4b3c7e52", + "config_file": "project.yaml", + "config_sha256": "7d2e4d0e5a27f93601de48ab7c15f2093e6d84a1b07c5329fe18d60a4b3c7e52", + "rates_file": "rates_2024.csv", + "rates_sha256": "90ab4d0e5a27f93601de48ab7c15f2093e6d84a1b07c5329fe18d60a4b3c7e52", + "schema": "IFC4", + "element_count": 40, + "score": 94, + "verdict": "FAIL", + "errors": 24, + "warnings": 15, + "infos": 3, + "rules_passed": 6, + "rules_failed": 9, + "rules_skipped": 1, + "report_sha256": "e3b04d0e5a27f93601de48ab7c15f2093e6d84a1b07c5329fe18d60a4b3c7e52", + "output_dir": "/home/anna/VeriModel/out/Clinic_Block_A_2026-10-14_1503" + }, + { + "tool": { + "name": "verimodel", + "version": "1.0.0" + }, + "timestamp": "2026-10-09T11:20:05Z", + "duration_ms": 902, + "ifc_file": "Warehouse_MEP.ifc", + "ifc_sha256": "5af0e92b17c3d684e0b19f27a35c6d8014be7f93a2c05d16e84b7390fa1d2c68", + "ids_file": null, + "ids_sha256": null, + "config_file": "project.yaml", + "config_sha256": "7d2ee92b17c3d684e0b19f27a35c6d8014be7f93a2c05d16e84b7390fa1d2c68", + "rates_file": "rates_2024.csv", + "rates_sha256": "90abe92b17c3d684e0b19f27a35c6d8014be7f93a2c05d16e84b7390fa1d2c68", + "schema": "IFC4", + "element_count": 40, + "score": 99, + "verdict": "PASS_WITH_WARNINGS", + "errors": 0, + "warnings": 4, + "infos": 1, + "rules_passed": 14, + "rules_failed": 2, + "rules_skipped": 1, + "report_sha256": "e3b0e92b17c3d684e0b19f27a35c6d8014be7f93a2c05d16e84b7390fa1d2c68", + "output_dir": "/home/anna/VeriModel/out/Warehouse_MEP_2026-10-09_1120" + } +] diff --git a/frontend/styles.css b/frontend/styles.css new file mode 100644 index 0000000..2e4723a --- /dev/null +++ b/frontend/styles.css @@ -0,0 +1,606 @@ +/* VeriModel UI. Plain CSS, system fonts, no external assets. + Tokens live on :root[data-theme]; spacing follows an 8px scale. */ + +:root { + --s1: 4px; --s2: 8px; --s3: 16px; --s4: 24px; --s5: 32px; --s6: 48px; + --radius: 8px; --radius-lg: 12px; + --topbar-h: 56px; + --assistant-w: 420px; + --detail-w: 460px; + --font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; + --mono: ui-monospace, "SF Mono", "Cascadia Mono", Menlo, Consolas, "Liberation Mono", monospace; +} + +:root, :root[data-theme="light"] { + color-scheme: light; + --bg: #f5f6f8; + --surface: #ffffff; + --surface-2: #f3f4f7; + --zebra: #f8f9fb; + --border: #e3e6eb; + --border-strong: #cdd2da; + --text: #14171c; + --text-2: #444c59; + --muted: #646d7a; + --brand: #f59e0b; --brand-hover: #e08a00; --on-brand: #1a1203; + --accent: #4338ca; + --accent-hover: #372fa8; + --accent-soft: #eceefe; + --on-accent: #ffffff; + --focus: #4338ca; + --error: #b42318; --error-bg: #fdecea; --error-solid: #d92d20; + --warn: #8a4b08; --warn-bg: #fdf3d6; --warn-solid: #d98a0b; + --pass: #17663a; --pass-bg: #dff5e7; --pass-solid: #1f9d55; + --info: #475467; --info-bg: #eaeef3; --info-solid: #98a2b3; + --tip-bg: #14171c; --tip-fg: #f5f6f8; + --shadow: 0 1px 2px rgba(16, 24, 40, .06), 0 1px 3px rgba(16, 24, 40, .08); + --shadow-lg: 0 12px 32px rgba(16, 24, 40, .16), 0 2px 6px rgba(16, 24, 40, .08); +} + +:root[data-theme="dark"] { + color-scheme: dark; + --bg: #0d0f12; + --surface: #15181d; + --surface-2: #1b1f26; + --zebra: #181b21; + --border: #272c34; + --border-strong: #3a414c; + --text: #eceef2; + --text-2: #b9c0cb; + --muted: #8f98a6; + --brand: #f59e0b; --brand-hover: #fbbf3c; --on-brand: #1a1203; + --accent: #8f96ff; + --accent-hover: #a7acff; + --accent-soft: #212449; + --on-accent: #0b0d12; + --focus: #a7acff; + --error: #ff8a80; --error-bg: #2b1618; --error-solid: #f0544a; + --warn: #f6c453; --warn-bg: #2a2210; --warn-solid: #e5a22b; + --pass: #5fd68b; --pass-bg: #13261b; --pass-solid: #34b872; + --info: #b3bccb; --info-bg: #212630; --info-solid: #6f7a8c; + --tip-bg: #eceef2; --tip-fg: #14171c; + --shadow: 0 1px 2px rgba(0, 0, 0, .4); + --shadow-lg: 0 16px 40px rgba(0, 0, 0, .55), 0 2px 6px rgba(0, 0, 0, .4); +} + +*, *::before, *::after { box-sizing: border-box; } +html { -webkit-text-size-adjust: 100%; } +body { + margin: 0; background: var(--bg); color: var(--text); + font: 15px/1.5 var(--font); font-feature-settings: "tnum" 0; + -webkit-font-smoothing: antialiased; +} +h1, h2, h3, h4 { margin: 0; line-height: 1.25; letter-spacing: -.01em; } +h1 { font-size: 28px; font-weight: 650; } +h2 { font-size: 18px; font-weight: 650; } +h3 { font-size: 15px; font-weight: 650; } +h4 { font-size: 15px; font-weight: 650; } +p { margin: 0; } +ul, ol { margin: 0; padding: 0; } +button, input, select { font: inherit; color: inherit; } +.mono { font-family: var(--mono); font-size: .92em; font-feature-settings: "calt" 0; font-variant-ligatures: none; } +.muted { color: var(--muted); } +.small { font-size: 13px; } +.strong { font-weight: 650; } +.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; } +[hidden] { display: none !important; } +kbd { font: 11px var(--mono); padding: 1px 6px; border: 1px solid var(--border-strong); border-radius: 4px; color: var(--muted); background: var(--surface-2); } + +:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: 4px; } +.skip-link { position: absolute; left: var(--s3); top: -64px; background: var(--accent); color: var(--on-accent); padding: var(--s2) var(--s3); border-radius: var(--radius); z-index: 200; } +.skip-link:focus { top: var(--s2); } + +/* ------------------------------------------------------------- top bar */ +.topbar { + position: sticky; top: 0; z-index: 50; height: var(--topbar-h); + background: color-mix(in srgb, var(--surface) 94%, transparent); + border-bottom: 1px solid var(--border); +} +:root[data-theme="dark"] .topbar { + background: color-mix(in srgb, var(--surface) 72%, transparent); + -webkit-backdrop-filter: saturate(1.4) blur(14px); backdrop-filter: saturate(1.4) blur(14px); +} +.topbar-inner { + max-width: 1440px; height: 100%; margin: 0 auto; padding: 0 var(--s4); + display: flex; align-items: center; gap: var(--s3); +} +.brand { flex: 1 1 0; display: flex; align-items: center; gap: 10px; min-width: 0; } +.logo-mark { flex: none; display: block; border-radius: 6px; } +.wordmark { flex: none; font-size: 18px; font-weight: 800; letter-spacing: -.02em; line-height: 1; } +.wordmark-model { color: var(--brand); } +.tagline { display: none; min-width: 0; padding-left: 12px; margin-left: 2px; border-left: 1px solid var(--border-strong); font-size: 12px; line-height: 1.3; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.header-right { flex: 1 1 0; display: flex; align-items: center; justify-content: flex-end; gap: var(--s2); min-width: max-content; } +.toggles { display: flex; align-items: center; gap: 2px; padding: 2px; border: 1px solid var(--border); border-radius: 10px; background: var(--surface-2); } +.toggles .segmented { border: 0; padding: 0; background: transparent; border-radius: 8px; } +.toggles .segmented + .segmented { margin-left: 2px; padding-left: 2px; border-left: 1px solid var(--border-strong); border-radius: 0; } +.segmented { display: inline-flex; border: 1px solid var(--border-strong); border-radius: var(--radius); padding: 2px; background: var(--surface-2); } +.segmented button { border: 0; background: transparent; color: var(--text-2); padding: 3px 10px; border-radius: 6px; font-size: 12.5px; font-weight: 550; cursor: pointer; min-height: 28px; white-space: nowrap; } +.segmented button:hover { color: var(--text); } +.segmented button[aria-pressed="true"] { background: var(--surface); color: var(--text); box-shadow: var(--shadow); } +.assistant-btn { min-height: 32px; padding: 0 12px; font-size: 13px; flex: none; } +.assistant-btn .spark { color: var(--accent); } +.assistant-btn[aria-expanded="true"] { background: var(--surface-2); border-color: var(--text-2); } +.version-pill { flex: none; padding: 3px 9px; border-radius: 999px; border: 1px solid var(--border); background: var(--surface-2); color: var(--muted); font-size: 11.5px; } + +/* The 3-step stepper is a segmented control. */ +.stepper { flex: none; } +.stepper ol { list-style: none; display: flex; align-items: center; gap: 2px; padding: 2px; border: 1px solid var(--border); border-radius: 10px; background: var(--surface-2); } +.stepper li { display: flex; } +.step { display: inline-flex; align-items: center; gap: 8px; border: 0; background: transparent; padding: 0 14px; min-height: 30px; border-radius: 8px; color: var(--text-2); font-size: 13px; font-weight: 550; cursor: pointer; } +.step:hover:not(:disabled) { color: var(--text); background: color-mix(in srgb, var(--surface) 60%, transparent); } +.step:disabled { color: var(--muted); cursor: default; opacity: .65; } +.step-num { width: 18px; height: 18px; border-radius: 50%; display: inline-grid; place-items: center; font-size: 11px; font-weight: 700; border: 1.5px solid var(--border-strong); color: var(--muted); } +.step.is-current { background: var(--surface); color: var(--text); box-shadow: var(--shadow); } +.step.is-current .step-num { background: var(--text); border-color: var(--text); color: var(--surface); } +.step.is-done .step-num { border-color: var(--pass-solid); color: var(--pass); } + +.busy-bar { height: 3px; background: var(--accent-soft); overflow: hidden; position: absolute; left: 0; right: 0; bottom: -1px; } +.busy-bar span { display: block; height: 100%; width: 35%; background: var(--accent); animation: indeterminate 1.3s ease-in-out infinite; } +@keyframes indeterminate { 0% { transform: translateX(-100%); } 100% { transform: translateX(300%); } } + +/* ---------------------------------------------------------------- layout */ +.page { max-width: 1280px; margin: 0 auto; padding: var(--s5) var(--s4) var(--s6); } +.view > * + * { margin-top: var(--s4); } +/* Step 1 is a flex column so the samples can move below the run bar once a model is loaded. */ +#view-load { display: flex; flex-direction: column; } +#view-load > * { order: 3; } +#view-load > .view-head { order: 0; } +#view-load > #load-error { order: 1; } +#view-load > .dropzone { order: 2; } +#view-load > #file-section { order: 4; } +#view-load > .settings { order: 5; } +#view-load > .runbar { order: 6; } +#view-load.has-file > .samples { order: 7; } +#view-load.has-file > .runbar { position: sticky; bottom: var(--s3); } +.view-head { display: grid; gap: var(--s1); } +.view-head > .lede { color: var(--text-2); max-width: 70ch; } +.section-head { display: flex; align-items: baseline; gap: var(--s3); flex-wrap: wrap; margin-bottom: var(--s3); } +.section-head p { font-size: 14px; } +.stack > * + * { margin-top: var(--s4); } +.card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); box-shadow: var(--shadow); padding: var(--s4); } +.eyebrow { font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); font-weight: 650; } +.footer { max-width: 1280px; margin: 0 auto; padding: 0 var(--s4) var(--s5); color: var(--muted); font-size: 13px; } + +/* --------------------------------------------------------------- buttons */ +.btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--s2); min-height: 36px; padding: 0 var(--s3); border-radius: var(--radius); border: 1px solid transparent; font-size: 14px; font-weight: 600; cursor: pointer; white-space: nowrap; text-decoration: none; transition: background .12s, border-color .12s; } +.btn:disabled { opacity: .5; cursor: not-allowed; } +.btn-primary { background: var(--brand); color: var(--on-brand); } +.btn-primary:hover:not(:disabled) { background: var(--brand-hover); } +.btn-secondary { background: var(--surface); border-color: var(--border-strong); color: var(--text); } +.btn-secondary:hover:not(:disabled) { background: var(--surface-2); } +.btn-ghost { background: transparent; color: var(--text-2); padding: 0 var(--s2); } +.btn-ghost:hover:not(:disabled) { background: var(--surface-2); color: var(--text); } +.btn-link { background: transparent; color: var(--accent); padding: 0; min-height: 28px; text-decoration: underline; text-underline-offset: 3px; } +.btn-lg { min-height: 44px; padding: 0 var(--s4); font-size: 15px; } +.btn-sm { min-height: 28px; font-size: 13px; padding: 0 var(--s2); } +.linklike { background: none; border: 0; padding: 0; color: var(--accent); cursor: pointer; text-align: left; text-decoration: underline; text-decoration-color: transparent; text-underline-offset: 3px; } +.linklike:hover { text-decoration-color: currentColor; } + +/* ----------------------------------------------------------- badges etc. */ +.badge { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 999px; font-size: 12px; font-weight: 650; letter-spacing: .02em; white-space: nowrap; border: 1px solid transparent; } +.sev-error, .st-fail { background: var(--error-bg); color: var(--error); border-color: color-mix(in srgb, var(--error-solid) 30%, transparent); } +.sev-warning { background: var(--warn-bg); color: var(--warn); border-color: color-mix(in srgb, var(--warn-solid) 35%, transparent); } +.sev-info, .st-na { background: var(--info-bg); color: var(--info); border-color: color-mix(in srgb, var(--info-solid) 30%, transparent); } +.st-pass, .badge-ok { background: var(--pass-bg); color: var(--pass); border-color: color-mix(in srgb, var(--pass-solid) 30%, transparent); } +.st-skipped { background: var(--warn-bg); color: var(--warn); border-color: color-mix(in srgb, var(--warn-solid) 35%, transparent); } +.badge.verdict { padding: 6px 14px; font-size: 13px; letter-spacing: .04em; } +.v-pass.badge { background: var(--pass-bg); color: var(--pass); border-color: color-mix(in srgb, var(--pass-solid) 40%, transparent); } +.v-warn.badge { background: var(--warn-bg); color: var(--warn); border-color: color-mix(in srgb, var(--warn-solid) 45%, transparent); } +.v-fail.badge { background: var(--error-bg); color: var(--error); border-color: color-mix(in srgb, var(--error-solid) 40%, transparent); } +.v-none.badge { background: var(--info-bg); color: var(--info); } +.chips { list-style: none; display: flex; flex-wrap: wrap; gap: var(--s2); } +.chip { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 999px; background: var(--surface-2); border: 1px solid var(--border); font-size: 12.5px; color: var(--text-2); } +.chip-accent { background: var(--accent-soft); color: var(--accent); border-color: transparent; margin-left: var(--s2); font-weight: 600; } +.mono-chips .chip { font-family: var(--mono); font-size: 12px; } +.term { border-bottom: 1px dotted currentColor; cursor: help; } +.badge-count { margin-left: auto; font-size: 12px; font-weight: 650; padding: 2px 10px; border-radius: 999px; background: var(--accent-soft); color: var(--accent); } +.badge-count.is-problem { background: var(--error-bg); color: var(--error); } + +.notice { display: flex; gap: var(--s3); align-items: flex-start; justify-content: space-between; padding: var(--s3) var(--s4); border-radius: var(--radius-lg); border: 1px solid var(--border); border-left-width: 4px; background: var(--surface); } +.notice-body { display: grid; gap: var(--s1); } +.notice-error { background: var(--error-bg); border-color: color-mix(in srgb, var(--error-solid) 40%, var(--border)); border-left-color: var(--error-solid); } +.notice-error h2 { color: var(--error); } +.notice-warning { background: var(--warn-bg); border-left-color: var(--warn-solid); } +.notice-info { background: var(--accent-soft); border-left-color: var(--accent); } +.error-hint { color: var(--text); } + +/* -------------------------------------------------------------- dropzone */ +.dropzone { background: var(--surface); border: 2px dashed var(--border-strong); border-radius: 16px; transition: border-color .12s, background .12s; } +.dropzone.is-dragging { border-color: var(--accent); background: var(--accent-soft); } +.dz-body { display: flex; justify-content: space-between; align-items: center; gap: var(--s4); padding: var(--s5) var(--s5); } +.dz-title { font-size: 22px; font-weight: 650; } +.dz-sub { color: var(--text-2); margin-top: var(--s1); } +.dropzone.is-loaded .dz-body { padding: var(--s3) var(--s4); } +.dropzone.is-loaded .dz-title { font-size: 16px; } +.dz-extras { display: grid; grid-template-columns: 1fr 1fr; border-top: 1px dashed var(--border-strong); } +.extra { display: flex; flex-direction: column; justify-content: space-between; gap: var(--s3); padding: var(--s3) var(--s4); } +.extra + .extra { border-left: 1px dashed var(--border-strong); } +.extra-text { display: grid; gap: 2px; } +.extra-title { font-weight: 650; } +.optional { font-weight: 450; color: var(--muted); font-size: 13px; } +.extra-desc { color: var(--text-2); font-size: 13.5px; } +.extra-actions { display: flex; align-items: center; gap: var(--s2); flex-wrap: wrap; } +.file-pill { padding: 3px 10px; border-radius: 6px; background: var(--accent-soft); color: var(--accent); font-size: 12.5px; max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + +.sample-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s3); } +.sample { display: flex; flex-direction: column; gap: var(--s2); padding: var(--s3) var(--s4); background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); } +.sample p:not(.sample-meta) { color: var(--text-2); font-size: 13.5px; flex: 1; } +.sample-meta { display: flex; gap: var(--s2); flex-wrap: wrap; } +.sample .btn { align-self: flex-start; } + +/* ------------------------------------------------------------- file card */ +.file-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); box-shadow: var(--shadow); padding: var(--s4); display: grid; gap: var(--s3); } +.file-card-head { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--s3); } +.file-card-head .path { color: var(--muted); font-size: 12px; margin-top: 2px; word-break: break-all; } +.facts { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: var(--s3); margin: 0; padding: var(--s3) 0; border-block: 1px solid var(--border); } +.fact dt { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: .05em; font-weight: 600; } +.fact dd { margin: 2px 0 0; font-size: 17px; font-weight: 600; font-variant-numeric: tabular-nums; } +.fact dd.mono, .fact dd .mono { font-size: 15px; } +.chip-rows { display: grid; gap: var(--s2); } +.chip-row { display: grid; grid-template-columns: 140px 1fr; gap: var(--s2); align-items: center; } +.chip-label { font-size: 13px; color: var(--muted); } +.file-card.is-loading { gap: var(--s2); } +.skeleton { height: 14px; border-radius: 6px; background: linear-gradient(90deg, var(--surface-2), var(--border), var(--surface-2)); background-size: 200% 100%; animation: shimmer 1.4s infinite linear; } +.skeleton.w40 { width: 40%; } .skeleton.w60 { width: 60%; } .skeleton.w80 { width: 80%; } +.skeleton-stack { display: grid; gap: var(--s2); padding: var(--s2) 0; } +@keyframes shimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } + +/* -------------------------------------------------------------- settings */ +.panel { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); } +.settings summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: var(--s3); padding: var(--s3) var(--s4); border-radius: var(--radius-lg); } +.settings summary::-webkit-details-marker { display: none; } +.settings summary::before { content: ""; width: 8px; height: 8px; border-right: 2px solid var(--muted); border-bottom: 2px solid var(--muted); transform: rotate(-45deg); transition: transform .12s; margin-right: 4px; } +.settings[open] summary::before { transform: rotate(45deg); } +.summary-title { font-weight: 650; font-size: 16px; } +.summary-hint { color: var(--muted); font-size: 13.5px; } +.settings-body { padding: 0 var(--s4) var(--s4); display: grid; gap: var(--s3); } +.settings-grid { display: grid; grid-template-columns: minmax(0, 1fr) 380px; gap: var(--s4); } +.settings-form { border: 0; margin: 0; padding: 0; min-width: 0; display: grid; grid-template-columns: 1fr 1fr; gap: var(--s4); } +.settings-form:disabled { opacity: .55; } +.settings-col { display: grid; gap: var(--s3); align-content: start; } +.settings-col h3 { padding-top: var(--s2); border-top: 1px solid var(--border); font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); } +.settings-col h3:first-child { border-top: 0; padding-top: 0; } +.field { display: grid; gap: 6px; } +.field label, .field .label { font-size: 13px; font-weight: 600; } +.field .hint { font-size: 12.5px; color: var(--muted); } +input[type="text"], input[type="number"], input[type="search"], select { + height: 36px; border: 1px solid var(--border-strong); border-radius: var(--radius); background: var(--surface); padding: 0 12px; min-width: 0; width: 100%; +} +select { padding-right: 28px; } +input.short { width: 96px; text-transform: uppercase; } +input::placeholder { color: var(--muted); } +.path-row { display: flex; gap: var(--s2); } +.check-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px var(--s3); } +.check { display: flex; align-items: center; gap: var(--s2); font-size: 14px; } +input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--accent); margin: 0; } +.switch { display: inline-flex; align-items: center; gap: 12px; cursor: pointer; font-weight: 550; } +.switch input { position: absolute; opacity: 0; width: 1px; height: 1px; } +.switch-track { width: 38px; height: 22px; border-radius: 999px; background: var(--border-strong); position: relative; transition: background .12s; flex: none; } +.switch-track::after { content: ""; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: #fff; transition: transform .12s; } +.switch input:checked + .switch-track { background: var(--accent); } +.switch input:checked + .switch-track::after { transform: translateX(16px); } +.switch input:focus-visible + .switch-track { outline: 2px solid var(--focus); outline-offset: 2px; } +.settings-side { display: grid; gap: var(--s2); align-content: start; } +.yaml-head { display: flex; justify-content: space-between; align-items: baseline; } +.yaml { margin: 0; padding: var(--s3); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius); font: 12.5px/1.6 var(--mono); max-height: 320px; overflow: auto; white-space: pre; user-select: text; } +.problems { list-style: none; display: grid; gap: 4px; color: var(--error); font-size: 13px; } +.problems:empty { display: none; } +.settings-actions { display: flex; gap: var(--s2); flex-wrap: wrap; } + +.runbar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--s3); z-index: 20; background: var(--surface); border: 1px solid var(--border-strong); border-radius: var(--radius-lg); padding: var(--s3) var(--s4); box-shadow: var(--shadow-lg); } +.runbar-text { display: grid; gap: 2px; min-width: 0; } +.runbar-text span { color: var(--text-2); font-size: 13.5px; } +.progress { flex-basis: 100%; display: grid; gap: var(--s2); } +.progress-track { height: 6px; border-radius: 999px; background: var(--accent-soft); overflow: hidden; } +.progress-bar { height: 100%; width: 35%; background: var(--accent); border-radius: 999px; animation: indeterminate 1.3s ease-in-out infinite; } +#run-stage { color: var(--text-2); font-size: 13.5px; } + +/* ---------------------------------------------------------------- review */ +.review-head { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: var(--s4); align-items: center; } +.score { position: relative; width: 140px; height: 140px; } +.ring { width: 100%; height: 100%; } +.ring-track { stroke: var(--border); } +.ring-value { stroke: var(--info-solid); } +.score.v-pass .ring-value { stroke: var(--pass-solid); } +.score.v-warn .ring-value { stroke: var(--warn-solid); } +.score.v-fail .ring-value { stroke: var(--error-solid); } +.score-text { position: absolute; inset: 0; display: grid; place-content: center; text-align: center; } +.score-num { font-size: 44px; font-weight: 700; letter-spacing: -.03em; line-height: 1; font-variant-numeric: tabular-nums; } +.score-of { font-size: 12px; color: var(--muted); margin-top: 2px; } +.rh-body { display: grid; gap: var(--s3); min-width: 0; } +.rh-title h2 { font-size: 22px; word-break: break-word; } +.verdict-row { display: flex; align-items: center; gap: var(--s3); flex-wrap: wrap; } +.verdict-wrap { position: relative; } +.popover { position: absolute; top: calc(100% + 8px); left: 0; width: 380px; max-width: 88vw; z-index: 45; background: var(--surface); border: 1px solid var(--border-strong); border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); padding: var(--s3) var(--s4); display: grid; gap: var(--s2); justify-items: start; } +.verdict-rule { color: var(--text); line-height: 1.6; } +.stats { display: flex; flex-wrap: wrap; gap: var(--s2) var(--s5); margin: 0; } +.stat dt { font-size: 12px; text-transform: uppercase; letter-spacing: .05em; color: var(--muted); font-weight: 600; } +.stat dd { margin: 0; font-size: 26px; font-weight: 650; letter-spacing: -.02em; font-variant-numeric: tabular-nums; } +.stat.is-error dd { color: var(--error); } +.stat.is-warning dd { color: var(--warn); } +.stat.is-info dd { color: var(--info); } +.rh-actions { display: grid; gap: var(--s2); justify-items: stretch; align-self: start; min-width: 190px; } + +.review-sticky { position: sticky; top: var(--topbar-h); z-index: 30; background: var(--bg); padding-top: var(--s2); margin-top: var(--s3); } +.tabs { display: flex; gap: var(--s1); border-bottom: 1px solid var(--border); overflow-x: auto; } +.tab { border: 0; background: transparent; padding: 12px var(--s3); font-weight: 600; color: var(--text-2); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; display: inline-flex; align-items: center; gap: var(--s2); white-space: nowrap; } +.tab:hover { color: var(--text); } +.tab[aria-selected="true"] { color: var(--accent); border-bottom-color: var(--accent); } +.tab-count { font-size: 12px; padding: 0 8px; border-radius: 999px; background: var(--surface-2); color: var(--muted); font-variant-numeric: tabular-nums; } +.tab[aria-selected="true"] .tab-count { background: var(--accent-soft); color: var(--accent); } + +.filterbar { display: flex; flex-wrap: wrap; gap: var(--s2) var(--s3); align-items: flex-end; padding: var(--s2) 0 var(--s3); } +.filter-group { display: flex; gap: var(--s2); } +.filter-chip { display: inline-flex; align-items: center; gap: 8px; height: 36px; padding: 0 12px; border-radius: 999px; border: 1px solid var(--border-strong); background: var(--surface); color: var(--text-2); font-weight: 600; font-size: 13px; cursor: pointer; } +.filter-chip .dot { width: 9px; height: 9px; border-radius: 50%; border: 2px solid currentColor; } +.filter-chip .count { font-variant-numeric: tabular-nums; color: var(--muted); font-weight: 550; } +.filter-chip[aria-pressed="true"].sev-error { background: var(--error-bg); color: var(--error); border-color: color-mix(in srgb, var(--error-solid) 40%, transparent); } +.filter-chip[aria-pressed="true"].sev-warning { background: var(--warn-bg); color: var(--warn); border-color: color-mix(in srgb, var(--warn-solid) 45%, transparent); } +.filter-chip[aria-pressed="true"].sev-info { background: var(--info-bg); color: var(--info); border-color: color-mix(in srgb, var(--info-solid) 45%, transparent); } +.filter-chip[aria-pressed="true"] .dot { background: currentColor; } +.filter-chip[aria-pressed="true"] .count { color: inherit; } +.filter-field { display: grid; gap: 4px; font-size: 12px; color: var(--muted); font-weight: 600; } +.filter-field select { min-width: 130px; width: auto; max-width: 220px; } +.filter-search { flex: 1 1 220px; max-width: 340px; } + +.tabpanel { padding-top: var(--s1); } +.tabpanel:focus-visible { outline-offset: 4px; } +.table-wrap { overflow: auto; max-height: max(360px, calc(100vh - var(--topbar-h) - 250px)); border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); } +.data-table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 13px; } +.data-table th { position: sticky; top: 0; z-index: 2; background: var(--surface-2); text-align: left; font-size: 12px; font-weight: 650; color: var(--text-2); padding: 10px 12px; border-bottom: 1px solid var(--border-strong); white-space: nowrap; } +.data-table td { padding: 10px 12px; border-bottom: 1px solid var(--border); vertical-align: top; white-space: nowrap; } +.data-table tbody tr:nth-child(even) td { background: var(--zebra); } +.data-table tbody tr:last-child td { border-bottom: 0; } +.data-table .num { text-align: right; font-variant-numeric: tabular-nums; } +.data-table td.wrap { white-space: normal; min-width: 220px; max-width: 420px; overflow-wrap: anywhere; } +.data-table td.name { min-width: 150px; } +.data-table td.ea { min-width: 220px; } +.data-table td.hint-cell { min-width: 260px; color: var(--text-2); } +.data-table.compact td, .data-table.compact th { padding: 6px 10px; } +.data-table tr.is-clickable { cursor: pointer; } +.data-table tr.is-clickable:hover td { background: var(--accent-soft); } +.data-table tr.is-selected td { background: var(--accent-soft); } +.data-table tr.is-selected td:first-child { box-shadow: inset 3px 0 0 var(--accent); } +.data-table tr.is-current td { background: var(--accent-soft); } +.fail-count { color: var(--error); font-weight: 650; } +.reason { margin-top: 4px; font-size: 12.5px; color: var(--warn); } +.ea-label { display: inline-block; min-width: 84px; color: var(--muted); font-size: 11.5px; text-transform: uppercase; letter-spacing: .04em; font-weight: 650; } +.total-row th, .total-row td { position: sticky; bottom: 0; background: var(--surface-2) !important; font-weight: 700; border-top: 1px solid var(--border-strong); border-bottom: 0; text-align: left; } +.total-row td.num { text-align: right; } +.total-row.selection th, .total-row.selection td { bottom: 37px; color: var(--accent); } +.data-table tfoot th { top: auto; z-index: 1; } +.src { margin-left: 8px; font-size: 11px; padding: 1px 6px; border-radius: 4px; background: var(--info-bg); color: var(--info); font-weight: 600; } +.src-geometry { background: var(--warn-bg); color: var(--warn); } +.src-base_quantity { background: var(--pass-bg); color: var(--pass); } +.diff.good { color: var(--pass); font-weight: 600; } +.diff.bad { color: var(--error); font-weight: 600; } +.tab-hint { margin-top: var(--s2); } + +.pager { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: var(--s2); padding: var(--s2) 2px 0; color: var(--text-2); font-size: 13px; } +.pager-controls { display: flex; align-items: center; gap: var(--s2); } +.pager-size { display: flex; align-items: center; gap: var(--s2); } +.pager-size select { width: auto; height: 32px; } +.pager .btn { min-height: 32px; } + +.empty { display: grid; gap: var(--s2); justify-items: center; text-align: center; padding: var(--s6) var(--s4); border: 1px dashed var(--border-strong); border-radius: var(--radius-lg); background: var(--surface); } +.empty p { color: var(--text-2); max-width: 62ch; } +.empty-explain { justify-items: start; text-align: left; } +.callout { background: var(--surface); border: 1px solid var(--border); border-left: 4px solid var(--accent); border-radius: var(--radius-lg); padding: var(--s3) var(--s4); display: grid; gap: var(--s1); } +.callout p { color: var(--text-2); max-width: 110ch; } +.callout-warn { color: var(--warn) !important; font-weight: 600; } +.samples-block { display: grid; gap: var(--s2); } + +/* ------------------------------------------------------------------- IDS */ +.ids-head { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--s3); } +.ids-spec { display: grid; gap: var(--s3); } +.ids-spec-head, .ids-req-head { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--s3); } +.ids-badges { display: flex; gap: var(--s2); align-items: center; flex-wrap: wrap; justify-content: flex-end; } +.ids-meta { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: var(--s3); margin: 0; padding: var(--s2) 0; border-block: 1px solid var(--border); } +.ids-meta dt { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: .05em; font-weight: 600; } +.ids-meta dd { margin: 2px 0 0; font-weight: 600; } +.ids-reqs { list-style: none; display: grid; gap: var(--s3); } +.ids-req { display: grid; gap: var(--s2); } +.ids-req blockquote { margin: 0; padding-left: var(--s3); border-left: 3px solid var(--border-strong); color: var(--text); font-style: italic; } +.ids-instructions { color: var(--text-2); font-size: 13.5px; } +.ids-failed { display: grid; gap: var(--s2); justify-items: start; } +.ids-failed .table-wrap { width: 100%; max-height: 320px; } + +/* ---------------------------------------------------------------- export */ +.export-top { display: flex; justify-content: space-between; align-items: center; gap: var(--s4); flex-wrap: wrap; } +.export-top h2 { margin: 2px 0 var(--s1); font-size: 22px; } +.out-dir { margin-top: 2px; word-break: break-all; color: var(--text-2); } +.export-top-actions { display: flex; align-items: center; gap: var(--s3); flex-wrap: wrap; } +.downloads { list-style: none; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; } +.download { display: grid; grid-template-columns: minmax(0, 1fr) 90px auto; gap: var(--s3); align-items: center; padding: var(--s3) var(--s4); } +.download + .download { border-top: 1px solid var(--border); } +.download-main { display: grid; gap: 2px; } +.download-main p { color: var(--text-2); font-size: 13.5px; max-width: 80ch; } +.download-main .file-name { color: var(--muted); font-size: 12px; margin-top: 2px; } +.download-main .file-extra { color: var(--accent); font-weight: 600; } +.file-size { text-align: right; color: var(--muted); font-variant-numeric: tabular-nums; font-size: 13px; } +.export-footer { display: flex; justify-content: space-between; gap: var(--s3); padding-top: var(--s2); } + +/* ---------------------------------------------------------- detail panel */ +.detail { position: fixed; z-index: 60; top: var(--topbar-h); right: 0; bottom: 0; width: min(var(--detail-w), 100vw); background: var(--surface); border-left: 1px solid var(--border-strong); box-shadow: var(--shadow-lg); display: flex; flex-direction: column; } +.detail-head { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--s3); padding: var(--s3) var(--s4); border-bottom: 1px solid var(--border); } +.detail-head h2 { word-break: break-word; } +.detail-body { overflow-y: auto; padding: var(--s3) var(--s4) var(--s5); display: grid; gap: var(--s4); align-content: start; } +.d-sec { display: grid; gap: var(--s2); } +.d-sec > h3 { font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); } +.d-finding { display: grid; gap: var(--s2); padding: var(--s3); border-radius: var(--radius-lg); border: 1px solid var(--border); border-left-width: 4px; background: var(--surface-2); } +.d-finding.sev-error { border-left-color: var(--error-solid); } +.d-finding.sev-warning { border-left-color: var(--warn-solid); } +.d-finding.sev-info { border-left-color: var(--info-solid); } +.d-finding.sev-error, .d-finding.sev-warning, .d-finding.sev-info { color: var(--text); } +.d-finding-head { display: flex; align-items: center; gap: var(--s2); flex-wrap: wrap; font-size: 13px; } +.d-message { font-weight: 600; } +.d-fix { color: var(--text-2); font-size: 13.5px; } +.kv { display: grid; gap: 0; margin: 0; } +.kv > div { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: var(--s2); padding: 6px 0; border-bottom: 1px solid var(--border); font-size: 13px; } +.kv > div:last-child { border-bottom: 0; } +.kv dt { color: var(--muted); } +.kv dd { margin: 0; overflow-wrap: anywhere; } +.copy-row { display: inline-flex; align-items: center; gap: var(--s2); flex-wrap: wrap; } +.empty-val { color: var(--warn); font-style: italic; } +.pset { border: 1px solid var(--border); border-radius: var(--radius); padding: 0 var(--s3); } +.pset + .pset { margin-top: var(--s2); } +.pset summary { cursor: pointer; padding: 8px 0; font-size: 13px; font-weight: 600; } +.pset[open] summary { border-bottom: 1px solid var(--border); } +.plain { list-style: none; display: grid; gap: var(--s2); font-size: 13px; } +.other-findings li { display: flex; gap: var(--s2); justify-content: space-between; align-items: baseline; } + +/* --------------------------------------------------------- tooltip, toast */ +#tooltip { position: fixed; z-index: 120; max-width: 340px; padding: 8px 12px; border-radius: var(--radius); background: var(--tip-bg); color: var(--tip-fg); font-size: 12.5px; line-height: 1.45; pointer-events: none; box-shadow: var(--shadow-lg); overflow-wrap: anywhere; } +.toasts { position: fixed; z-index: 130; right: var(--s4); bottom: var(--s4); display: grid; gap: var(--s2); max-width: min(420px, calc(100vw - 32px)); } +.toast { padding: 12px var(--s3); border-radius: var(--radius); background: var(--tip-bg); color: var(--tip-fg); box-shadow: var(--shadow-lg); font-size: 13.5px; border-left: 4px solid var(--accent); } +.toast-error { border-left-color: var(--error-solid); } +.toast-success { border-left-color: var(--pass-solid); } + +/* ------------------------------------------------------------------ assistant */ +.assistant { + position: fixed; z-index: 65; top: var(--topbar-h); right: 0; bottom: 0; width: min(var(--assistant-w), 100vw); + display: flex; flex-direction: column; background: var(--surface); border-left: 1px solid var(--border-strong); box-shadow: var(--shadow-lg); +} +.assistant-head { flex: none; display: flex; justify-content: space-between; align-items: flex-start; gap: var(--s3); padding: var(--s3) var(--s4); border-bottom: 1px solid var(--border); } +.assistant-scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: var(--s3) var(--s4); display: grid; gap: var(--s3); align-content: start; } +.as-card { display: grid; gap: var(--s2); padding: var(--s3); border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface-2); } +.as-card-head { display: flex; justify-content: space-between; align-items: center; gap: var(--s2); } +.as-card-head h3 { font-size: 14px; } +.as-state { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 650; } +.as-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--info-solid); flex: none; } +.as-state.is-ready { color: var(--pass); } +.as-state.is-ready .as-dot { background: var(--pass-solid); box-shadow: 0 0 0 3px color-mix(in srgb, var(--pass-solid) 22%, transparent); } +.as-model { font-weight: 600; font-size: 13.5px; } +.as-facts { display: grid; grid-template-columns: repeat(4, auto); justify-content: space-between; gap: 2px var(--s3); margin: 0; } +.as-facts dd { white-space: nowrap; } +.as-facts dt { font-size: 11px; text-transform: uppercase; letter-spacing: .05em; color: var(--muted); font-weight: 600; } +.as-facts dd { margin: 0; font-size: 12.5px; font-variant-numeric: tabular-nums; } +.as-explain { color: var(--text-2); font-size: 13.5px; } +.as-actions { display: flex; align-items: center; gap: var(--s2); flex-wrap: wrap; } +.as-progress { display: grid; gap: 6px; } +.as-progress .progress-track { height: 8px; } +.as-progress .progress-bar { width: 0; animation: none; transition: width .2s linear; } +.as-section { display: grid; gap: var(--s2); } +.as-label { font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); } +.as-chips { display: flex; flex-wrap: wrap; gap: 6px; } +.chip-btn { display: inline-flex; align-items: center; min-height: 30px; padding: 0 12px; border-radius: 999px; border: 1px solid var(--border-strong); background: var(--surface); color: var(--text); font-size: 12.5px; font-weight: 550; cursor: pointer; } +.chip-btn:hover:not(:disabled) { background: var(--surface-2); } +.chip-btn:disabled { opacity: .5; cursor: not-allowed; } +.chip-btn[aria-pressed="true"] { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); } +.as-convo { display: grid; gap: var(--s3); } +.as-empty { color: var(--muted); font-size: 13.5px; } +.msg { display: grid; gap: 4px; } +.msg-who { font-size: 11.5px; font-weight: 650; color: var(--muted); text-transform: uppercase; letter-spacing: .05em; } +.msg-user { justify-items: end; } +.msg-user .bubble { background: var(--text); color: var(--surface); border-radius: 14px 14px 4px 14px; max-width: 88%; } +.bubble { padding: 8px 12px; font-size: 13.5px; overflow-wrap: anywhere; white-space: pre-wrap; } +.msg-assistant .answer, .msg-error .answer { display: grid; gap: var(--s2); padding: var(--s3); border: 1px solid var(--border); border-radius: 4px 14px 14px 14px; background: var(--surface); font-size: 13.5px; } +.msg-error .answer { border-color: color-mix(in srgb, var(--error-solid) 40%, var(--border)); background: var(--error-bg); } +.msg-error .answer strong { color: var(--error); } +.answer p { white-space: pre-wrap; overflow-wrap: anywhere; } +.answer .sources { color: var(--muted); font-size: 12.5px; } +.answer .note-warn { padding: 6px 10px; border-radius: var(--radius); background: var(--warn-bg); color: var(--warn); border: 1px solid color-mix(in srgb, var(--warn-solid) 35%, transparent); font-size: 12.5px; } +.answer .note-dropped { color: var(--muted); font-size: 12.5px; font-style: italic; } +.filter-chips { display: flex; flex-wrap: wrap; gap: 6px; list-style: none; } +.filter-chips .chip b { font-weight: 650; margin-right: 4px; color: var(--muted); } +.answer-actions { display: flex; align-items: center; gap: var(--s2); flex-wrap: wrap; } +.answer-actions .done { color: var(--pass); font-size: 12.5px; font-weight: 600; } +.yaml-block { margin: 0; padding: 10px 12px; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius); font: 12px/1.55 var(--mono); max-height: 240px; overflow: auto; white-space: pre; } +.thinking { display: inline-flex; gap: 4px; align-items: center; color: var(--muted); } +.thinking i { width: 6px; height: 6px; border-radius: 50%; background: currentColor; animation: pulse 1.1s infinite ease-in-out; } +.thinking i:nth-child(2) { animation-delay: .15s; } .thinking i:nth-child(3) { animation-delay: .3s; } +.thinking span { margin-left: 6px; font-size: 13px; } +@keyframes pulse { 0%, 80%, 100% { opacity: .25; } 40% { opacity: 1; } } +.as-composer { flex: none; display: grid; gap: 6px; padding: var(--s2) var(--s4) var(--s2); border-top: 1px solid var(--border); background: var(--surface); } +.as-mode { font-size: 12px; color: var(--muted); } +.as-input-row { display: flex; gap: var(--s2); align-items: flex-end; } +.as-input-row textarea { flex: 1; min-width: 0; resize: none; min-height: 52px; max-height: 140px; padding: 8px 12px; border: 1px solid var(--border-strong); border-radius: var(--radius); background: var(--surface); font: inherit; line-height: 1.4; } +.as-input-row textarea:disabled { background: var(--surface-2); opacity: .7; } +.as-input-row .btn { min-height: 52px; } +.as-hint { font-size: 12.5px; color: var(--muted); } +.assistant-foot { flex: none; display: grid; gap: 6px; padding: var(--s2) var(--s4) var(--s3); border-top: 1px solid var(--border); background: var(--surface-2); } +.as-import-row { display: flex; gap: var(--s2); align-items: center; flex-wrap: wrap; } +.as-import-result { display: grid; gap: 6px; font-size: 12.5px; } +.as-import-result:empty { display: none; } +.as-disclaimer { font-size: 12.5px; font-weight: 600; color: var(--text-2); } + +/* ------------------------------------------------------------- demo + load */ +.dz-actions { display: flex; align-items: flex-start; gap: var(--s3); flex-wrap: wrap; justify-content: flex-end; } +.demo-cta { display: grid; gap: 6px; max-width: 230px; } +.btn-demo { border-width: 1.5px; border-color: var(--text-2); } +.btn-demo svg { flex: none; } +.demo-hint { font-size: 12.5px; color: var(--muted); line-height: 1.35; } +.dropzone.is-loaded .demo-cta { display: none; } +.sample.is-demo { grid-column: 1 / -1; flex-direction: row; align-items: center; justify-content: space-between; gap: var(--s4); border-color: var(--border-strong); } +.sample.is-demo .sample-body { display: grid; gap: var(--s2); min-width: 0; } +.sample.is-demo .sample-body p:not(.sample-meta) { flex: none; } +.sample.is-demo .btn { align-self: center; flex: none; } +.footer-about { display: block; margin-top: 4px; font-size: 12px; } +.d-explain { justify-self: start; } + +/* --------------------------------------------------------------- layout adj */ +body.assistant-open { --rside: var(--assistant-w); } +body.detail-open { --rside: var(--detail-w); } +@media (min-width: 1100px) { + body.detail-open .page, body.assistant-open .page { padding-right: calc(var(--rside) + var(--s4)); margin-left: 0; max-width: none; } + body.detail-open .page > .view, body.assistant-open .page > .view { max-width: 1280px; } + body.detail-open .footer, body.assistant-open .footer { display: none; } + /* The detail panel already shows expected/actual and the fix hint. */ + body.detail-open .failures-table .col-ea, body.detail-open .failures-table .col-fix { display: none; } +} +@media (min-width: 1100px) { body.assistant-open .toasts { right: calc(var(--assistant-w) + var(--s3)); } } +/* Wide screens: both panels side by side, the finding to the left of the assistant. */ +@media (min-width: 1500px) { + body.detail-open.assistant-open { --rside: calc(var(--detail-w) + var(--assistant-w)); } + body.assistant-open .detail { right: var(--assistant-w); } +} +/* Narrower: the assistant sits on top and the finding comes back when it closes. */ +@media (max-width: 1499px) { + body.assistant-open .detail { visibility: hidden; } +} +@media (min-width: 1280px) { .tagline { display: block; } } +@media (max-width: 1240px) { + .step-num { display: none; } + .step { padding: 0 11px; } + .toggles .segmented button { padding: 3px 8px; } +} +@media (max-width: 1120px) { + .version-pill { display: none; } +} +@media (max-width: 1100px) { + .sample-grid { grid-template-columns: 1fr 1fr; } + .facts { grid-template-columns: repeat(3, minmax(0, 1fr)); } + .settings-grid { grid-template-columns: 1fr; } +} +@media (max-width: 960px) { + :root { --topbar-h: 104px; } + .topbar-inner { flex-wrap: wrap; align-content: center; gap: var(--s2) var(--s3); } + .brand, .header-right { flex: 1 1 auto; } + .stepper { order: 3; flex: 1 1 100%; display: flex; justify-content: center; } +} +@media (max-width: 760px) { + :root { --topbar-h: 150px; } + .page { padding-inline: var(--s3); } + .topbar-inner { padding-inline: var(--s3); } + .header-right { justify-content: flex-start; flex-wrap: wrap; } + .dz-body { flex-direction: column; align-items: flex-start; padding: var(--s4); } + .dz-actions { justify-content: flex-start; } + .dz-extras { grid-template-columns: 1fr; } + .extra + .extra { border-left: 0; border-top: 1px dashed var(--border-strong); } + .sample-grid { grid-template-columns: 1fr; } + .sample.is-demo { flex-direction: column; align-items: flex-start; } + .settings-form { grid-template-columns: 1fr; } + .review-head { grid-template-columns: 1fr; justify-items: start; } + .facts { grid-template-columns: 1fr 1fr; } + .chip-row { grid-template-columns: 1fr; } + .download { grid-template-columns: 1fr auto; } + .file-size { display: none; } + .ids-meta { grid-template-columns: 1fr; } + .kv > div { grid-template-columns: 1fr; } + .export-footer { flex-direction: column-reverse; } + .detail, .assistant { top: 0; z-index: 70; } +} + +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; } +} diff --git a/src-tauri/.gitkeep b/src-tauri/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..dc56c16 --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "verimodel-desktop" +version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true +description = "VeriModel desktop app (Tauri v2): IFC QA gate, quantity takeoff and BCF export." + +[lib] +name = "verimodel_desktop_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +verimodel-core = { path = "../crates/core" } +verimodel-ifc-reader = { path = "../crates/ifc_reader" } +verimodel-assistant = { path = "../crates/assistant" } +tauri = { version = "2", features = [] } +tauri-plugin-dialog = "2" +tauri-plugin-opener = "2" +serde.workspace = true +serde_json.workspace = true +chrono.workspace = true +log = { workspace = true, features = ["std"] } + +[dev-dependencies] +tempfile.workspace = true diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 0000000..da0e161 --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,14 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Permissions of the VeriModel main window: core APIs (including drag-and-drop and app events), native file dialogs and opening files/folders with the system default app.", + "windows": ["main"], + "permissions": [ + "core:default", + "core:event:default", + "core:window:default", + "core:webview:default", + "dialog:default", + "opener:default" + ] +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000..46c9c39 Binary files /dev/null and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..88caf84 Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png new file mode 100644 index 0000000..a3cb874 Binary files /dev/null and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/64x64.png b/src-tauri/icons/64x64.png new file mode 100644 index 0000000..296bb28 Binary files /dev/null and b/src-tauri/icons/64x64.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..349db3d Binary files /dev/null and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..c15571f Binary files /dev/null and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..dfb3412 Binary files /dev/null and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..856b28c Binary files /dev/null and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..0d3d12e Binary files /dev/null and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..6bf8905 Binary files /dev/null and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..1dd7674 Binary files /dev/null and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..763dabd Binary files /dev/null and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..1a5dc4c Binary files /dev/null and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..54eb3ac Binary files /dev/null and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 0000000..790531d Binary files /dev/null and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000..51f93c1 Binary files /dev/null and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000..bcdc2c8 Binary files /dev/null and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/src/assistant.rs b/src-tauri/src/assistant.rs new file mode 100644 index 0000000..31a5478 --- /dev/null +++ b/src-tauri/src/assistant.rs @@ -0,0 +1,281 @@ +//! Plain, Tauri-free helpers behind the assistant commands, so they can be unit-tested +//! without launching a window. +//! +//! The assistant is a read-only copilot: nothing here touches verdicts, scores or quantities. + +use std::path::PathBuf; + +use serde::{Deserialize, Serialize}; +use verimodel_assistant::model::ModelStatus; +use verimodel_assistant::{Assistant, AssistantError, Knowledge}; +use verimodel_core::model::RunReport; + +use crate::error::AppError; + +/// Event name the UI listens to for model download progress: `{ done, total }`. +pub const DOWNLOAD_PROGRESS_EVENT: &str = "assistant://download-progress"; + +/// What the UI receives from `app_info`. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct AppInfo { + pub name: String, + pub version: String, +} + +pub fn app_info() -> AppInfo { + AppInfo { + name: verimodel_core::TOOL_NAME.to_string(), + version: verimodel_core::VERSION.to_string(), + } +} + +/// `ModelStatus` plus whether the model is currently loaded in memory. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct AssistantStatus { + #[serde(flatten)] + pub status: ModelStatus, + pub loaded: bool, +} + +/// Result of importing documentation. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ImportSummary { + pub files_read: Vec, + pub skipped: Vec, + pub chunks_added: usize, + /// The knowledge converted by this import, as `knowledge.yaml` text (for "Save knowledge.yaml"). + pub knowledge_yaml: String, +} + +/// The three sources of what the assistant can retrieve, kept apart so that a new run +/// replaces the previous report's chunks without touching the built-in docs or the +/// documentation the user imported. +#[derive(Debug, Clone, Default)] +pub struct KnowledgeParts { + builtin: Knowledge, + imported: Knowledge, + report: Knowledge, +} + +impl KnowledgeParts { + pub fn new(builtin: Knowledge) -> Self { + Self { + builtin, + imported: Knowledge::default(), + report: Knowledge::default(), + } + } + + /// Replace the report chunks with those of `report`. + pub fn set_report(&mut self, report: &RunReport) { + let mut k = Knowledge::default(); + k.add_report(report); + self.report = k; + } + + /// Add imported documentation. Returns the number of chunks added. + pub fn add_imported(&mut self, k: Knowledge) -> usize { + let n = k.chunks.len(); + self.imported.extend(k); + n + } + + /// Imported documentation only, as `knowledge.yaml` text. + pub fn imported_yaml(&self) -> String { + self.imported.to_yaml() + } + + /// builtin + imported + current report. + pub fn combined(&self) -> Knowledge { + let mut k = self.builtin.clone(); + k.extend(self.imported.clone()); + k.extend(self.report.clone()); + k + } +} + +/// Map an assistant error to the UI error shape. +pub fn app_error(e: AssistantError) -> AppError { + log::error!("assistant error: {e}"); + let code = match &e { + AssistantError::ModelNotInstalled => "assistant_not_installed", + AssistantError::Download(_) => "assistant_download", + AssistantError::Checksum(_) => "assistant_checksum", + AssistantError::Load(_) => "assistant_load", + AssistantError::Generation(_) => "assistant_generation", + AssistantError::Convert(_) => "assistant_convert", + AssistantError::NoBackend => "assistant_no_backend", + AssistantError::Other(_) => "assistant_error", + }; + AppError::new(code, e.to_string(), e.hint()) +} + +/// Load the model with the given knowledge (blocking: reads the model file). +pub fn load_assistant( + app_data: &std::path::Path, + knowledge: Knowledge, +) -> Result { + Assistant::load(app_data, knowledge).map_err(app_error) +} + +/// Turn the UI's path strings into `PathBuf`s, dropping blanks. +pub fn to_paths(paths: &[String]) -> Vec { + paths + .iter() + .filter(|p| !p.trim().is_empty()) + .map(PathBuf::from) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + use verimodel_assistant::{Chunk, Task}; + + fn chunk(source: &str, title: &str) -> Chunk { + Chunk { + source: source.into(), + title: title.into(), + text: "t".into(), + keywords: vec![], + } + } + + fn kn(chunks: Vec) -> Knowledge { + Knowledge { chunks } + } + + fn report_named(name: &str) -> RunReport { + let mut r = RunReport::default(); + r.model.file_name = name.into(); + r + } + + #[test] + fn rebuild_keeps_builtin_and_imported_and_replaces_the_report() { + let mut parts = KnowledgeParts::new(kn(vec![chunk("docs/RULES.md", "Rules")])); + assert_eq!(parts.combined().chunks.len(), 1); + + assert_eq!( + parts.add_imported(kn(vec![ + chunk("bep.docx", "Naming"), + chunk("bep.docx", "Psets") + ])), + 2 + ); + assert_eq!(parts.combined().chunks.len(), 3); + + parts.set_report(&report_named("a.ifc")); + let first = parts.combined(); + assert!(first.chunks.iter().any(|c| c.source == "report:a.ifc")); + let with_a = first.chunks.len(); + + parts.set_report(&report_named("b.ifc")); + let second = parts.combined(); + assert!( + !second.chunks.iter().any(|c| c.source == "report:a.ifc"), + "previous report chunks are gone" + ); + assert!(second.chunks.iter().any(|c| c.source == "report:b.ifc")); + assert_eq!( + second.chunks.len(), + with_a, + "same shape of report, same chunk count" + ); + assert!(second.chunks.iter().any(|c| c.source == "docs/RULES.md")); + assert_eq!( + second + .chunks + .iter() + .filter(|c| c.source == "bep.docx") + .count(), + 2 + ); + } + + #[test] + fn imported_yaml_round_trips_and_excludes_builtin_and_report() { + let mut parts = KnowledgeParts::new(kn(vec![chunk("docs/RULES.md", "Rules")])); + parts.add_imported(kn(vec![chunk("bep.md", "Naming")])); + parts.set_report(&report_named("a.ifc")); + let back = Knowledge::from_yaml(&parts.imported_yaml()).unwrap(); + assert_eq!(back.chunks.len(), 1); + assert_eq!(back.chunks[0].source, "bep.md"); + } + + #[test] + fn model_not_installed_maps_to_code_and_hint() { + let e = app_error(AssistantError::ModelNotInstalled); + assert_eq!(e.code, "assistant_not_installed"); + assert!(e.message.contains("not installed")); + assert!(e.hint.contains("Download model")); + } + + #[test] + fn app_info_reports_name_and_version() { + let i = app_info(); + assert_eq!(i.name, "VeriModel"); + assert!(!i.version.is_empty()); + } + + #[test] + fn task_json_round_trips_with_the_shapes_the_ui_sends() { + let filter = serde_json::json!({ + "kind": "filter", + "question": "errors on level 1", + "context": { "rule_ids": ["CL-001"], "storeys": ["Level 1"], "ifc_types": ["IfcWall"], "severities": ["ERROR", "WARNING"] } + }); + let t: Task = serde_json::from_value(filter.clone()).unwrap(); + assert!(matches!(t, Task::Filter { .. })); + assert_eq!(serde_json::to_value(&t).unwrap(), filter); + + let explain = serde_json::json!({ + "kind": "explain", + "finding": { + "rule_id": "ID-002", "severity": "ERROR", "global_id": "1x2y3z", "step_id": 776, "ifc_type": "IfcDoor", + "name": "DR-104", "storey": "Level 1", "message": "bad id", "expected": "22 chars", "actual": "x", + "fix_hint": "re-export", "source": { "kind": "rule_pack", "pack": "generic" } + }, + "rule": null + }); + let t: Task = serde_json::from_value(explain).unwrap(); + match &t { + Task::Explain { finding, rule } => { + assert_eq!(finding.rule_id, "ID-002"); + assert!(rule.is_none()); + } + other => panic!("wrong task {other:?}"), + } + let again: Task = serde_json::from_value(serde_json::to_value(&t).unwrap()).unwrap(); + assert_eq!(again, t); + + for v in [ + serde_json::json!({ "kind": "config_help", "question": "q", "current_yaml": null }), + serde_json::json!({ "kind": "draft_rules", "requirements_text": "walls need FireRating" }), + serde_json::json!({ "kind": "ask", "question": "what is IDS?" }), + ] { + let t: Task = serde_json::from_value(v.clone()).unwrap(); + assert_eq!(serde_json::to_value(&t).unwrap(), v); + } + } + + #[test] + fn status_serialises_flat_with_loaded_flag() { + let s = AssistantStatus { + status: verimodel_assistant::model::status(std::path::Path::new("/nonexistent")), + loaded: false, + }; + let v = serde_json::to_value(&s).unwrap(); + assert_eq!(v["installed"], false); + assert_eq!(v["loaded"], false); + assert!(v["name"].is_string() && v["license"].is_string()); + } + + #[test] + fn blank_paths_are_dropped() { + assert_eq!( + to_paths(&["a.md".into(), " ".into()]), + vec![PathBuf::from("a.md")] + ); + } +} diff --git a/src-tauri/src/error.rs b/src-tauri/src/error.rs new file mode 100644 index 0000000..2f521e8 --- /dev/null +++ b/src-tauri/src/error.rs @@ -0,0 +1,151 @@ +//! Error type sent to the UI: plain language only, never a Debug dump. +//! Technical detail goes to the log file instead. + +use serde::Serialize; +use verimodel_core::CoreError; +use verimodel_ifc_reader::ReaderError; + +/// What the frontend receives when a command fails. +#[derive(Debug, Clone, Serialize, PartialEq, Eq)] +pub struct AppError { + /// Stable machine code, e.g. "ifc_not_found", "config_invalid". + pub code: String, + /// What went wrong, in plain language. + pub message: String, + /// What the user can do about it (may be empty). + pub hint: String, +} + +impl AppError { + pub fn new(code: &str, message: impl Into, hint: impl Into) -> Self { + Self { + code: code.to_string(), + message: message.into(), + hint: hint.into(), + } + } + + pub fn file_missing(what: &str, path: &str) -> Self { + Self::new( + "file_not_found", + format!("{what} not found: {path}"), + "Check that the file still exists, or choose it again.", + ) + } + + pub fn internal(detail: impl std::fmt::Display) -> Self { + log::error!("internal error: {detail}"); + Self::new( + "internal", + "Something unexpected went wrong inside VeriModel.", + "Try again. If it keeps happening, send the log file (Help > Open log folder) to the maintainers.", + ) + } +} + +impl std::fmt::Display for AppError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&self.message) + } +} + +impl From for AppError { + fn from(e: ReaderError) -> Self { + log::error!( + "reader error [{}]: {} (hint: {})", + e.code, + e.message, + e.hint + ); + AppError { + code: e.code, + message: e.message, + hint: e.hint, + } + } +} + +impl From for AppError { + fn from(e: CoreError) -> Self { + log::error!("core error: {e:?}"); + let (code, hint) = match &e { + CoreError::Config(_) => ( + "config_invalid", + "Open the Project settings and fix the highlighted problem.", + ), + CoreError::RulePack(_) => ( + "rule_pack_invalid", + "Check the custom rule pack referenced in the project settings.", + ), + CoreError::Io(_) => ( + "io_error", + "Check that the file exists and that you can read and write that folder.", + ), + CoreError::Report(_) => ( + "report_error", + "Choose another output folder and run the check again.", + ), + CoreError::Bcf(_) => ( + "bcf_error", + "Choose another output folder and run the check again.", + ), + CoreError::Qto(_) => ( + "qto_error", + "Check the unit rates file and the quantity takeoff settings.", + ), + CoreError::Other(_) => ("error", ""), + }; + AppError::new(code, e.to_string(), hint) + } +} + +impl From for AppError { + fn from(e: std::io::Error) -> Self { + log::error!("io error: {e:?}"); + AppError::new( + "io_error", + format!("File problem: {e}"), + "Check the path and your permissions.", + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn core_error_maps_to_code_and_plain_message() { + let e: AppError = CoreError::Config("bad yaml".into()).into(); + assert_eq!(e.code, "config_invalid"); + assert!(e.message.contains("bad yaml")); + assert!( + !e.message.contains("Config("), + "no Debug output in messages" + ); + assert!(!e.hint.is_empty()); + } + + #[test] + fn reader_error_keeps_code_message_hint() { + let e: AppError = ReaderError { + code: "python_missing".into(), + message: "No Python".into(), + hint: "Install it".into(), + } + .into(); + assert_eq!( + (e.code.as_str(), e.message.as_str(), e.hint.as_str()), + ("python_missing", "No Python", "Install it") + ); + } + + #[test] + fn serialises_to_three_fields() { + let v = serde_json::to_value(AppError::new("c", "m", "h")).unwrap(); + assert_eq!( + v, + serde_json::json!({"code": "c", "message": "m", "hint": "h"}) + ); + } +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000..a606788 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,456 @@ +//! VeriModel desktop shell (Tauri v2). +//! +//! The window is a static HTML UI (`../frontend`) that talks to this crate through +//! the commands below. Every command is a thin wrapper around a plain function in +//! [`ops`], which is unit-tested without launching Tauri. +//! +//! Commands (argument names are snake_case on the JavaScript side too, e.g. +//! `invoke("run_check", { ifc_path, ids_path, config_yaml, out_dir })`): +//! +//! | command | returns | +//! |---|---| +//! | `inspect_file(path)` | `FileCard` | +//! | `run_check(ifc_path, ids_path?, config_yaml?, out_dir?, config_dir?)` | `RunOutcome` | +//! | `get_element(global_id)` | `Element` of the last run | +//! | `list_runs(root?)` | `RunLedger[]` | +//! | `default_config_yaml()` | `string` | +//! | `validate_config_yaml(yaml)` | `{ ok, error }` | +//! | `list_examples()` | `Example[]` | +//! | `open_path(path)` | `void` | +//! | `save_text_file(path, contents)` | `void` | +//! | `read_text_file(path)` | `string` (a project.yaml; remembers its folder for relative paths) | +//! | `app_info()` | `{ name, version }` | +//! | `assistant_status()` | `ModelStatus` + `{ loaded }` | +//! | `assistant_download_model()` | `ModelStatus` (emits `assistant://download-progress` `{ done, total }`) | +//! | `assistant_remove_model()` | `ModelStatus` | +//! | `assistant_ask(task)` | `Answer` (task is the JSON of `verimodel_assistant::Task`, tagged `kind`) | +//! | `assistant_import_docs(paths)` | `{ files_read, skipped, chunks_added, knowledge_yaml }` | +//! | `assistant_knowledge_yaml()` | `string` (imported documentation as knowledge.yaml) | +//! +//! The assistant is a read-only copilot: it never takes part in a verdict, score or quantity. +//! +//! Errors are `{ code, message, hint }` and never contain Debug output. + +pub mod assistant; +pub mod error; +pub mod logging; +pub mod ops; + +use std::path::{Path, PathBuf}; +use std::sync::{Arc, Mutex}; + +use tauri::path::BaseDirectory; +use tauri::{AppHandle, Emitter, Manager, State}; +use tauri_plugin_opener::OpenerExt; +use verimodel_assistant::model::{self as assistant_model, DEFAULT_MODEL}; +use verimodel_assistant::{Answer, Assistant, Knowledge, Task}; +use verimodel_core::model::{Element, Model, RunLedger}; +use verimodel_core::run::RunOutcome; + +use crate::assistant::{ + AppInfo, AssistantStatus, ImportSummary, KnowledgeParts, DOWNLOAD_PROGRESS_EVENT, +}; +use crate::error::AppError; +use crate::ops::{Example, ExampleRoots, FileCard, RunRequest, ValidationResult}; + +/// Managed state: the model of the last run, for the element detail panel. +#[derive(Default)] +pub struct AppState { + last_model: Arc>>, + /// Folder of the last text file read through `read_text_file` (a project.yaml). The UI + /// sends the config as text, so this is where its relative paths (rates CSV, IDS, rule + /// pack) resolve from. + last_config_dir: Mutex>, +} + +/// Managed state of the assistant: the loaded model (lazy) and what it can retrieve. +pub struct AssistantState { + /// `None` until the first question; reset when the model is downloaded or removed. + assistant: Mutex>, + /// Built-in docs + imported documentation + the current report, kept apart. + knowledge: Mutex, +} + +impl Default for AssistantState { + fn default() -> Self { + Self { + assistant: Mutex::new(None), + knowledge: Mutex::new(KnowledgeParts::new(Knowledge::builtin())), + } + } +} + +impl AssistantState { + /// Push the rebuilt knowledge into the loaded assistant (if any). + fn sync_loaded(&self, knowledge: Knowledge) { + if let Ok(mut a) = self.assistant.lock() { + if let Some(a) = a.as_mut() { + *a.knowledge_mut() = knowledge; + } + } + } +} + +fn app_data(app: &AppHandle) -> Result { + app.path().app_data_dir().map_err(|e| { + AppError::new( + "no_data_dir", + "VeriModel cannot find its data folder.", + format!("Details were written to the log: {e}"), + ) + }) +} + +fn runs_root(app: &AppHandle) -> Result { + let base = app.path().app_data_dir().map_err(|e| { + AppError::new( + "no_data_dir", + "VeriModel cannot find its data folder.", + format!("Details were written to the log: {e}"), + ) + })?; + Ok(base.join("runs")) +} + +async fn blocking(f: F) -> Result +where + T: Send + 'static, + F: FnOnce() -> Result + Send + 'static, +{ + tauri::async_runtime::spawn_blocking(f) + .await + .map_err(|e| AppError::internal(format!("background task failed: {e}")))? +} + +#[tauri::command(rename_all = "snake_case")] +async fn inspect_file(path: String) -> Result { + blocking(move || ops::inspect_file(&path)).await +} + +#[tauri::command(rename_all = "snake_case")] +async fn run_check( + app: AppHandle, + state: State<'_, AppState>, + ifc_path: String, + ids_path: Option, + config_yaml: Option, + out_dir: Option, + config_dir: Option, +) -> Result { + let ifc = PathBuf::from(&ifc_path); + let out = match out_dir.filter(|s| !s.trim().is_empty()) { + Some(d) => PathBuf::from(d), + None => ops::default_out_dir(&runs_root(&app)?, &ifc, &ops::timestamp_now()), + }; + let req = RunRequest { + ifc_path: ifc, + ids_path: ids_path.filter(|s| !s.trim().is_empty()).map(PathBuf::from), + config_yaml, + config_dir: config_dir + .filter(|s| !s.trim().is_empty()) + .map(PathBuf::from) + .or_else(|| state.last_config_dir.lock().ok().and_then(|g| g.clone())), + out_dir: out, + }; + let slot = Arc::clone(&state.last_model); + let handle = app.clone(); + blocking(move || { + let (outcome, model) = ops::run_check_blocking(&req)?; + if let Ok(mut guard) = slot.lock() { + *guard = Some(model); + } + // The assistant can now answer questions about this report (replacing the previous one). + let assist = handle.state::(); + let combined = assist.knowledge.lock().ok().map(|mut k| { + k.set_report(&outcome.report); + k.combined() + }); + if let Some(k) = combined { + assist.sync_loaded(k); + } + Ok(outcome) + }) + .await +} + +#[tauri::command(rename_all = "snake_case")] +fn get_element(state: State<'_, AppState>, global_id: String) -> Result { + let guard = state + .last_model + .lock() + .map_err(|_| AppError::internal("model lock poisoned"))?; + let model = guard.as_ref().ok_or_else(|| { + AppError::new( + "no_model", + "No model has been checked yet.", + "Run a check first, then select an element.", + ) + })?; + model.element_by_id(&global_id).cloned().ok_or_else(|| { + AppError::new( + "element_not_found", + format!("Element {global_id} is not in the last checked model."), + "Run the check again.", + ) + }) +} + +#[tauri::command(rename_all = "snake_case")] +async fn list_runs(app: AppHandle, root: Option) -> Result, AppError> { + let root = match root.filter(|s| !s.trim().is_empty()) { + Some(r) => PathBuf::from(r), + None => runs_root(&app)?, + }; + blocking(move || Ok(verimodel_core::run::list_runs(&root)?)).await +} + +#[tauri::command(rename_all = "snake_case")] +fn default_config_yaml() -> String { + ops::default_config_yaml() +} + +#[tauri::command(rename_all = "snake_case")] +fn validate_config_yaml(yaml: String) -> ValidationResult { + ops::validate_config_yaml(&yaml) +} + +/// Resource folders of the installed app, if the bundle has them. +fn bundled_roots(app: &AppHandle) -> Option { + let examples = app + .path() + .resolve("examples", BaseDirectory::Resource) + .ok()?; + let fixtures = app + .path() + .resolve("fixtures", BaseDirectory::Resource) + .ok()?; + Some(ExampleRoots { examples, fixtures }) +} + +#[tauri::command(rename_all = "snake_case")] +fn list_examples(app: AppHandle) -> Vec { + let dev_root = Path::new(env!("CARGO_MANIFEST_DIR")) + .parent() + .unwrap_or_else(|| Path::new(".")); + let roots = ops::resolve_roots(bundled_roots(&app), dev_root); + ops::list_examples_in(&roots) +} + +#[tauri::command(rename_all = "snake_case")] +fn open_path(app: AppHandle, path: String) -> Result<(), AppError> { + if !Path::new(&path).exists() { + return Err(AppError::file_missing("File or folder", &path)); + } + app.opener().open_path(&path, None::<&str>).map_err(|e| { + log::error!("open_path failed for {path}: {e:?}"); + AppError::new( + "open_failed", + format!("Could not open {path}."), + "Open it from your file manager instead.", + ) + }) +} + +#[tauri::command(rename_all = "snake_case")] +fn save_text_file(path: String, contents: String) -> Result<(), AppError> { + ops::save_text_file(&path, &contents) +} + +#[tauri::command(rename_all = "snake_case")] +fn read_text_file(state: State<'_, AppState>, path: String) -> Result { + let text = ops::read_text_file(&path)?; + if let (Some(dir), Ok(mut slot)) = (Path::new(&path).parent(), state.last_config_dir.lock()) { + *slot = Some(dir.to_path_buf()); + } + Ok(text) +} + +// --------------------------------------------------------------------------------------------- +// Assistant (optional, local, read-only) +// --------------------------------------------------------------------------------------------- + +#[tauri::command(rename_all = "snake_case")] +fn app_info() -> AppInfo { + assistant::app_info() +} + +fn status_now(app: &AppHandle, state: &AssistantState) -> Result { + let loaded = state.assistant.lock().map(|a| a.is_some()).unwrap_or(false); + Ok(AssistantStatus { + status: assistant_model::status(&app_data(app)?), + loaded, + }) +} + +#[tauri::command(rename_all = "snake_case")] +fn assistant_status( + app: AppHandle, + state: State<'_, AssistantState>, +) -> Result { + status_now(&app, &state) +} + +#[tauri::command(rename_all = "snake_case")] +async fn assistant_download_model(app: AppHandle) -> Result { + let data = app_data(&app)?; + let handle = app.clone(); + blocking(move || { + let spec = DEFAULT_MODEL.clone(); + let mut last_emit = std::time::Instant::now() - std::time::Duration::from_secs(1); + let mut last_done = 0u64; + let mut progress = |done: u64, total: Option| { + let total = total.unwrap_or(spec.gguf_size_bytes); + // About 5 events a second at most; always emit the last one. + if done < total + && last_emit.elapsed().as_millis() < 200 + && done.saturating_sub(last_done) < total / 100 + { + return; + } + last_emit = std::time::Instant::now(); + last_done = done; + let _ = handle.emit( + DOWNLOAD_PROGRESS_EVENT, + serde_json::json!({ "done": done, "total": total }), + ); + }; + let status = + assistant_model::download(&data, &spec, &mut progress).map_err(assistant::app_error)?; + let state = handle.state::(); + if let Ok(mut a) = state.assistant.lock() { + *a = None; // reload the fresh files on the next question + } + Ok(AssistantStatus { + status, + loaded: false, + }) + }) + .await +} + +#[tauri::command(rename_all = "snake_case")] +async fn assistant_remove_model(app: AppHandle) -> Result { + let data = app_data(&app)?; + let handle = app.clone(); + blocking(move || { + let state = handle.state::(); + if let Ok(mut a) = state.assistant.lock() { + *a = None; // release the model before deleting its files + } + assistant_model::remove(&data, &DEFAULT_MODEL).map_err(assistant::app_error)?; + Ok(AssistantStatus { + status: assistant_model::status(&data), + loaded: false, + }) + }) + .await +} + +#[tauri::command(rename_all = "snake_case")] +async fn assistant_ask(app: AppHandle, task: Task) -> Result { + let data = app_data(&app)?; + let handle = app.clone(); + blocking(move || { + let state = handle.state::(); + let mut slot = state + .assistant + .lock() + .map_err(|_| AppError::internal("assistant lock poisoned"))?; + if slot.is_none() { + let knowledge = state + .knowledge + .lock() + .map_err(|_| AppError::internal("knowledge lock poisoned"))? + .combined(); + *slot = Some(assistant::load_assistant(&data, knowledge)?); + } + let a = slot + .as_mut() + .ok_or_else(|| AppError::internal("assistant missing after load"))?; + a.run(&task).map_err(assistant::app_error) + }) + .await +} + +#[tauri::command(rename_all = "snake_case")] +async fn assistant_import_docs( + app: AppHandle, + paths: Vec, +) -> Result { + let paths = assistant::to_paths(&paths); + let handle = app.clone(); + blocking(move || { + let report = + verimodel_assistant::convert::convert_paths(&paths).map_err(assistant::app_error)?; + let knowledge_yaml = report.knowledge.to_yaml(); + let state = handle.state::(); + let (chunks_added, combined) = { + let mut parts = state + .knowledge + .lock() + .map_err(|_| AppError::internal("knowledge lock poisoned"))?; + let n = parts.add_imported(report.knowledge); + (n, parts.combined()) + }; + state.sync_loaded(combined); + Ok(ImportSummary { + files_read: report.files_read, + skipped: report.skipped, + chunks_added, + knowledge_yaml, + }) + }) + .await +} + +#[tauri::command(rename_all = "snake_case")] +fn assistant_knowledge_yaml(state: State<'_, AssistantState>) -> Result { + let parts = state + .knowledge + .lock() + .map_err(|_| AppError::internal("knowledge lock poisoned"))?; + Ok(parts.imported_yaml()) +} + +/// Start the app. +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_opener::init()) + .manage(AppState::default()) + .manage(AssistantState::default()) + .setup(|app| { + if let Ok(dir) = app.path().app_log_dir() { + if let Some(p) = logging::init(&dir) { + log::info!( + "{} {} started, log file {}", + verimodel_core::TOOL_NAME, + verimodel_core::VERSION, + p.display() + ); + } + } + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + inspect_file, + run_check, + get_element, + list_runs, + default_config_yaml, + validate_config_yaml, + list_examples, + open_path, + save_text_file, + read_text_file, + app_info, + assistant_status, + assistant_download_model, + assistant_remove_model, + assistant_ask, + assistant_import_docs, + assistant_knowledge_yaml, + ]) + .run(tauri::generate_context!()) + .expect("error while running VeriModel"); +} diff --git a/src-tauri/src/logging.rs b/src-tauri/src/logging.rs new file mode 100644 index 0000000..ebcead8 --- /dev/null +++ b/src-tauri/src/logging.rs @@ -0,0 +1,84 @@ +//! A tiny file logger (no extra dependency). Technical detail (what the UI must +//! not show) lands in `/verimodel.log`. + +use std::fs::{File, OpenOptions}; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::sync::Mutex; + +use log::{LevelFilter, Log, Metadata, Record}; + +struct FileLogger { + file: Mutex, + level: LevelFilter, +} + +impl Log for FileLogger { + fn enabled(&self, m: &Metadata) -> bool { + m.level() <= self.level + } + + fn log(&self, r: &Record) { + if !self.enabled(r.metadata()) { + return; + } + let line = format!( + "{} {:<5} {} - {}\n", + chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f"), + r.level(), + r.target(), + r.args() + ); + if cfg!(debug_assertions) { + eprint!("{line}"); + } + if let Ok(mut f) = self.file.lock() { + let _ = f.write_all(line.as_bytes()); + } + } + + fn flush(&self) { + if let Ok(mut f) = self.file.lock() { + let _ = f.flush(); + } + } +} + +/// Install the logger writing to `/verimodel.log`. Returns the log path. +/// Failing to log never stops the app: on error the app simply runs without a log file. +pub fn init(dir: &Path) -> Option { + std::fs::create_dir_all(dir).ok()?; + let path = dir.join("verimodel.log"); + let file = OpenOptions::new() + .create(true) + .append(true) + .open(&path) + .ok()?; + let level = if cfg!(debug_assertions) { + LevelFilter::Debug + } else { + LevelFilter::Info + }; + let logger = FileLogger { + file: Mutex::new(file), + level, + }; + log::set_boxed_logger(Box::new(logger)).ok()?; + log::set_max_level(level); + Some(path) +} + +#[cfg(test)] +mod tests { + #[test] + fn init_creates_log_file() { + let dir = tempfile::tempdir().unwrap(); + let p = super::init(&dir.path().join("logs")); + // set_boxed_logger can only succeed once per process; both outcomes are fine. + if let Some(p) = p { + log::info!("hello from test"); + log::logger().flush(); + assert!(p.is_file()); + } + } +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..8fbec53 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,6 @@ +// Prevents an extra console window on Windows in release builds. +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + verimodel_desktop_lib::run() +} diff --git a/src-tauri/src/ops.rs b/src-tauri/src/ops.rs new file mode 100644 index 0000000..4488474 --- /dev/null +++ b/src-tauri/src/ops.rs @@ -0,0 +1,658 @@ +//! Plain, Tauri-free functions behind the commands, so they can be unit-tested +//! without launching a window. + +use std::collections::BTreeMap; +use std::path::{Path, PathBuf}; +use std::time::Instant; + +use serde::{Deserialize, Serialize}; +use verimodel_core::config::Config; +use verimodel_core::model::{Model, ModelInfo, UnitSystem}; +use verimodel_core::run::{self, RunInputs, RunOutcome}; +use verimodel_ifc_reader::ReadOptions; + +use crate::error::AppError; + +// --------------------------------------------------------------------------------------------- +// File card +// --------------------------------------------------------------------------------------------- + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct CardUnits { + /// "metric" or "imperial". + pub system: String, + /// Length unit as declared in the file, e.g. "MILLIMETRE" (null when not declared). + pub length_unit: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct FileCard { + pub file_name: String, + pub path: String, + pub size_bytes: u64, + pub sha256: String, + pub sha256_short: String, + pub schema: String, + pub element_count: usize, + pub units: CardUnits, + pub disciplines: Vec, + pub storeys: Vec, + pub type_counts: BTreeMap, + pub reader_warnings: Vec, +} + +/// Build the file card from what the reader found. Fills size and hash from the +/// file itself when the reader left them empty. +pub fn build_file_card(path: &Path, info: &ModelInfo) -> FileCard { + let size_bytes = if info.file_size_bytes > 0 { + info.file_size_bytes + } else { + std::fs::metadata(path).map(|m| m.len()).unwrap_or(0) + }; + let sha256 = if info.sha256.is_empty() { + verimodel_core::hash::sha256_file(path).unwrap_or_default() + } else { + info.sha256.clone() + }; + let file_name = if info.file_name.is_empty() { + path.file_name() + .map(|s| s.to_string_lossy().to_string()) + .unwrap_or_default() + } else { + info.file_name.clone() + }; + FileCard { + file_name, + path: path.display().to_string(), + size_bytes, + sha256_short: verimodel_core::hash::short(&sha256), + sha256, + schema: info.schema.clone(), + element_count: info.element_count, + units: CardUnits { + system: match info.units.system { + UnitSystem::Metric => "metric".into(), + UnitSystem::Imperial => "imperial".into(), + }, + length_unit: info.units.length_unit.clone(), + }, + disciplines: info.disciplines.clone(), + storeys: info.storeys.clone(), + type_counts: info.type_counts.clone(), + reader_warnings: info.reader_warnings.clone(), + } +} + +pub fn inspect_file(path: &str) -> Result { + let p = Path::new(path); + if !p.is_file() { + return Err(AppError::file_missing("IFC file", path)); + } + let info = verimodel_ifc_reader::inspect(p)?; + Ok(build_file_card(p, &info)) +} + +// --------------------------------------------------------------------------------------------- +// Config +// --------------------------------------------------------------------------------------------- + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ValidationResult { + pub ok: bool, + pub error: Option, +} + +pub fn default_config_yaml() -> String { + let body = Config::default().to_yaml().unwrap_or_default(); + format!("# VeriModel project settings. Every key is optional; removed keys fall back to these defaults.\n{body}") +} + +pub fn validate_config_yaml(yaml: &str) -> ValidationResult { + match Config::from_yaml(yaml) { + Ok(_) => ValidationResult { + ok: true, + error: None, + }, + Err(e) => ValidationResult { + ok: false, + error: Some(e.to_string()), + }, + } +} + +/// Parse the config given by the UI, or the defaults when there is none (or it is blank). +pub fn parse_config(yaml: Option<&str>) -> Result { + match yaml { + Some(t) if !t.trim().is_empty() => Ok(Config::from_yaml(t)?), + _ => Ok(Config::default()), + } +} + +// --------------------------------------------------------------------------------------------- +// Runs +// --------------------------------------------------------------------------------------------- + +/// `/-`. +pub fn default_out_dir(runs_root: &Path, ifc_path: &Path, stamp: &str) -> PathBuf { + let stem = ifc_path + .file_stem() + .map(|s| s.to_string_lossy().to_string()) + .unwrap_or_else(|| "model".into()); + let safe: String = stem + .chars() + .map(|c| { + if c.is_alphanumeric() || c == '-' || c == '_' || c == '.' { + c + } else { + '_' + } + }) + .collect(); + runs_root.join(format!("{safe}-{stamp}")) +} + +pub fn timestamp_now() -> String { + chrono::Local::now().format("%Y%m%d-%H%M%S").to_string() +} + +pub struct RunRequest { + pub ifc_path: PathBuf, + pub ids_path: Option, + pub config_yaml: Option, + /// Folder relative paths inside the config resolve against (rates CSV, rule pack, IDS). + pub config_dir: Option, + pub out_dir: PathBuf, +} + +/// Read the model (geometry on), evaluate, write the out folder. Returns the outcome +/// and the model so the caller can keep it for the element detail panel. +pub fn run_check_blocking(req: &RunRequest) -> Result<(RunOutcome, Model), AppError> { + let started = Instant::now(); + if !req.ifc_path.is_file() { + return Err(AppError::file_missing( + "IFC file", + &req.ifc_path.display().to_string(), + )); + } + let config = parse_config(req.config_yaml.as_deref())?; + // An explicit IDS wins; otherwise use requirements.ids_file from the config. + let ids_path = req + .ids_path + .clone() + .or_else(|| config.ids_path(req.config_dir.as_deref())); + if let Some(ids) = &ids_path { + if !ids.is_file() { + return Err(AppError::file_missing( + "IDS file", + &ids.display().to_string(), + )); + } + } + let opts = ReadOptions { + ids_path: ids_path.clone(), + geometry: true, + ..Default::default() + }; + log::info!("run_check: reading {}", req.ifc_path.display()); + let model = verimodel_ifc_reader::read_model(&req.ifc_path, &opts)?; + let inputs = RunInputs { + ifc_path: req.ifc_path.clone(), + ids_path, + config_path: None, + config_dir: req.config_dir.clone(), + out_dir: req.out_dir.clone(), + started: Some(started), + }; + let outcome = run::execute(&model, &config, &inputs)?; + log::info!( + "run_check: done verdict={:?} score={} out={}", + outcome.report.summary.verdict, + outcome.report.summary.score, + outcome.out_dir.display() + ); + Ok((outcome, model)) +} + +// --------------------------------------------------------------------------------------------- +// Examples +// --------------------------------------------------------------------------------------------- + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct Example { + pub id: String, + pub name: String, + pub description: String, + pub ifc_path: String, + /// `null` when the example project file is not present. + pub config_path: Option, + /// `null` when the sample IDS is not present. + pub ids_path: Option, +} + +/// Where the example project files and sample IFC files live. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ExampleRoots { + /// Folder containing `residential/`, `office/`, `infrastructure/`, `sample.ids`. + pub examples: PathBuf, + /// Folder containing the `*.ifc` sample files. + pub fixtures: PathBuf, +} + +/// Pick the bundled resource folders when they exist (installed app), otherwise the +/// repository folders (development). `dev_root` is the repository root. +pub fn resolve_roots(bundled: Option, dev_root: &Path) -> ExampleRoots { + if let Some(b) = bundled { + if b.examples.is_dir() && b.fixtures.is_dir() { + return b; + } + } + ExampleRoots { + examples: dev_root.join("examples"), + fixtures: dev_root.join("tests").join("fixtures"), + } +} + +struct ExampleDef { + id: &'static str, + name: &'static str, + description: &'static str, + ifc: &'static str, +} + +const EXAMPLE_DEFS: [ExampleDef; 3] = [ + ExampleDef { + id: "residential", + name: "Residential building", + description: "Architecture model in IFC2X3 with an IDS file and a unit rates table: walls, doors, windows and slabs.", + ifc: "bsi_ifc2x3_building_architecture.ifc", + }, + ExampleDef { + id: "office", + name: "Office building", + description: "Structural model in IFC4: columns, beams and slabs checked against load-bearing and classification requirements.", + ifc: "bsi_ifc4_building_structural.ifc", + }, + ExampleDef { + id: "infrastructure", + name: "Infrastructure (bridge)", + description: "Bridge in IFC4X3: shows the checks on a non-building model with its own spatial structure.", + ifc: "bsi_ifc4x3_infra_bridge.ifc", + }, +]; + +/// The demo pavilion: always the first example, because it is the fastest way to see VeriModel +/// at work (its `project.yaml` references `../sample.ids` and `../rates.csv`). +pub const DEMO_ID: &str = "demo"; +const DEMO_NAME: &str = "Demo pavilion (start here)"; +const DEMO_DESCRIPTION: &str = "Two-storey office pavilion with properties, quantities, classification and five deliberate defects \u{2014} the fastest way to see VeriModel at work."; + +/// List the examples whose IFC file exists, the demo first. Missing optional files become `null`. +pub fn list_examples_in(roots: &ExampleRoots) -> Vec { + let existing = |p: PathBuf| { + if p.is_file() { + Some(p.display().to_string()) + } else { + None + } + }; + let ids = existing(roots.examples.join("sample.ids")); + let demo_dir = roots.examples.join(DEMO_ID); + let demo = existing(demo_dir.join("demo_building.ifc")).map(|ifc| Example { + id: DEMO_ID.into(), + name: DEMO_NAME.into(), + description: DEMO_DESCRIPTION.into(), + ifc_path: ifc, + config_path: existing(demo_dir.join("project.yaml")), + ids_path: ids.clone(), + }); + demo.into_iter() + .chain(EXAMPLE_DEFS.iter().filter_map(|d| { + let ifc = existing(roots.fixtures.join(d.ifc))?; + Some(Example { + id: d.id.into(), + name: d.name.into(), + description: d.description.into(), + ifc_path: ifc, + config_path: existing(roots.examples.join(d.id).join("project.yaml")), + ids_path: ids.clone(), + }) + })) + .collect() +} + +// --------------------------------------------------------------------------------------------- +// Files +// --------------------------------------------------------------------------------------------- + +pub fn save_text_file(path: &str, contents: &str) -> Result<(), AppError> { + let p = Path::new(path); + if let Some(parent) = p.parent() { + if !parent.as_os_str().is_empty() { + std::fs::create_dir_all(parent)?; + } + } + std::fs::write(p, contents)?; + Ok(()) +} + +pub fn read_text_file(path: &str) -> Result { + let p = Path::new(path); + if !p.is_file() { + return Err(AppError::file_missing("File", path)); + } + Ok(std::fs::read_to_string(p)?) +} + +#[cfg(test)] +mod tests { + use super::*; + use verimodel_core::model::ModelUnits; + + fn info() -> ModelInfo { + let mut type_counts = BTreeMap::new(); + type_counts.insert("IfcWall".to_string(), 12); + ModelInfo { + file_name: "a.ifc".into(), + file_size_bytes: 2048, + sha256: "0123456789abcdef0123456789abcdef".into(), + schema: "IFC4".into(), + units: ModelUnits { + length_unit: Some("MILLIMETRE".into()), + ..Default::default() + }, + element_count: 12, + type_counts, + storeys: vec!["Level 1".into()], + disciplines: vec!["Architecture".into()], + reader_warnings: vec!["a warning".into()], + ..Default::default() + } + } + + #[test] + fn file_card_copies_reader_facts() { + let c = build_file_card(Path::new("/x/a.ifc"), &info()); + assert_eq!(c.file_name, "a.ifc"); + assert_eq!(c.path, "/x/a.ifc"); + assert_eq!(c.size_bytes, 2048); + assert_eq!(c.sha256_short, "0123456789ab"); + assert_eq!(c.schema, "IFC4"); + assert_eq!(c.units.system, "metric"); + assert_eq!(c.units.length_unit.as_deref(), Some("MILLIMETRE")); + assert_eq!(c.type_counts["IfcWall"], 12); + assert_eq!(c.reader_warnings, vec!["a warning"]); + } + + #[test] + fn file_card_json_shape_is_the_documented_contract() { + let v = serde_json::to_value(build_file_card(Path::new("/x/a.ifc"), &info())).unwrap(); + for k in [ + "file_name", + "path", + "size_bytes", + "sha256", + "sha256_short", + "schema", + "element_count", + "units", + "disciplines", + "storeys", + "type_counts", + "reader_warnings", + ] { + assert!(v.get(k).is_some(), "missing key {k}"); + } + assert!(v["units"].get("system").is_some() && v["units"].get("length_unit").is_some()); + } + + #[test] + fn file_card_computes_hash_and_size_when_reader_left_them_empty() { + let dir = tempfile::tempdir().unwrap(); + let p = dir.path().join("t.ifc"); + std::fs::write(&p, b"abc").unwrap(); + let c = build_file_card(&p, &ModelInfo::default()); + assert_eq!(c.size_bytes, 3); + assert_eq!(c.sha256_short, "ba7816bf8f01"); + assert_eq!(c.file_name, "t.ifc"); + } + + #[test] + fn inspect_missing_file_is_a_plain_error() { + let e = inspect_file("/no/such/file.ifc").unwrap_err(); + assert_eq!(e.code, "file_not_found"); + assert!(e.message.contains("/no/such/file.ifc")); + } + + #[test] + fn default_config_validates_and_roundtrips() { + let y = default_config_yaml(); + assert!(y.starts_with('#')); + assert_eq!( + validate_config_yaml(&y), + ValidationResult { + ok: true, + error: None + } + ); + assert!(parse_config(Some(&y)).is_ok()); + } + + #[test] + fn invalid_config_reports_error_text() { + let r = validate_config_yaml("nonsense_key: 1\n"); + assert!(!r.ok); + assert!(r.error.unwrap().contains("Configuration problem")); + let r = validate_config_yaml("qto:\n group_by: [colour]\n"); + assert!(!r.ok); + assert!(r.error.unwrap().contains("group_by")); + } + + #[test] + fn blank_or_missing_config_means_defaults() { + assert_eq!(parse_config(None).unwrap(), Config::default()); + assert_eq!(parse_config(Some(" \n")).unwrap(), Config::default()); + assert_eq!( + parse_config(Some("nope: 1")).unwrap_err().code, + "config_invalid" + ); + } + + #[test] + fn out_dir_uses_stem_and_stamp_and_sanitises() { + let d = default_out_dir( + Path::new("/runs"), + Path::new("/m/My Model (v2).ifc"), + "20260101-120000", + ); + assert_eq!(d, PathBuf::from("/runs/My_Model__v2_-20260101-120000")); + let t = timestamp_now(); + assert_eq!(t.len(), 15); + assert_eq!(&t[8..9], "-"); + } + + #[test] + fn run_check_rejects_missing_inputs_before_reading() { + let req = RunRequest { + ifc_path: "/no/model.ifc".into(), + ids_path: None, + config_yaml: None, + config_dir: None, + out_dir: "/tmp/x".into(), + }; + assert_eq!( + run_check_blocking(&req).err().unwrap().code, + "file_not_found" + ); + let dir = tempfile::tempdir().unwrap(); + let ifc = dir.path().join("m.ifc"); + std::fs::write(&ifc, "x").unwrap(); + let req = RunRequest { + ifc_path: ifc.clone(), + ids_path: Some("/no/x.ids".into()), + config_yaml: None, + config_dir: None, + out_dir: dir.path().join("o"), + }; + let e = run_check_blocking(&req).err().unwrap(); + assert!(e.message.starts_with("IDS file not found")); + let req = RunRequest { + ifc_path: ifc, + ids_path: None, + config_yaml: Some("bad_key: 1".into()), + config_dir: None, + out_dir: dir.path().join("o"), + }; + assert_eq!( + run_check_blocking(&req).err().unwrap().code, + "config_invalid" + ); + } + + #[test] + fn ids_file_from_config_is_resolved_against_config_dir() { + let dir = tempfile::tempdir().unwrap(); + let ifc = dir.path().join("m.ifc"); + std::fs::write(&ifc, "x").unwrap(); + let req = RunRequest { + ifc_path: ifc, + ids_path: None, + config_yaml: Some("requirements:\n ids_file: ../missing.ids\n".into()), + config_dir: Some(dir.path().join("cfg")), + out_dir: dir.path().join("o"), + }; + let e = run_check_blocking(&req).err().unwrap(); + assert_eq!(e.code, "file_not_found"); + assert!( + e.message.contains("missing.ids") && e.message.contains("cfg"), + "{}", + e.message + ); + } + + fn touch(p: &Path) { + std::fs::create_dir_all(p.parent().unwrap()).unwrap(); + std::fs::write(p, "x").unwrap(); + } + + #[test] + fn dev_roots_fall_back_to_repo_layout() { + let repo = Path::new("/repo"); + let r = resolve_roots(None, repo); + assert_eq!(r.examples, PathBuf::from("/repo/examples")); + assert_eq!(r.fixtures, PathBuf::from("/repo/tests/fixtures")); + let missing = ExampleRoots { + examples: "/nope/a".into(), + fixtures: "/nope/b".into(), + }; + assert_eq!(resolve_roots(Some(missing), repo), r); + } + + #[test] + fn bundled_roots_win_when_present() { + let dir = tempfile::tempdir().unwrap(); + let b = ExampleRoots { + examples: dir.path().join("examples"), + fixtures: dir.path().join("fixtures"), + }; + std::fs::create_dir_all(&b.examples).unwrap(); + std::fs::create_dir_all(&b.fixtures).unwrap(); + assert_eq!(resolve_roots(Some(b.clone()), Path::new("/repo")), b); + } + + #[test] + fn examples_resolve_paths_and_skip_missing_models() { + let dir = tempfile::tempdir().unwrap(); + let roots = ExampleRoots { + examples: dir.path().join("examples"), + fixtures: dir.path().join("fixtures"), + }; + touch(&roots.fixtures.join("bsi_ifc2x3_building_architecture.ifc")); + touch(&roots.fixtures.join("bsi_ifc4_building_structural.ifc")); + touch(&roots.examples.join("residential").join("project.yaml")); + touch(&roots.examples.join("sample.ids")); + let without_demo = list_examples_in(&roots); + assert_eq!( + without_demo + .iter() + .map(|e| e.id.as_str()) + .collect::>(), + vec!["residential", "office"], + "no demo files, no demo entry" + ); + touch(&roots.examples.join("demo").join("demo_building.ifc")); + touch(&roots.examples.join("demo").join("project.yaml")); + let all = list_examples_in(&roots); + assert_eq!(all[0].id, "demo"); + let list = all[1..].to_vec(); + assert_eq!( + list.iter().map(|e| e.id.as_str()).collect::>(), + vec!["residential", "office"] + ); + let res = &list[0]; + assert!(res + .ifc_path + .ends_with("bsi_ifc2x3_building_architecture.ifc")); + assert!(res + .config_path + .as_ref() + .unwrap() + .ends_with("residential/project.yaml")); + assert!(res.ids_path.as_ref().unwrap().ends_with("sample.ids")); + assert!( + list[1].config_path.is_none(), + "office has no project.yaml in this fixture tree" + ); + } + + #[test] + fn demo_is_the_first_example_with_config_and_ids() { + let root = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap(); + let list = list_examples_in(&resolve_roots(None, root)); + let demo = &list[0]; + assert_eq!(demo.id, "demo"); + assert_eq!(demo.name, "Demo pavilion (start here)"); + assert!(demo.description.contains("five deliberate defects")); + assert!( + demo.ifc_path.ends_with("examples/demo/demo_building.ifc") + && Path::new(&demo.ifc_path).is_file() + ); + assert!(demo + .config_path + .as_ref() + .unwrap() + .ends_with("examples/demo/project.yaml")); + assert!(demo + .ids_path + .as_ref() + .unwrap() + .ends_with("examples/sample.ids")); + assert!( + list.len() >= 2 && list[1..].iter().all(|e| e.id != "demo"), + "the buildingSMART samples follow the demo" + ); + } + + #[test] + fn repo_examples_resolve_in_dev_layout() { + // CARGO_MANIFEST_DIR is src-tauri, so the repo root is its parent. + let root = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap(); + let roots = resolve_roots(None, root); + let list = list_examples_in(&roots); + assert!(!list.is_empty(), "fixtures exist in the repository"); + for e in &list { + assert!(Path::new(&e.ifc_path).is_file()); + } + } + + #[test] + fn save_and_read_text_file_roundtrip() { + let dir = tempfile::tempdir().unwrap(); + let p = dir.path().join("deep/er/x.yaml"); + save_text_file(&p.display().to_string(), "a: 1\n").unwrap(); + assert_eq!(read_text_file(&p.display().to_string()).unwrap(), "a: 1\n"); + assert_eq!( + read_text_file("/no/such").unwrap_err().code, + "file_not_found" + ); + } +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..2d9675d --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "VeriModel", + "identifier": "io.verimodel.desktop", + "build": { + "frontendDist": "../frontend" + }, + "app": { + "withGlobalTauri": true, + "windows": [ + { + "label": "main", + "title": "VeriModel", + "width": 1400, + "height": 900, + "minWidth": 1024, + "minHeight": 700, + "resizable": true, + "dragDropEnabled": true + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": ["msi", "nsis", "dmg", "appimage", "deb"], + "category": "DeveloperTool", + "shortDescription": "IFC QA gate, quantity takeoff and BCF export", + "longDescription": "VeriModel checks an IFC model against rules and IDS requirements, produces a quantity takeoff with optional cost estimate, and exports BCF issues, all offline on your computer.", + "copyright": "Copyright 2026 Grohle. PolyForm Noncommercial 1.0.0", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "resources": { + "../examples/": "examples/", + "../tests/fixtures/*.ifc": "fixtures/" + } + } +} diff --git a/tests/Cargo.toml b/tests/Cargo.toml new file mode 100644 index 0000000..507ec8d --- /dev/null +++ b/tests/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "verimodel-tests" +version.workspace = true +edition.workspace = true +license.workspace = true +publish = false +description = "End-to-end tests of VeriModel on real IFC fixtures (golden, genericity, determinism, IDS, schema, BCF)." + +[lib] +path = "src/lib.rs" + +[dependencies] +verimodel-core = { path = "../crates/core" } +verimodel-ifc-reader = { path = "../crates/ifc_reader" } +serde_json.workspace = true +zip.workspace = true +tempfile.workspace = true diff --git a/tests/fixtures/.gitkeep b/tests/fixtures/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/fixtures/README.md b/tests/fixtures/README.md new file mode 100644 index 0000000..51efa5f --- /dev/null +++ b/tests/fixtures/README.md @@ -0,0 +1,102 @@ +# Test fixtures + +This folder holds IFC files used by the tests and the examples, and the script +that makes one deliberately broken file. + +## Attribution: buildingSMART sample files + +The four files named `bsi_*.ifc` are copied, unchanged, from the +buildingSMART sample repository: + +- Source: (GitHub also + serves it at `buildingSMART/sample-test-files`; the names are not case sensitive) +- Copyright: © buildingSMART International Ltd. +- Licence: [Creative Commons Attribution 4.0 International](http://creativecommons.org/licenses/by/4.0/) + (CC BY 4.0), as stated in the repository's `LICENSE` file. +- Copied from commit `80d976a9b193a26a8e928c3e79bff67af1de68a8` (committed 2026-09-04). + +Required attribution for reuse: credit buildingSMART International as the author +of the sample files, link to the source repository, and say whether changes were +made. No changes were made to the content. The files were renamed when copied +to this folder, and the new names are shown in the table. + +Each file is byte-identical to its upstream original. The SHA-256 of each file +matches the one in the table. Check with `sha256sum`. + +| File here | Original path in the repository | Schema (FILE_SCHEMA) | SHA-256 | +| --- | --- | --- | --- | +| `bsi_ifc2x3_building_architecture.ifc` | `IFC 2.3.0.1 (IFC 2x3 TC1)/Simple-Scene/Building-Architecture.ifc` | IFC2X3 | `c4db65ba847f6b369a95d6c54fa11f4750cbe6d59f021934e8923d8d578e5885` | +| `bsi_ifc4_building_structural.ifc` | `IFC 4.0.2.1 (IFC 4 ADD2 TC1)/Simple-Scene/Building-Structural.ifc` | IFC4 | `903b5a005901397aa2b235daf6a60f46c099eae286cb01c815abf0a341707432` | +| `bsi_ifc4_building_hvac.ifc` | `IFC 4.0.2.1 (IFC 4 ADD2 TC1)/Simple-Scene/Building-Hvac.ifc` | IFC4 | `2c17ecad2b0fbd3335420ee42ba48963b5a395294e86bcdcfc786ee559f9a344` | +| `bsi_ifc4x3_infra_bridge.ifc` | `IFC 4.3.2.0 (IFC 4.3 ADD2)/Simple-Scene/Infra-Bridge.ifc` | IFC4X3_ADD2 | `97e84cb93e07bfbedbc1bdc57aef161f4998e09accd77175dd0561af2ab4ffab` | + +All four files come from the repository's "Simple-Scene" folder. They are the +same sample scene, exported in different schemas and for different disciplines. +The project header is the same in each. Counts below are the number of instances +of each entity in the file (type definitions are not counted). + +### `bsi_ifc2x3_building_architecture.ifc` + +- Schema IFC2X3, view definition CoordinationView V2.0, exported from SketchUp. +- Length unit: millimetre (`IFCSIUNIT` with `MILLI`). +- One building (`IFCBUILDING`), one site, one storey named `00 groundfloor`. +- Walls 4 (`IFCWALL`), slabs 3, roof 1, spaces 2, zone 1, furnishing element 1, + building element proxies 5. +- Uses property sets (`IFCPROPERTYSET`, 2) and quantity sets with + `IFCQUANTITYVOLUME`, `IFCQUANTITYAREA` and `IFCQUANTITYLENGTH`. +- No beams, no doors, no windows. + +### `bsi_ifc4_building_structural.ifc` + +- Schema IFC4, reference view V1.2, exported from SketchUp. +- Length unit: millimetre. Projected CRS `IFCPROJECTEDCRS` with a map conversion. +- One building, one storey, 2 sites. +- Beams 6, walls 4, roof 1, footing 1, chimney 1, discrete accessories 2, + building element proxies 2. +- Has quantity sets (volume, area, length) and classification references. +- No element in this file carries `Pset_WallCommon`; walls fail the wall property rules. + +### `bsi_ifc4_building_hvac.ifc` + +- Schema IFC4, reference view V1.2, exported from SketchUp. +- Length unit: millimetre. Projected CRS `EPSG:32760` (WGS 84 / UTM zone 60S). +- One building, one storey, 2 sites. +- Air terminals 2, duct segment 1, distribution system 1, chimney 1, building + element proxies 2. +- **No walls and no beams.** Useful for "applies to nothing" cases. + +### `bsi_ifc4x3_infra_bridge.ifc` + +- Schema `IFC4X3_ADD2` (read as `IFC4X3`), reference view, exported from SketchUp. + Projected CRS `EPSG:32760`. A bridge model: bridges, bridge parts, beams, columns, + footings and earthworks. +- **No storeys.** Spatial structure is site (6), bridge (3) and bridge part (18). +- Beams 8, columns 7, footings 7, members 8, walls 4, slabs 3, railings 2, + earthworks fills 4, element assemblies 2, signs 4, building element proxy 1. +- Has quantity sets (volume, area, length). + +## `broken_building.ifc`: a deliberately invalid fixture + +`broken_building.ifc` is **not** a buildingSMART file. It was generated by the +VeriModel project with `tests/fixtures/make_broken.py`, and it is covered by the +repository's licence. It is an IFC4 model in millimetres with one storey. It +contains eight known defects, so that tests can check that each one is caught: + +| # | Defect | Expected rule | +| --- | --- | --- | +| 1 | Two walls share the same GlobalId | ID-001 | +| 2 | A slab has a 7-character GlobalId (`BADID01`) | ID-002 | +| 3 | A column is not contained in any storey | SP-001 | +| 4 | A wall is extruded with zero thickness (zero volume) | GEO-002 and QT-001 | +| 5 | A beam is placed 25 km from the origin | SP-004 | +| 6 | No wall carries `Pset_WallCommon.FireRating` | IDS and CFG-PSET rules | +| 7 | `Pset_WallCommon.Reference` is an empty string | PR-001 | +| 8 | Two walls are both named `Wall` | ID-003 | + +It also contains a healthy door with `Pset_DoorCommon`, so that at least one +element passes every check. The units are millimetres on purpose, so the unit +conversion is exercised: the healthy wall is 5000 mm long, 3000 mm high and +200 mm thick, which is 3.0 m³. + +To make it again, run `python3 tests/fixtures/make_broken.py` from the +repository root. The script writes `broken_building.ifc` into this folder. diff --git a/tests/fixtures/broken_building.ifc b/tests/fixtures/broken_building.ifc new file mode 100644 index 0000000..786da11 --- /dev/null +++ b/tests/fixtures/broken_building.ifc @@ -0,0 +1,164 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition[DesignTransferView]'),'2;1'); +FILE_NAME('/dev/null','2026-10-17T16:35:18+00:00',(''),(''),'IfcOpenShell 0.9.0.post1','IfcOpenShell 0.9.0.post1','Nobody'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCPROJECT('33ORrgBJz5uQiik7pANMpO',$,'VeriModel broken sample',$,$,$,$,(#10),#5); +#2=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#3=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#4=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); +#5=IFCUNITASSIGNMENT((#2,#3,#4)); +#6=IFCCARTESIANPOINT((0.,0.,0.)); +#7=IFCDIRECTION((0.,0.,1.)); +#8=IFCDIRECTION((1.,0.,0.)); +#9=IFCAXIS2PLACEMENT3D(#6,#7,#8); +#10=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,$); +#11=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#10,$,.MODEL_VIEW.,$); +#12=IFCSITE('3jOGn8OAX4JwE4Mi5Dz$MO',$,'Site',$,$,$,$,$,$,$,$,$,$,$); +#13=IFCBUILDING('1VooApdLvEnhufnJA1dyDi',$,'Broken House',$,$,$,$,$,$,$,$,$); +#14=IFCBUILDINGSTOREY('2hQB2rwe13BeVbyRxuS6dv',$,'Level 1',$,$,$,$,$,$,0.); +#15=IFCRELAGGREGATES('2cWew0FlbB5fpodyosRVx7',$,$,$,#1,(#12)); +#16=IFCRELAGGREGATES('3PepUHJbHAsPz5PEvqITmg',$,$,$,#12,(#13)); +#17=IFCRELAGGREGATES('37YbMiJuPEi9WMCdyXoyUw',$,$,$,#13,(#14)); +#18=IFCMATERIAL('Concrete C30/37',$,$); +#19=IFCWALL('3eNKgh$lf5pRpe4WgxWEtY',$,'Wall',$,$,#41,#30,$,$); +#20=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,200.),(5000.,200.),(5000.,0.),(0.,0.))); +#21=IFCINDEXEDPOLYCURVE(#20,$,.F.); +#22=IFCDIRECTION((0.,0.,1.)); +#23=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#21); +#24=IFCCARTESIANPOINT((0.,0.,0.)); +#25=IFCDIRECTION((0.,0.,1.)); +#26=IFCDIRECTION((1.,0.,0.)); +#27=IFCAXIS2PLACEMENT3D(#24,#25,#26); +#28=IFCEXTRUDEDAREASOLID(#23,#27,#22,3000.); +#29=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#28)); +#30=IFCPRODUCTDEFINITIONSHAPE($,$,(#29)); +#36=IFCRELCONTAINEDINSPATIALSTRUCTURE('3wVNC3LpT3nxar8xSHlboi',$,$,$,(#99,#138,#19,#160,#43,#73),#14); +#37=IFCCARTESIANPOINT((0.,0.,0.)); +#38=IFCDIRECTION((0.,0.,1.)); +#39=IFCDIRECTION((1.,0.,0.)); +#40=IFCAXIS2PLACEMENT3D(#37,#38,#39); +#41=IFCLOCALPLACEMENT($,#40); +#42=IFCRELASSOCIATESMATERIAL('1MsuCeL99DXQ4zWOoacTEY',$,$,$,(#19,#43,#73),#18); +#43=IFCWALL('3eNKgh$lf5pRpe4WgxWEtY',$,'Wall',$,$,#64,#54,$,$); +#44=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,200.),(4000.,200.),(4000.,0.),(0.,0.))); +#45=IFCINDEXEDPOLYCURVE(#44,$,.F.); +#46=IFCDIRECTION((0.,0.,1.)); +#47=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#45); +#48=IFCCARTESIANPOINT((0.,0.,0.)); +#49=IFCDIRECTION((0.,0.,1.)); +#50=IFCDIRECTION((1.,0.,0.)); +#51=IFCAXIS2PLACEMENT3D(#48,#49,#50); +#52=IFCEXTRUDEDAREASOLID(#47,#51,#46,3000.); +#53=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#52)); +#54=IFCPRODUCTDEFINITIONSHAPE($,$,(#53)); +#60=IFCCARTESIANPOINT((0.,3000.,0.)); +#61=IFCDIRECTION((0.,0.,1.)); +#62=IFCDIRECTION((1.,0.,0.)); +#63=IFCAXIS2PLACEMENT3D(#60,#61,#62); +#64=IFCLOCALPLACEMENT($,#63); +#65=IFCPROPERTYSET('2vToTFMWD0aAJca6yyZNsb',$,'Pset_WallCommon',$,(#67,#68)); +#66=IFCRELDEFINESBYPROPERTIES('3etL2BKKP32grUfliaCSPz',$,$,$,(#19),#65); +#67=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#68=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER(''),$); +#69=IFCPROPERTYSET('3cRbakDTHCz9C_1BaJYeTu',$,'Pset_WallCommon',$,(#71,#72)); +#70=IFCRELDEFINESBYPROPERTIES('1BDdBDmvDA4QfV7v58$DzC',$,$,$,(#43),#69); +#71=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#72=IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER(''),$); +#73=IFCWALL('3HivYlr4b3yQYLctZ_blrN',$,'Wall-Zero',$,$,#94,#84,$,$); +#74=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,0.),(3000.,0.),(3000.,0.),(0.,0.))); +#75=IFCINDEXEDPOLYCURVE(#74,$,.F.); +#76=IFCDIRECTION((0.,0.,1.)); +#77=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#75); +#78=IFCCARTESIANPOINT((0.,0.,0.)); +#79=IFCDIRECTION((0.,0.,1.)); +#80=IFCDIRECTION((1.,0.,0.)); +#81=IFCAXIS2PLACEMENT3D(#78,#79,#80); +#82=IFCEXTRUDEDAREASOLID(#77,#81,#76,3000.); +#83=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#82)); +#84=IFCPRODUCTDEFINITIONSHAPE($,$,(#83)); +#90=IFCCARTESIANPOINT((0.,6000.,0.)); +#91=IFCDIRECTION((0.,0.,1.)); +#92=IFCDIRECTION((1.,0.,0.)); +#93=IFCAXIS2PLACEMENT3D(#90,#91,#92); +#94=IFCLOCALPLACEMENT($,#93); +#95=IFCPROPERTYSET('1mbF$nJvL36v_onNPrL6Uf',$,'Pset_WallCommon',$,(#97,#98)); +#96=IFCRELDEFINESBYPROPERTIES('3NP_bnyHH0I9F89Bcg4PtJ',$,$,$,(#73),#95); +#97=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#98=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI60'),$); +#99=IFCSLAB('BADID01',$,'Slab-1',$,$,#120,#110,$,$); +#100=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,6000.),(6000.,6000.),(6000.,0.),(0.,0.))); +#101=IFCINDEXEDPOLYCURVE(#100,$,.F.); +#102=IFCDIRECTION((0.,0.,1.)); +#103=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#101); +#104=IFCCARTESIANPOINT((0.,0.,0.)); +#105=IFCDIRECTION((0.,0.,1.)); +#106=IFCDIRECTION((1.,0.,0.)); +#107=IFCAXIS2PLACEMENT3D(#104,#105,#106); +#108=IFCEXTRUDEDAREASOLID(#103,#107,#102,250.); +#109=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#108)); +#110=IFCPRODUCTDEFINITIONSHAPE($,$,(#109)); +#116=IFCCARTESIANPOINT((0.,0.,-250.)); +#117=IFCDIRECTION((0.,0.,1.)); +#118=IFCDIRECTION((1.,0.,0.)); +#119=IFCAXIS2PLACEMENT3D(#116,#117,#118); +#120=IFCLOCALPLACEMENT($,#119); +#121=IFCCOLUMN('2z2YqNt15EjPxLUaNc_oSv',$,'Column-Orphan',$,$,#137,#132,$,$); +#122=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,300.),(300.,300.),(300.,0.),(0.,0.))); +#123=IFCINDEXEDPOLYCURVE(#122,$,.F.); +#124=IFCDIRECTION((0.,0.,1.)); +#125=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#123); +#126=IFCCARTESIANPOINT((0.,0.,0.)); +#127=IFCDIRECTION((0.,0.,1.)); +#128=IFCDIRECTION((1.,0.,0.)); +#129=IFCAXIS2PLACEMENT3D(#126,#127,#128); +#130=IFCEXTRUDEDAREASOLID(#125,#129,#124,3000.); +#131=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#130)); +#132=IFCPRODUCTDEFINITIONSHAPE($,$,(#131)); +#133=IFCCARTESIANPOINT((8000.,0.,0.)); +#134=IFCDIRECTION((0.,0.,1.)); +#135=IFCDIRECTION((1.,0.,0.)); +#136=IFCAXIS2PLACEMENT3D(#133,#134,#135); +#137=IFCLOCALPLACEMENT($,#136); +#138=IFCBEAM('0X7z_axfj29AkG7BecxqrE',$,'Beam-Far',$,$,#159,#149,$,$); +#139=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,200.),(4000.,200.),(4000.,0.),(0.,0.))); +#140=IFCINDEXEDPOLYCURVE(#139,$,.F.); +#141=IFCDIRECTION((0.,0.,1.)); +#142=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#140); +#143=IFCCARTESIANPOINT((0.,0.,0.)); +#144=IFCDIRECTION((0.,0.,1.)); +#145=IFCDIRECTION((1.,0.,0.)); +#146=IFCAXIS2PLACEMENT3D(#143,#144,#145); +#147=IFCEXTRUDEDAREASOLID(#142,#146,#141,400.); +#148=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#147)); +#149=IFCPRODUCTDEFINITIONSHAPE($,$,(#148)); +#155=IFCCARTESIANPOINT((2.5E+07,2.5E+07,3000.)); +#156=IFCDIRECTION((0.,0.,1.)); +#157=IFCDIRECTION((1.,0.,0.)); +#158=IFCAXIS2PLACEMENT3D(#155,#156,#157); +#159=IFCLOCALPLACEMENT($,#158); +#160=IFCDOOR('1H8NHIef5FYP0Vzxe_iXqX',$,'Door-1',$,$,#181,#171,$,$,$,$,$,$); +#161=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,100.),(900.,100.),(900.,0.),(0.,0.))); +#162=IFCINDEXEDPOLYCURVE(#161,$,.F.); +#163=IFCDIRECTION((0.,0.,1.)); +#164=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#162); +#165=IFCCARTESIANPOINT((0.,0.,0.)); +#166=IFCDIRECTION((0.,0.,1.)); +#167=IFCDIRECTION((1.,0.,0.)); +#168=IFCAXIS2PLACEMENT3D(#165,#166,#167); +#169=IFCEXTRUDEDAREASOLID(#164,#168,#163,2100.); +#170=IFCSHAPEREPRESENTATION(#11,'Body','SweptSolid',(#169)); +#171=IFCPRODUCTDEFINITIONSHAPE($,$,(#170)); +#177=IFCCARTESIANPOINT((1000.,0.,0.)); +#178=IFCDIRECTION((0.,0.,1.)); +#179=IFCDIRECTION((1.,0.,0.)); +#180=IFCAXIS2PLACEMENT3D(#177,#178,#179); +#181=IFCLOCALPLACEMENT($,#180); +#182=IFCPROPERTYSET('3K9DJdDQ1B9835GgTVafCG',$,'Pset_DoorCommon',$,(#184,#185)); +#183=IFCRELDEFINESBYPROPERTIES('0XNgc3D3DEthcxOszfYhhc',$,$,$,(#160),#182); +#184=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('EI30'),$); +#185=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +ENDSEC; +END-ISO-10303-21; diff --git a/tests/fixtures/bsi_ifc2x3_building_architecture.ifc b/tests/fixtures/bsi_ifc2x3_building_architecture.ifc new file mode 100644 index 0000000..07f1b80 --- /dev/null +++ b/tests/fixtures/bsi_ifc2x3_building_architecture.ifc @@ -0,0 +1,2055 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]'),'2;1'); +FILE_NAME('Building-Architecture.ifc','2026-06-23T11:53:12',(''),(''),'Sketchup-IFC-manager 5.6.0 / SketchUp 2026 (26.2.242)','BIM_Tools - Sketchup_IFC_manager - 5.6.0','None'); +FILE_SCHEMA(('IFC2X3')); +ENDSEC; +DATA; +#1=IFCOWNERHISTORY(#2,#5,$,.ADDED.,1782208392,#2,#5,1782208392); +#2=IFCPERSONANDORGANIZATION(#3,#4,$); +#3=IFCPERSON('3720f2e9-0107-4ce6-b699-e20d9bd03331','Jan B.',$,$,$,$,$,$); +#4=IFCORGANIZATION($,'buildingSMART International','buildingSMART is the worldwide industry body driving the digital transformation of the built environment.',$,$); +#5=IFCAPPLICATION(#6,'5.6.0','IFC manager for sketchup','su_ifcmanager'); +#6=IFCORGANIZATION($,'BIM-Tools',$,$,$); +#7=IFCAXIS2PLACEMENT3D(#8,#9,#10); +#8=IFCCARTESIANPOINT((0.,0.,0.)); +#9=IFCDIRECTION((0.,0.,1.)); +#10=IFCDIRECTION((1.,0.,0.)); +#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.001,#7,$); +#12=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#11,$,.MODEL_VIEW.,$); +#13=IFCPROJECT('2Ndyd$OSX7s9A04nc4lyye',#1,'ifc silly sample scene - project','Demystifying IFC with a playful scene using diverse building elements and compositions.',$,$,$,(#11),#14); +#14=IFCUNITASSIGNMENT((#15,#16,#17)); +#15=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#16=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#17=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); +#18=IFCSITE('23sFQGRy90RxVbRHD9iSE2',#1,'environment - site','A sample scene environment, showcasing the surrounding landscape.',$,#20,$,$,.ELEMENT.,$,$,0.,$,$); +#19=IFCRELAGGREGATES('287XxLcUD1YAYIMjr_cHyi',#1,'ifc silly sample scene - project container',$,#13,(#18)); +#20=IFCLOCALPLACEMENT($,#21); +#21=IFCAXIS2PLACEMENT3D(#22,#23,#24); +#22=IFCCARTESIANPOINT((-28841.016,-14200.,-1300.)); +#23=IFCDIRECTION((0.,0.,1.)); +#24=IFCDIRECTION((0.4999999999999999,-0.8660254037844387,0.)); +#25=IFCBUILDING('0c$N1CTon2BB2Sp89385G8',#1,'Single-family house','The main building structure, providing shelter and space.','house',#31,$,'house - building',.ELEMENT.,$,$,$); +#26=IFCCLASSIFICATION('Molio','1.0',#27,'CCI Construction'); +#27=IFCCALENDARDATE(23,1,2023); +#28=IFCCLASSIFICATIONREFERENCE('https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0/class/E-AAA','E-AAA','Single-family house',#26); +#29=IFCRELASSOCIATESCLASSIFICATION('0skJJdxmHBAeDmkIalrgaZ',#1,'CCI Construction Classification',$,(#25),#28); +#30=IFCRELAGGREGATES('3KxtZnpaTAov8tQORGSjgB',#1,'environment - site container',$,#18,(#25)); +#31=IFCLOCALPLACEMENT(#20,#32); +#32=IFCAXIS2PLACEMENT3D(#33,#34,#35); +#33=IFCCARTESIANPOINT((1024.871,36175.129,1300.)); +#34=IFCDIRECTION((0.,0.,1.)); +#35=IFCDIRECTION((0.4999999999999999,0.8660254037844387,0.)); +#36=IFCBUILDINGSTOREY('1Ano2ZUxnEIvVQ_beukl8b',#1,'00 groundfloor','The ground floor, forming the base level of the building.','buildingstorey',#38,$,$,.ELEMENT.,0.); +#37=IFCRELAGGREGATES('1WuImaoQX1yBDMfi0eZ1zE',#1,'Single-family house container',$,#25,(#36)); +#38=IFCLOCALPLACEMENT(#31,#7); +#39=IFCSLABTYPE('0hnSKr4LD8eRixcnqcc6X1',#1,'house - groundfloor','A solid, site-cast concrete floor, providing a strong foundation.',$,(#43),$,'884513','slab on grade',.FLOOR.); +#40=IFCRELDEFINESBYTYPE('0KEb1WVHHEhQZ4xbbd6b2c',#1,$,$,(#44),#39); +#41=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI60'),$); +#42=IFCPROPERTYSINGLEVALUE('SurfaceSpreadOfFlame',$,IFCLABEL('A2 s1 d0'),$); +#43=IFCPROPERTYSET('2m2wZSk294_BDZ5qEb72Tp',#1,'Pset_SlabCommon',$,(#41,#42)); +#44=IFCSLAB('3zR0BOEcLADRKln4HYporH',#1,'floor','A solid, site-cast concrete floor, providing a strong foundation.','slab on grade',#59,#178,'454425.1027891.979946.932083.920025',$); +#45=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#46=IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.F.),$); +#47=IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('REI30'),$); +#48=IFCPROPERTYSINGLEVALUE('AcousticRating',$,IFCLABEL('29dB Rw'),$); +#49=IFCPROPERTYSET('3IPHMao9vAlQSQdn4mt1Bm',#1,'Pset_SlabCommon',$,(#45,#46,#47,#48)); +#50=IFCRELDEFINESBYPROPERTIES('2axa51yETCdR634ODfs97D',#1,$,$,(#44),#49); +#51=IFCRELASSOCIATESMATERIAL('0oKrXjQf58gwTDmoHg_xVx',#1,$,$,(#44),#52); +#52=IFCMATERIAL('concrete_reinforced_in-situ'); +#53=IFCQUANTITYVOLUME('NetVolume',$,$,6.437500000000378); +#54=IFCQUANTITYLENGTH('Depth',$,$,250.); +#55=IFCQUANTITYAREA('NetArea',$,$,25.749999999991743); +#56=IFCELEMENTQUANTITY('1UL4az0Oz2PxIjYyJ8n$pf',#1,'Qto_SlabBaseQuantities',$,'BaseQuantities',(#53,#54,#55)); +#57=IFCRELDEFINESBYPROPERTIES('3g0El4C8X5qv1wF_P0fs9i',#1,$,$,(#44),#56); +#58=IFCRELCONTAINEDINSPATIALSTRUCTURE('0h8aL6Sxj3ze_CxUn4LBFb',#1,$,$,(#44,#319,#370,#415,#460,#468),#36); +#59=IFCLOCALPLACEMENT(#38,#60); +#60=IFCAXIS2PLACEMENT3D(#61,#62,#63); +#61=IFCCARTESIANPOINT((200.,0.,-250.)); +#62=IFCDIRECTION((0.,0.,1.)); +#63=IFCDIRECTION((1.,0.,0.)); +#64=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#65)); +#65=IFCFACETEDBREP(#66); +#66=IFCCLOSEDSHELL((#71,#92,#96,#116,#119,#122,#125,#128,#131,#134,#137,#140,#143,#146,#149,#152,#155,#158,#161,#164,#167,#170)); +#67=IFCCARTESIANPOINT((2400.,0.,0.)); +#68=IFCCARTESIANPOINT((2400.,200.,0.)); +#69=IFCCARTESIANPOINT((2400.,200.,250.)); +#70=IFCCARTESIANPOINT((2400.,0.,250.)); +#71=IFCFACE((#72)); +#72=IFCFACEOUTERBOUND(#73,.T.); +#73=IFCPOLYLOOP((#67,#68,#69,#70)); +#74=IFCCARTESIANPOINT((1400.,0.,0.)); +#75=IFCCARTESIANPOINT((1400.,200.,0.)); +#76=IFCCARTESIANPOINT((0.,200.,0.)); +#77=IFCCARTESIANPOINT((0.,1800.,0.)); +#78=IFCCARTESIANPOINT((1400.,1800.,0.)); +#79=IFCCARTESIANPOINT((1400.,2000.,0.)); +#80=IFCCARTESIANPOINT((0.,2000.,0.)); +#81=IFCCARTESIANPOINT((0.,5800.,0.)); +#82=IFCCARTESIANPOINT((5200.,5800.,0.)); +#83=IFCCARTESIANPOINT((5200.,5300.,0.)); +#84=IFCCARTESIANPOINT((4500.,5300.,0.)); +#85=IFCCARTESIANPOINT((4500.,4600.,0.)); +#86=IFCCARTESIANPOINT((5200.,4600.,0.)); +#87=IFCCARTESIANPOINT((5200.,2000.,0.)); +#88=IFCCARTESIANPOINT((2400.,2000.,0.)); +#89=IFCCARTESIANPOINT((2400.,1800.,0.)); +#90=IFCCARTESIANPOINT((3800.,1800.,0.)); +#91=IFCCARTESIANPOINT((3800.,200.,0.)); +#92=IFCFACE((#93)); +#93=IFCFACEOUTERBOUND(#94,.T.); +#94=IFCPOLYLOOP((#67,#74,#75,#76,#77,#78,#79,#80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#68)); +#95=IFCCARTESIANPOINT((3800.,200.,250.)); +#96=IFCFACE((#97)); +#97=IFCFACEOUTERBOUND(#98,.T.); +#98=IFCPOLYLOOP((#68,#91,#95,#69)); +#99=IFCCARTESIANPOINT((1400.,0.,250.)); +#100=IFCCARTESIANPOINT((3800.,1800.,250.)); +#101=IFCCARTESIANPOINT((2400.,1800.,250.)); +#102=IFCCARTESIANPOINT((2400.,2000.,250.)); +#103=IFCCARTESIANPOINT((5200.,2000.,250.)); +#104=IFCCARTESIANPOINT((5200.,4600.,250.)); +#105=IFCCARTESIANPOINT((4500.,4600.,250.)); +#106=IFCCARTESIANPOINT((4500.,5300.,250.)); +#107=IFCCARTESIANPOINT((5200.,5300.,250.)); +#108=IFCCARTESIANPOINT((5200.,5800.,250.)); +#109=IFCCARTESIANPOINT((0.,5800.,250.)); +#110=IFCCARTESIANPOINT((0.,2000.,250.)); +#111=IFCCARTESIANPOINT((1400.,2000.,250.)); +#112=IFCCARTESIANPOINT((1400.,1800.,250.)); +#113=IFCCARTESIANPOINT((0.,1800.,250.)); +#114=IFCCARTESIANPOINT((0.,200.,250.)); +#115=IFCCARTESIANPOINT((1400.,200.,250.)); +#116=IFCFACE((#117)); +#117=IFCFACEOUTERBOUND(#118,.T.); +#118=IFCPOLYLOOP((#99,#70,#69,#95,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,#110,#111,#112,#113,#114,#115)); +#119=IFCFACE((#120)); +#120=IFCFACEOUTERBOUND(#121,.T.); +#121=IFCPOLYLOOP((#70,#99,#74,#67)); +#122=IFCFACE((#123)); +#123=IFCFACEOUTERBOUND(#124,.T.); +#124=IFCPOLYLOOP((#75,#74,#99,#115)); +#125=IFCFACE((#126)); +#126=IFCFACEOUTERBOUND(#127,.T.); +#127=IFCPOLYLOOP((#76,#75,#115,#114)); +#128=IFCFACE((#129)); +#129=IFCFACEOUTERBOUND(#130,.T.); +#130=IFCPOLYLOOP((#77,#76,#114,#113)); +#131=IFCFACE((#132)); +#132=IFCFACEOUTERBOUND(#133,.T.); +#133=IFCPOLYLOOP((#78,#77,#113,#112)); +#134=IFCFACE((#135)); +#135=IFCFACEOUTERBOUND(#136,.T.); +#136=IFCPOLYLOOP((#112,#111,#79,#78)); +#137=IFCFACE((#138)); +#138=IFCFACEOUTERBOUND(#139,.T.); +#139=IFCPOLYLOOP((#79,#111,#110,#80)); +#140=IFCFACE((#141)); +#141=IFCFACEOUTERBOUND(#142,.T.); +#142=IFCPOLYLOOP((#81,#80,#110,#109)); +#143=IFCFACE((#144)); +#144=IFCFACEOUTERBOUND(#145,.T.); +#145=IFCPOLYLOOP((#82,#81,#109,#108)); +#146=IFCFACE((#147)); +#147=IFCFACEOUTERBOUND(#148,.T.); +#148=IFCPOLYLOOP((#108,#107,#83,#82)); +#149=IFCFACE((#150)); +#150=IFCFACEOUTERBOUND(#151,.T.); +#151=IFCPOLYLOOP((#83,#107,#106,#84)); +#152=IFCFACE((#153)); +#153=IFCFACEOUTERBOUND(#154,.T.); +#154=IFCPOLYLOOP((#85,#84,#106,#105)); +#155=IFCFACE((#156)); +#156=IFCFACEOUTERBOUND(#157,.T.); +#157=IFCPOLYLOOP((#104,#86,#85,#105)); +#158=IFCFACE((#159)); +#159=IFCFACEOUTERBOUND(#160,.T.); +#160=IFCPOLYLOOP((#87,#86,#104,#103)); +#161=IFCFACE((#162)); +#162=IFCFACEOUTERBOUND(#163,.T.); +#163=IFCPOLYLOOP((#102,#88,#87,#103)); +#164=IFCFACE((#165)); +#165=IFCFACEOUTERBOUND(#166,.T.); +#166=IFCPOLYLOOP((#89,#88,#102,#101)); +#167=IFCFACE((#168)); +#168=IFCFACEOUTERBOUND(#169,.T.); +#169=IFCPOLYLOOP((#90,#89,#101,#100)); +#170=IFCFACE((#171)); +#171=IFCFACEOUTERBOUND(#172,.T.); +#172=IFCPOLYLOOP((#91,#90,#100,#95)); +#173=IFCSTYLEDITEM(#65,(#177),$); +#174=IFCSURFACESTYLERENDERING(#175,0.,$,$,$,$,$,$,.NOTDEFINED.); +#175=IFCCOLOURRGB($,0.5764705882352941,0.5764705882352941,0.5764705882352941); +#176=IFCSURFACESTYLE('concrete_reinforced_in-situ',.BOTH.,(#174)); +#177=IFCPRESENTATIONSTYLEASSIGNMENT((#176)); +#178=IFCPRODUCTDEFINITIONSHAPE($,$,(#64)); +#179=IFCZONE('2Cv3e8z_D5hxYOcR$bfTHG',#1,'house - living space','A cozy living space, perfect for relaxation and gatherings.','living space'); +#180=IFCRELASSIGNSTOGROUP('3FOXrDWlb5BBZLPdA9L7_V',#1,$,$,(#183,#296),$,#179); +#181=IFCSPACETYPE('1hq0sM3Q5Cq9DOc93a74pc',#1,'house - living room','A cozy space, perfect for relaxation and family gatherings.',$,$,$,'883849','living area',.NOTDEFINED.); +#182=IFCRELDEFINESBYTYPE('1DDWFfD5f3YQgIl2Q_QABN',#1,$,$,(#183),#181); +#183=IFCSPACE('0xY$LvXaDEswJDk_VU74C_',#1,'living room','A cozy space, perfect for relaxation and family gatherings.','living area',#185,#212,$,.ELEMENT.,.NOTDEFINED.,0.); +#184=IFCRELAGGREGATES('0Ixk1O2zrFTff_vjj8r6JX',#1,'00 groundfloor container',$,#36,(#183,#296)); +#185=IFCLOCALPLACEMENT(#38,#186); +#186=IFCAXIS2PLACEMENT3D(#187,#188,#189); +#187=IFCCARTESIANPOINT((200.,2000.,0.)); +#188=IFCDIRECTION((0.,0.,1.)); +#189=IFCDIRECTION((1.,0.,0.)); +#190=IFCSHAPEREPRESENTATION(#12,'Body','SweptSolid',(#191)); +#191=IFCEXTRUDEDAREASOLID(#205,#192,#206,2200.); +#192=IFCAXIS2PLACEMENT3D(#193,#194,#195); +#193=IFCCARTESIANPOINT((0.,0.,0.)); +#194=IFCDIRECTION((0.,0.,1.)); +#195=IFCDIRECTION((1.,0.,0.)); +#196=IFCCARTESIANPOINT((4950.,2600.)); +#197=IFCCARTESIANPOINT((4950.,0.)); +#198=IFCCARTESIANPOINT((0.,0.)); +#199=IFCCARTESIANPOINT((0.,3800.)); +#200=IFCCARTESIANPOINT((4950.,3800.)); +#201=IFCCARTESIANPOINT((4950.,3300.)); +#202=IFCCARTESIANPOINT((4500.,3300.)); +#203=IFCCARTESIANPOINT((4500.,2600.)); +#204=IFCPOLYLINE((#196,#197,#198,#199,#200,#201,#202,#203)); +#205=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#204); +#206=IFCDIRECTION((-1.8375927042639037E-14,-3.265008465611757E-14,1.)); +#207=IFCSTYLEDITEM(#191,(#211),$); +#208=IFCSURFACESTYLERENDERING(#209,0.8509803921568627,$,$,$,$,$,$,.NOTDEFINED.); +#209=IFCCOLOURRGB($,0.,0.5686274509803921,0.788235294117647); +#210=IFCSURFACESTYLE('virtual_space',.BOTH.,(#208)); +#211=IFCPRESENTATIONSTYLEASSIGNMENT((#210)); +#212=IFCPRODUCTDEFINITIONSHAPE($,$,(#190)); +#213=IFCFURNISHINGELEMENTTYPE('38qaFzdvb6KwnqDJqzAlhG',#1,'house - kitchen','The heart of the home, where meals are prepared and shared.',$,$,$,'883722','kitchen'); +#214=IFCRELDEFINESBYTYPE('3y6FA_02H2c8vSY8Ak$Hnw',#1,$,$,(#215),#213); +#215=IFCFURNISHINGELEMENT('2e9pghUJbBqR4jTInsONQT',#1,'kitchen','The heart of the home, where meals are prepared and shared.','kitchen',#219,#293,'454425.1027891.979946.932083.920029.919427.2003222'); +#216=IFCRELASSOCIATESMATERIAL('0MEUM3gDb4HQJkmZ0$VlbL',#1,$,$,(#215),#217); +#217=IFCMATERIAL('wood_mdf_plate'); +#218=IFCRELCONTAINEDINSPATIALSTRUCTURE('2jjbwlFIfDJBk376Ru8q4w',#1,$,$,(#215),#183); +#219=IFCLOCALPLACEMENT(#185,#220); +#220=IFCAXIS2PLACEMENT3D(#221,#222,#223); +#221=IFCCARTESIANPOINT((4950.,2100.,0.)); +#222=IFCDIRECTION((9.419047450321992E-31,5.661703895142863E-16,1.)); +#223=IFCDIRECTION((-1.5394380663318816E-15,-1.,5.661703895142863E-16)); +#224=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#225)); +#225=IFCFACETEDBREP(#226); +#226=IFCCLOSEDSHELL((#231,#240,#246,#250,#253,#258,#264,#268,#273,#276,#279,#282,#285)); +#227=IFCCARTESIANPOINT((725.,-150.,900.)); +#228=IFCCARTESIANPOINT((275.,-150.,900.)); +#229=IFCCARTESIANPOINT((275.,-150.,700.)); +#230=IFCCARTESIANPOINT((725.,-150.,700.)); +#231=IFCFACE((#232)); +#232=IFCFACEOUTERBOUND(#233,.T.); +#233=IFCPOLYLOOP((#227,#228,#229,#230)); +#234=IFCCARTESIANPOINT((1600.,0.,900.)); +#235=IFCCARTESIANPOINT((0.,0.,900.)); +#236=IFCCARTESIANPOINT((0.,-600.,900.)); +#237=IFCCARTESIANPOINT((1600.,-600.,900.)); +#238=IFCCARTESIANPOINT((275.,-550.,900.)); +#239=IFCCARTESIANPOINT((725.,-550.,900.)); +#240=IFCFACE((#241,#243)); +#241=IFCFACEOUTERBOUND(#242,.T.); +#242=IFCPOLYLOOP((#234,#235,#236,#237)); +#243=IFCFACEBOUND(#244,.T.); +#244=IFCPOLYLOOP((#238,#228,#227,#239)); +#245=IFCCARTESIANPOINT((275.,-550.,700.)); +#246=IFCFACE((#247)); +#247=IFCFACEOUTERBOUND(#248,.T.); +#248=IFCPOLYLOOP((#228,#238,#245,#229)); +#249=IFCCARTESIANPOINT((725.,-550.,700.)); +#250=IFCFACE((#251)); +#251=IFCFACEOUTERBOUND(#252,.T.); +#252=IFCPOLYLOOP((#229,#245,#249,#230)); +#253=IFCFACE((#254)); +#254=IFCFACEOUTERBOUND(#255,.T.); +#255=IFCPOLYLOOP((#239,#227,#230,#249)); +#256=IFCCARTESIANPOINT((1600.,0.,0.)); +#257=IFCCARTESIANPOINT((0.,0.,0.)); +#258=IFCFACE((#259)); +#259=IFCFACEOUTERBOUND(#260,.T.); +#260=IFCPOLYLOOP((#256,#257,#235,#234)); +#261=IFCCARTESIANPOINT((0.,-580.,0.)); +#262=IFCCARTESIANPOINT((0.,-580.,850.)); +#263=IFCCARTESIANPOINT((0.,-600.,850.)); +#264=IFCFACE((#265)); +#265=IFCFACEOUTERBOUND(#266,.T.); +#266=IFCPOLYLOOP((#257,#261,#262,#263,#236,#235)); +#267=IFCCARTESIANPOINT((1600.,-600.,850.)); +#268=IFCFACE((#269)); +#269=IFCFACEOUTERBOUND(#270,.T.); +#270=IFCPOLYLOOP((#236,#263,#267,#237)); +#271=IFCCARTESIANPOINT((1600.,-580.,0.)); +#272=IFCCARTESIANPOINT((1600.,-580.,850.)); +#273=IFCFACE((#274)); +#274=IFCFACEOUTERBOUND(#275,.T.); +#275=IFCPOLYLOOP((#271,#256,#234,#237,#267,#272)); +#276=IFCFACE((#277)); +#277=IFCFACEOUTERBOUND(#278,.T.); +#278=IFCPOLYLOOP((#238,#239,#249,#245)); +#279=IFCFACE((#280)); +#280=IFCFACEOUTERBOUND(#281,.T.); +#281=IFCPOLYLOOP((#257,#256,#271,#261)); +#282=IFCFACE((#283)); +#283=IFCFACEOUTERBOUND(#284,.T.); +#284=IFCPOLYLOOP((#271,#272,#262,#261)); +#285=IFCFACE((#286)); +#286=IFCFACEOUTERBOUND(#287,.T.); +#287=IFCPOLYLOOP((#267,#263,#262,#272)); +#288=IFCSTYLEDITEM(#225,(#292),$); +#289=IFCSURFACESTYLERENDERING(#290,0.,$,$,$,$,$,$,.NOTDEFINED.); +#290=IFCCOLOURRGB($,1.,1.,1.); +#291=IFCSURFACESTYLE('wood_mdf_plate',.BOTH.,(#289)); +#292=IFCPRESENTATIONSTYLEASSIGNMENT((#291)); +#293=IFCPRODUCTDEFINITIONSHAPE($,$,(#224)); +#294=IFCSPACETYPE('30wkH7SyH7gvhogulgnDi9',#1,'house - entry hall','A welcoming entry hall, the first impression of the home.',$,$,$,'884735','hallway',.NOTDEFINED.); +#295=IFCRELDEFINESBYTYPE('1F9yKAe29AmeFH3cbwlo3g',#1,$,$,(#296),#294); +#296=IFCSPACE('18QhMtUIXBvQktPHXXxs7H',#1,'entry hall','A welcoming entry hall, the first impression of the home.','hallway',#297,#316,$,.ELEMENT.,.NOTDEFINED.,0.); +#297=IFCLOCALPLACEMENT(#38,#298); +#298=IFCAXIS2PLACEMENT3D(#299,#300,#301); +#299=IFCCARTESIANPOINT((200.,200.,0.)); +#300=IFCDIRECTION((0.,0.,1.)); +#301=IFCDIRECTION((1.,0.,0.)); +#302=IFCSHAPEREPRESENTATION(#12,'Body','SweptSolid',(#303)); +#303=IFCEXTRUDEDAREASOLID(#313,#304,#314,2200.); +#304=IFCAXIS2PLACEMENT3D(#305,#306,#307); +#305=IFCCARTESIANPOINT((0.,0.,0.)); +#306=IFCDIRECTION((0.,0.,1.)); +#307=IFCDIRECTION((1.,0.,0.)); +#308=IFCCARTESIANPOINT((3800.,1600.)); +#309=IFCCARTESIANPOINT((3800.,0.)); +#310=IFCCARTESIANPOINT((0.,0.)); +#311=IFCCARTESIANPOINT((0.,1600.)); +#312=IFCPOLYLINE((#308,#309,#310,#311)); +#313=IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,$,#312); +#314=IFCDIRECTION((-6.070618755157653E-15,-1.8375927042639384E-14,1.)); +#315=IFCSTYLEDITEM(#303,(#211),$); +#316=IFCPRODUCTDEFINITIONSHAPE($,$,(#302)); +#317=IFCWALLTYPE('2YJwrhcCv9v8UXU8cWK40m',#1,'house - outer wall - house right front','A solid outer wall, forming the right front side of the house.',$,$,$,'919456','solidwall',.NOTDEFINED.); +#318=IFCRELDEFINESBYTYPE('1f7McSpvb6CvSSdrUtEsXW',#1,$,$,(#319),#317); +#319=IFCWALL('1AQAupaRP1txwK1AGiN61V',#1,'house - outer wall - house right front','A solid outer wall, forming the right front side of the house.','solidwall',#328,#367,'454425.1027891.979946.932083.920023'); +#320=IFCRELASSOCIATESMATERIAL('0sAYN8OJzFKu1rNoJBdSki',#1,$,$,(#319,#370,#415,#460),#321); +#321=IFCMATERIAL('stone_sand-lime'); +#322=IFCQUANTITYVOLUME('NetVolume',$,$,1.2692649352635803); +#323=IFCQUANTITYLENGTH('Width',$,$,200.); +#324=IFCQUANTITYLENGTH('Length',$,$,1800.); +#325=IFCQUANTITYAREA('NetSideArea',$,$,6.346324676317878); +#326=IFCELEMENTQUANTITY('1mTYWP9L9FlwutbnS2LYAL',#1,'Qto_WallBaseQuantities',$,'BaseQuantities',(#322,#323,#324,#325)); +#327=IFCRELDEFINESBYPROPERTIES('2$ZgJbYs9EBum3DQZgNbI9',#1,$,$,(#319),#326); +#328=IFCLOCALPLACEMENT(#38,#329); +#329=IFCAXIS2PLACEMENT3D(#330,#331,#332); +#330=IFCCARTESIANPOINT((4100.,1800.,0.)); +#331=IFCDIRECTION((3.668379928205197E-30,3.2836943041225645E-15,1.)); +#332=IFCDIRECTION((2.5272447978365648E-14,-1.,3.2836943041225645E-15)); +#333=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#334)); +#334=IFCFACETEDBREP(#335); +#335=IFCCLOSEDSHELL((#340,#345,#349,#353,#356,#359)); +#336=IFCCARTESIANPOINT((1800.,100.,-250.)); +#337=IFCCARTESIANPOINT((0.,100.,-250.)); +#338=IFCCARTESIANPOINT((0.,100.,3175.736)); +#339=IFCCARTESIANPOINT((1800.,100.,3175.736)); +#340=IFCFACE((#341)); +#341=IFCFACEOUTERBOUND(#342,.T.); +#342=IFCPOLYLOOP((#336,#337,#338,#339)); +#343=IFCCARTESIANPOINT((1800.,-100.,-250.)); +#344=IFCCARTESIANPOINT((0.,-100.,-250.)); +#345=IFCFACE((#346)); +#346=IFCFACEOUTERBOUND(#347,.T.); +#347=IFCPOLYLOOP((#336,#343,#344,#337)); +#348=IFCCARTESIANPOINT((0.,-100.,3375.736)); +#349=IFCFACE((#350)); +#350=IFCFACEOUTERBOUND(#351,.T.); +#351=IFCPOLYLOOP((#348,#338,#337,#344)); +#352=IFCCARTESIANPOINT((1800.,-100.,3375.736)); +#353=IFCFACE((#354)); +#354=IFCFACEOUTERBOUND(#355,.T.); +#355=IFCPOLYLOOP((#348,#352,#339,#338)); +#356=IFCFACE((#357)); +#357=IFCFACEOUTERBOUND(#358,.T.); +#358=IFCPOLYLOOP((#343,#336,#339,#352)); +#359=IFCFACE((#360)); +#360=IFCFACEOUTERBOUND(#361,.T.); +#361=IFCPOLYLOOP((#352,#348,#344,#343)); +#362=IFCSTYLEDITEM(#334,(#366),$); +#363=IFCSURFACESTYLERENDERING(#364,0.,$,$,$,$,$,$,.NOTDEFINED.); +#364=IFCCOLOURRGB($,1.,1.,1.); +#365=IFCSURFACESTYLE('stone_sand-lime',.BOTH.,(#363)); +#366=IFCPRESENTATIONSTYLEASSIGNMENT((#365)); +#367=IFCPRODUCTDEFINITIONSHAPE($,$,(#333)); +#368=IFCWALLTYPE('1t790TYSH528FFF32MjoC5',#1,'house - outer wall - house right back','A solid outer wall, forming the right back side of the house.',$,$,$,'919483','solidwall',.NOTDEFINED.); +#369=IFCRELDEFINESBYTYPE('2SJ_E$q6PEh9TvfPUzQl1P',#1,$,$,(#370),#368); +#370=IFCWALL('3wdauVJT5Fx9drrREiDqA$',#1,'house - outer wall - house right back','A solid outer wall, forming the right back side of the house.','solidwall',#377,#412,'454425.1027891.979946.932083.920031'); +#371=IFCQUANTITYVOLUME('NetVolume',$,$,1.7856181822821589); +#372=IFCQUANTITYLENGTH('Width',$,$,200.); +#373=IFCQUANTITYLENGTH('Length',$,$,4200.); +#374=IFCQUANTITYAREA('NetSideArea',$,$,8.928090911402803); +#375=IFCELEMENTQUANTITY('1W70Fb1Tf8gRXcDOOjZRQ$',#1,'Qto_WallBaseQuantities',$,'BaseQuantities',(#371,#372,#373,#374)); +#376=IFCRELDEFINESBYPROPERTIES('23cDqiOtT7Fg4ImALZhSlz',#1,$,$,(#370),#375); +#377=IFCLOCALPLACEMENT(#38,#378); +#378=IFCAXIS2PLACEMENT3D(#379,#380,#381); +#379=IFCCARTESIANPOINT((5500.,6000.,0.)); +#380=IFCDIRECTION((0.,0.,1.)); +#381=IFCDIRECTION((-1.1508600077130768E-15,-1.,0.)); +#382=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#383)); +#383=IFCFACETEDBREP(#384); +#384=IFCCLOSEDSHELL((#389,#394,#398,#402,#405,#408)); +#385=IFCCARTESIANPOINT((0.,100.,-250.)); +#386=IFCCARTESIANPOINT((0.,100.,1775.736)); +#387=IFCCARTESIANPOINT((4200.,100.,1775.736)); +#388=IFCCARTESIANPOINT((4200.,100.,-250.)); +#389=IFCFACE((#390)); +#390=IFCFACEOUTERBOUND(#391,.T.); +#391=IFCPOLYLOOP((#385,#386,#387,#388)); +#392=IFCCARTESIANPOINT((0.,-100.,-250.)); +#393=IFCCARTESIANPOINT((0.,-100.,1975.736)); +#394=IFCFACE((#395)); +#395=IFCFACEOUTERBOUND(#396,.T.); +#396=IFCPOLYLOOP((#385,#392,#393,#386)); +#397=IFCCARTESIANPOINT((4200.,-100.,1975.736)); +#398=IFCFACE((#399)); +#399=IFCFACEOUTERBOUND(#400,.T.); +#400=IFCPOLYLOOP((#393,#397,#387,#386)); +#401=IFCCARTESIANPOINT((4200.,-100.,-250.)); +#402=IFCFACE((#403)); +#403=IFCFACEOUTERBOUND(#404,.T.); +#404=IFCPOLYLOOP((#387,#397,#401,#388)); +#405=IFCFACE((#406)); +#406=IFCFACEOUTERBOUND(#407,.T.); +#407=IFCPOLYLOOP((#388,#401,#392,#385)); +#408=IFCFACE((#409)); +#409=IFCFACEOUTERBOUND(#410,.T.); +#410=IFCPOLYLOOP((#397,#393,#392,#401)); +#411=IFCSTYLEDITEM(#383,(#366),$); +#412=IFCPRODUCTDEFINITIONSHAPE($,$,(#382)); +#413=IFCWALLTYPE('3zoiwePjTDQAyswDZcvJRA',#1,'house - outer wall - house left','A solid outer wall, forming the left side of the house.',$,$,$,'919429','solidwall',.NOTDEFINED.); +#414=IFCRELDEFINESBYTYPE('3EfLxcz4z2gvxxH9$AIOIS',#1,$,$,(#415),#413); +#415=IFCWALL('0OfZwWc8j9QP5uX8xPTxDH',#1,'house - outer wall - house left','A solid outer wall, forming the left side of the house.','solidwall',#422,#457,'454425.1027891.979946.932083.920032'); +#416=IFCQUANTITYVOLUME('NetVolume',$,$,4.230883117545889); +#417=IFCQUANTITYLENGTH('Width',$,$,200.); +#418=IFCQUANTITYLENGTH('Length',$,$,6000.); +#419=IFCQUANTITYAREA('NetSideArea',$,$,21.154415587728412); +#420=IFCELEMENTQUANTITY('2nlf0Hx2DAAh6MIO9QQBkR',#1,'Qto_WallBaseQuantities',$,'BaseQuantities',(#416,#417,#418,#419)); +#421=IFCRELDEFINESBYPROPERTIES('2Cfe6vapr609tCA95jxiSF',#1,$,$,(#415),#420); +#422=IFCLOCALPLACEMENT(#38,#423); +#423=IFCAXIS2PLACEMENT3D(#424,#425,#426); +#424=IFCCARTESIANPOINT((100.,0.,0.)); +#425=IFCDIRECTION((0.,0.,1.)); +#426=IFCDIRECTION((1.3173934614068503E-15,1.,0.)); +#427=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#428)); +#428=IFCFACETEDBREP(#429); +#429=IFCCLOSEDSHELL((#434,#439,#443,#447,#450,#453)); +#430=IFCCARTESIANPOINT((6000.,-100.,3375.736)); +#431=IFCCARTESIANPOINT((0.,-100.,3375.736)); +#432=IFCCARTESIANPOINT((0.,-100.,-250.)); +#433=IFCCARTESIANPOINT((6000.,-100.,-250.)); +#434=IFCFACE((#435)); +#435=IFCFACEOUTERBOUND(#436,.T.); +#436=IFCPOLYLOOP((#430,#431,#432,#433)); +#437=IFCCARTESIANPOINT((0.,100.,3175.736)); +#438=IFCCARTESIANPOINT((6000.,100.,3175.736)); +#439=IFCFACE((#440)); +#440=IFCFACEOUTERBOUND(#441,.T.); +#441=IFCPOLYLOOP((#437,#431,#430,#438)); +#442=IFCCARTESIANPOINT((0.,100.,-250.)); +#443=IFCFACE((#444)); +#444=IFCFACEOUTERBOUND(#445,.T.); +#445=IFCPOLYLOOP((#431,#437,#442,#432)); +#446=IFCCARTESIANPOINT((6000.,100.,-250.)); +#447=IFCFACE((#448)); +#448=IFCFACEOUTERBOUND(#449,.T.); +#449=IFCPOLYLOOP((#433,#432,#442,#446)); +#450=IFCFACE((#451)); +#451=IFCFACEOUTERBOUND(#452,.T.); +#452=IFCPOLYLOOP((#438,#430,#433,#446)); +#453=IFCFACE((#454)); +#454=IFCFACEOUTERBOUND(#455,.T.); +#455=IFCPOLYLOOP((#446,#442,#437,#438)); +#456=IFCSTYLEDITEM(#428,(#366),$); +#457=IFCPRODUCTDEFINITIONSHAPE($,$,(#427)); +#458=IFCBUILDINGELEMENTPROXYTYPE('2vWR$XNSf2qhsAEJMXcZLU',#1,'house - chimney','A chimney, standing tall and proud, guiding smoke away from the home.',$,$,$,'884350','flue',.NOTDEFINED.); +#459=IFCRELDEFINESBYTYPE('22pEICzjP0uQNvM7rXMZ6g',#1,$,$,(#460),#458); +#460=IFCBUILDINGELEMENTPROXY('3Fbgsvr8nAYfGs9y5keub0',#1,'house - chimney','A chimney, standing tall and proud, guiding smoke away from the home.','flue',#461,$,'454425.1027891.979946.932083.2023772',$); +#461=IFCLOCALPLACEMENT(#38,#462); +#462=IFCAXIS2PLACEMENT3D(#463,#464,#465); +#463=IFCCARTESIANPOINT((4700.,5300.,0.)); +#464=IFCDIRECTION((0.,0.,1.)); +#465=IFCDIRECTION((-1.3173934614068503E-15,-1.,0.)); +#466=IFCWALLTYPE('2S9_r4C7nDjgFt_4z9uegR',#1,'plumbing wall','A wall designed to house and protect plumbing systems, keeping the pipes snug and secure.',$,$,$,'880192','plumbingwall',.NOTDEFINED.); +#467=IFCRELDEFINESBYTYPE('2zGea7oBbB_PNczYvvtC0B',#1,$,$,(#468),#466); +#468=IFCWALL('0Q5LjisRjDwhFSOc_WQjlF',#1,'plumbing wall','A wall designed to house and protect plumbing systems, keeping the pipes snug and secure.','plumbingwall',#477,#545,'454425.1027891.979946.932083.2037918.920027'); +#469=IFCRELASSOCIATESMATERIAL('1eEeFE5_HCcQXkHLD$AhF4',#1,$,$,(#468),#470); +#470=IFCMATERIAL('gypsum_fiber-board_panel'); +#471=IFCQUANTITYVOLUME('NetVolume',$,$,0.1647019532880213); +#472=IFCQUANTITYLENGTH('Width',$,$,24.); +#473=IFCQUANTITYLENGTH('Length',$,$,3800.); +#474=IFCQUANTITYAREA('NetSideArea',$,$,6.862581386977265); +#475=IFCELEMENTQUANTITY('1VlnRqJVXCUeVzwbPrjJv$',#1,'Qto_WallBaseQuantities',$,'BaseQuantities',(#471,#472,#473,#474)); +#476=IFCRELDEFINESBYPROPERTIES('0pYSHI$lX9FBRitS_09_FG',#1,$,$,(#468),#475); +#477=IFCLOCALPLACEMENT(#38,#478); +#478=IFCAXIS2PLACEMENT3D(#479,#480,#481); +#479=IFCCARTESIANPOINT((5400.,5800.,0.)); +#480=IFCDIRECTION((0.,0.,1.)); +#481=IFCDIRECTION((-1.3173934614068503E-15,-1.,0.)); +#482=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#483,#516)); +#483=IFCFACETEDBREP(#484); +#484=IFCCLOSEDSHELL((#489,#494,#498,#502,#505,#508)); +#485=IFCCARTESIANPOINT((1200.,-226.,0.)); +#486=IFCCARTESIANPOINT((3800.,-226.,0.)); +#487=IFCCARTESIANPOINT((3800.,-250.,0.)); +#488=IFCCARTESIANPOINT((1200.,-250.,0.)); +#489=IFCFACE((#490)); +#490=IFCFACEOUTERBOUND(#491,.T.); +#491=IFCPOLYLOOP((#485,#486,#487,#488)); +#492=IFCCARTESIANPOINT((1200.,-226.,2201.736)); +#493=IFCCARTESIANPOINT((3800.,-226.,2201.736)); +#494=IFCFACE((#495)); +#495=IFCFACEOUTERBOUND(#496,.T.); +#496=IFCPOLYLOOP((#485,#492,#493,#486)); +#497=IFCCARTESIANPOINT((3800.,-250.,2225.736)); +#498=IFCFACE((#499)); +#499=IFCFACEOUTERBOUND(#500,.T.); +#500=IFCPOLYLOOP((#487,#486,#493,#497)); +#501=IFCCARTESIANPOINT((1200.,-250.,2225.736)); +#502=IFCFACE((#503)); +#503=IFCFACEOUTERBOUND(#504,.T.); +#504=IFCPOLYLOOP((#488,#487,#497,#501)); +#505=IFCFACE((#506)); +#506=IFCFACEOUTERBOUND(#507,.T.); +#507=IFCPOLYLOOP((#501,#492,#485,#488)); +#508=IFCFACE((#509)); +#509=IFCFACEOUTERBOUND(#510,.T.); +#510=IFCPOLYLOOP((#497,#493,#492,#501)); +#511=IFCSTYLEDITEM(#483,(#515),$); +#512=IFCSURFACESTYLERENDERING(#513,0.,$,$,$,$,$,$,.NOTDEFINED.); +#513=IFCCOLOURRGB($,1.,1.,1.); +#514=IFCSURFACESTYLE('gypsum_fiber-board_panel',.BOTH.,(#512)); +#515=IFCPRESENTATIONSTYLEASSIGNMENT((#514)); +#516=IFCFACETEDBREP(#517); +#517=IFCCLOSEDSHELL((#522,#527,#531,#535,#538,#541)); +#518=IFCCARTESIANPOINT((500.,-250.,2225.736)); +#519=IFCCARTESIANPOINT((500.,-226.,2201.736)); +#520=IFCCARTESIANPOINT((0.,-226.,2201.736)); +#521=IFCCARTESIANPOINT((0.,-250.,2225.736)); +#522=IFCFACE((#523)); +#523=IFCFACEOUTERBOUND(#524,.T.); +#524=IFCPOLYLOOP((#518,#519,#520,#521)); +#525=IFCCARTESIANPOINT((500.,-250.,0.)); +#526=IFCCARTESIANPOINT((500.,-226.,0.)); +#527=IFCFACE((#528)); +#528=IFCFACEOUTERBOUND(#529,.T.); +#529=IFCPOLYLOOP((#525,#526,#519,#518)); +#530=IFCCARTESIANPOINT((0.,-226.,0.)); +#531=IFCFACE((#532)); +#532=IFCFACEOUTERBOUND(#533,.T.); +#533=IFCPOLYLOOP((#530,#520,#519,#526)); +#534=IFCCARTESIANPOINT((0.,-250.,0.)); +#535=IFCFACE((#536)); +#536=IFCFACEOUTERBOUND(#537,.T.); +#537=IFCPOLYLOOP((#521,#520,#530,#534)); +#538=IFCFACE((#539)); +#539=IFCFACEOUTERBOUND(#540,.T.); +#540=IFCPOLYLOOP((#534,#525,#518,#521)); +#541=IFCFACE((#542)); +#542=IFCFACEOUTERBOUND(#543,.T.); +#543=IFCPOLYLOOP((#530,#526,#525,#534)); +#544=IFCSTYLEDITEM(#516,(#515),$); +#545=IFCPRODUCTDEFINITIONSHAPE($,$,(#482)); +#546=IFCROOF('2iPwJwpPDCSgMheXwk9cBT',#1,'house - roof','A sturdy roof, sheltering the house from the elements.','gable_roof',#548,$,'454425.1027891.979946.932084',.GABLE_ROOF.); +#547=IFCRELCONTAINEDINSPATIALSTRUCTURE('3lU3u8qWHBe9TU7kIS0Hm7',#1,$,$,(#546,#684,#744,#855,#900),#18); +#548=IFCLOCALPLACEMENT(#20,#549); +#549=IFCAXIS2PLACEMENT3D(#550,#551,#552); +#550=IFCCARTESIANPOINT((1024.871,36175.129,3100.)); +#551=IFCDIRECTION((0.,0.,1.)); +#552=IFCDIRECTION((0.4999999999999999,0.8660254037844387,0.)); +#553=IFCSLABTYPE('3eOsEo1q1CHfDNvWsh3ksD',#1,'house - roof - slab left','A roof slab that\X\27s got it all covered',$,$,$,'880245','roof',.ROOF.); +#554=IFCRELDEFINESBYTYPE('2i47udZl5BLfVbbW8mvEps',#1,$,$,(#555),#553); +#555=IFCSLAB('0ZTBBPo6f6bxqV2K7Oelrq',#1,'house - roof - slab left','A roof slab that\X\27s got it all covered','roof',#564,#603,'454425.1027891.979946.932084.902510',$); +#556=IFCRELASSOCIATESMATERIAL('1Tyvz$43XCrgyBJnA9othY',#1,$,$,(#555,#606),#557); +#557=IFCMATERIAL('composite_element_roof'); +#558=IFCQUANTITYVOLUME('NetVolume',$,$,6.7203428483966); +#559=IFCQUANTITYLENGTH('Depth',$,$,300.); +#560=IFCQUANTITYAREA('NetArea',$,$,22.40114282797721); +#561=IFCELEMENTQUANTITY('3CqnToH_P9TBg9thOFoHzj',#1,'Qto_SlabBaseQuantities',$,'BaseQuantities',(#558,#559,#560)); +#562=IFCRELDEFINESBYPROPERTIES('3l_Inuq1bCTBrWge5FzyyV',#1,$,$,(#555),#561); +#563=IFCRELAGGREGATES('1DZpKHupD6tQd7wVF$7XGd',#1,'house - roof container',$,#546,(#555,#606)); +#564=IFCLOCALPLACEMENT(#548,#565); +#565=IFCAXIS2PLACEMENT3D(#566,#567,#568); +#566=IFCCARTESIANPOINT((2100.,6000.,3475.736)); +#567=IFCDIRECTION((-0.707106781186532,-1.5343992092947548E-15,0.7071067811865631)); +#568=IFCDIRECTION((8.401584185916714E-15,-1.,6.231616014037196E-15)); +#569=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#570)); +#570=IFCFACETEDBREP(#571); +#571=IFCCLOSEDSHELL((#576,#581,#585,#589,#592,#595)); +#572=IFCCARTESIANPOINT((6300.,-3094.113,300.)); +#573=IFCCARTESIANPOINT((6300.,300.,300.)); +#574=IFCCARTESIANPOINT((-300.,300.,300.)); +#575=IFCCARTESIANPOINT((-300.,-3094.113,300.)); +#576=IFCFACE((#577)); +#577=IFCFACEOUTERBOUND(#578,.T.); +#578=IFCPOLYLOOP((#572,#573,#574,#575)); +#579=IFCCARTESIANPOINT((6300.,-3394.113,0.)); +#580=IFCCARTESIANPOINT((6300.,0.,0.)); +#581=IFCFACE((#582)); +#582=IFCFACEOUTERBOUND(#583,.T.); +#583=IFCPOLYLOOP((#573,#572,#579,#580)); +#584=IFCCARTESIANPOINT((-300.,0.,0.)); +#585=IFCFACE((#586)); +#586=IFCFACEOUTERBOUND(#587,.T.); +#587=IFCPOLYLOOP((#574,#573,#580,#584)); +#588=IFCCARTESIANPOINT((-300.,-3394.113,0.)); +#589=IFCFACE((#590)); +#590=IFCFACEOUTERBOUND(#591,.T.); +#591=IFCPOLYLOOP((#575,#574,#584,#588)); +#592=IFCFACE((#593)); +#593=IFCFACEOUTERBOUND(#594,.T.); +#594=IFCPOLYLOOP((#572,#575,#588,#579)); +#595=IFCFACE((#596)); +#596=IFCFACEOUTERBOUND(#597,.T.); +#597=IFCPOLYLOOP((#580,#579,#588,#584)); +#598=IFCSTYLEDITEM(#570,(#602),$); +#599=IFCSURFACESTYLERENDERING(#600,0.,$,$,$,$,$,$,.NOTDEFINED.); +#600=IFCCOLOURRGB($,0.9647058823529412,0.6862745098039216,0.4980392156862745); +#601=IFCSURFACESTYLE('composite_element_roof',.BOTH.,(#599)); +#602=IFCPRESENTATIONSTYLEASSIGNMENT((#601)); +#603=IFCPRODUCTDEFINITIONSHAPE($,$,(#569)); +#604=IFCSLABTYPE('3n9C2OuJjE89DiYlOaoccO',#1,'house - roof - slab right','A roof slab that\X\27s got it all covered',$,$,$,'883786','roof',.ROOF.); +#605=IFCRELDEFINESBYTYPE('2LggWrf0b8BBbNxz_kRjsN',#1,$,$,(#606),#604); +#606=IFCSLAB('12UVOn4wvAJPMUExKdZLb8',#1,'house - roof - slab right','A roof slab that\X\27s got it all covered','roof',#612,#681,'454425.1027891.979946.932084.902511',$); +#607=IFCQUANTITYVOLUME('NetVolume',$,$,9.363507996471887); +#608=IFCQUANTITYLENGTH('Depth',$,$,300.); +#609=IFCQUANTITYAREA('NetArea',$,$,31.21169332156894); +#610=IFCELEMENTQUANTITY('2zybqsy$b4jP8JFDlD8Pw0',#1,'Qto_SlabBaseQuantities',$,'BaseQuantities',(#607,#608,#609)); +#611=IFCRELDEFINESBYPROPERTIES('3DBl4k1Q9EQfIk_Igkx4l4',#1,$,$,(#606),#610); +#612=IFCLOCALPLACEMENT(#548,#613); +#613=IFCAXIS2PLACEMENT3D(#614,#615,#616); +#614=IFCCARTESIANPOINT((2100.,0.,3475.736)); +#615=IFCDIRECTION((0.7071067811865405,1.3827840298789288E-14,0.7071067811865547)); +#616=IFCDIRECTION((-2.475399821121155E-15,1.,-1.708011946775574E-14)); +#617=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#618)); +#618=IFCFACETEDBREP(#619); +#619=IFCCLOSEDSHELL((#624,#635,#641,#651,#656,#659,#662,#665,#668,#671,#674,#677)); +#620=IFCCARTESIANPOINT((-300.,-3094.113,300.)); +#621=IFCCARTESIANPOINT((-300.,300.,300.)); +#622=IFCCARTESIANPOINT((-300.,0.,0.)); +#623=IFCCARTESIANPOINT((-300.,-3394.113,0.)); +#624=IFCFACE((#625)); +#625=IFCFACEOUTERBOUND(#626,.T.); +#626=IFCPOLYLOOP((#620,#621,#622,#623)); +#627=IFCCARTESIANPOINT((1500.,-3094.113,300.)); +#628=IFCCARTESIANPOINT((1500.,-5074.012,300.)); +#629=IFCCARTESIANPOINT((6300.,-5074.012,300.)); +#630=IFCCARTESIANPOINT((6300.,300.,300.)); +#631=IFCCARTESIANPOINT((4600.,-4366.905,300.)); +#632=IFCCARTESIANPOINT((4600.,-3376.955,300.)); +#633=IFCCARTESIANPOINT((5300.,-3376.955,300.)); +#634=IFCCARTESIANPOINT((5300.,-4366.905,300.)); +#635=IFCFACE((#636,#638)); +#636=IFCFACEOUTERBOUND(#637,.T.); +#637=IFCPOLYLOOP((#620,#627,#628,#629,#630,#621)); +#638=IFCFACEBOUND(#639,.T.); +#639=IFCPOLYLOOP((#631,#632,#633,#634)); +#640=IFCCARTESIANPOINT((6300.,0.,0.)); +#641=IFCFACE((#642)); +#642=IFCFACEOUTERBOUND(#643,.T.); +#643=IFCPOLYLOOP((#621,#630,#640,#622)); +#644=IFCCARTESIANPOINT((6300.,-5374.012,0.)); +#645=IFCCARTESIANPOINT((1500.,-5374.012,0.)); +#646=IFCCARTESIANPOINT((1500.,-3394.113,0.)); +#647=IFCCARTESIANPOINT((4600.,-4666.905,0.)); +#648=IFCCARTESIANPOINT((5300.,-4666.905,0.)); +#649=IFCCARTESIANPOINT((5300.,-3676.955,0.)); +#650=IFCCARTESIANPOINT((4600.,-3676.955,0.)); +#651=IFCFACE((#652,#654)); +#652=IFCFACEOUTERBOUND(#653,.T.); +#653=IFCPOLYLOOP((#640,#644,#645,#646,#623,#622)); +#654=IFCFACEBOUND(#655,.T.); +#655=IFCPOLYLOOP((#647,#648,#649,#650)); +#656=IFCFACE((#657)); +#657=IFCFACEOUTERBOUND(#658,.T.); +#658=IFCPOLYLOOP((#623,#646,#627,#620)); +#659=IFCFACE((#660)); +#660=IFCFACEOUTERBOUND(#661,.T.); +#661=IFCPOLYLOOP((#627,#646,#645,#628)); +#662=IFCFACE((#663)); +#663=IFCFACEOUTERBOUND(#664,.T.); +#664=IFCPOLYLOOP((#629,#628,#645,#644)); +#665=IFCFACE((#666)); +#666=IFCFACEOUTERBOUND(#667,.T.); +#667=IFCPOLYLOOP((#630,#629,#644,#640)); +#668=IFCFACE((#669)); +#669=IFCFACEOUTERBOUND(#670,.T.); +#670=IFCPOLYLOOP((#631,#647,#650,#632)); +#671=IFCFACE((#672)); +#672=IFCFACEOUTERBOUND(#673,.T.); +#673=IFCPOLYLOOP((#632,#650,#649,#633)); +#674=IFCFACE((#675)); +#675=IFCFACEOUTERBOUND(#676,.T.); +#676=IFCPOLYLOOP((#633,#649,#648,#634)); +#677=IFCFACE((#678)); +#678=IFCFACEOUTERBOUND(#679,.T.); +#679=IFCPOLYLOOP((#634,#648,#647,#631)); +#680=IFCSTYLEDITEM(#618,(#602),$); +#681=IFCPRODUCTDEFINITIONSHAPE($,$,(#617)); +#682=IFCBUILDINGELEMENTPROXYTYPE('02tV5cCF9FyA9D1O5nS04E',#1,'house - gross volume',$,$,$,$,'884737','gross volume',.NOTDEFINED.); +#683=IFCRELDEFINESBYTYPE('0gNxHKqrn0uui2jga0HHAV',#1,$,$,(#684),#682); +#684=IFCBUILDINGELEMENTPROXY('1yP7NInQz5uQzbiOpVFFJr',#1,'house - gross volume',$,'gross volume',#687,#741,'454425.1027891.979946.932085',$); +#685=IFCRELASSOCIATESMATERIAL('2dVeNa6HTDsvDmffomoslq',#1,$,$,(#684),#686); +#686=IFCMATERIAL('virtual_spatial-zone'); +#687=IFCLOCALPLACEMENT(#20,#688); +#688=IFCAXIS2PLACEMENT3D(#689,#690,#691); +#689=IFCCARTESIANPOINT((1024.871,36175.129,1300.)); +#690=IFCDIRECTION((0.,0.,1.)); +#691=IFCDIRECTION((0.4999999999999999,0.8660254037844387,0.)); +#692=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#693)); +#693=IFCFACETEDBREP(#694); +#694=IFCCLOSEDSHELL((#699,#706,#711,#715,#719,#723,#727,#730,#733)); +#695=IFCCARTESIANPOINT((2100.,0.,5700.)); +#696=IFCCARTESIANPOINT((2100.,6000.,5700.)); +#697=IFCCARTESIANPOINT((0.,6000.,3600.)); +#698=IFCCARTESIANPOINT((0.,0.,3600.)); +#699=IFCFACE((#700)); +#700=IFCFACEOUTERBOUND(#701,.T.); +#701=IFCPOLYLOOP((#695,#696,#697,#698)); +#702=IFCCARTESIANPOINT((5600.,1800.,2200.)); +#703=IFCCARTESIANPOINT((5600.,6000.,2200.)); +#704=IFCCARTESIANPOINT((4200.,0.,3600.)); +#705=IFCCARTESIANPOINT((4200.,1800.,3600.)); +#706=IFCFACE((#707)); +#707=IFCFACEOUTERBOUND(#708,.T.); +#708=IFCPOLYLOOP((#702,#703,#696,#695,#704,#705)); +#709=IFCCARTESIANPOINT((0.,6000.,-300.)); +#710=IFCCARTESIANPOINT((5600.,6000.,-300.)); +#711=IFCFACE((#712)); +#712=IFCFACEOUTERBOUND(#713,.T.); +#713=IFCPOLYLOOP((#709,#697,#696,#703,#710)); +#714=IFCCARTESIANPOINT((0.,0.,-300.)); +#715=IFCFACE((#716)); +#716=IFCFACEOUTERBOUND(#717,.T.); +#717=IFCPOLYLOOP((#709,#714,#698,#697)); +#718=IFCCARTESIANPOINT((4200.,0.,-300.)); +#719=IFCFACE((#720)); +#720=IFCFACEOUTERBOUND(#721,.T.); +#721=IFCPOLYLOOP((#714,#718,#704,#695,#698)); +#722=IFCCARTESIANPOINT((5600.,1800.,-300.)); +#723=IFCFACE((#724)); +#724=IFCFACEOUTERBOUND(#725,.T.); +#725=IFCPOLYLOOP((#702,#722,#710,#703)); +#726=IFCCARTESIANPOINT((4200.,1800.,-300.)); +#727=IFCFACE((#728)); +#728=IFCFACEOUTERBOUND(#729,.T.); +#729=IFCPOLYLOOP((#718,#726,#705,#704)); +#730=IFCFACE((#731)); +#731=IFCFACEOUTERBOUND(#732,.T.); +#732=IFCPOLYLOOP((#726,#722,#702,#705)); +#733=IFCFACE((#734)); +#734=IFCFACEOUTERBOUND(#735,.T.); +#735=IFCPOLYLOOP((#709,#710,#722,#726,#718,#714)); +#736=IFCSTYLEDITEM(#693,(#740),$); +#737=IFCSURFACESTYLERENDERING(#738,0.8509803921568627,$,$,$,$,$,$,.NOTDEFINED.); +#738=IFCCOLOURRGB($,0.,0.5686274509803921,0.); +#739=IFCSURFACESTYLE('virtual_spatial-zone',.BOTH.,(#737)); +#740=IFCPRESENTATIONSTYLEASSIGNMENT((#739)); +#741=IFCPRODUCTDEFINITIONSHAPE($,$,(#692)); +#742=IFCBUILDINGELEMENTPROXYTYPE('3w6ICDipzDzBpAKGLlR62f',#1,'sand bedding','A layer of ground floor sand bedding, providing a stable base.',$,$,$,'884803','subgrade',.NOTDEFINED.); +#743=IFCRELDEFINESBYTYPE('1SihQ7wbb2zxRE28j$a1do',#1,$,$,(#744),#742); +#744=IFCBUILDINGELEMENTPROXY('3_4VN63S96DfWiJjgG8j1C',#1,'sand bedding','A layer of ground floor sand bedding, providing a stable base.','subgrade',#747,#852,'454425.1027891.979946.932086',$); +#745=IFCRELASSOCIATESMATERIAL('1k8uxHQbjDqBL1HxU2VBqX',#1,$,$,(#744),#746); +#746=IFCMATERIAL('bulk-material_sand-coarse_generic'); +#747=IFCLOCALPLACEMENT(#20,#748); +#748=IFCAXIS2PLACEMENT3D(#749,#750,#751); +#749=IFCCARTESIANPOINT((1024.871,36175.129,1300.)); +#750=IFCDIRECTION((0.,0.,1.)); +#751=IFCDIRECTION((0.4999999999999999,0.8660254037844387,0.)); +#752=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#753,#813)); +#753=IFCFACETEDBREP(#754); +#754=IFCCLOSEDSHELL((#758,#762,#766,#775,#780,#783,#788,#792,#796,#799,#802,#805)); +#755=IFCCARTESIANPOINT((3662.324,800.,-550.)); +#756=IFCCARTESIANPOINT((2800.,800.,-598.692)); +#757=IFCCARTESIANPOINT((2800.,1248.138,-550.)); +#758=IFCFACE((#759)); +#759=IFCFACEOUTERBOUND(#760,.T.); +#760=IFCPOLYLOOP((#755,#756,#757)); +#761=IFCCARTESIANPOINT((3034.54,565.46,-550.)); +#762=IFCFACE((#763)); +#763=IFCFACEOUTERBOUND(#764,.T.); +#764=IFCPOLYLOOP((#761,#756,#755)); +#765=IFCCARTESIANPOINT((2612.046,987.954,-550.)); +#766=IFCFACE((#767)); +#767=IFCFACEOUTERBOUND(#768,.T.); +#768=IFCPOLYLOOP((#757,#756,#765)); +#769=IFCCARTESIANPOINT((3850.,1700.,-550.)); +#770=IFCCARTESIANPOINT((3850.,350.,-550.)); +#771=IFCCARTESIANPOINT((350.,350.,-550.)); +#772=IFCCARTESIANPOINT((350.,1700.,-550.)); +#773=IFCCARTESIANPOINT((2508.771,800.,-550.)); +#774=IFCCARTESIANPOINT((2800.,401.153,-550.)); +#775=IFCFACE((#776,#778)); +#776=IFCFACEOUTERBOUND(#777,.T.); +#777=IFCPOLYLOOP((#769,#770,#771,#772)); +#778=IFCFACEBOUND(#779,.T.); +#779=IFCPOLYLOOP((#761,#755,#757,#765,#773,#774)); +#780=IFCFACE((#781)); +#781=IFCFACEOUTERBOUND(#782,.T.); +#782=IFCPOLYLOOP((#774,#756,#761)); +#783=IFCFACE((#784)); +#784=IFCFACEOUTERBOUND(#785,.T.); +#785=IFCPOLYLOOP((#765,#756,#773)); +#786=IFCCARTESIANPOINT((3850.,1700.,-250.)); +#787=IFCCARTESIANPOINT((3850.,350.,-250.)); +#788=IFCFACE((#789)); +#789=IFCFACEOUTERBOUND(#790,.T.); +#790=IFCPOLYLOOP((#770,#769,#786,#787)); +#791=IFCCARTESIANPOINT((350.,350.,-250.)); +#792=IFCFACE((#793)); +#793=IFCFACEOUTERBOUND(#794,.T.); +#794=IFCPOLYLOOP((#787,#791,#771,#770)); +#795=IFCCARTESIANPOINT((350.,1700.,-250.)); +#796=IFCFACE((#797)); +#797=IFCFACEOUTERBOUND(#798,.T.); +#798=IFCPOLYLOOP((#772,#771,#791,#795)); +#799=IFCFACE((#800)); +#800=IFCFACEOUTERBOUND(#801,.T.); +#801=IFCPOLYLOOP((#769,#772,#795,#786)); +#802=IFCFACE((#803)); +#803=IFCFACEOUTERBOUND(#804,.T.); +#804=IFCPOLYLOOP((#773,#756,#774)); +#805=IFCFACE((#806)); +#806=IFCFACEOUTERBOUND(#807,.T.); +#807=IFCPOLYLOOP((#787,#786,#795,#791)); +#808=IFCSTYLEDITEM(#753,(#812),$); +#809=IFCSURFACESTYLERENDERING(#810,0.,$,$,$,$,$,$,.NOTDEFINED.); +#810=IFCCOLOURRGB($,0.8588235294117647,0.7725490196078432,0.596078431372549); +#811=IFCSURFACESTYLE('bulk-material_sand-coarse_generic',.BOTH.,(#809)); +#812=IFCPRESENTATIONSTYLEASSIGNMENT((#811)); +#813=IFCFACETEDBREP(#814); +#814=IFCCLOSEDSHELL((#821,#826,#830,#834,#838,#842,#845,#848)); +#815=IFCCARTESIANPOINT((5250.,2150.,-250.)); +#816=IFCCARTESIANPOINT((5250.,4500.,-250.)); +#817=IFCCARTESIANPOINT((4600.,4500.,-250.)); +#818=IFCCARTESIANPOINT((4600.,5650.,-250.)); +#819=IFCCARTESIANPOINT((350.,5650.,-250.)); +#820=IFCCARTESIANPOINT((350.,2150.,-250.)); +#821=IFCFACE((#822)); +#822=IFCFACEOUTERBOUND(#823,.T.); +#823=IFCPOLYLOOP((#815,#816,#817,#818,#819,#820)); +#824=IFCCARTESIANPOINT((5250.,2150.,-550.)); +#825=IFCCARTESIANPOINT((5250.,4500.,-550.)); +#826=IFCFACE((#827)); +#827=IFCFACEOUTERBOUND(#828,.T.); +#828=IFCPOLYLOOP((#816,#815,#824,#825)); +#829=IFCCARTESIANPOINT((4600.,4500.,-550.)); +#830=IFCFACE((#831)); +#831=IFCFACEOUTERBOUND(#832,.T.); +#832=IFCPOLYLOOP((#816,#825,#829,#817)); +#833=IFCCARTESIANPOINT((4600.,5650.,-550.)); +#834=IFCFACE((#835)); +#835=IFCFACEOUTERBOUND(#836,.T.); +#836=IFCPOLYLOOP((#817,#829,#833,#818)); +#837=IFCCARTESIANPOINT((350.,5650.,-550.)); +#838=IFCFACE((#839)); +#839=IFCFACEOUTERBOUND(#840,.T.); +#840=IFCPOLYLOOP((#833,#837,#819,#818)); +#841=IFCCARTESIANPOINT((350.,2150.,-550.)); +#842=IFCFACE((#843)); +#843=IFCFACEOUTERBOUND(#844,.T.); +#844=IFCPOLYLOOP((#820,#819,#837,#841)); +#845=IFCFACE((#846)); +#846=IFCFACEOUTERBOUND(#847,.T.); +#847=IFCPOLYLOOP((#815,#820,#841,#824)); +#848=IFCFACE((#849)); +#849=IFCFACEOUTERBOUND(#850,.T.); +#850=IFCPOLYLOOP((#837,#833,#829,#825,#824,#841)); +#851=IFCSTYLEDITEM(#813,(#812),$); +#852=IFCPRODUCTDEFINITIONSHAPE($,$,(#752)); +#853=IFCBUILDINGELEMENTPROXYTYPE('3mjKLn_DjE4Beriey9bTvr',#1,'origin','The local position for coordination of aspect models.',$,$,$,'1028017','origin',.NOTDEFINED.); +#854=IFCRELDEFINESBYTYPE('21U96ixejDwQmHCVkbTd2U',#1,$,$,(#855),#853); +#855=IFCBUILDINGELEMENTPROXY('2F44QMqSH3TOkM$SZoqCBe',#1,'origin','The local position for coordination of aspect models.','origin',#858,#897,'454425.1027891.1032757',$); +#856=IFCRELASSOCIATESMATERIAL('1QcTgcyaP1C9MT3_T1ZeJj',#1,$,$,(#855),#857); +#857=IFCMATERIAL('virtual_white'); +#858=IFCLOCALPLACEMENT(#20,#859); +#859=IFCAXIS2PLACEMENT3D(#860,#861,#862); +#860=IFCCARTESIANPOINT((2122.947,32077.053,1300.)); +#861=IFCDIRECTION((0.,0.,1.)); +#862=IFCDIRECTION((0.4999999999999999,0.8660254037844387,0.)); +#863=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#864)); +#864=IFCFACETEDBREP(#865); +#865=IFCCLOSEDSHELL((#870,#875,#879,#883,#886,#889)); +#866=IFCCARTESIANPOINT((1000.,0.,0.)); +#867=IFCCARTESIANPOINT((1000.,1000.,0.)); +#868=IFCCARTESIANPOINT((1000.,1000.,1000.)); +#869=IFCCARTESIANPOINT((1000.,0.,1000.)); +#870=IFCFACE((#871)); +#871=IFCFACEOUTERBOUND(#872,.T.); +#872=IFCPOLYLOOP((#866,#867,#868,#869)); +#873=IFCCARTESIANPOINT((0.,1000.,0.)); +#874=IFCCARTESIANPOINT((0.,0.,0.)); +#875=IFCFACE((#876)); +#876=IFCFACEOUTERBOUND(#877,.T.); +#877=IFCPOLYLOOP((#873,#867,#866,#874)); +#878=IFCCARTESIANPOINT((0.,1000.,1000.)); +#879=IFCFACE((#880)); +#880=IFCFACEOUTERBOUND(#881,.T.); +#881=IFCPOLYLOOP((#867,#873,#878,#868)); +#882=IFCCARTESIANPOINT((0.,0.,1000.)); +#883=IFCFACE((#884)); +#884=IFCFACEOUTERBOUND(#885,.T.); +#885=IFCPOLYLOOP((#868,#878,#882,#869)); +#886=IFCFACE((#887)); +#887=IFCFACEOUTERBOUND(#888,.T.); +#888=IFCPOLYLOOP((#874,#866,#869,#882)); +#889=IFCFACE((#890)); +#890=IFCFACEOUTERBOUND(#891,.T.); +#891=IFCPOLYLOOP((#873,#874,#882,#878)); +#892=IFCSTYLEDITEM(#864,(#896),$); +#893=IFCSURFACESTYLERENDERING(#894,0.,$,$,$,$,$,$,.NOTDEFINED.); +#894=IFCCOLOURRGB($,1.,1.,1.); +#895=IFCSURFACESTYLE('virtual_white',.BOTH.,(#893)); +#896=IFCPRESENTATIONSTYLEASSIGNMENT((#895)); +#897=IFCPRODUCTDEFINITIONSHAPE($,$,(#863)); +#898=IFCBUILDINGELEMENTPROXYTYPE('2IpkHFcdnD3xuZl6H52fWn',#1,'geo-reference','The reference point for transforming the local engineering coordinate system into the coordinate reference system of the underlying map.',$,$,$,'1028019','origin',.NOTDEFINED.); +#899=IFCRELDEFINESBYTYPE('3530pFWy94WO4ESJ$CWAXG',#1,$,$,(#900),#898); +#900=IFCBUILDINGELEMENTPROXY('3Fit2Fad92zf2f6aWdJtF5',#1,'geo-reference','The reference point for transforming the local engineering coordinate system into the coordinate reference system of the underlying map.','origin',#903,#2046,'454425.1032696',$); +#901=IFCRELASSOCIATESMATERIAL('2EBkr99ef9S8X3ZQxjf56M',#1,$,$,(#900),#902); +#902=IFCMATERIAL('virtual_black'); +#903=IFCLOCALPLACEMENT(#20,#904); +#904=IFCAXIS2PLACEMENT3D(#905,#906,#907); +#905=IFCCARTESIANPOINT((0.,0.,0.)); +#906=IFCDIRECTION((0.,0.,1.)); +#907=IFCDIRECTION((1.,1.487416814333745E-17,0.)); +#908=IFCSHAPEREPRESENTATION(#12,'Body','Brep',(#909,#1012,#1385,#1494,#1553,#1652,#1681)); +#909=IFCFACETEDBREP(#910); +#910=IFCCLOSEDSHELL((#915,#920,#938,#942,#959,#962,#965,#968,#971,#974,#977,#980,#983,#986,#989,#992,#995,#998,#1001,#1004)); +#911=IFCCARTESIANPOINT((0.3,-300.,5.)); +#912=IFCCARTESIANPOINT((0.3,-300.,0.)); +#913=IFCCARTESIANPOINT((0.3,-500.,0.)); +#914=IFCCARTESIANPOINT((0.3,-500.,5.)); +#915=IFCFACE((#916)); +#916=IFCFACEOUTERBOUND(#917,.T.); +#917=IFCPOLYLOOP((#911,#912,#913,#914)); +#918=IFCCARTESIANPOINT((58.827,-294.236,5.)); +#919=IFCCARTESIANPOINT((58.827,-294.236,0.)); +#920=IFCFACE((#921)); +#921=IFCFACEOUTERBOUND(#922,.T.); +#922=IFCPOLYLOOP((#911,#918,#919,#912)); +#923=IFCCARTESIANPOINT((191.642,-461.94,0.)); +#924=IFCCARTESIANPOINT((97.845,-490.393,0.)); +#925=IFCCARTESIANPOINT((115.105,-277.164,0.)); +#926=IFCCARTESIANPOINT((166.971,-249.441,0.)); +#927=IFCCARTESIANPOINT((212.432,-212.132,0.)); +#928=IFCCARTESIANPOINT((249.741,-166.671,0.)); +#929=IFCCARTESIANPOINT((277.464,-114.805,0.)); +#930=IFCCARTESIANPOINT((294.536,-58.527,0.)); +#931=IFCCARTESIANPOINT((300.3,0.,0.)); +#932=IFCCARTESIANPOINT((500.3,0.,0.)); +#933=IFCCARTESIANPOINT((490.693,-97.545,0.)); +#934=IFCCARTESIANPOINT((462.24,-191.342,0.)); +#935=IFCCARTESIANPOINT((416.035,-277.785,0.)); +#936=IFCCARTESIANPOINT((353.853,-353.553,0.)); +#937=IFCCARTESIANPOINT((278.085,-415.735,0.)); +#938=IFCFACE((#939)); +#939=IFCFACEOUTERBOUND(#940,.T.); +#940=IFCPOLYLOOP((#923,#924,#913,#912,#919,#925,#926,#927,#928,#929,#930,#931,#932,#933,#934,#935,#936,#937)); +#941=IFCCARTESIANPOINT((97.845,-490.393,5.)); +#942=IFCFACE((#943)); +#943=IFCFACEOUTERBOUND(#944,.T.); +#944=IFCPOLYLOOP((#913,#924,#941,#914)); +#945=IFCCARTESIANPOINT((300.3,0.,5.)); +#946=IFCCARTESIANPOINT((294.536,-58.527,5.)); +#947=IFCCARTESIANPOINT((277.464,-114.805,5.)); +#948=IFCCARTESIANPOINT((249.741,-166.671,5.)); +#949=IFCCARTESIANPOINT((212.432,-212.132,5.)); +#950=IFCCARTESIANPOINT((166.971,-249.441,5.)); +#951=IFCCARTESIANPOINT((115.105,-277.164,5.)); +#952=IFCCARTESIANPOINT((191.642,-461.94,5.)); +#953=IFCCARTESIANPOINT((278.085,-415.735,5.)); +#954=IFCCARTESIANPOINT((353.853,-353.553,5.)); +#955=IFCCARTESIANPOINT((416.035,-277.785,5.)); +#956=IFCCARTESIANPOINT((462.24,-191.342,5.)); +#957=IFCCARTESIANPOINT((490.693,-97.545,5.)); +#958=IFCCARTESIANPOINT((500.3,0.,5.)); +#959=IFCFACE((#960)); +#960=IFCFACEOUTERBOUND(#961,.T.); +#961=IFCPOLYLOOP((#945,#946,#947,#948,#949,#950,#951,#918,#911,#914,#941,#952,#953,#954,#955,#956,#957,#958)); +#962=IFCFACE((#963)); +#963=IFCFACEOUTERBOUND(#964,.T.); +#964=IFCPOLYLOOP((#919,#918,#951,#925)); +#965=IFCFACE((#966)); +#966=IFCFACEOUTERBOUND(#967,.T.); +#967=IFCPOLYLOOP((#923,#952,#941,#924)); +#968=IFCFACE((#969)); +#969=IFCFACEOUTERBOUND(#970,.T.); +#970=IFCPOLYLOOP((#925,#951,#950,#926)); +#971=IFCFACE((#972)); +#972=IFCFACEOUTERBOUND(#973,.T.); +#973=IFCPOLYLOOP((#949,#927,#926,#950)); +#974=IFCFACE((#975)); +#975=IFCFACEOUTERBOUND(#976,.T.); +#976=IFCPOLYLOOP((#927,#949,#948,#928)); +#977=IFCFACE((#978)); +#978=IFCFACEOUTERBOUND(#979,.T.); +#979=IFCPOLYLOOP((#947,#929,#928,#948)); +#980=IFCFACE((#981)); +#981=IFCFACEOUTERBOUND(#982,.T.); +#982=IFCPOLYLOOP((#930,#929,#947,#946)); +#983=IFCFACE((#984)); +#984=IFCFACEOUTERBOUND(#985,.T.); +#985=IFCPOLYLOOP((#945,#931,#930,#946)); +#986=IFCFACE((#987)); +#987=IFCFACEOUTERBOUND(#988,.T.); +#988=IFCPOLYLOOP((#931,#945,#958,#932)); +#989=IFCFACE((#990)); +#990=IFCFACEOUTERBOUND(#991,.T.); +#991=IFCPOLYLOOP((#957,#933,#932,#958)); +#992=IFCFACE((#993)); +#993=IFCFACEOUTERBOUND(#994,.T.); +#994=IFCPOLYLOOP((#934,#933,#957,#956)); +#995=IFCFACE((#996)); +#996=IFCFACEOUTERBOUND(#997,.T.); +#997=IFCPOLYLOOP((#956,#955,#935,#934)); +#998=IFCFACE((#999)); +#999=IFCFACEOUTERBOUND(#1000,.T.); +#1000=IFCPOLYLOOP((#936,#935,#955,#954)); +#1001=IFCFACE((#1002)); +#1002=IFCFACEOUTERBOUND(#1003,.T.); +#1003=IFCPOLYLOOP((#954,#953,#937,#936)); +#1004=IFCFACE((#1005)); +#1005=IFCFACEOUTERBOUND(#1006,.T.); +#1006=IFCPOLYLOOP((#952,#923,#937,#953)); +#1007=IFCSTYLEDITEM(#909,(#1011),$); +#1008=IFCSURFACESTYLERENDERING(#1009,0.,$,$,$,$,$,$,.NOTDEFINED.); +#1009=IFCCOLOURRGB($,0.,0.,0.); +#1010=IFCSURFACESTYLE('virtual_black',.BOTH.,(#1008)); +#1011=IFCPRESENTATIONSTYLEASSIGNMENT((#1010)); +#1012=IFCFACETEDBREP(#1013); +#1013=IFCCLOSEDSHELL((#1018,#1091,#1097,#1169,#1174,#1177,#1180,#1183,#1186,#1189,#1192,#1195,#1198,#1201,#1204,#1207,#1210,#1213,#1216,#1219,#1222,#1225,#1228,#1231,#1234,#1237,#1240,#1243,#1246,#1249,#1252,#1255,#1258,#1261,#1264,#1267,#1270,#1273,#1276,#1279,#1282,#1285,#1288,#1291,#1294,#1297,#1300,#1303,#1306,#1309,#1312,#1315,#1318,#1321,#1324,#1327,#1330,#1333,#1336,#1339,#1342,#1345,#1348,#1351,#1354,#1357,#1360,#1363,#1366,#1369,#1372,#1375,#1378,#1381)); +#1014=IFCCARTESIANPOINT((881.793,37.789,0.)); +#1015=IFCCARTESIANPOINT((877.313,53.797,0.)); +#1016=IFCCARTESIANPOINT((877.313,53.797,5.)); +#1017=IFCCARTESIANPOINT((881.793,37.789,5.)); +#1018=IFCFACE((#1019)); +#1019=IFCFACEOUTERBOUND(#1020,.T.); +#1020=IFCPOLYLOOP((#1014,#1015,#1016,#1017)); +#1021=IFCCARTESIANPOINT((650.3,0.,0.)); +#1022=IFCCARTESIANPOINT((652.354,28.939,0.)); +#1023=IFCCARTESIANPOINT((658.516,54.557,0.)); +#1024=IFCCARTESIANPOINT((668.786,76.852,0.)); +#1025=IFCCARTESIANPOINT((683.164,95.825,0.)); +#1026=IFCCARTESIANPOINT((700.79,110.973,0.)); +#1027=IFCCARTESIANPOINT((720.806,121.793,0.)); +#1028=IFCCARTESIANPOINT((743.212,128.285,0.)); +#1029=IFCCARTESIANPOINT((768.006,130.449,0.)); +#1030=IFCCARTESIANPOINT((784.606,129.433,0.)); +#1031=IFCCARTESIANPOINT((800.367,126.383,0.)); +#1032=IFCCARTESIANPOINT((815.29,121.301,0.)); +#1033=IFCCARTESIANPOINT((829.374,114.185,0.)); +#1034=IFCCARTESIANPOINT((842.228,105.251,0.)); +#1035=IFCCARTESIANPOINT((853.456,94.714,0.)); +#1036=IFCCARTESIANPOINT((863.061,82.574,0.)); +#1037=IFCCARTESIANPOINT((871.041,68.83,0.)); +#1038=IFCCARTESIANPOINT((884.481,20.807,0.)); +#1039=IFCCARTESIANPOINT((885.377,2.85,0.)); +#1040=IFCCARTESIANPOINT((884.434,-15.353,0.)); +#1041=IFCCARTESIANPOINT((881.604,-32.57,0.)); +#1042=IFCCARTESIANPOINT((876.889,-48.803,0.)); +#1043=IFCCARTESIANPOINT((870.287,-64.051,0.)); +#1044=IFCCARTESIANPOINT((861.955,-77.91,0.)); +#1045=IFCCARTESIANPOINT((852.052,-89.977,0.)); +#1046=IFCCARTESIANPOINT((840.577,-100.253,0.)); +#1047=IFCCARTESIANPOINT((827.53,-108.736,0.)); +#1048=IFCCARTESIANPOINT((813.425,-115.375,0.)); +#1049=IFCCARTESIANPOINT((798.774,-120.117,0.)); +#1050=IFCCARTESIANPOINT((783.579,-122.962,0.)); +#1051=IFCCARTESIANPOINT((767.839,-123.91,0.)); +#1052=IFCCARTESIANPOINT((750.946,-122.862,0.)); +#1053=IFCCARTESIANPOINT((734.975,-119.718,0.)); +#1054=IFCCARTESIANPOINT((719.926,-114.479,0.)); +#1055=IFCCARTESIANPOINT((705.8,-107.143,0.)); +#1056=IFCCARTESIANPOINT((692.962,-97.994,0.)); +#1057=IFCCARTESIANPOINT((681.781,-87.316,0.)); +#1058=IFCCARTESIANPOINT((672.255,-75.107,0.)); +#1059=IFCCARTESIANPOINT((664.385,-61.368,0.)); +#1060=IFCCARTESIANPOINT((653.821,-31.522,0.)); +#1061=IFCCARTESIANPOINT((683.835,-0.503,0.)); +#1062=IFCCARTESIANPOINT((685.328,-21.541,0.)); +#1063=IFCCARTESIANPOINT((689.808,-40.22,0.)); +#1064=IFCCARTESIANPOINT((697.275,-56.542,0.)); +#1065=IFCCARTESIANPOINT((707.728,-70.506,0.)); +#1066=IFCCARTESIANPOINT((720.434,-81.693,0.)); +#1067=IFCCARTESIANPOINT((734.66,-89.684,0.)); +#1068=IFCCARTESIANPOINT((750.406,-94.478,0.)); +#1069=IFCCARTESIANPOINT((767.671,-96.076,0.)); +#1070=IFCCARTESIANPOINT((785.219,-94.463,0.)); +#1071=IFCCARTESIANPOINT((801.143,-89.621,0.)); +#1072=IFCCARTESIANPOINT((815.442,-81.552,0.)); +#1073=IFCCARTESIANPOINT((828.117,-70.255,0.)); +#1074=IFCCARTESIANPOINT((838.497,-55.992,0.)); +#1075=IFCCARTESIANPOINT((845.911,-39.026,0.)); +#1076=IFCCARTESIANPOINT((850.36,-19.356,0.)); +#1077=IFCCARTESIANPOINT((851.843,3.018,0.)); +#1078=IFCCARTESIANPOINT((849.307,31.124,0.)); +#1079=IFCCARTESIANPOINT((841.698,55.416,0.)); +#1080=IFCCARTESIANPOINT((829.207,75.285,0.)); +#1081=IFCCARTESIANPOINT((812.02,90.124,0.)); +#1082=IFCCARTESIANPOINT((791.292,99.367,0.)); +#1083=IFCCARTESIANPOINT((768.174,102.448,0.)); +#1084=IFCCARTESIANPOINT((751.506,100.965,0.)); +#1085=IFCCARTESIANPOINT((736.044,96.517,0.)); +#1086=IFCCARTESIANPOINT((721.786,89.102,0.)); +#1087=IFCCARTESIANPOINT((708.734,78.722,0.)); +#1088=IFCCARTESIANPOINT((697.84,64.874,0.)); +#1089=IFCCARTESIANPOINT((690.059,47.053,0.)); +#1090=IFCCARTESIANPOINT((685.391,25.261,0.)); +#1091=IFCFACE((#1092,#1094)); +#1092=IFCFACEOUTERBOUND(#1093,.T.); +#1093=IFCPOLYLOOP((#1021,#1022,#1023,#1024,#1025,#1026,#1027,#1028,#1029,#1030,#1031,#1032,#1033,#1034,#1035,#1036,#1037,#1015,#1014,#1038,#1039,#1040,#1041,#1042,#1043,#1044,#1045,#1046,#1047,#1048,#1049,#1050,#1051,#1052,#1053,#1054,#1055,#1056,#1057,#1058,#1059,#1060)); +#1094=IFCFACEBOUND(#1095,.T.); +#1095=IFCPOLYLOOP((#1061,#1062,#1063,#1064,#1065,#1066,#1067,#1068,#1069,#1070,#1071,#1072,#1073,#1074,#1075,#1076,#1077,#1078,#1079,#1080,#1081,#1082,#1083,#1084,#1085,#1086,#1087,#1088,#1089,#1090)); +#1096=IFCCARTESIANPOINT((871.041,68.83,5.)); +#1097=IFCFACE((#1098)); +#1098=IFCFACEOUTERBOUND(#1099,.T.); +#1099=IFCPOLYLOOP((#1015,#1037,#1096,#1016)); +#1100=IFCCARTESIANPOINT((652.354,28.939,5.)); +#1101=IFCCARTESIANPOINT((650.3,0.,5.)); +#1102=IFCCARTESIANPOINT((653.821,-31.522,5.)); +#1103=IFCCARTESIANPOINT((664.385,-61.368,5.)); +#1104=IFCCARTESIANPOINT((672.255,-75.107,5.)); +#1105=IFCCARTESIANPOINT((681.781,-87.316,5.)); +#1106=IFCCARTESIANPOINT((692.962,-97.994,5.)); +#1107=IFCCARTESIANPOINT((705.8,-107.143,5.)); +#1108=IFCCARTESIANPOINT((719.926,-114.479,5.)); +#1109=IFCCARTESIANPOINT((734.975,-119.718,5.)); +#1110=IFCCARTESIANPOINT((750.946,-122.862,5.)); +#1111=IFCCARTESIANPOINT((767.839,-123.91,5.)); +#1112=IFCCARTESIANPOINT((783.579,-122.962,5.)); +#1113=IFCCARTESIANPOINT((798.774,-120.117,5.)); +#1114=IFCCARTESIANPOINT((813.425,-115.375,5.)); +#1115=IFCCARTESIANPOINT((827.53,-108.736,5.)); +#1116=IFCCARTESIANPOINT((840.577,-100.253,5.)); +#1117=IFCCARTESIANPOINT((852.052,-89.977,5.)); +#1118=IFCCARTESIANPOINT((861.955,-77.91,5.)); +#1119=IFCCARTESIANPOINT((870.287,-64.051,5.)); +#1120=IFCCARTESIANPOINT((876.889,-48.803,5.)); +#1121=IFCCARTESIANPOINT((881.604,-32.57,5.)); +#1122=IFCCARTESIANPOINT((884.434,-15.353,5.)); +#1123=IFCCARTESIANPOINT((885.377,2.85,5.)); +#1124=IFCCARTESIANPOINT((884.481,20.807,5.)); +#1125=IFCCARTESIANPOINT((863.061,82.574,5.)); +#1126=IFCCARTESIANPOINT((853.456,94.714,5.)); +#1127=IFCCARTESIANPOINT((842.228,105.251,5.)); +#1128=IFCCARTESIANPOINT((829.374,114.185,5.)); +#1129=IFCCARTESIANPOINT((815.29,121.301,5.)); +#1130=IFCCARTESIANPOINT((800.367,126.383,5.)); +#1131=IFCCARTESIANPOINT((784.606,129.433,5.)); +#1132=IFCCARTESIANPOINT((768.006,130.449,5.)); +#1133=IFCCARTESIANPOINT((743.212,128.285,5.)); +#1134=IFCCARTESIANPOINT((720.806,121.793,5.)); +#1135=IFCCARTESIANPOINT((700.79,110.973,5.)); +#1136=IFCCARTESIANPOINT((683.164,95.825,5.)); +#1137=IFCCARTESIANPOINT((668.786,76.852,5.)); +#1138=IFCCARTESIANPOINT((658.516,54.557,5.)); +#1139=IFCCARTESIANPOINT((685.328,-21.541,5.)); +#1140=IFCCARTESIANPOINT((683.835,-0.503,5.)); +#1141=IFCCARTESIANPOINT((685.391,25.261,5.)); +#1142=IFCCARTESIANPOINT((690.059,47.053,5.)); +#1143=IFCCARTESIANPOINT((697.84,64.874,5.)); +#1144=IFCCARTESIANPOINT((708.734,78.722,5.)); +#1145=IFCCARTESIANPOINT((721.786,89.102,5.)); +#1146=IFCCARTESIANPOINT((736.044,96.517,5.)); +#1147=IFCCARTESIANPOINT((751.506,100.965,5.)); +#1148=IFCCARTESIANPOINT((768.174,102.448,5.)); +#1149=IFCCARTESIANPOINT((791.292,99.367,5.)); +#1150=IFCCARTESIANPOINT((812.02,90.124,5.)); +#1151=IFCCARTESIANPOINT((829.207,75.285,5.)); +#1152=IFCCARTESIANPOINT((841.698,55.416,5.)); +#1153=IFCCARTESIANPOINT((849.307,31.124,5.)); +#1154=IFCCARTESIANPOINT((851.843,3.018,5.)); +#1155=IFCCARTESIANPOINT((850.36,-19.356,5.)); +#1156=IFCCARTESIANPOINT((845.911,-39.026,5.)); +#1157=IFCCARTESIANPOINT((838.497,-55.992,5.)); +#1158=IFCCARTESIANPOINT((828.117,-70.255,5.)); +#1159=IFCCARTESIANPOINT((815.442,-81.552,5.)); +#1160=IFCCARTESIANPOINT((801.143,-89.621,5.)); +#1161=IFCCARTESIANPOINT((785.219,-94.463,5.)); +#1162=IFCCARTESIANPOINT((767.671,-96.076,5.)); +#1163=IFCCARTESIANPOINT((750.406,-94.478,5.)); +#1164=IFCCARTESIANPOINT((734.66,-89.684,5.)); +#1165=IFCCARTESIANPOINT((720.434,-81.693,5.)); +#1166=IFCCARTESIANPOINT((707.728,-70.506,5.)); +#1167=IFCCARTESIANPOINT((697.275,-56.542,5.)); +#1168=IFCCARTESIANPOINT((689.808,-40.22,5.)); +#1169=IFCFACE((#1170,#1172)); +#1170=IFCFACEOUTERBOUND(#1171,.T.); +#1171=IFCPOLYLOOP((#1100,#1101,#1102,#1103,#1104,#1105,#1106,#1107,#1108,#1109,#1110,#1111,#1112,#1113,#1114,#1115,#1116,#1117,#1118,#1119,#1120,#1121,#1122,#1123,#1124,#1017,#1016,#1096,#1125,#1126,#1127,#1128,#1129,#1130,#1131,#1132,#1133,#1134,#1135,#1136,#1137,#1138)); +#1172=IFCFACEBOUND(#1173,.T.); +#1173=IFCPOLYLOOP((#1139,#1140,#1141,#1142,#1143,#1144,#1145,#1146,#1147,#1148,#1149,#1150,#1151,#1152,#1153,#1154,#1155,#1156,#1157,#1158,#1159,#1160,#1161,#1162,#1163,#1164,#1165,#1166,#1167,#1168)); +#1174=IFCFACE((#1175)); +#1175=IFCFACEOUTERBOUND(#1176,.T.); +#1176=IFCPOLYLOOP((#1038,#1014,#1017,#1124)); +#1177=IFCFACE((#1178)); +#1178=IFCFACEOUTERBOUND(#1179,.T.); +#1179=IFCPOLYLOOP((#1022,#1021,#1101,#1100)); +#1180=IFCFACE((#1181)); +#1181=IFCFACEOUTERBOUND(#1182,.T.); +#1182=IFCPOLYLOOP((#1023,#1022,#1100,#1138)); +#1183=IFCFACE((#1184)); +#1184=IFCFACEOUTERBOUND(#1185,.T.); +#1185=IFCPOLYLOOP((#1024,#1023,#1138,#1137)); +#1186=IFCFACE((#1187)); +#1187=IFCFACEOUTERBOUND(#1188,.T.); +#1188=IFCPOLYLOOP((#1025,#1024,#1137,#1136)); +#1189=IFCFACE((#1190)); +#1190=IFCFACEOUTERBOUND(#1191,.T.); +#1191=IFCPOLYLOOP((#1026,#1025,#1136,#1135)); +#1192=IFCFACE((#1193)); +#1193=IFCFACEOUTERBOUND(#1194,.T.); +#1194=IFCPOLYLOOP((#1027,#1026,#1135,#1134)); +#1195=IFCFACE((#1196)); +#1196=IFCFACEOUTERBOUND(#1197,.T.); +#1197=IFCPOLYLOOP((#1028,#1027,#1134,#1133)); +#1198=IFCFACE((#1199)); +#1199=IFCFACEOUTERBOUND(#1200,.T.); +#1200=IFCPOLYLOOP((#1029,#1028,#1133,#1132)); +#1201=IFCFACE((#1202)); +#1202=IFCFACEOUTERBOUND(#1203,.T.); +#1203=IFCPOLYLOOP((#1030,#1029,#1132,#1131)); +#1204=IFCFACE((#1205)); +#1205=IFCFACEOUTERBOUND(#1206,.T.); +#1206=IFCPOLYLOOP((#1031,#1030,#1131,#1130)); +#1207=IFCFACE((#1208)); +#1208=IFCFACEOUTERBOUND(#1209,.T.); +#1209=IFCPOLYLOOP((#1032,#1031,#1130,#1129)); +#1210=IFCFACE((#1211)); +#1211=IFCFACEOUTERBOUND(#1212,.T.); +#1212=IFCPOLYLOOP((#1033,#1032,#1129,#1128)); +#1213=IFCFACE((#1214)); +#1214=IFCFACEOUTERBOUND(#1215,.T.); +#1215=IFCPOLYLOOP((#1034,#1033,#1128,#1127)); +#1216=IFCFACE((#1217)); +#1217=IFCFACEOUTERBOUND(#1218,.T.); +#1218=IFCPOLYLOOP((#1035,#1034,#1127,#1126)); +#1219=IFCFACE((#1220)); +#1220=IFCFACEOUTERBOUND(#1221,.T.); +#1221=IFCPOLYLOOP((#1036,#1035,#1126,#1125)); +#1222=IFCFACE((#1223)); +#1223=IFCFACEOUTERBOUND(#1224,.T.); +#1224=IFCPOLYLOOP((#1037,#1036,#1125,#1096)); +#1225=IFCFACE((#1226)); +#1226=IFCFACEOUTERBOUND(#1227,.T.); +#1227=IFCPOLYLOOP((#1039,#1038,#1124,#1123)); +#1228=IFCFACE((#1229)); +#1229=IFCFACEOUTERBOUND(#1230,.T.); +#1230=IFCPOLYLOOP((#1040,#1039,#1123,#1122)); +#1231=IFCFACE((#1232)); +#1232=IFCFACEOUTERBOUND(#1233,.T.); +#1233=IFCPOLYLOOP((#1041,#1040,#1122,#1121)); +#1234=IFCFACE((#1235)); +#1235=IFCFACEOUTERBOUND(#1236,.T.); +#1236=IFCPOLYLOOP((#1042,#1041,#1121,#1120)); +#1237=IFCFACE((#1238)); +#1238=IFCFACEOUTERBOUND(#1239,.T.); +#1239=IFCPOLYLOOP((#1043,#1042,#1120,#1119)); +#1240=IFCFACE((#1241)); +#1241=IFCFACEOUTERBOUND(#1242,.T.); +#1242=IFCPOLYLOOP((#1044,#1043,#1119,#1118)); +#1243=IFCFACE((#1244)); +#1244=IFCFACEOUTERBOUND(#1245,.T.); +#1245=IFCPOLYLOOP((#1045,#1044,#1118,#1117)); +#1246=IFCFACE((#1247)); +#1247=IFCFACEOUTERBOUND(#1248,.T.); +#1248=IFCPOLYLOOP((#1046,#1045,#1117,#1116)); +#1249=IFCFACE((#1250)); +#1250=IFCFACEOUTERBOUND(#1251,.T.); +#1251=IFCPOLYLOOP((#1047,#1046,#1116,#1115)); +#1252=IFCFACE((#1253)); +#1253=IFCFACEOUTERBOUND(#1254,.T.); +#1254=IFCPOLYLOOP((#1048,#1047,#1115,#1114)); +#1255=IFCFACE((#1256)); +#1256=IFCFACEOUTERBOUND(#1257,.T.); +#1257=IFCPOLYLOOP((#1049,#1048,#1114,#1113)); +#1258=IFCFACE((#1259)); +#1259=IFCFACEOUTERBOUND(#1260,.T.); +#1260=IFCPOLYLOOP((#1050,#1049,#1113,#1112)); +#1261=IFCFACE((#1262)); +#1262=IFCFACEOUTERBOUND(#1263,.T.); +#1263=IFCPOLYLOOP((#1051,#1050,#1112,#1111)); +#1264=IFCFACE((#1265)); +#1265=IFCFACEOUTERBOUND(#1266,.T.); +#1266=IFCPOLYLOOP((#1052,#1051,#1111,#1110)); +#1267=IFCFACE((#1268)); +#1268=IFCFACEOUTERBOUND(#1269,.T.); +#1269=IFCPOLYLOOP((#1053,#1052,#1110,#1109)); +#1270=IFCFACE((#1271)); +#1271=IFCFACEOUTERBOUND(#1272,.T.); +#1272=IFCPOLYLOOP((#1054,#1053,#1109,#1108)); +#1273=IFCFACE((#1274)); +#1274=IFCFACEOUTERBOUND(#1275,.T.); +#1275=IFCPOLYLOOP((#1055,#1054,#1108,#1107)); +#1276=IFCFACE((#1277)); +#1277=IFCFACEOUTERBOUND(#1278,.T.); +#1278=IFCPOLYLOOP((#1056,#1055,#1107,#1106)); +#1279=IFCFACE((#1280)); +#1280=IFCFACEOUTERBOUND(#1281,.T.); +#1281=IFCPOLYLOOP((#1057,#1056,#1106,#1105)); +#1282=IFCFACE((#1283)); +#1283=IFCFACEOUTERBOUND(#1284,.T.); +#1284=IFCPOLYLOOP((#1058,#1057,#1105,#1104)); +#1285=IFCFACE((#1286)); +#1286=IFCFACEOUTERBOUND(#1287,.T.); +#1287=IFCPOLYLOOP((#1059,#1058,#1104,#1103)); +#1288=IFCFACE((#1289)); +#1289=IFCFACEOUTERBOUND(#1290,.T.); +#1290=IFCPOLYLOOP((#1060,#1059,#1103,#1102)); +#1291=IFCFACE((#1292)); +#1292=IFCFACEOUTERBOUND(#1293,.T.); +#1293=IFCPOLYLOOP((#1021,#1060,#1102,#1101)); +#1294=IFCFACE((#1295)); +#1295=IFCFACEOUTERBOUND(#1296,.T.); +#1296=IFCPOLYLOOP((#1062,#1061,#1140,#1139)); +#1297=IFCFACE((#1298)); +#1298=IFCFACEOUTERBOUND(#1299,.T.); +#1299=IFCPOLYLOOP((#1063,#1062,#1139,#1168)); +#1300=IFCFACE((#1301)); +#1301=IFCFACEOUTERBOUND(#1302,.T.); +#1302=IFCPOLYLOOP((#1064,#1063,#1168,#1167)); +#1303=IFCFACE((#1304)); +#1304=IFCFACEOUTERBOUND(#1305,.T.); +#1305=IFCPOLYLOOP((#1065,#1064,#1167,#1166)); +#1306=IFCFACE((#1307)); +#1307=IFCFACEOUTERBOUND(#1308,.T.); +#1308=IFCPOLYLOOP((#1066,#1065,#1166,#1165)); +#1309=IFCFACE((#1310)); +#1310=IFCFACEOUTERBOUND(#1311,.T.); +#1311=IFCPOLYLOOP((#1067,#1066,#1165,#1164)); +#1312=IFCFACE((#1313)); +#1313=IFCFACEOUTERBOUND(#1314,.T.); +#1314=IFCPOLYLOOP((#1068,#1067,#1164,#1163)); +#1315=IFCFACE((#1316)); +#1316=IFCFACEOUTERBOUND(#1317,.T.); +#1317=IFCPOLYLOOP((#1069,#1068,#1163,#1162)); +#1318=IFCFACE((#1319)); +#1319=IFCFACEOUTERBOUND(#1320,.T.); +#1320=IFCPOLYLOOP((#1070,#1069,#1162,#1161)); +#1321=IFCFACE((#1322)); +#1322=IFCFACEOUTERBOUND(#1323,.T.); +#1323=IFCPOLYLOOP((#1071,#1070,#1161,#1160)); +#1324=IFCFACE((#1325)); +#1325=IFCFACEOUTERBOUND(#1326,.T.); +#1326=IFCPOLYLOOP((#1072,#1071,#1160,#1159)); +#1327=IFCFACE((#1328)); +#1328=IFCFACEOUTERBOUND(#1329,.T.); +#1329=IFCPOLYLOOP((#1073,#1072,#1159,#1158)); +#1330=IFCFACE((#1331)); +#1331=IFCFACEOUTERBOUND(#1332,.T.); +#1332=IFCPOLYLOOP((#1074,#1073,#1158,#1157)); +#1333=IFCFACE((#1334)); +#1334=IFCFACEOUTERBOUND(#1335,.T.); +#1335=IFCPOLYLOOP((#1075,#1074,#1157,#1156)); +#1336=IFCFACE((#1337)); +#1337=IFCFACEOUTERBOUND(#1338,.T.); +#1338=IFCPOLYLOOP((#1076,#1075,#1156,#1155)); +#1339=IFCFACE((#1340)); +#1340=IFCFACEOUTERBOUND(#1341,.T.); +#1341=IFCPOLYLOOP((#1077,#1076,#1155,#1154)); +#1342=IFCFACE((#1343)); +#1343=IFCFACEOUTERBOUND(#1344,.T.); +#1344=IFCPOLYLOOP((#1078,#1077,#1154,#1153)); +#1345=IFCFACE((#1346)); +#1346=IFCFACEOUTERBOUND(#1347,.T.); +#1347=IFCPOLYLOOP((#1079,#1078,#1153,#1152)); +#1348=IFCFACE((#1349)); +#1349=IFCFACEOUTERBOUND(#1350,.T.); +#1350=IFCPOLYLOOP((#1080,#1079,#1152,#1151)); +#1351=IFCFACE((#1352)); +#1352=IFCFACEOUTERBOUND(#1353,.T.); +#1353=IFCPOLYLOOP((#1081,#1080,#1151,#1150)); +#1354=IFCFACE((#1355)); +#1355=IFCFACEOUTERBOUND(#1356,.T.); +#1356=IFCPOLYLOOP((#1082,#1081,#1150,#1149)); +#1357=IFCFACE((#1358)); +#1358=IFCFACEOUTERBOUND(#1359,.T.); +#1359=IFCPOLYLOOP((#1083,#1082,#1149,#1148)); +#1360=IFCFACE((#1361)); +#1361=IFCFACEOUTERBOUND(#1362,.T.); +#1362=IFCPOLYLOOP((#1084,#1083,#1148,#1147)); +#1363=IFCFACE((#1364)); +#1364=IFCFACEOUTERBOUND(#1365,.T.); +#1365=IFCPOLYLOOP((#1085,#1084,#1147,#1146)); +#1366=IFCFACE((#1367)); +#1367=IFCFACEOUTERBOUND(#1368,.T.); +#1368=IFCPOLYLOOP((#1086,#1085,#1146,#1145)); +#1369=IFCFACE((#1370)); +#1370=IFCFACEOUTERBOUND(#1371,.T.); +#1371=IFCPOLYLOOP((#1087,#1086,#1145,#1144)); +#1372=IFCFACE((#1373)); +#1373=IFCFACEOUTERBOUND(#1374,.T.); +#1374=IFCPOLYLOOP((#1088,#1087,#1144,#1143)); +#1375=IFCFACE((#1376)); +#1376=IFCFACEOUTERBOUND(#1377,.T.); +#1377=IFCPOLYLOOP((#1089,#1088,#1143,#1142)); +#1378=IFCFACE((#1379)); +#1379=IFCFACEOUTERBOUND(#1380,.T.); +#1380=IFCPOLYLOOP((#1090,#1089,#1142,#1141)); +#1381=IFCFACE((#1382)); +#1382=IFCFACEOUTERBOUND(#1383,.T.); +#1383=IFCPOLYLOOP((#1061,#1090,#1141,#1140)); +#1384=IFCSTYLEDITEM(#1012,(#1011),$); +#1385=IFCFACETEDBREP(#1386); +#1386=IFCCLOSEDSHELL((#1391,#1412,#1416,#1436,#1439,#1442,#1445,#1448,#1451,#1454,#1457,#1460,#1463,#1466,#1469,#1472,#1475,#1478,#1481,#1484,#1487,#1490)); +#1387=IFCCARTESIANPOINT((-900.538,-122.904,0.)); +#1388=IFCCARTESIANPOINT((-867.339,-122.904,0.)); +#1389=IFCCARTESIANPOINT((-867.339,-122.904,5.)); +#1390=IFCCARTESIANPOINT((-900.538,-122.904,5.)); +#1391=IFCFACE((#1392)); +#1392=IFCFACEOUTERBOUND(#1393,.T.); +#1393=IFCPOLYLOOP((#1387,#1388,#1389,#1390)); +#1394=IFCCARTESIANPOINT((-965.763,122.904,0.)); +#1395=IFCCARTESIANPOINT((-932.396,122.904,0.)); +#1396=IFCCARTESIANPOINT((-895.005,-38.229,0.)); +#1397=IFCCARTESIANPOINT((-884.609,-88.531,0.)); +#1398=IFCCARTESIANPOINT((-873.543,-43.092,0.)); +#1399=IFCCARTESIANPOINT((-826.762,122.904,0.)); +#1400=IFCCARTESIANPOINT((-787.527,122.904,0.)); +#1401=IFCCARTESIANPOINT((-752.316,-1.509,0.)); +#1402=IFCCARTESIANPOINT((-740.914,-46.403,0.)); +#1403=IFCCARTESIANPOINT((-733.201,-88.531,0.)); +#1404=IFCCARTESIANPOINT((-720.961,-35.044,0.)); +#1405=IFCCARTESIANPOINT((-682.396,122.904,0.)); +#1406=IFCCARTESIANPOINT((-649.7,122.904,0.)); +#1407=IFCCARTESIANPOINT((-717.104,-122.904,0.)); +#1408=IFCCARTESIANPOINT((-748.459,-122.904,0.)); +#1409=IFCCARTESIANPOINT((-800.27,64.386,0.)); +#1410=IFCCARTESIANPOINT((-807.983,93.226,0.)); +#1411=IFCCARTESIANPOINT((-815.193,64.386,0.)); +#1412=IFCFACE((#1413)); +#1413=IFCFACEOUTERBOUND(#1414,.T.); +#1414=IFCPOLYLOOP((#1387,#1394,#1395,#1396,#1397,#1398,#1399,#1400,#1401,#1402,#1403,#1404,#1405,#1406,#1407,#1408,#1409,#1410,#1411,#1388)); +#1415=IFCCARTESIANPOINT((-815.193,64.386,5.)); +#1416=IFCFACE((#1417)); +#1417=IFCFACEOUTERBOUND(#1418,.T.); +#1418=IFCPOLYLOOP((#1388,#1411,#1415,#1389)); +#1419=IFCCARTESIANPOINT((-965.763,122.904,5.)); +#1420=IFCCARTESIANPOINT((-807.983,93.226,5.)); +#1421=IFCCARTESIANPOINT((-800.27,64.386,5.)); +#1422=IFCCARTESIANPOINT((-748.459,-122.904,5.)); +#1423=IFCCARTESIANPOINT((-717.104,-122.904,5.)); +#1424=IFCCARTESIANPOINT((-649.7,122.904,5.)); +#1425=IFCCARTESIANPOINT((-682.396,122.904,5.)); +#1426=IFCCARTESIANPOINT((-720.961,-35.044,5.)); +#1427=IFCCARTESIANPOINT((-733.201,-88.531,5.)); +#1428=IFCCARTESIANPOINT((-740.914,-46.403,5.)); +#1429=IFCCARTESIANPOINT((-752.316,-1.509,5.)); +#1430=IFCCARTESIANPOINT((-787.527,122.904,5.)); +#1431=IFCCARTESIANPOINT((-826.762,122.904,5.)); +#1432=IFCCARTESIANPOINT((-873.543,-43.092,5.)); +#1433=IFCCARTESIANPOINT((-884.609,-88.531,5.)); +#1434=IFCCARTESIANPOINT((-895.005,-38.229,5.)); +#1435=IFCCARTESIANPOINT((-932.396,122.904,5.)); +#1436=IFCFACE((#1437)); +#1437=IFCFACEOUTERBOUND(#1438,.T.); +#1438=IFCPOLYLOOP((#1419,#1390,#1389,#1415,#1420,#1421,#1422,#1423,#1424,#1425,#1426,#1427,#1428,#1429,#1430,#1431,#1432,#1433,#1434,#1435)); +#1439=IFCFACE((#1440)); +#1440=IFCFACEOUTERBOUND(#1441,.T.); +#1441=IFCPOLYLOOP((#1394,#1387,#1390,#1419)); +#1442=IFCFACE((#1443)); +#1443=IFCFACEOUTERBOUND(#1444,.T.); +#1444=IFCPOLYLOOP((#1395,#1394,#1419,#1435)); +#1445=IFCFACE((#1446)); +#1446=IFCFACEOUTERBOUND(#1447,.T.); +#1447=IFCPOLYLOOP((#1396,#1395,#1435,#1434)); +#1448=IFCFACE((#1449)); +#1449=IFCFACEOUTERBOUND(#1450,.T.); +#1450=IFCPOLYLOOP((#1397,#1396,#1434,#1433)); +#1451=IFCFACE((#1452)); +#1452=IFCFACEOUTERBOUND(#1453,.T.); +#1453=IFCPOLYLOOP((#1398,#1397,#1433,#1432)); +#1454=IFCFACE((#1455)); +#1455=IFCFACEOUTERBOUND(#1456,.T.); +#1456=IFCPOLYLOOP((#1399,#1398,#1432,#1431)); +#1457=IFCFACE((#1458)); +#1458=IFCFACEOUTERBOUND(#1459,.T.); +#1459=IFCPOLYLOOP((#1400,#1399,#1431,#1430)); +#1460=IFCFACE((#1461)); +#1461=IFCFACEOUTERBOUND(#1462,.T.); +#1462=IFCPOLYLOOP((#1401,#1400,#1430,#1429)); +#1463=IFCFACE((#1464)); +#1464=IFCFACEOUTERBOUND(#1465,.T.); +#1465=IFCPOLYLOOP((#1402,#1401,#1429,#1428)); +#1466=IFCFACE((#1467)); +#1467=IFCFACEOUTERBOUND(#1468,.T.); +#1468=IFCPOLYLOOP((#1403,#1402,#1428,#1427)); +#1469=IFCFACE((#1470)); +#1470=IFCFACEOUTERBOUND(#1471,.T.); +#1471=IFCPOLYLOOP((#1404,#1403,#1427,#1426)); +#1472=IFCFACE((#1473)); +#1473=IFCFACEOUTERBOUND(#1474,.T.); +#1474=IFCPOLYLOOP((#1405,#1404,#1426,#1425)); +#1475=IFCFACE((#1476)); +#1476=IFCFACEOUTERBOUND(#1477,.T.); +#1477=IFCPOLYLOOP((#1406,#1405,#1425,#1424)); +#1478=IFCFACE((#1479)); +#1479=IFCFACEOUTERBOUND(#1480,.T.); +#1480=IFCPOLYLOOP((#1407,#1406,#1424,#1423)); +#1481=IFCFACE((#1482)); +#1482=IFCFACEOUTERBOUND(#1483,.T.); +#1483=IFCPOLYLOOP((#1408,#1407,#1423,#1422)); +#1484=IFCFACE((#1485)); +#1485=IFCFACEOUTERBOUND(#1486,.T.); +#1486=IFCPOLYLOOP((#1409,#1408,#1422,#1421)); +#1487=IFCFACE((#1488)); +#1488=IFCFACEOUTERBOUND(#1489,.T.); +#1489=IFCPOLYLOOP((#1410,#1409,#1421,#1420)); +#1490=IFCFACE((#1491)); +#1491=IFCFACEOUTERBOUND(#1492,.T.); +#1492=IFCPOLYLOOP((#1411,#1410,#1420,#1415)); +#1493=IFCSTYLEDITEM(#1385,(#1011),$); +#1494=IFCFACETEDBREP(#1495); +#1495=IFCCLOSEDSHELL((#1500,#1511,#1515,#1525,#1528,#1531,#1534,#1537,#1540,#1543,#1546,#1549)); +#1496=IFCCARTESIANPOINT((-64.254,650.,0.)); +#1497=IFCCARTESIANPOINT((-64.254,843.159,0.)); +#1498=IFCCARTESIANPOINT((-64.254,843.159,5.)); +#1499=IFCCARTESIANPOINT((-64.254,650.,5.)); +#1500=IFCFACE((#1501)); +#1501=IFCFACEOUTERBOUND(#1502,.T.); +#1502=IFCPOLYLOOP((#1496,#1497,#1498,#1499)); +#1503=IFCCARTESIANPOINT((-95.441,650.,0.)); +#1504=IFCCARTESIANPOINT((-95.441,895.808,0.)); +#1505=IFCCARTESIANPOINT((-62.074,895.808,0.)); +#1506=IFCCARTESIANPOINT((67.034,702.817,0.)); +#1507=IFCCARTESIANPOINT((67.034,895.808,0.)); +#1508=IFCCARTESIANPOINT((98.221,895.808,0.)); +#1509=IFCCARTESIANPOINT((98.221,650.,0.)); +#1510=IFCCARTESIANPOINT((64.854,650.,0.)); +#1511=IFCFACE((#1512)); +#1512=IFCFACEOUTERBOUND(#1513,.T.); +#1513=IFCPOLYLOOP((#1503,#1504,#1505,#1506,#1507,#1508,#1509,#1510,#1497,#1496)); +#1514=IFCCARTESIANPOINT((64.854,650.,5.)); +#1515=IFCFACE((#1516)); +#1516=IFCFACEOUTERBOUND(#1517,.T.); +#1517=IFCPOLYLOOP((#1497,#1510,#1514,#1498)); +#1518=IFCCARTESIANPOINT((-95.441,895.808,5.)); +#1519=IFCCARTESIANPOINT((-95.441,650.,5.)); +#1520=IFCCARTESIANPOINT((98.221,650.,5.)); +#1521=IFCCARTESIANPOINT((98.221,895.808,5.)); +#1522=IFCCARTESIANPOINT((67.034,895.808,5.)); +#1523=IFCCARTESIANPOINT((67.034,702.817,5.)); +#1524=IFCCARTESIANPOINT((-62.074,895.808,5.)); +#1525=IFCFACE((#1526)); +#1526=IFCFACEOUTERBOUND(#1527,.T.); +#1527=IFCPOLYLOOP((#1518,#1519,#1499,#1498,#1514,#1520,#1521,#1522,#1523,#1524)); +#1528=IFCFACE((#1529)); +#1529=IFCFACEOUTERBOUND(#1530,.T.); +#1530=IFCPOLYLOOP((#1503,#1496,#1499,#1519)); +#1531=IFCFACE((#1532)); +#1532=IFCFACEOUTERBOUND(#1533,.T.); +#1533=IFCPOLYLOOP((#1504,#1503,#1519,#1518)); +#1534=IFCFACE((#1535)); +#1535=IFCFACEOUTERBOUND(#1536,.T.); +#1536=IFCPOLYLOOP((#1505,#1504,#1518,#1524)); +#1537=IFCFACE((#1538)); +#1538=IFCFACEOUTERBOUND(#1539,.T.); +#1539=IFCPOLYLOOP((#1506,#1505,#1524,#1523)); +#1540=IFCFACE((#1541)); +#1541=IFCFACEOUTERBOUND(#1542,.T.); +#1542=IFCPOLYLOOP((#1507,#1506,#1523,#1522)); +#1543=IFCFACE((#1544)); +#1544=IFCFACEOUTERBOUND(#1545,.T.); +#1545=IFCPOLYLOOP((#1508,#1507,#1522,#1521)); +#1546=IFCFACE((#1547)); +#1547=IFCFACEOUTERBOUND(#1548,.T.); +#1548=IFCPOLYLOOP((#1509,#1508,#1521,#1520)); +#1549=IFCFACE((#1550)); +#1550=IFCFACEOUTERBOUND(#1551,.T.); +#1551=IFCPOLYLOOP((#1510,#1509,#1520,#1514)); +#1552=IFCSTYLEDITEM(#1494,(#1011),$); +#1553=IFCFACETEDBREP(#1554); +#1554=IFCCLOSEDSHELL((#1559,#1564,#1582,#1586,#1603,#1606,#1609,#1612,#1615,#1618,#1621,#1624,#1627,#1630,#1633,#1636,#1639,#1642,#1645,#1648)); +#1555=IFCCARTESIANPOINT((-299.7,0.,5.)); +#1556=IFCCARTESIANPOINT((-299.7,0.,0.)); +#1557=IFCCARTESIANPOINT((-293.936,58.527,0.)); +#1558=IFCCARTESIANPOINT((-293.936,58.527,5.)); +#1559=IFCFACE((#1560)); +#1560=IFCFACEOUTERBOUND(#1561,.T.); +#1561=IFCPOLYLOOP((#1555,#1556,#1557,#1558)); +#1562=IFCCARTESIANPOINT((-499.7,0.,5.)); +#1563=IFCCARTESIANPOINT((-499.7,0.,0.)); +#1564=IFCFACE((#1565)); +#1565=IFCFACEOUTERBOUND(#1566,.T.); +#1566=IFCPOLYLOOP((#1556,#1555,#1562,#1563)); +#1567=IFCCARTESIANPOINT((-490.093,97.545,0.)); +#1568=IFCCARTESIANPOINT((-461.64,191.342,0.)); +#1569=IFCCARTESIANPOINT((-415.435,277.785,0.)); +#1570=IFCCARTESIANPOINT((-353.253,353.553,0.)); +#1571=IFCCARTESIANPOINT((-277.485,415.735,0.)); +#1572=IFCCARTESIANPOINT((-191.042,461.94,0.)); +#1573=IFCCARTESIANPOINT((-97.245,490.393,0.)); +#1574=IFCCARTESIANPOINT((0.3,500.,0.)); +#1575=IFCCARTESIANPOINT((0.3,300.,0.)); +#1576=IFCCARTESIANPOINT((-58.227,294.236,0.)); +#1577=IFCCARTESIANPOINT((-114.505,277.164,0.)); +#1578=IFCCARTESIANPOINT((-166.371,249.441,0.)); +#1579=IFCCARTESIANPOINT((-211.832,212.132,0.)); +#1580=IFCCARTESIANPOINT((-249.141,166.671,0.)); +#1581=IFCCARTESIANPOINT((-276.864,114.805,0.)); +#1582=IFCFACE((#1583)); +#1583=IFCFACEOUTERBOUND(#1584,.T.); +#1584=IFCPOLYLOOP((#1567,#1568,#1569,#1570,#1571,#1572,#1573,#1574,#1575,#1576,#1577,#1578,#1579,#1580,#1581,#1557,#1556,#1563)); +#1585=IFCCARTESIANPOINT((-276.864,114.805,5.)); +#1586=IFCFACE((#1587)); +#1587=IFCFACEOUTERBOUND(#1588,.T.); +#1588=IFCPOLYLOOP((#1558,#1557,#1581,#1585)); +#1589=IFCCARTESIANPOINT((-114.505,277.164,5.)); +#1590=IFCCARTESIANPOINT((-58.227,294.236,5.)); +#1591=IFCCARTESIANPOINT((0.3,300.,5.)); +#1592=IFCCARTESIANPOINT((0.3,500.,5.)); +#1593=IFCCARTESIANPOINT((-97.245,490.393,5.)); +#1594=IFCCARTESIANPOINT((-191.042,461.94,5.)); +#1595=IFCCARTESIANPOINT((-277.485,415.735,5.)); +#1596=IFCCARTESIANPOINT((-353.253,353.553,5.)); +#1597=IFCCARTESIANPOINT((-415.435,277.785,5.)); +#1598=IFCCARTESIANPOINT((-461.64,191.342,5.)); +#1599=IFCCARTESIANPOINT((-490.093,97.545,5.)); +#1600=IFCCARTESIANPOINT((-249.141,166.671,5.)); +#1601=IFCCARTESIANPOINT((-211.832,212.132,5.)); +#1602=IFCCARTESIANPOINT((-166.371,249.441,5.)); +#1603=IFCFACE((#1604)); +#1604=IFCFACEOUTERBOUND(#1605,.T.); +#1605=IFCPOLYLOOP((#1589,#1590,#1591,#1592,#1593,#1594,#1595,#1596,#1597,#1598,#1599,#1562,#1555,#1558,#1585,#1600,#1601,#1602)); +#1606=IFCFACE((#1607)); +#1607=IFCFACEOUTERBOUND(#1608,.T.); +#1608=IFCPOLYLOOP((#1562,#1599,#1567,#1563)); +#1609=IFCFACE((#1610)); +#1610=IFCFACEOUTERBOUND(#1611,.T.); +#1611=IFCPOLYLOOP((#1599,#1598,#1568,#1567)); +#1612=IFCFACE((#1613)); +#1613=IFCFACEOUTERBOUND(#1614,.T.); +#1614=IFCPOLYLOOP((#1569,#1568,#1598,#1597)); +#1615=IFCFACE((#1616)); +#1616=IFCFACEOUTERBOUND(#1617,.T.); +#1617=IFCPOLYLOOP((#1570,#1569,#1597,#1596)); +#1618=IFCFACE((#1619)); +#1619=IFCFACEOUTERBOUND(#1620,.T.); +#1620=IFCPOLYLOOP((#1596,#1595,#1571,#1570)); +#1621=IFCFACE((#1622)); +#1622=IFCFACEOUTERBOUND(#1623,.T.); +#1623=IFCPOLYLOOP((#1572,#1571,#1595,#1594)); +#1624=IFCFACE((#1625)); +#1625=IFCFACEOUTERBOUND(#1626,.T.); +#1626=IFCPOLYLOOP((#1573,#1572,#1594,#1593)); +#1627=IFCFACE((#1628)); +#1628=IFCFACEOUTERBOUND(#1629,.T.); +#1629=IFCPOLYLOOP((#1574,#1573,#1593,#1592)); +#1630=IFCFACE((#1631)); +#1631=IFCFACEOUTERBOUND(#1632,.T.); +#1632=IFCPOLYLOOP((#1591,#1575,#1574,#1592)); +#1633=IFCFACE((#1634)); +#1634=IFCFACEOUTERBOUND(#1635,.T.); +#1635=IFCPOLYLOOP((#1591,#1590,#1576,#1575)); +#1636=IFCFACE((#1637)); +#1637=IFCFACEOUTERBOUND(#1638,.T.); +#1638=IFCPOLYLOOP((#1589,#1577,#1576,#1590)); +#1639=IFCFACE((#1640)); +#1640=IFCFACEOUTERBOUND(#1641,.T.); +#1641=IFCPOLYLOOP((#1577,#1589,#1602,#1578)); +#1642=IFCFACE((#1643)); +#1643=IFCFACEOUTERBOUND(#1644,.T.); +#1644=IFCPOLYLOOP((#1601,#1579,#1578,#1602)); +#1645=IFCFACE((#1646)); +#1646=IFCFACEOUTERBOUND(#1647,.T.); +#1647=IFCPOLYLOOP((#1600,#1580,#1579,#1601)); +#1648=IFCFACE((#1649)); +#1649=IFCFACEOUTERBOUND(#1650,.T.); +#1650=IFCPOLYLOOP((#1580,#1600,#1585,#1581)); +#1651=IFCSTYLEDITEM(#1553,(#1011),$); +#1652=IFCFACETEDBREP(#1653); +#1653=IFCCLOSEDSHELL((#1658,#1663,#1667,#1671,#1674,#1677)); +#1654=IFCCARTESIANPOINT((200.3,0.,0.)); +#1655=IFCCARTESIANPOINT((0.3,0.,0.)); +#1656=IFCCARTESIANPOINT((0.3,200.,0.)); +#1657=IFCCARTESIANPOINT((200.3,200.,0.)); +#1658=IFCFACE((#1659)); +#1659=IFCFACEOUTERBOUND(#1660,.T.); +#1660=IFCPOLYLOOP((#1654,#1655,#1656,#1657)); +#1661=IFCCARTESIANPOINT((200.3,0.,100.)); +#1662=IFCCARTESIANPOINT((0.3,0.,100.)); +#1663=IFCFACE((#1664)); +#1664=IFCFACEOUTERBOUND(#1665,.T.); +#1665=IFCPOLYLOOP((#1655,#1654,#1661,#1662)); +#1666=IFCCARTESIANPOINT((0.3,200.,100.)); +#1667=IFCFACE((#1668)); +#1668=IFCFACEOUTERBOUND(#1669,.T.); +#1669=IFCPOLYLOOP((#1656,#1655,#1662,#1666)); +#1670=IFCCARTESIANPOINT((200.3,200.,100.)); +#1671=IFCFACE((#1672)); +#1672=IFCFACEOUTERBOUND(#1673,.T.); +#1673=IFCPOLYLOOP((#1657,#1656,#1666,#1670)); +#1674=IFCFACE((#1675)); +#1675=IFCFACEOUTERBOUND(#1676,.T.); +#1676=IFCPOLYLOOP((#1654,#1657,#1670,#1661)); +#1677=IFCFACE((#1678)); +#1678=IFCFACEOUTERBOUND(#1679,.T.); +#1679=IFCPOLYLOOP((#1662,#1661,#1670,#1666)); +#1680=IFCSTYLEDITEM(#1652,(#1011),$); +#1681=IFCFACETEDBREP(#1682); +#1682=IFCCLOSEDSHELL((#1753,#1758,#1762,#1766,#1770,#1774,#1778,#1782,#1786,#1790,#1794,#1798,#1802,#1806,#1810,#1814,#1818,#1822,#1827,#1830,#1833,#1836,#1840,#1844,#1848,#1852,#1856,#1860,#1864,#1868,#1872,#1876,#1880,#1884,#1888,#1892,#1896,#1900,#1904,#1908,#1912,#1916,#1920,#1924,#1928,#1932,#1936,#1940,#1944,#1948,#1952,#1956,#1960,#1964,#1968,#1972,#1976,#1980,#1984,#1988,#1992,#1996,#2000,#2004,#2008,#2012,#2016,#2020,#2024,#2028,#2032,#2036,#2039,#2042)); +#1683=IFCCARTESIANPOINT((-102.651,-821.026,0.)); +#1684=IFCCARTESIANPOINT((-71.967,-818.343,0.)); +#1685=IFCCARTESIANPOINT((-68.341,-835.132,0.)); +#1686=IFCCARTESIANPOINT((-61.823,-848.608,0.)); +#1687=IFCCARTESIANPOINT((-51.658,-859.297,0.)); +#1688=IFCCARTESIANPOINT((-37.091,-867.723,0.)); +#1689=IFCCARTESIANPOINT((-19.276,-873.193,0.)); +#1690=IFCCARTESIANPOINT((0.635,-875.017,0.)); +#1691=IFCCARTESIANPOINT((18.157,-873.633,0.)); +#1692=IFCCARTESIANPOINT((33.499,-869.484,0.)); +#1693=IFCCARTESIANPOINT((45.928,-862.923,0.)); +#1694=IFCCARTESIANPOINT((54.71,-854.309,0.)); +#1695=IFCCARTESIANPOINT((59.929,-844.228,0.)); +#1696=IFCCARTESIANPOINT((61.668,-833.266,0.)); +#1697=IFCCARTESIANPOINT((59.991,-822.43,0.)); +#1698=IFCCARTESIANPOINT((54.961,-813.062,0.)); +#1699=IFCCARTESIANPOINT((46.075,-805.118,0.)); +#1700=IFCCARTESIANPOINT((32.829,-798.558,0.)); +#1701=IFCCARTESIANPOINT((-10.934,-786.569,0.)); +#1702=IFCCARTESIANPOINT((-39.732,-778.668,0.)); +#1703=IFCCARTESIANPOINT((-58.385,-771.227,0.)); +#1704=IFCCARTESIANPOINT((-73.748,-760.895,0.)); +#1705=IFCCARTESIANPOINT((-84.626,-748.34,0.)); +#1706=IFCCARTESIANPOINT((-91.103,-733.857,0.)); +#1707=IFCCARTESIANPOINT((-93.261,-717.74,0.)); +#1708=IFCCARTESIANPOINT((-90.621,-699.736,0.)); +#1709=IFCCARTESIANPOINT((-82.698,-682.948,0.)); +#1710=IFCCARTESIANPOINT((-69.703,-668.716,0.)); +#1711=IFCCARTESIANPOINT((-51.846,-658.384,0.)); +#1712=IFCCARTESIANPOINT((-30.426,-652.096,0.)); +#1713=IFCCARTESIANPOINT((-6.742,-650.,0.)); +#1714=IFCCARTESIANPOINT((18.975,-652.201,0.)); +#1715=IFCCARTESIANPOINT((41.464,-658.803,0.)); +#1716=IFCCARTESIANPOINT((59.929,-669.681,0.)); +#1717=IFCCARTESIANPOINT((73.573,-684.708,0.)); +#1718=IFCCARTESIANPOINT((82.208,-702.943,0.)); +#1719=IFCCARTESIANPOINT((85.645,-723.441,0.)); +#1720=IFCCARTESIANPOINT((54.458,-725.788,0.)); +#1721=IFCCARTESIANPOINT((48.946,-705.332,0.)); +#1722=IFCCARTESIANPOINT((43.942,-697.242,0.)); +#1723=IFCCARTESIANPOINT((37.44,-690.577,0.)); +#1724=IFCCARTESIANPOINT((29.323,-685.368,0.)); +#1725=IFCCARTESIANPOINT((19.478,-681.648,0.)); +#1726=IFCCARTESIANPOINT((-5.401,-678.672,0.)); +#1727=IFCCARTESIANPOINT((-30.908,-681.376,0.)); +#1728=IFCCARTESIANPOINT((-40.659,-684.755,0.)); +#1729=IFCCARTESIANPOINT((-48.409,-689.487,0.)); +#1730=IFCCARTESIANPOINT((-58.532,-701.413,0.)); +#1731=IFCCARTESIANPOINT((-61.907,-715.56,0.)); +#1732=IFCCARTESIANPOINT((-59.517,-727.632,0.)); +#1733=IFCCARTESIANPOINT((-52.349,-737.357,0.)); +#1734=IFCCARTESIANPOINT((-35.393,-746.014,0.)); +#1735=IFCCARTESIANPOINT((-3.305,-754.879,0.)); +#1736=IFCCARTESIANPOINT((30.125,-763.284,0.)); +#1737=IFCCARTESIANPOINT((51.105,-770.557,0.)); +#1738=IFCCARTESIANPOINT((69.758,-781.77,0.)); +#1739=IFCCARTESIANPOINT((82.795,-795.624,0.)); +#1740=IFCCARTESIANPOINT((90.466,-811.951,0.)); +#1741=IFCCARTESIANPOINT((93.023,-830.584,0.)); +#1742=IFCCARTESIANPOINT((90.214,-849.635,0.)); +#1743=IFCCARTESIANPOINT((81.789,-867.555,0.)); +#1744=IFCCARTESIANPOINT((68.103,-882.981,0.)); +#1745=IFCCARTESIANPOINT((49.512,-894.551,0.)); +#1746=IFCCARTESIANPOINT((27.149,-901.782,0.)); +#1747=IFCCARTESIANPOINT((2.144,-904.192,0.)); +#1748=IFCCARTESIANPOINT((-28.519,-901.761,0.)); +#1749=IFCCARTESIANPOINT((-53.774,-894.467,0.)); +#1750=IFCCARTESIANPOINT((-73.895,-882.29,0.)); +#1751=IFCCARTESIANPOINT((-89.153,-865.208,0.)); +#1752=IFCCARTESIANPOINT((-98.941,-844.396,0.)); +#1753=IFCFACE((#1754)); +#1754=IFCFACEOUTERBOUND(#1755,.T.); +#1755=IFCPOLYLOOP((#1683,#1684,#1685,#1686,#1687,#1688,#1689,#1690,#1691,#1692,#1693,#1694,#1695,#1696,#1697,#1698,#1699,#1700,#1701,#1702,#1703,#1704,#1705,#1706,#1707,#1708,#1709,#1710,#1711,#1712,#1713,#1714,#1715,#1716,#1717,#1718,#1719,#1720,#1721,#1722,#1723,#1724,#1725,#1726,#1727,#1728,#1729,#1730,#1731,#1732,#1733,#1734,#1735,#1736,#1737,#1738,#1739,#1740,#1741,#1742,#1743,#1744,#1745,#1746,#1747,#1748,#1749,#1750,#1751,#1752)); +#1756=IFCCARTESIANPOINT((-102.651,-821.026,5.)); +#1757=IFCCARTESIANPOINT((-71.967,-818.343,5.)); +#1758=IFCFACE((#1759)); +#1759=IFCFACEOUTERBOUND(#1760,.T.); +#1760=IFCPOLYLOOP((#1684,#1683,#1756,#1757)); +#1761=IFCCARTESIANPOINT((-68.341,-835.132,5.)); +#1762=IFCFACE((#1763)); +#1763=IFCFACEOUTERBOUND(#1764,.T.); +#1764=IFCPOLYLOOP((#1685,#1684,#1757,#1761)); +#1765=IFCCARTESIANPOINT((-61.823,-848.608,5.)); +#1766=IFCFACE((#1767)); +#1767=IFCFACEOUTERBOUND(#1768,.T.); +#1768=IFCPOLYLOOP((#1686,#1685,#1761,#1765)); +#1769=IFCCARTESIANPOINT((-51.658,-859.297,5.)); +#1770=IFCFACE((#1771)); +#1771=IFCFACEOUTERBOUND(#1772,.T.); +#1772=IFCPOLYLOOP((#1687,#1686,#1765,#1769)); +#1773=IFCCARTESIANPOINT((-37.091,-867.723,5.)); +#1774=IFCFACE((#1775)); +#1775=IFCFACEOUTERBOUND(#1776,.T.); +#1776=IFCPOLYLOOP((#1688,#1687,#1769,#1773)); +#1777=IFCCARTESIANPOINT((-19.276,-873.193,5.)); +#1778=IFCFACE((#1779)); +#1779=IFCFACEOUTERBOUND(#1780,.T.); +#1780=IFCPOLYLOOP((#1689,#1688,#1773,#1777)); +#1781=IFCCARTESIANPOINT((0.635,-875.017,5.)); +#1782=IFCFACE((#1783)); +#1783=IFCFACEOUTERBOUND(#1784,.T.); +#1784=IFCPOLYLOOP((#1690,#1689,#1777,#1781)); +#1785=IFCCARTESIANPOINT((18.157,-873.633,5.)); +#1786=IFCFACE((#1787)); +#1787=IFCFACEOUTERBOUND(#1788,.T.); +#1788=IFCPOLYLOOP((#1691,#1690,#1781,#1785)); +#1789=IFCCARTESIANPOINT((33.499,-869.484,5.)); +#1790=IFCFACE((#1791)); +#1791=IFCFACEOUTERBOUND(#1792,.T.); +#1792=IFCPOLYLOOP((#1692,#1691,#1785,#1789)); +#1793=IFCCARTESIANPOINT((45.928,-862.923,5.)); +#1794=IFCFACE((#1795)); +#1795=IFCFACEOUTERBOUND(#1796,.T.); +#1796=IFCPOLYLOOP((#1693,#1692,#1789,#1793)); +#1797=IFCCARTESIANPOINT((54.71,-854.309,5.)); +#1798=IFCFACE((#1799)); +#1799=IFCFACEOUTERBOUND(#1800,.T.); +#1800=IFCPOLYLOOP((#1694,#1693,#1793,#1797)); +#1801=IFCCARTESIANPOINT((59.929,-844.228,5.)); +#1802=IFCFACE((#1803)); +#1803=IFCFACEOUTERBOUND(#1804,.T.); +#1804=IFCPOLYLOOP((#1695,#1694,#1797,#1801)); +#1805=IFCCARTESIANPOINT((61.668,-833.266,5.)); +#1806=IFCFACE((#1807)); +#1807=IFCFACEOUTERBOUND(#1808,.T.); +#1808=IFCPOLYLOOP((#1696,#1695,#1801,#1805)); +#1809=IFCCARTESIANPOINT((59.991,-822.43,5.)); +#1810=IFCFACE((#1811)); +#1811=IFCFACEOUTERBOUND(#1812,.T.); +#1812=IFCPOLYLOOP((#1697,#1696,#1805,#1809)); +#1813=IFCCARTESIANPOINT((54.961,-813.062,5.)); +#1814=IFCFACE((#1815)); +#1815=IFCFACEOUTERBOUND(#1816,.T.); +#1816=IFCPOLYLOOP((#1698,#1697,#1809,#1813)); +#1817=IFCCARTESIANPOINT((46.075,-805.118,5.)); +#1818=IFCFACE((#1819)); +#1819=IFCFACEOUTERBOUND(#1820,.T.); +#1820=IFCPOLYLOOP((#1699,#1698,#1813,#1817)); +#1821=IFCCARTESIANPOINT((32.829,-798.558,5.)); +#1822=IFCFACE((#1823)); +#1823=IFCFACEOUTERBOUND(#1824,.T.); +#1824=IFCPOLYLOOP((#1700,#1699,#1817,#1821)); +#1825=IFCCARTESIANPOINT((-10.934,-786.569,5.)); +#1826=IFCCARTESIANPOINT((-39.732,-778.668,5.)); +#1827=IFCFACE((#1828)); +#1828=IFCFACEOUTERBOUND(#1829,.T.); +#1829=IFCPOLYLOOP((#1821,#1825,#1826)); +#1830=IFCFACE((#1831)); +#1831=IFCFACEOUTERBOUND(#1832,.T.); +#1832=IFCPOLYLOOP((#1821,#1826,#1702)); +#1833=IFCFACE((#1834)); +#1834=IFCFACEOUTERBOUND(#1835,.T.); +#1835=IFCPOLYLOOP((#1821,#1702,#1701)); +#1836=IFCFACE((#1837)); +#1837=IFCFACEOUTERBOUND(#1838,.T.); +#1838=IFCPOLYLOOP((#1821,#1701,#1700)); +#1839=IFCCARTESIANPOINT((-58.385,-771.227,5.)); +#1840=IFCFACE((#1841)); +#1841=IFCFACEOUTERBOUND(#1842,.T.); +#1842=IFCPOLYLOOP((#1703,#1702,#1826,#1839)); +#1843=IFCCARTESIANPOINT((-73.748,-760.895,5.)); +#1844=IFCFACE((#1845)); +#1845=IFCFACEOUTERBOUND(#1846,.T.); +#1846=IFCPOLYLOOP((#1704,#1703,#1839,#1843)); +#1847=IFCCARTESIANPOINT((-84.626,-748.34,5.)); +#1848=IFCFACE((#1849)); +#1849=IFCFACEOUTERBOUND(#1850,.T.); +#1850=IFCPOLYLOOP((#1705,#1704,#1843,#1847)); +#1851=IFCCARTESIANPOINT((-91.103,-733.857,5.)); +#1852=IFCFACE((#1853)); +#1853=IFCFACEOUTERBOUND(#1854,.T.); +#1854=IFCPOLYLOOP((#1706,#1705,#1847,#1851)); +#1855=IFCCARTESIANPOINT((-93.261,-717.74,5.)); +#1856=IFCFACE((#1857)); +#1857=IFCFACEOUTERBOUND(#1858,.T.); +#1858=IFCPOLYLOOP((#1707,#1706,#1851,#1855)); +#1859=IFCCARTESIANPOINT((-90.621,-699.736,5.)); +#1860=IFCFACE((#1861)); +#1861=IFCFACEOUTERBOUND(#1862,.T.); +#1862=IFCPOLYLOOP((#1708,#1707,#1855,#1859)); +#1863=IFCCARTESIANPOINT((-82.698,-682.948,5.)); +#1864=IFCFACE((#1865)); +#1865=IFCFACEOUTERBOUND(#1866,.T.); +#1866=IFCPOLYLOOP((#1709,#1708,#1859,#1863)); +#1867=IFCCARTESIANPOINT((-69.703,-668.716,5.)); +#1868=IFCFACE((#1869)); +#1869=IFCFACEOUTERBOUND(#1870,.T.); +#1870=IFCPOLYLOOP((#1710,#1709,#1863,#1867)); +#1871=IFCCARTESIANPOINT((-51.846,-658.384,5.)); +#1872=IFCFACE((#1873)); +#1873=IFCFACEOUTERBOUND(#1874,.T.); +#1874=IFCPOLYLOOP((#1711,#1710,#1867,#1871)); +#1875=IFCCARTESIANPOINT((-30.426,-652.096,5.)); +#1876=IFCFACE((#1877)); +#1877=IFCFACEOUTERBOUND(#1878,.T.); +#1878=IFCPOLYLOOP((#1712,#1711,#1871,#1875)); +#1879=IFCCARTESIANPOINT((-6.742,-650.,5.)); +#1880=IFCFACE((#1881)); +#1881=IFCFACEOUTERBOUND(#1882,.T.); +#1882=IFCPOLYLOOP((#1713,#1712,#1875,#1879)); +#1883=IFCCARTESIANPOINT((18.975,-652.201,5.)); +#1884=IFCFACE((#1885)); +#1885=IFCFACEOUTERBOUND(#1886,.T.); +#1886=IFCPOLYLOOP((#1714,#1713,#1879,#1883)); +#1887=IFCCARTESIANPOINT((41.464,-658.803,5.)); +#1888=IFCFACE((#1889)); +#1889=IFCFACEOUTERBOUND(#1890,.T.); +#1890=IFCPOLYLOOP((#1715,#1714,#1883,#1887)); +#1891=IFCCARTESIANPOINT((59.929,-669.681,5.)); +#1892=IFCFACE((#1893)); +#1893=IFCFACEOUTERBOUND(#1894,.T.); +#1894=IFCPOLYLOOP((#1716,#1715,#1887,#1891)); +#1895=IFCCARTESIANPOINT((73.573,-684.708,5.)); +#1896=IFCFACE((#1897)); +#1897=IFCFACEOUTERBOUND(#1898,.T.); +#1898=IFCPOLYLOOP((#1717,#1716,#1891,#1895)); +#1899=IFCCARTESIANPOINT((82.208,-702.943,5.)); +#1900=IFCFACE((#1901)); +#1901=IFCFACEOUTERBOUND(#1902,.T.); +#1902=IFCPOLYLOOP((#1718,#1717,#1895,#1899)); +#1903=IFCCARTESIANPOINT((85.645,-723.441,5.)); +#1904=IFCFACE((#1905)); +#1905=IFCFACEOUTERBOUND(#1906,.T.); +#1906=IFCPOLYLOOP((#1719,#1718,#1899,#1903)); +#1907=IFCCARTESIANPOINT((54.458,-725.788,5.)); +#1908=IFCFACE((#1909)); +#1909=IFCFACEOUTERBOUND(#1910,.T.); +#1910=IFCPOLYLOOP((#1720,#1719,#1903,#1907)); +#1911=IFCCARTESIANPOINT((48.946,-705.332,5.)); +#1912=IFCFACE((#1913)); +#1913=IFCFACEOUTERBOUND(#1914,.T.); +#1914=IFCPOLYLOOP((#1721,#1720,#1907,#1911)); +#1915=IFCCARTESIANPOINT((43.942,-697.242,5.)); +#1916=IFCFACE((#1917)); +#1917=IFCFACEOUTERBOUND(#1918,.T.); +#1918=IFCPOLYLOOP((#1722,#1721,#1911,#1915)); +#1919=IFCCARTESIANPOINT((37.44,-690.577,5.)); +#1920=IFCFACE((#1921)); +#1921=IFCFACEOUTERBOUND(#1922,.T.); +#1922=IFCPOLYLOOP((#1723,#1722,#1915,#1919)); +#1923=IFCCARTESIANPOINT((29.323,-685.368,5.)); +#1924=IFCFACE((#1925)); +#1925=IFCFACEOUTERBOUND(#1926,.T.); +#1926=IFCPOLYLOOP((#1724,#1723,#1919,#1923)); +#1927=IFCCARTESIANPOINT((19.478,-681.648,5.)); +#1928=IFCFACE((#1929)); +#1929=IFCFACEOUTERBOUND(#1930,.T.); +#1930=IFCPOLYLOOP((#1725,#1724,#1923,#1927)); +#1931=IFCCARTESIANPOINT((-5.401,-678.672,5.)); +#1932=IFCFACE((#1933)); +#1933=IFCFACEOUTERBOUND(#1934,.T.); +#1934=IFCPOLYLOOP((#1726,#1725,#1927,#1931)); +#1935=IFCCARTESIANPOINT((-30.908,-681.376,5.)); +#1936=IFCFACE((#1937)); +#1937=IFCFACEOUTERBOUND(#1938,.T.); +#1938=IFCPOLYLOOP((#1727,#1726,#1931,#1935)); +#1939=IFCCARTESIANPOINT((-40.659,-684.755,5.)); +#1940=IFCFACE((#1941)); +#1941=IFCFACEOUTERBOUND(#1942,.T.); +#1942=IFCPOLYLOOP((#1728,#1727,#1935,#1939)); +#1943=IFCCARTESIANPOINT((-48.409,-689.487,5.)); +#1944=IFCFACE((#1945)); +#1945=IFCFACEOUTERBOUND(#1946,.T.); +#1946=IFCPOLYLOOP((#1729,#1728,#1939,#1943)); +#1947=IFCCARTESIANPOINT((-58.532,-701.413,5.)); +#1948=IFCFACE((#1949)); +#1949=IFCFACEOUTERBOUND(#1950,.T.); +#1950=IFCPOLYLOOP((#1730,#1729,#1943,#1947)); +#1951=IFCCARTESIANPOINT((-61.907,-715.56,5.)); +#1952=IFCFACE((#1953)); +#1953=IFCFACEOUTERBOUND(#1954,.T.); +#1954=IFCPOLYLOOP((#1731,#1730,#1947,#1951)); +#1955=IFCCARTESIANPOINT((-59.517,-727.632,5.)); +#1956=IFCFACE((#1957)); +#1957=IFCFACEOUTERBOUND(#1958,.T.); +#1958=IFCPOLYLOOP((#1732,#1731,#1951,#1955)); +#1959=IFCCARTESIANPOINT((-52.349,-737.357,5.)); +#1960=IFCFACE((#1961)); +#1961=IFCFACEOUTERBOUND(#1962,.T.); +#1962=IFCPOLYLOOP((#1733,#1732,#1955,#1959)); +#1963=IFCCARTESIANPOINT((-35.393,-746.014,5.)); +#1964=IFCFACE((#1965)); +#1965=IFCFACEOUTERBOUND(#1966,.T.); +#1966=IFCPOLYLOOP((#1734,#1733,#1959,#1963)); +#1967=IFCCARTESIANPOINT((-3.305,-754.879,5.)); +#1968=IFCFACE((#1969)); +#1969=IFCFACEOUTERBOUND(#1970,.T.); +#1970=IFCPOLYLOOP((#1735,#1734,#1963,#1967)); +#1971=IFCCARTESIANPOINT((30.125,-763.284,5.)); +#1972=IFCFACE((#1973)); +#1973=IFCFACEOUTERBOUND(#1974,.T.); +#1974=IFCPOLYLOOP((#1736,#1735,#1967,#1971)); +#1975=IFCCARTESIANPOINT((51.105,-770.557,5.)); +#1976=IFCFACE((#1977)); +#1977=IFCFACEOUTERBOUND(#1978,.T.); +#1978=IFCPOLYLOOP((#1737,#1736,#1971,#1975)); +#1979=IFCCARTESIANPOINT((69.758,-781.77,5.)); +#1980=IFCFACE((#1981)); +#1981=IFCFACEOUTERBOUND(#1982,.T.); +#1982=IFCPOLYLOOP((#1738,#1737,#1975,#1979)); +#1983=IFCCARTESIANPOINT((82.795,-795.624,5.)); +#1984=IFCFACE((#1985)); +#1985=IFCFACEOUTERBOUND(#1986,.T.); +#1986=IFCPOLYLOOP((#1739,#1738,#1979,#1983)); +#1987=IFCCARTESIANPOINT((90.466,-811.951,5.)); +#1988=IFCFACE((#1989)); +#1989=IFCFACEOUTERBOUND(#1990,.T.); +#1990=IFCPOLYLOOP((#1740,#1739,#1983,#1987)); +#1991=IFCCARTESIANPOINT((93.023,-830.584,5.)); +#1992=IFCFACE((#1993)); +#1993=IFCFACEOUTERBOUND(#1994,.T.); +#1994=IFCPOLYLOOP((#1741,#1740,#1987,#1991)); +#1995=IFCCARTESIANPOINT((90.214,-849.635,5.)); +#1996=IFCFACE((#1997)); +#1997=IFCFACEOUTERBOUND(#1998,.T.); +#1998=IFCPOLYLOOP((#1742,#1741,#1991,#1995)); +#1999=IFCCARTESIANPOINT((81.789,-867.555,5.)); +#2000=IFCFACE((#2001)); +#2001=IFCFACEOUTERBOUND(#2002,.T.); +#2002=IFCPOLYLOOP((#1743,#1742,#1995,#1999)); +#2003=IFCCARTESIANPOINT((68.103,-882.981,5.)); +#2004=IFCFACE((#2005)); +#2005=IFCFACEOUTERBOUND(#2006,.T.); +#2006=IFCPOLYLOOP((#1744,#1743,#1999,#2003)); +#2007=IFCCARTESIANPOINT((49.512,-894.551,5.)); +#2008=IFCFACE((#2009)); +#2009=IFCFACEOUTERBOUND(#2010,.T.); +#2010=IFCPOLYLOOP((#1745,#1744,#2003,#2007)); +#2011=IFCCARTESIANPOINT((27.149,-901.782,5.)); +#2012=IFCFACE((#2013)); +#2013=IFCFACEOUTERBOUND(#2014,.T.); +#2014=IFCPOLYLOOP((#1746,#1745,#2007,#2011)); +#2015=IFCCARTESIANPOINT((2.144,-904.192,5.)); +#2016=IFCFACE((#2017)); +#2017=IFCFACEOUTERBOUND(#2018,.T.); +#2018=IFCPOLYLOOP((#1747,#1746,#2011,#2015)); +#2019=IFCCARTESIANPOINT((-28.519,-901.761,5.)); +#2020=IFCFACE((#2021)); +#2021=IFCFACEOUTERBOUND(#2022,.T.); +#2022=IFCPOLYLOOP((#1748,#1747,#2015,#2019)); +#2023=IFCCARTESIANPOINT((-53.774,-894.467,5.)); +#2024=IFCFACE((#2025)); +#2025=IFCFACEOUTERBOUND(#2026,.T.); +#2026=IFCPOLYLOOP((#1749,#1748,#2019,#2023)); +#2027=IFCCARTESIANPOINT((-73.895,-882.29,5.)); +#2028=IFCFACE((#2029)); +#2029=IFCFACEOUTERBOUND(#2030,.T.); +#2030=IFCPOLYLOOP((#1750,#1749,#2023,#2027)); +#2031=IFCCARTESIANPOINT((-89.153,-865.208,5.)); +#2032=IFCFACE((#2033)); +#2033=IFCFACEOUTERBOUND(#2034,.T.); +#2034=IFCPOLYLOOP((#1751,#1750,#2027,#2031)); +#2035=IFCCARTESIANPOINT((-98.941,-844.396,5.)); +#2036=IFCFACE((#2037)); +#2037=IFCFACEOUTERBOUND(#2038,.T.); +#2038=IFCPOLYLOOP((#1752,#1751,#2031,#2035)); +#2039=IFCFACE((#2040)); +#2040=IFCFACEOUTERBOUND(#2041,.T.); +#2041=IFCPOLYLOOP((#1683,#1752,#2035,#1756)); +#2042=IFCFACE((#2043)); +#2043=IFCFACEOUTERBOUND(#2044,.T.); +#2044=IFCPOLYLOOP((#1757,#1756,#2035,#2031,#2027,#2023,#2019,#2015,#2011,#2007,#2003,#1999,#1995,#1991,#1987,#1983,#1979,#1975,#1971,#1967,#1963,#1959,#1955,#1951,#1947,#1943,#1939,#1935,#1931,#1927,#1923,#1919,#1915,#1911,#1907,#1903,#1899,#1895,#1891,#1887,#1883,#1879,#1875,#1871,#1867,#1863,#1859,#1855,#1851,#1847,#1843,#1839,#1826,#1825,#1821,#1817,#1813,#1809,#1805,#1801,#1797,#1793,#1789,#1785,#1781,#1777,#1773,#1769,#1765,#1761)); +#2045=IFCSTYLEDITEM(#1681,(#1011),$); +#2046=IFCPRODUCTDEFINITIONSHAPE($,$,(#908)); +ENDSEC; +END-ISO-10303-21; diff --git a/tests/fixtures/bsi_ifc4_building_hvac.ifc b/tests/fixtures/bsi_ifc4_building_hvac.ifc new file mode 100644 index 0000000..66b38c9 --- /dev/null +++ b/tests/fixtures/bsi_ifc4_building_hvac.ifc @@ -0,0 +1,161 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [ReferenceView_V1.2]'),'2;1'); +FILE_NAME('Building-Hvac.ifc','2026-06-23T11:53:44',(''),(''),'Sketchup-IFC-manager 5.6.0 / SketchUp 2026 (26.2.242)','BIM_Tools - Sketchup_IFC_manager - 5.6.0','None'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCOWNERHISTORY(#2,#5,$,.ADDED.,1782208424,#2,#5,1782208424); +#2=IFCPERSONANDORGANIZATION(#3,#4,$); +#3=IFCPERSON('3720f2e9-0107-4ce6-b699-e20d9bd03331','Jan B.',$,$,$,$,$,$); +#4=IFCORGANIZATION($,'buildingSMART International','buildingSMART is the worldwide industry body driving the digital transformation of the built environment.',$,$); +#5=IFCAPPLICATION(#6,'5.6.0','IFC manager for sketchup','su_ifcmanager'); +#6=IFCORGANIZATION($,'BIM-Tools',$,$,$); +#7=IFCAXIS2PLACEMENT3D(#8,#9,#10); +#8=IFCCARTESIANPOINT((0.,0.,0.)); +#9=IFCDIRECTION((0.,0.,1.)); +#10=IFCDIRECTION((1.,0.,0.)); +#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.001,#7,$); +#12=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#11,$,.MODEL_VIEW.,$); +#13=IFCPROJECT('2Ndyd$OSX7s9A04nc4lyye',#1,'ifc silly sample scene - project','Demystifying IFC with a playful scene using diverse building elements and compositions.',$,$,$,(#11),#14); +#14=IFCUNITASSIGNMENT((#15,#16,#17)); +#15=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#16=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#17=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); +#18=IFCPROJECTEDCRS('EPSG:32760','EPSG:32760 - WGS 84 / UTM zone 60S','WGS 84',$,$,$,#19); +#19=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.); +#20=IFCMAPCONVERSION(#11,#18,729013.3488297004,9063992.684697364,1.3000000000000018,0.4999999999999999,0.8660254037844387,0.001); +#21=IFCSITE('23sFQGRy90RxVbRHD9iSE2',#1,'environment - site','A sample scene environment, showcasing the surrounding landscape.',$,#23,$,$,.COMPLEX.,$,$,0.,$,$); +#22=IFCRELAGGREGATES('0xU4rrHvv1TB26eqbzCvGj',#1,'ifc silly sample scene - project container',$,#13,(#21)); +#23=IFCLOCALPLACEMENT($,#24); +#24=IFCAXIS2PLACEMENT3D(#25,#26,#27); +#25=IFCCARTESIANPOINT((-28841.016,-14200.,-1300.)); +#26=IFCDIRECTION((0.,0.,1.)); +#27=IFCDIRECTION((0.4999999999999999,-0.8660254037844387,0.)); +#28=IFCSITE('1Pbuu0tu59NfhrTsztVBK1',#1,'house - site','Smoke curls from a friendly chimney, promising warmth within this idyllic hilltop house.',$,#30,$,$,.PARTIAL.,$,$,0.,$,$); +#29=IFCRELAGGREGATES('2X5UKnc59A8xhk2N8Wj$aB',#1,'environment - site container',$,#21,(#28)); +#30=IFCLOCALPLACEMENT(#23,#31); +#31=IFCAXIS2PLACEMENT3D(#32,#33,#34); +#32=IFCCARTESIANPOINT((0.,40000.,0.)); +#33=IFCDIRECTION((0.,0.,1.)); +#34=IFCDIRECTION((0.4999999999999999,0.8660254037844387,0.)); +#35=IFCBUILDING('0c$N1CTon2BB2Sp89385G8',#1,'Single-family house','The main building structure, providing shelter and space.','house',#40,$,'house - building',.ELEMENT.,$,$,$); +#36=IFCCLASSIFICATION('Molio','1.0','2023-01-23','CCI Construction',$,'https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0',$); +#37=IFCCLASSIFICATIONREFERENCE('https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0/class/E-AAA','E-AAA','Single-family house',#36,$,$); +#38=IFCRELASSOCIATESCLASSIFICATION('3TlC6xeDP0uhRrs9WxVfPe',#1,'CCI Construction Classification',$,(#35),#37); +#39=IFCRELAGGREGATES('3igAl8ryv9iBngGww8eVQv',#1,'house - site container',$,#28,(#35)); +#40=IFCLOCALPLACEMENT(#30,#41); +#41=IFCAXIS2PLACEMENT3D(#42,#43,#44); +#42=IFCCARTESIANPOINT((-2800.,-2800.,1300.)); +#43=IFCDIRECTION((0.,0.,1.)); +#44=IFCDIRECTION((1.,0.,0.)); +#45=IFCBUILDINGSTOREY('1Ano2ZUxnEIvVQ_beukl8b',#1,'00 groundfloor','The ground floor, forming the base level of the building.','buildingstorey',#47,$,$,.ELEMENT.,0.); +#46=IFCRELAGGREGATES('0fc9YeRV55oOJJevoridOq',#1,'Single-family house container',$,#35,(#45)); +#47=IFCLOCALPLACEMENT(#40,#7); +#48=IFCCHIMNEYTYPE('2vWR$XNSf2qhsAEJMXcZLU',#1,'house - chimney','A chimney, standing tall and proud, guiding smoke away from the home.',$,$,$,'884350','flue',.USERDEFINED.); +#49=IFCRELDEFINESBYTYPE('22pEICzjP0uQNvM7rXMZ6g',#1,$,$,(#50),#48); +#50=IFCCHIMNEY('3Fbgsvr8nAYfGs9y5keub0',#1,'house - chimney','A chimney, standing tall and proud, guiding smoke away from the home.','flue',#54,$,'454425.1027891.979946.932083.2023772',$); +#51=IFCRELASSOCIATESMATERIAL('0sAYN8OJzFKu1rNoJBdSki',#1,$,$,(#50),#52); +#52=IFCMATERIAL('stone_sand-lime',$,$); +#53=IFCRELCONTAINEDINSPATIALSTRUCTURE('3h3GnIQoTABQuR4R5PmNHL',#1,$,$,(#50,#63,#81,#99),#45); +#54=IFCLOCALPLACEMENT(#47,#55); +#55=IFCAXIS2PLACEMENT3D(#56,#57,#58); +#56=IFCCARTESIANPOINT((4700.,5300.,0.)); +#57=IFCDIRECTION((0.,0.,1.)); +#58=IFCDIRECTION((-1.3173934614068503E-15,-1.,0.)); +#59=IFCDISTRIBUTIONSYSTEM('2jrWSvrRvERBuat2Z0kgJ9',#1,'house - chimney flue','A vital passage, guiding smoke safely out of the home.','exhaust',$,.EXHAUST.); +#60=IFCRELASSIGNSTOGROUP('3E2d0RV4D1fgWu6kq4yI0n',#1,$,$,(#63,#81,#99),$,#59); +#61=IFCAIRTERMINALTYPE('1bDUqBVpL3VQZuBK3au6xC',#1,'chimney cover','A sturdy cover, protecting the chimney from the elements.',$,$,$,'879611','chimney cover',.USERDEFINED.); +#62=IFCRELDEFINESBYTYPE('2I6m1hqnjCO8dYsE3Kdvzc',#1,$,$,(#63),#61); +#63=IFCAIRTERMINAL('23uPJWDfXEcwHH3kdFgV9c',#1,'chimney cover','A sturdy cover, protecting the chimney from the elements.','chimney cover',#66,#78,'454425.1027891.979946.932083.2023772.884510.880033',$); +#64=IFCRELASSOCIATESMATERIAL('2EzoC_HWT1he$0WII134uQ',#1,$,$,(#63),#65); +#65=IFCMATERIAL('metal_steel_generic_coated-anthracitegrey',$,$); +#66=IFCLOCALPLACEMENT(#47,#67); +#67=IFCAXIS2PLACEMENT3D(#68,#69,#70); +#68=IFCCARTESIANPOINT((4700.,5300.,4700.)); +#69=IFCDIRECTION((0.,0.,1.)); +#70=IFCDIRECTION((-1.3173934614068503E-15,-1.,0.)); +#71=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#72)); +#72=IFCTRIANGULATEDFACESET(#73,((-1.,-1.3622527930331977E-16,1.4168628624703642E-32),(-1.,-1.3622527930331977E-16,1.4168628624703642E-32),(-1.,-1.3622527930331977E-16,1.4168628624703642E-32),(-1.,-1.3622527930331977E-16,1.4168628624703642E-32),(-1.,-1.3622527930331977E-16,1.4168628624703642E-32),(-1.,-1.3622527930331977E-16,1.4168628624703642E-32),(-1.,-1.3622527930331977E-16,1.4168628624703642E-32),(-1.,-1.3622527930331977E-16,1.4168628624703642E-32),(4.163336342344337E-16,-1.,0.),(4.163336342344337E-16,-1.,0.),(4.163336342344337E-16,-1.,0.),(4.163336342344337E-16,-1.,0.),(4.163336342344337E-16,-1.,0.),(4.163336342344337E-16,-1.,0.),(4.163336342344337E-16,-1.,0.),(4.163336342344337E-16,-1.,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(1.,1.3622527930331977E-16,0.),(1.,1.3622527930331977E-16,0.),(1.,1.3622527930331977E-16,0.),(1.,1.3622527930331977E-16,0.),(1.,1.3622527930331977E-16,0.),(1.,1.3622527930331977E-16,0.),(1.,1.3622527930331977E-16,0.),(1.,1.3622527930331977E-16,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(-4.163336342344337E-16,1.,0.),(-4.163336342344337E-16,1.,0.),(-4.163336342344337E-16,1.,0.),(-4.163336342344337E-16,1.,0.),(1.,4.163336342344337E-16,0.),(1.,4.163336342344337E-16,0.),(1.,4.163336342344337E-16,0.),(1.,4.163336342344337E-16,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(-1.,-4.163336342344337E-16,0.),(-1.,-4.163336342344337E-16,0.),(-1.,-4.163336342344337E-16,0.),(-1.,-4.163336342344337E-16,0.),(-4.163336342344337E-16,1.,0.),(-4.163336342344337E-16,1.,0.),(-4.163336342344337E-16,1.,0.),(-4.163336342344337E-16,1.,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(6,4,7),(8,3,2),(9,10,11),(10,9,12),(12,9,13),(13,14,15),(14,13,16),(16,13,9),(17,18,19),(18,17,20),(21,22,23),(22,21,24),(24,21,25),(25,26,27),(26,25,28),(28,25,21),(29,30,31),(32,33,34),(33,32,35),(33,35,36),(36,35,30),(36,30,29),(37,38,39),(38,37,40),(41,42,43),(42,41,44),(44,41,45),(45,41,39),(45,39,46),(46,39,38),(42,47,48),(47,42,44),(49,50,51),(50,49,52),(53,54,55),(54,53,56),(57,58,59),(58,57,60),(61,62,63),(62,61,64),(65,66,67),(66,65,68),(69,70,71),(70,69,72),(73,74,75),(74,73,76),(77,78,79),(78,77,80),(81,82,83),(82,81,84),(85,86,87),(86,85,88),(89,90,91),(90,89,92),(93,94,95),(94,93,96)),$); +#73=IFCCARTESIANPOINTLIST3D(((0.,0.,150.),(0.,40.,140.),(0.,0.,0.),(0.,700.,150.),(0.,660.,140.),(0.,660.,0.),(0.,700.,0.),(0.,40.,0.),(700.,0.,150.),(660.,0.,0.),(700.,0.,0.),(660.,0.,140.),(40.,0.,140.),(0.,0.,0.),(40.,0.,0.),(0.,0.,150.),(0.,0.,150.),(700.,700.,150.),(0.,700.,150.),(700.,0.,150.),(0.,700.,150.),(40.,700.,0.),(0.,700.,0.),(40.,700.,140.),(660.,700.,140.),(700.,700.,0.),(660.,700.,0.),(700.,700.,150.),(700.,700.,0.),(700.,660.,140.),(700.,660.,0.),(700.,40.,0.),(700.,0.,150.),(700.,0.,0.),(700.,40.,140.),(700.,700.,150.),(700.,660.,140.),(660.,40.,140.),(660.,660.,140.),(700.,40.,140.),(660.,700.,140.),(40.,660.,140.),(40.,700.,140.),(40.,40.,140.),(40.,0.,140.),(660.,0.,140.),(0.,40.,140.),(0.,660.,140.),(40.,700.,0.),(0.,660.,0.),(0.,700.,0.),(40.,660.,0.),(40.,700.,0.),(40.,660.,140.),(40.,660.,0.),(40.,700.,140.),(40.,660.,140.),(0.,660.,0.),(40.,660.,0.),(0.,660.,140.),(40.,40.,0.),(0.,0.,0.),(0.,40.,0.),(40.,0.,0.),(0.,40.,140.),(40.,40.,0.),(0.,40.,0.),(40.,40.,140.),(40.,40.,0.),(40.,0.,140.),(40.,0.,0.),(40.,40.,140.),(700.,40.,0.),(660.,0.,0.),(660.,40.,0.),(700.,0.,0.),(660.,40.,140.),(660.,0.,0.),(660.,0.,140.),(660.,40.,0.),(660.,40.,140.),(700.,40.,0.),(660.,40.,0.),(700.,40.,140.),(700.,700.,0.),(660.,660.,0.),(660.,700.,0.),(700.,660.,0.),(700.,660.,140.),(660.,660.,0.),(700.,660.,0.),(660.,660.,140.),(660.,700.,140.),(660.,660.,0.),(660.,660.,140.),(660.,700.,0.))); +#74=IFCSTYLEDITEM(#72,(#77),$); +#75=IFCSURFACESTYLERENDERING(#76,0.,$,$,$,$,$,$,.NOTDEFINED.); +#76=IFCCOLOURRGB($,0.1607843137254902,0.19215686274509805,0.2); +#77=IFCSURFACESTYLE('metal_steel_generic_coated-anthracitegrey',.BOTH.,(#75)); +#78=IFCPRODUCTDEFINITIONSHAPE($,$,(#71)); +#79=IFCDUCTSEGMENTTYPE('2WCxplvXT9YQLTEACI3Wln',#1,'building element',$,$,$,$,'879710','rigidsegment',.RIGIDSEGMENT.); +#80=IFCRELDEFINESBYTYPE('0Bvyw_PSn0kgiXoOixqE3u',#1,$,$,(#81),#79); +#81=IFCDUCTSEGMENT('38WbwIGD90nB_3T2BTU5Ed',#1,'building element',$,'rigidsegment',#84,#96,'454425.1027891.979946.932083.2023772.884510.880032',$); +#82=IFCRELASSOCIATESMATERIAL('0h96c29SfAxQbCDOLFZN7y',#1,$,$,(#81),#83); +#83=IFCMATERIAL('metal_steel-galvanized',$,$); +#84=IFCLOCALPLACEMENT(#47,#85); +#85=IFCAXIS2PLACEMENT3D(#86,#87,#88); +#86=IFCCARTESIANPOINT((4900.,4950.,900.)); +#87=IFCDIRECTION((0.,0.,1.)); +#88=IFCDIRECTION((-1.3173934614068503E-15,-1.,0.)); +#89=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#90)); +#90=IFCTRIANGULATEDFACESET(#91,((0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-9.14653472836377E-16,0.),(-0.8660254037844398,-0.49999999999999806,0.),(-0.8660254037844398,-0.49999999999999806,0.),(-1.,-9.14653472836377E-16,0.),(-0.8660254037844398,-0.49999999999999806,0.),(-0.5000000000000014,-0.8660254037844378,0.),(-0.5000000000000014,-0.8660254037844378,0.),(-0.8660254037844398,-0.49999999999999806,0.),(0.,-1.,0.),(-0.5000000000000014,-0.8660254037844378,0.),(0.,-1.,0.),(-0.5000000000000014,-0.8660254037844378,0.),(0.49999999999999933,-0.866025403784439,0.),(0.,-1.,0.),(0.49999999999999933,-0.866025403784439,0.),(0.,-1.,0.),(0.866025403784439,-0.49999999999999933,0.),(0.49999999999999933,-0.866025403784439,0.),(0.49999999999999933,-0.866025403784439,0.),(0.866025403784439,-0.49999999999999933,0.),(1.,9.14653472836377E-16,0.),(0.866025403784439,-0.49999999999999933,0.),(0.866025403784439,-0.49999999999999933,0.),(1.,9.14653472836377E-16,0.),(0.8660254037844398,0.49999999999999806,0.),(1.,9.14653472836377E-16,0.),(1.,9.14653472836377E-16,0.),(0.8660254037844398,0.49999999999999806,0.),(0.5000000000000014,0.8660254037844378,0.),(0.8660254037844398,0.49999999999999806,0.),(0.8660254037844398,0.49999999999999806,0.),(0.5000000000000014,0.8660254037844378,0.),(-9.14653472836377E-16,1.,0.),(0.5000000000000014,0.8660254037844378,0.),(-9.14653472836377E-16,1.,0.),(0.5000000000000014,0.8660254037844378,0.),(-0.49999999999999806,0.8660254037844398,0.),(-9.14653472836377E-16,1.,0.),(-0.49999999999999806,0.8660254037844398,0.),(-9.14653472836377E-16,1.,0.),(-0.8660254037844378,0.5000000000000014,0.),(-0.49999999999999806,0.8660254037844398,0.),(-0.8660254037844378,0.5000000000000014,0.),(-0.49999999999999806,0.8660254037844398,0.),(-0.8660254037844378,0.5000000000000014,0.),(-1.,-9.14653472836377E-16,0.),(-1.,-9.14653472836377E-16,0.),(-0.8660254037844378,0.5000000000000014,0.),(-1.,0.,0.),(-0.8660254037844403,0.49999999999999734,0.),(-0.8660254037844403,0.49999999999999734,0.),(-1.,0.,0.),(-0.8660254037844403,0.49999999999999734,0.),(-0.5000000000000012,0.8660254037844379,0.),(-0.5000000000000012,0.8660254037844379,0.),(-0.8660254037844403,0.49999999999999734,0.),(1.024411889576742E-15,1.,0.),(-0.5000000000000012,0.8660254037844379,0.),(1.024411889576742E-15,1.,0.),(-0.5000000000000012,0.8660254037844379,0.),(0.5000000000000021,0.8660254037844375,0.),(1.024411889576742E-15,1.,0.),(0.5000000000000021,0.8660254037844375,0.),(1.024411889576742E-15,1.,0.),(0.8660254037844403,0.49999999999999734,0.),(0.5000000000000021,0.8660254037844375,0.),(0.5000000000000021,0.8660254037844375,0.),(0.8660254037844403,0.49999999999999734,0.),(1.,0.,0.),(0.8660254037844403,0.49999999999999734,0.),(0.8660254037844403,0.49999999999999734,0.),(1.,0.,0.),(0.8660254037844403,-0.49999999999999734,0.),(1.,0.,0.),(1.,0.,0.),(0.8660254037844403,-0.49999999999999734,0.),(0.5000000000000021,-0.8660254037844375,0.),(0.8660254037844403,-0.49999999999999734,0.),(0.8660254037844403,-0.49999999999999734,0.),(0.5000000000000021,-0.8660254037844375,0.),(0.,-1.,0.),(0.5000000000000021,-0.8660254037844375,0.),(0.,-1.,0.),(0.5000000000000021,-0.8660254037844375,0.),(-0.4999999999999998,-0.8660254037844389,0.),(0.,-1.,0.),(-0.4999999999999998,-0.8660254037844389,0.),(0.,-1.,0.),(-0.4999999999999998,-0.8660254037844389,0.),(-0.8660254037844389,-0.4999999999999998,0.),(-0.8660254037844389,-0.4999999999999998,0.),(-0.4999999999999998,-0.8660254037844389,0.),(-0.8660254037844389,-0.4999999999999998,0.),(-1.,0.,0.),(-1.,0.,0.),(-0.8660254037844389,-0.4999999999999998,0.)),$,((1,2,3),(2,1,4),(4,1,5),(4,5,6),(6,5,7),(6,7,8),(8,7,9),(8,9,10),(10,9,11),(11,9,12),(11,12,13),(13,12,14),(2,15,3),(15,2,16),(15,16,17),(17,16,18),(17,18,19),(19,18,20),(19,20,21),(19,21,22),(22,21,23),(22,23,24),(24,23,13),(24,13,14),(25,26,27),(26,25,28),(28,25,29),(28,29,30),(30,29,31),(30,31,32),(32,31,33),(32,33,34),(34,33,35),(35,33,36),(35,36,37),(37,36,38),(26,39,27),(39,26,40),(39,40,41),(41,40,42),(41,42,43),(43,42,44),(43,44,45),(43,45,46),(46,45,47),(46,47,48),(48,47,37),(48,37,38),(49,50,51),(50,49,52),(53,54,55),(54,53,56),(57,58,59),(58,57,60),(61,62,63),(62,61,64),(65,66,67),(66,65,68),(69,70,71),(70,69,72),(73,74,75),(74,73,76),(77,78,79),(78,77,80),(81,82,83),(82,81,84),(85,86,87),(86,85,88),(89,90,91),(90,89,92),(93,94,95),(94,93,96),(97,98,99),(98,97,100),(101,102,103),(102,101,104),(105,106,107),(106,105,108),(109,110,111),(110,109,112),(113,114,115),(114,113,116),(117,118,119),(118,117,120),(121,122,123),(122,121,124),(125,126,127),(126,125,128),(129,130,131),(130,129,132),(133,134,135),(134,133,136),(137,138,139),(138,137,140),(141,142,143),(142,141,144)),$); +#91=IFCCARTESIANPOINTLIST3D(((-86.603,50.,0.),(-90.,0.,0.),(-100.,0.,0.),(-77.942,45.,0.),(-50.,86.603,0.),(-45.,77.942,0.),(0.,100.,0.),(0.,90.,0.),(50.,86.603,0.),(45.,77.942,0.),(77.942,45.,0.),(86.603,50.,0.),(90.,0.,0.),(100.,0.,0.),(-86.603,-50.,0.),(-77.942,-45.,0.),(-50.,-86.603,0.),(-45.,-77.942,0.),(0.,-100.,0.),(0.,-90.,0.),(45.,-77.942,0.),(50.,-86.603,0.),(77.942,-45.,0.),(86.603,-50.,0.),(-86.603,-50.,3800.),(-90.,0.,3800.),(-100.,0.,3800.),(-77.942,-45.,3800.),(-50.,-86.603,3800.),(-45.,-77.942,3800.),(0.,-100.,3800.),(0.,-90.,3800.),(50.,-86.603,3800.),(45.,-77.942,3800.),(77.942,-45.,3800.),(86.603,-50.,3800.),(90.,0.,3800.),(100.,0.,3800.),(-86.603,50.,3800.),(-77.942,45.,3800.),(-50.,86.603,3800.),(-45.,77.942,3800.),(0.,100.,3800.),(0.,90.,3800.),(45.,77.942,3800.),(50.,86.603,3800.),(77.942,45.,3800.),(86.603,50.,3800.),(-100.,0.,3800.),(-86.603,-50.,0.),(-86.603,-50.,3800.),(-100.,0.,0.),(-86.603,-50.,3800.),(-50.,-86.603,0.),(-50.,-86.603,3800.),(-86.603,-50.,0.),(0.,-100.,3800.),(-50.,-86.603,0.),(0.,-100.,0.),(-50.,-86.603,3800.),(50.,-86.603,3800.),(0.,-100.,0.),(50.,-86.603,0.),(0.,-100.,3800.),(86.603,-50.,0.),(50.,-86.603,3800.),(50.,-86.603,0.),(86.603,-50.,3800.),(100.,0.,0.),(86.603,-50.,3800.),(86.603,-50.,0.),(100.,0.,3800.),(86.603,50.,0.),(100.,0.,3800.),(100.,0.,0.),(86.603,50.,3800.),(50.,86.603,0.),(86.603,50.,3800.),(86.603,50.,0.),(50.,86.603,3800.),(0.,100.,3800.),(50.,86.603,0.),(0.,100.,0.),(50.,86.603,3800.),(-50.,86.603,3800.),(0.,100.,0.),(-50.,86.603,0.),(0.,100.,3800.),(-86.603,50.,3800.),(-50.,86.603,0.),(-86.603,50.,0.),(-50.,86.603,3800.),(-86.603,50.,3800.),(-100.,0.,0.),(-100.,0.,3800.),(-86.603,50.,0.),(90.,0.,3800.),(77.942,-45.,0.),(77.942,-45.,3800.),(90.,0.,0.),(77.942,-45.,3800.),(45.,-77.942,0.),(45.,-77.942,3800.),(77.942,-45.,0.),(0.,-90.,3800.),(45.,-77.942,0.),(0.,-90.,0.),(45.,-77.942,3800.),(-45.,-77.942,3800.),(0.,-90.,0.),(-45.,-77.942,0.),(0.,-90.,3800.),(-77.942,-45.,0.),(-45.,-77.942,3800.),(-45.,-77.942,0.),(-77.942,-45.,3800.),(-90.,0.,0.),(-77.942,-45.,3800.),(-77.942,-45.,0.),(-90.,0.,3800.),(-77.942,45.,0.),(-90.,0.,3800.),(-90.,0.,0.),(-77.942,45.,3800.),(-45.,77.942,0.),(-77.942,45.,3800.),(-77.942,45.,0.),(-45.,77.942,3800.),(0.,90.,3800.),(-45.,77.942,0.),(0.,90.,0.),(-45.,77.942,3800.),(45.,77.942,3800.),(0.,90.,0.),(45.,77.942,0.),(0.,90.,3800.),(45.,77.942,3800.),(77.942,45.,0.),(77.942,45.,3800.),(45.,77.942,0.),(77.942,45.,3800.),(90.,0.,0.),(90.,0.,3800.),(77.942,45.,0.))); +#92=IFCSTYLEDITEM(#90,(#95),$); +#93=IFCSURFACESTYLERENDERING(#94,0.,$,$,$,$,$,$,.NOTDEFINED.); +#94=IFCCOLOURRGB($,0.6,0.6,0.6); +#95=IFCSURFACESTYLE('metal_steel-galvanized',.BOTH.,(#93)); +#96=IFCPRODUCTDEFINITIONSHAPE($,$,(#89)); +#97=IFCAIRTERMINALTYPE('1lalbrERnBquz_FkWP_uwT',#1,'house fireplace cap','A hidden concrete cap, secretly keeping the fireplace safe and sound.',$,$,$,'879861','fireplace cap',.USERDEFINED.); +#98=IFCRELDEFINESBYTYPE('0W6NPPbBzBUfbjCWGdu$kz',#1,$,$,(#99),#97); +#99=IFCAIRTERMINAL('34Y6EIt3nDCAS1k$kPGOKm',#1,'house fireplace cap','A hidden concrete cap, secretly keeping the fireplace safe and sound.','fireplace cap',#102,#114,'454425.1027891.979946.932083.2023772.884510.880034',$); +#100=IFCRELASSOCIATESMATERIAL('2VydWQfLvDSPW7gidaXJGH',#1,$,$,(#99),#101); +#101=IFCMATERIAL('concrete_reinforced_prefab',$,$); +#102=IFCLOCALPLACEMENT(#47,#103); +#103=IFCAXIS2PLACEMENT3D(#104,#105,#106); +#104=IFCCARTESIANPOINT((4750.,5236.038,700.)); +#105=IFCDIRECTION((0.,0.,1.)); +#106=IFCDIRECTION((-1.3173934614068503E-15,-1.,0.)); +#107=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#108)); +#108=IFCTRIANGULATEDFACESET(#109,((2.9678801079225556E-28,-1.2031856992204666E-14,-1.),(2.9678801079225556E-28,-1.2031856992204666E-14,-1.),(2.9678801079225556E-28,-1.2031856992204666E-14,-1.),(2.9678801079225556E-28,-1.2031856992204666E-14,-1.),(2.9678801079225556E-28,-1.2031856992204666E-14,-1.),(2.9678801079225556E-28,-1.2031856992204666E-14,-1.),(2.9678801079225556E-28,-1.2031856992204666E-14,-1.),(2.9678801079225556E-28,-1.2031856992204666E-14,-1.),(1.2595414133360666E-14,-0.9544799780350253,-0.29827499313596134),(1.2595414133360666E-14,-0.9544799780350253,-0.29827499313596134),(1.2595414133360666E-14,-0.9544799780350253,-0.29827499313596134),(1.2595414133360666E-14,-0.9544799780350253,-0.29827499313596134),(8.483193464818537E-15,-0.9796132889203113,-0.20089251895162963),(8.483193464818528E-15,-0.9796132889203114,-0.2008925189516294),(1.4709046270830545E-14,-8.651185486381191E-15,-1.),(1.4709046270830545E-14,-8.651185486381191E-15,-1.),(1.4709046270830545E-14,-8.651185486381191E-15,-1.),(1.4709046270830545E-14,-8.651185486381191E-15,-1.),(1.4709046270830545E-14,-8.651185486381191E-15,-1.),(1.4709046270830545E-14,-8.651185486381191E-15,-1.),(1.4709046270830545E-14,-8.651185486381191E-15,-1.),(0.8160244811016613,-0.2720081603672092,-0.5100153006885297),(0.8160244811016613,-0.2720081603672092,-0.5100153006885297),(0.8160244811016613,-0.2720081603672092,-0.5100153006885297),(0.8160244811016613,-0.2720081603672092,-0.5100153006885297),(-0.8160244811016516,-0.27200816036723247,-0.5100153006885327),(-0.8160244811016516,-0.27200816036723247,-0.5100153006885327),(-0.8160244811016516,-0.27200816036723247,-0.5100153006885327),(-0.8160244811016516,-0.27200816036723247,-0.5100153006885327),(-1.8180853632437473E-14,0.9544799780350394,-0.2982749931359164),(-1.8180853632437473E-14,0.9544799780350394,-0.2982749931359164),(-1.8180853632437473E-14,0.9544799780350394,-0.2982749931359164),(-1.224506771495063E-14,0.979613288855854,-0.20089251926594276),(-1.2245067714950645E-14,0.979613288855854,-0.200892519265943),(-1.8180853632437473E-14,0.9544799780350394,-0.2982749931359164),(1.8125419490565118E-14,-0.9701425001453369,0.24253562503631365),(1.8125419490565118E-14,-0.9701425001453369,0.24253562503631365),(1.8125419490565118E-14,-0.9701425001453369,0.24253562503631365),(1.8125419490565118E-14,-0.9701425001453369,0.24253562503631365),(-1.730813629663187E-14,0.9701425001453302,0.2425356250363395),(-1.730813629663187E-14,0.9701425001453302,0.2425356250363395),(-1.730813629663187E-14,0.9701425001453302,0.2425356250363395),(-1.730813629663187E-14,0.9701425001453302,0.2425356250363395),(0.8571428571428575,0.28571428571429286,0.42857142857142305),(0.8571428571428575,0.28571428571429286,0.42857142857142305),(0.8571428571428575,0.28571428571429286,0.42857142857142305),(0.8571428571428575,0.28571428571429286,0.42857142857142305),(-0.8571428571428628,0.2857142857142794,0.42857142857142155),(-0.8571428571428628,0.2857142857142794,0.42857142857142155),(-0.8571428571428628,0.2857142857142794,0.42857142857142155),(-0.8571428571428628,0.2857142857142794,0.42857142857142155),(-1.,0.,0.),(-0.8660254037844383,0.5000000000000009,0.),(-0.8660254037844372,0.5000000000000028,0.),(-1.,0.,0.),(-0.8660254037844372,-0.5000000000000028,0.),(-1.,0.,0.),(-1.,0.,0.),(-0.866025403784436,-0.5000000000000047,0.),(0.7071067811865476,-0.7071067811865476,0.),(0.8660254037844372,-0.5000000000000028,0.),(0.8660254037844367,-0.5000000000000033,0.),(0.7071067811865476,-0.7071067811865476,0.),(0.8660254037844367,-0.5000000000000033,0.),(1.,0.,0.),(1.,0.,0.),(0.8660254037844372,-0.5000000000000028,0.),(1.,0.,0.),(0.8660254037844372,0.5000000000000028,0.),(0.8660254037844389,0.4999999999999997,0.),(1.,0.,0.),(-0.8660254037844372,0.5000000000000028,0.),(-0.7071067811865476,0.7071067811865476,0.),(-0.7071067811865476,0.7071067811865476,0.),(-0.8660254037844383,0.5000000000000009,0.),(-1.3302482961340333E-14,-8.834153071355775E-15,-1.),(-1.3302482961340333E-14,-8.834153071355775E-15,-1.),(-1.3302482961340333E-14,-8.834153071355775E-15,-1.),(-1.3302482961340333E-14,-8.834153071355775E-15,-1.),(-1.3302482961340333E-14,-8.834153071355775E-15,-1.),(-1.3302482961340333E-14,-8.834153071355775E-15,-1.),(-1.3302482961340333E-14,-8.834153071355775E-15,-1.),(-0.7071067811865476,-0.7071067811865476,0.),(-0.866025403784436,-0.5000000000000047,0.),(-0.8660254037844372,-0.5000000000000028,0.),(-0.7071067811865476,-0.7071067811865476,0.),(0.8660254037844389,0.4999999999999997,0.),(0.7071067811865476,0.7071067811865476,0.),(0.7071067811865476,0.7071067811865476,0.),(0.8660254037844372,0.5000000000000028,0.),(-1.224506771495063E-14,0.979613288855854,-0.20089251926594276),(0.,1.,0.),(-1.2245067714950645E-14,0.979613288855854,-0.200892519265943),(0.,1.,0.),(0.,-1.,0.),(8.483193464818528E-15,-0.9796132889203114,-0.2008925189516294),(8.483193464818537E-15,-0.9796132889203113,-0.20089251895162963),(0.,-1.,0.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.),(0.,1.62430069394763E-14,1.)),$,((1,2,3),(2,1,4),(4,1,5),(4,5,6),(6,5,7),(7,5,8),(2,8,3),(8,2,7),(9,10,11),(10,9,12),(10,12,13),(10,13,14),(15,16,17),(16,15,18),(16,18,19),(20,18,21),(18,20,19),(22,23,24),(23,22,25),(26,27,28),(27,26,29),(30,31,32),(31,30,33),(31,33,34),(35,31,34),(36,37,38),(37,36,39),(40,41,42),(41,40,43),(44,45,46),(45,44,47),(48,49,50),(49,48,51),(52,53,54),(53,52,55),(56,57,58),(57,56,59),(60,61,62),(61,60,63),(64,65,66),(65,64,67),(68,69,70),(69,68,71),(72,73,74),(73,72,75),(76,77,78),(77,76,79),(77,79,80),(76,81,82),(81,76,78),(83,84,85),(84,83,86),(87,88,89),(88,87,90),(91,92,93),(92,91,94),(95,96,97),(96,95,98),(99,100,101),(100,99,102),(102,99,103),(103,99,104),(103,104,105),(105,104,106),(106,104,107),(107,104,108),(101,109,108),(109,101,110),(110,101,100),(108,109,111),(108,111,112),(108,112,107)),$); +#109=IFCCARTESIANPOINTLIST3D(((100.,300.,0.),(55.497,40.,0.),(0.,0.,0.),(128.83,260.,0.),(472.076,300.,0.),(443.246,260.,0.),(516.579,40.,0.),(572.076,0.,0.),(443.246,260.,0.),(212.164,210.,160.),(128.83,260.,0.),(359.912,210.,160.),(348.98,210.,160.),(223.096,210.,160.),(359.912,210.,160.),(363.98,195.,160.),(348.98,210.,160.),(399.912,90.,160.),(376.038,150.,160.),(363.98,105.,160.),(348.98,90.,160.),(128.83,260.,0.),(172.164,90.,160.),(55.497,40.,0.),(212.164,210.,160.),(399.912,90.,160.),(443.246,260.,0.),(516.579,40.,0.),(359.912,210.,160.),(172.164,90.,160.),(516.579,40.,0.),(55.497,40.,0.),(223.096,90.,160.),(348.98,90.,160.),(399.912,90.,160.),(455.409,50.,200.),(0.,0.,0.),(572.076,0.,0.),(116.667,50.,200.),(183.333,250.,200.),(472.076,300.,0.),(100.,300.,0.),(388.743,250.,200.),(472.076,300.,0.),(455.409,50.,200.),(572.076,0.,0.),(388.743,250.,200.),(116.667,50.,200.),(100.,300.,0.),(0.,0.,0.),(183.333,250.,200.),(376.038,150.,200.),(363.98,105.,160.),(363.98,105.,200.),(376.038,150.,160.),(363.98,195.,200.),(376.038,150.,160.),(376.038,150.,200.),(363.98,195.,160.),(223.096,210.,160.),(208.096,195.,200.),(208.096,195.,160.),(223.096,210.,200.),(208.096,195.,160.),(196.038,150.,200.),(196.038,150.,160.),(208.096,195.,200.),(196.038,150.,160.),(208.096,105.,200.),(208.096,105.,160.),(196.038,150.,200.),(363.98,105.,200.),(348.98,90.,160.),(348.98,90.,200.),(363.98,105.,160.),(172.164,90.,160.),(208.096,195.,160.),(196.038,150.,160.),(212.164,210.,160.),(223.096,210.,160.),(208.096,105.,160.),(223.096,90.,160.),(348.98,210.,200.),(363.98,195.,160.),(363.98,195.,200.),(348.98,210.,160.),(208.096,105.,160.),(223.096,90.,200.),(223.096,90.,160.),(208.096,105.,200.),(223.096,90.,160.),(348.98,90.,200.),(348.98,90.,160.),(223.096,90.,200.),(348.98,210.,200.),(223.096,210.,160.),(348.98,210.,160.),(223.096,210.,200.),(116.667,50.,200.),(196.038,150.,200.),(183.333,250.,200.),(208.096,105.,200.),(223.096,90.,200.),(455.409,50.,200.),(348.98,90.,200.),(363.98,105.,200.),(376.038,150.,200.),(388.743,250.,200.),(223.096,210.,200.),(208.096,195.,200.),(348.98,210.,200.),(363.98,195.,200.))); +#110=IFCSTYLEDITEM(#108,(#113),$); +#111=IFCSURFACESTYLERENDERING(#112,0.,$,$,$,$,$,$,.NOTDEFINED.); +#112=IFCCOLOURRGB($,0.5764705882352941,0.5764705882352941,0.5764705882352941); +#113=IFCSURFACESTYLE('concrete_reinforced_prefab',.BOTH.,(#111)); +#114=IFCPRODUCTDEFINITIONSHAPE($,$,(#107)); +#115=IFCBUILDINGELEMENTPROXYTYPE('3mjKLn_DjE4Beriey9bTvr',#1,'origin','The local position for coordination of aspect models.',$,$,$,'1028017','origin',.USERDEFINED.); +#116=IFCRELDEFINESBYTYPE('21U96ixejDwQmHCVkbTd2U',#1,$,$,(#117),#115); +#117=IFCBUILDINGELEMENTPROXY('2F44QMqSH3TOkM$SZoqCBe',#1,'origin','The local position for coordination of aspect models.','origin',#121,#133,'454425.1027891.1032757',$); +#118=IFCRELASSOCIATESMATERIAL('1QcTgcyaP1C9MT3_T1ZeJj',#1,$,$,(#117),#119); +#119=IFCMATERIAL('virtual_white',$,$); +#120=IFCRELCONTAINEDINSPATIALSTRUCTURE('115FQVYsL5$wVwIAF5n0xr',#1,$,$,(#117),#28); +#121=IFCLOCALPLACEMENT(#30,#122); +#122=IFCAXIS2PLACEMENT3D(#123,#124,#125); +#123=IFCCARTESIANPOINT((-5800.,-5800.,1300.)); +#124=IFCDIRECTION((0.,0.,1.)); +#125=IFCDIRECTION((1.,0.,0.)); +#126=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#127)); +#127=IFCTRIANGULATEDFACESET(#128,((1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#128=IFCCARTESIANPOINTLIST3D(((1000.,1000.,0.),(1000.,0.,1000.),(1000.,0.,0.),(1000.,1000.,1000.),(0.,1000.,1000.),(1000.,1000.,0.),(0.,1000.,0.),(1000.,1000.,1000.),(1000.,1000.,0.),(0.,0.,0.),(0.,1000.,0.),(1000.,0.,0.),(0.,1000.,1000.),(0.,0.,0.),(0.,0.,1000.),(0.,1000.,0.),(1000.,0.,1000.),(0.,1000.,1000.),(0.,0.,1000.),(1000.,1000.,1000.),(1000.,0.,1000.),(0.,0.,0.),(1000.,0.,0.),(0.,0.,1000.))); +#129=IFCSTYLEDITEM(#127,(#132),$); +#130=IFCSURFACESTYLERENDERING(#131,0.,$,$,$,$,$,$,.NOTDEFINED.); +#131=IFCCOLOURRGB($,1.,1.,1.); +#132=IFCSURFACESTYLE('virtual_white',.BOTH.,(#130)); +#133=IFCPRODUCTDEFINITIONSHAPE($,$,(#126)); +#134=IFCBUILDINGELEMENTPROXYTYPE('2IpkHFcdnD3xuZl6H52fWn',#1,'geo-reference','The reference point for transforming the local engineering coordinate system into the coordinate reference system of the underlying map.',$,$,$,'1028019','origin',.USERDEFINED.); +#135=IFCRELDEFINESBYTYPE('3530pFWy94WO4ESJ$CWAXG',#1,$,$,(#136),#134); +#136=IFCBUILDINGELEMENTPROXY('3Fit2Fad92zf2f6aWdJtF5',#1,'geo-reference','The reference point for transforming the local engineering coordinate system into the coordinate reference system of the underlying map.','origin',#140,#152,'454425.1032696',$); +#137=IFCRELASSOCIATESMATERIAL('2EBkr99ef9S8X3ZQxjf56M',#1,$,$,(#136),#138); +#138=IFCMATERIAL('virtual_black',$,$); +#139=IFCRELCONTAINEDINSPATIALSTRUCTURE('1yuJpb78fBUxedTGWT6ka6',#1,$,$,(#136),#21); +#140=IFCLOCALPLACEMENT(#23,#141); +#141=IFCAXIS2PLACEMENT3D(#142,#143,#144); +#142=IFCCARTESIANPOINT((0.,0.,0.)); +#143=IFCDIRECTION((0.,0.,1.)); +#144=IFCDIRECTION((1.,1.487416814333745E-17,0.)); +#145=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#146)); +#146=IFCTRIANGULATEDFACESET(#147,((-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-0.09801728974624706,0.9951847119559265,-2.8293428708776068E-14),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-0.09801728974624706,0.9951847119559265,-2.8293428708776068E-14),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-0.9951847119558951,0.09801728974656551,1.7414784486937357E-13),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(-0.9951847119558951,0.09801728974656551,1.7414784486937357E-13),(0.38268339078040076,-0.9238795497362281,0.),(0.19509039794782512,-0.980785265299474,0.),(0.38268339078040076,-0.9238795497362281,0.),(0.19509039794782512,-0.980785265299474,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9238795497362351,-0.3826833907803836,0.),(0.9238795497362351,-0.3826833907803836,0.),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9238795497362351,-0.3826833907803836,0.),(0.8314696223790943,-0.5555702179389808,0.),(0.8314696223790943,-0.5555702179389808,0.),(0.9238795497362351,-0.3826833907803836,0.),(0.9951847119559278,-0.09801728974623324,-9.75332807319653E-13),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9951847119559278,-0.09801728974623324,-9.75332807319653E-13),(0.5555702179389931,-0.8314696223790862,0.),(0.38268339078040076,-0.9238795497362281,0.),(0.5555702179389931,-0.8314696223790862,0.),(0.38268339078040076,-0.9238795497362281,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.5555702179389931,-0.8314696223790862,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.5555702179389931,-0.8314696223790862,0.),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-0.38268349542963814,0.9238795063890931,0.),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-0.38268349542963814,0.9238795063890931,0.),(0.8314696223790943,-0.5555702179389808,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.8314696223790943,-0.5555702179389808,0.),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(-0.9238795063891102,0.38268349542959684,0.),(-0.9238795063891102,0.38268349542959684,0.),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(0.19509039794782512,-0.980785265299474,0.),(0.09801728974630905,-0.9951847119559203,0.),(0.19509039794782512,-0.980785265299474,0.),(0.09801728974630905,-0.9951847119559203,0.),(0.9447142547101878,0.3278947650502742,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9447142547101878,0.3278947650502742,0.),(0.8957596329165385,0.44453872726369803,0.),(0.9447142547101878,0.3278947650502742,0.),(0.9447142547101878,0.3278947650502742,0.),(0.8957596329165385,0.44453872726369803,0.),(0.36763569523471507,-0.9299698896143292,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.36763569523471507,-0.9299698896143292,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.36763569523471507,-0.9299698896143292,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.36763569523471507,-0.9299698896143292,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.6371382701240347,-0.7707495214032589,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.6371382701240347,-0.7707495214032589,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9752819685766632,-0.22096398296833067,0.),(0.9752819685766632,-0.22096398296833067,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9999995436725548,-0.0009553296197073197,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9999995436725548,-0.0009553296197073197,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.8576732356667385,0.5141951194059969,0.),(-0.8576732356667385,0.5141951194059969,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.3790838524776873,0.9253623251411714,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.3790838524776873,0.9253623251411714,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.012947889549911789,0.9999161725645823,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.012947889549911789,0.9999161725645823,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.3790838524776873,0.9253623251411714,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.3790838524776873,0.9253623251411714,0.),(0.25678560352314495,0.9664683925629717,0.),(0.38760898056242665,0.9218238867524298,0.),(0.25678560352314495,0.9664683925629717,0.),(0.38760898056242665,0.9218238867524298,0.),(-0.021878265380184617,-0.9997606421058765,0.),(0.18338909196229686,-0.9830404065699663,0.),(-0.021878265380184617,-0.9997606421058765,0.),(0.18338909196229686,-0.9830404065699663,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.021878265380184617,-0.9997606421058765,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.021878265380184617,-0.9997606421058765,0.),(0.9946569870411934,0.10323506250366385,0.),(0.9999995436725548,-0.0009553296197073197,0.),(0.9999995436725548,-0.0009553296197073197,0.),(0.9946569870411934,0.10323506250366385,0.),(0.817214458947544,-0.5763336950821748,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.817214458947544,-0.5763336950821748,0.),(0.8893220941653559,-0.45728132788180387,0.),(0.817214458947544,-0.5763336950821748,0.),(0.817214458947544,-0.5763336950821748,0.),(0.8893220941653559,-0.45728132788180387,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9447848469584931,0.32769130741845615,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9447848469584931,0.32769130741845615,0.),(0.38760898056242665,0.9218238867524298,0.),(0.5120817306320317,0.8589367270951357,0.),(0.38760898056242665,0.9218238867524298,0.),(0.5120817306320317,0.8589367270951357,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9946569870411934,0.10323506250366385,0.),(0.9946569870411934,0.10323506250366385,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9453223709696031,0.3261374172713214,0.),(0.8598493850403663,0.5105477793955271,0.),(0.8598493850403663,0.5105477793955271,0.),(0.9453223709696031,0.3261374172713214,0.),(0.8598493850403663,0.5105477793955271,0.),(0.7345761428927619,0.6785262635247017,0.),(0.7345761428927619,0.6785262635247017,0.),(0.8598493850403663,0.5105477793955271,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9088850097664936,-0.41704680675166556,0.),(-0.9088850097664936,-0.41704680675166556,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9088850097664936,-0.41704680675166556,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.9088850097664936,-0.41704680675166556,0.),(0.9882991966281712,0.15252769566249838,0.),(0.9453223709696031,0.3261374172713214,0.),(0.9453223709696031,0.3261374172713214,0.),(0.9882991966281712,0.15252769566249838,0.),(-0.8576732356667385,0.5141951194059969,0.),(-0.9447848469584931,0.32769130741845615,0.),(-0.9447848469584931,0.32769130741845615,0.),(-0.8576732356667385,0.5141951194059969,0.),(0.9752819685766632,-0.22096398296833067,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.9752819685766632,-0.22096398296833067,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(-0.12780975406149545,-0.991798702745038,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(-0.12780975406149545,-0.991798702745038,0.),(0.12233197847190952,-0.9924892377467619,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(0.12233197847190952,-0.9924892377467619,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.12233197847190952,-0.9924892377467619,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.12233197847190952,-0.9924892377467619,0.),(0.5120817306320317,0.8589367270951357,0.),(0.6291972681526775,0.7772456482664974,0.),(0.5120817306320317,0.8589367270951357,0.),(0.6291972681526775,0.7772456482664974,0.),(0.7362866814501166,0.6766697294243142,0.),(0.8266452258336311,0.5627234406051209,0.),(0.8266452258336311,0.5627234406051209,0.),(0.7362866814501166,0.6766697294243142,0.),(0.8266452258336311,0.5627234406051209,0.),(0.8957596329165385,0.44453872726369803,0.),(0.8957596329165385,0.44453872726369803,0.),(0.8266452258336311,0.5627234406051209,0.),(-0.012947889549911789,0.9999161725645823,0.),(0.12580746189129235,0.9920546771889498,0.),(-0.012947889549911789,0.9999161725645823,0.),(0.12580746189129235,0.9920546771889498,0.),(0.12580746189129235,0.9920546771889498,0.),(0.25678560352314495,0.9664683925629717,0.),(0.12580746189129235,0.9920546771889498,0.),(0.25678560352314495,0.9664683925629717,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.8893220941653559,-0.45728132788180387,0.),(0.8893220941653559,-0.45728132788180387,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.6291972681526775,0.7772456482664974,0.),(0.7362866814501166,0.6766697294243142,0.),(0.6291972681526775,0.7772456482664974,0.),(0.7362866814501166,0.6766697294243142,0.),(-0.12780975406149545,-0.991798702745038,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.12780975406149545,-0.991798702745038,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.39586511141738157,-0.9183086700900217,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.39586511141738157,-0.9183086700900217,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.6371382701240347,-0.7707495214032589,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.6371382701240347,-0.7707495214032589,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.39586511141738157,-0.9183086700900217,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.39586511141738157,-0.9183086700900217,0.),(0.9999861252731272,0.00526775675575694,0.),(0.9882991966281712,0.15252769566249838,0.),(0.9882991966281712,0.15252769566249838,0.),(0.9999861252731272,0.00526775675575694,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.0002958514360789271,0.9999999562359629,0.),(-0.19223371225305855,0.981349173267807,0.),(0.0002958514360789271,0.9999999562359629,0.),(-0.19223371225305855,0.981349173267807,0.),(0.19272392771065497,0.9812530191993186,0.),(0.0002958514360789271,0.9999999562359629,0.),(0.19272392771065497,0.9812530191993186,0.),(0.0002958514360789271,0.9999999562359629,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9999861252731272,0.00526775675575694,0.),(0.9999861252731272,0.00526775675575694,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.7345761428927619,0.6785262635247017,0.),(0.578454045877275,0.8157149727743213,0.),(0.7345761428927619,0.6785262635247017,0.),(0.578454045877275,0.8157149727743213,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.9643985522083707,-0.2644530818470427,0.),(0.9643985522083707,-0.2644530818470427,0.),(0.9643985522083707,-0.2644530818470427,0.),(0.9643985522083707,-0.2644530818470427,0.),(-0.9625082715910013,0.27125233108473634,0.),(-0.9672095041928837,0.2539798712476175,0.),(-0.9672095041928837,0.2539798712476175,0.),(-0.9625082715910013,0.27125233108473634,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.9769988877805387,0.21324439799345352,0.),(0.9836499297931796,0.18009113142482358,0.),(0.9836499297931796,0.18009113142482358,0.),(0.9769988877805387,0.21324439799345352,0.),(-0.9731576010320436,0.23013970442658913,0.),(-0.9748015785129227,0.22307371545907045,0.),(-0.9748015785129227,0.22307371545907045,0.),(-0.9731576010320436,0.23013970442658913,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9633571078061799,-0.268222077464389,0.),(0.9633571078061799,-0.268222077464389,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9701425001453329,-0.24253562503632958,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9701425001453329,-0.24253562503632958,0.),(-0.9649338002855462,-0.2624933543282454,0.),(-0.9638016856477805,-0.2666201619204687,0.),(-0.9638016856477805,-0.2666201619204687,0.),(-0.9649338002855462,-0.2624933543282454,0.),(0.9741171320751483,0.2260438298155657,0.),(0.9767827016489056,0.21423247596819933,0.),(0.9767827016489056,0.21423247596819933,0.),(0.9741171320751483,0.2260438298155657,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(-0.9672095041928837,0.2539798712476175,0.),(-0.9716008047066287,0.2366260262385175,0.),(-0.9716008047066287,0.2366260262385175,0.),(-0.9672095041928837,0.2539798712476175,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.9501115102274097,0.31191043287038495,0.),(-0.9501115102274097,0.31191043287038495,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.9501115102274097,0.31191043287038495,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.9501115102274097,0.31191043287038495,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.7089870822585878,-0.7052214667680322,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.7089870822585878,-0.7052214667680322,0.),(0.7089870822585878,-0.7052214667680322,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.7089870822585878,-0.7052214667680322,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.7411781990788633,0.6713083324450941,0.),(-0.7411781990788633,0.6713083324450941,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.7411781990788633,0.6713083324450941,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.7411781990788633,0.6713083324450941,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.370770082790638,-0.9287246877882721,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.370770082790638,-0.9287246877882721,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.18338909196229686,-0.9830404065699663,0.),(0.370770082790638,-0.9287246877882721,0.),(0.18338909196229686,-0.9830404065699663,0.),(0.370770082790638,-0.9287246877882721,0.),(0.578454045877275,0.8157149727743213,0.),(0.392800811108307,0.9196235766837736,0.),(0.578454045877275,0.8157149727743213,0.),(0.392800811108307,0.9196235766837736,0.),(0.392800811108307,0.9196235766837736,0.),(0.19272392771065497,0.9812530191993186,0.),(0.392800811108307,0.9196235766837736,0.),(0.19272392771065497,0.9812530191993186,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.19223371225305855,0.981349173267807,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.19223371225305855,0.981349173267807,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.9714624054277151,0.23719358094307266,0.),(-0.9731576010320436,0.23013970442658913,0.),(-0.9731576010320436,0.23013970442658913,0.),(-0.9714624054277151,0.23719358094307266,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9660482448389756,-0.2583617398987992,0.),(-0.9649338002855462,-0.2624933543282454,0.),(-0.9649338002855462,-0.2624933543282454,0.),(-0.9660482448389756,-0.2583617398987992,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.9622060458243664,0.2723224657993486,0.),(0.965807041701975,0.25926194899923066,0.),(0.965807041701975,0.25926194899923066,0.),(0.9622060458243664,0.2723224657993486,0.),(0.965807041701975,0.25926194899923066,0.),(0.9769988877805387,0.21324439799345352,0.),(0.9769988877805387,0.21324439799345352,0.),(0.965807041701975,0.25926194899923066,0.),(0.9767827016489056,0.21423247596819933,0.),(0.9793050618474799,0.20238971278181062,0.),(0.9793050618474799,0.20238971278181062,0.),(0.9767827016489056,0.21423247596819933,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.8311604628836111,0.5560326293834755,0.),(0.8311604628836111,0.5560326293834755,0.),(0.8311604628836111,0.5560326293834755,0.),(0.8311604628836111,0.5560326293834755,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(-0.8313835216090105,-0.5556990552421339,0.),(-0.8313835216090105,-0.5556990552421339,0.),(-0.8313835216090105,-0.5556990552421339,0.),(-0.8313835216090105,-0.5556990552421339,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.9807852652994644,-0.19509039794787292,0.),(0.9951847119559052,-0.09801728974646383,0.),(0.9951847119559052,-0.09801728974646383,0.),(0.9807852652994644,-0.19509039794787292,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.7071067811865489,0.7071067811865461,0.),(-0.7071067811865489,0.7071067811865461,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.5555702260896939,0.8314696169329622,0.),(-0.7071067811865489,0.7071067811865461,0.),(-0.5555702260896939,0.8314696169329622,0.),(-0.7071067811865489,0.7071067811865461,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.555570226089786,-0.8314696169329004,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.555570226089786,-0.8314696169329004,0.),(0.19509039794791153,-0.9807852652994568,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.19509039794791153,-0.9807852652994568,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.09801728974643438,-0.9951847119559081,0.),(0.19509039794791153,-0.9807852652994568,0.),(0.09801728974643438,-0.9951847119559081,0.),(0.19509039794791153,-0.9807852652994568,0.),(-0.38268349542963814,0.9238795063890931,0.),(-0.5555702260896939,0.8314696169329622,0.),(-0.38268349542963814,0.9238795063890931,0.),(-0.5555702260896939,0.8314696169329622,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(-0.9238795063891102,0.38268349542959684,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.9238795063891102,0.38268349542959684,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.09801728974637888,0.9951847119559135,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.09801728974637888,0.9951847119559135,0.),(-0.98078526529947,0.19509039794784488,0.),(-0.9951847119559265,0.09801728974624783,0.),(-0.9951847119559265,0.09801728974624783,0.),(-0.98078526529947,0.19509039794784488,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.9807852652994644,-0.19509039794787292,0.),(0.9807852652994644,-0.19509039794787292,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.7071067811865351,-0.70710678118656,0.),(0.8314696169328859,-0.5555702260898077,0.),(0.8314696169328859,-0.5555702260898077,0.),(0.7071067811865351,-0.70710678118656,0.),(0.8314696169328859,-0.5555702260898077,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.8314696169328859,-0.5555702260898077,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.98078526529947,0.19509039794784488,0.),(-0.98078526529947,0.19509039794784488,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.3826833907803875,0.9238795497362333,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.3826833907803875,0.9238795497362333,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.3826833907803875,0.9238795497362333,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.3826833907803875,0.9238795497362333,0.),(0.555570226089786,-0.8314696169329004,0.),(0.7071067811865351,-0.70710678118656,0.),(0.555570226089786,-0.8314696169329004,0.),(0.7071067811865351,-0.70710678118656,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.08709942068020388,0.9961996240298292,0.),(-0.08709942068020388,0.9961996240298292,0.),(-0.08709942068020388,0.9961996240298292,0.),(-0.08709942068020388,0.9961996240298292,0.),(0.9774618285571268,0.21111223013780628,0.),(0.9455208071073157,0.3255616736152011,0.),(0.9455208071073157,0.3255616736152011,0.),(0.9774618285571268,0.21111223013780628,0.),(0.9455208071073157,0.3255616736152011,0.),(0.82228120474033,0.5690813828713708,0.),(0.82228120474033,0.5690813828713708,0.),(0.9455208071073157,0.3255616736152011,0.),(0.82228120474033,0.5690813828713708,0.),(0.618991963670469,0.7853973191394131,0.),(0.618991963670469,0.7853973191394131,0.),(0.82228120474033,0.5690813828713708,0.),(0.618991963670469,0.7853973191394131,0.),(0.3996723632402599,0.9166580616903697,0.),(0.618991963670469,0.7853973191394131,0.),(0.3996723632402599,0.9166580616903697,0.),(0.3996723632402599,0.9166580616903697,0.),(0.19339585438116996,0.9811208098436082,0.),(0.3996723632402599,0.9166580616903697,0.),(0.19339585438116996,0.9811208098436082,0.),(0.19339585438116996,0.9811208098436082,0.),(0.006270084827264089,0.9999803428249272,0.),(0.19339585438116996,0.9811208098436082,0.),(0.006270084827264089,0.9999803428249272,0.),(0.006270084827264089,0.9999803428249272,0.),(-0.1706379345644615,0.9853337989166792,0.),(0.006270084827264089,0.9999803428249272,0.),(-0.1706379345644615,0.9853337989166792,0.),(-0.1706379345644615,0.9853337989166792,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.1706379345644615,0.9853337989166792,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.5602022188465279,-0.8283558860776129,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.5602022188465279,-0.8283558860776129,0.),(-0.5602022188465279,-0.8283558860776129,0.),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.5602022188465279,-0.8283558860776129,0.),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.26435381846863887,-0.964425766278074,1.1000904274438964E-30),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.26435381846863887,-0.964425766278074,1.1000904274438964E-30),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.4669255000030771,-0.8842966569239514,0.),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.4669255000030771,-0.8842966569239514,0.),(-0.4669255000030771,-0.8842966569239514,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.4669255000030771,-0.8842966569239514,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.0014495197728581503,0.9999989494456624,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.0014495197728581503,0.9999989494456624,0.),(-0.0014495197728581503,0.9999989494456624,0.),(0.18439541958058675,0.9828521400687388,0.),(-0.0014495197728581503,0.9999989494456624,0.),(0.18439541958058675,0.9828521400687388,0.),(0.18439541958058675,0.9828521400687388,0.),(0.397653234982458,0.9175357784348174,0.),(0.18439541958058675,0.9828521400687388,0.),(0.397653234982458,0.9175357784348174,0.),(0.397653234982458,0.9175357784348174,0.),(0.6311132446113388,0.7756907067099287,0.),(0.397653234982458,0.9175357784348174,0.),(0.6311132446113388,0.7756907067099287,0.),(0.6311132446113388,0.7756907067099287,0.),(0.8310893844718592,0.5561388630712533,0.),(0.8310893844718592,0.5561388630712533,0.),(0.6311132446113388,0.7756907067099287,0.),(0.8310893844718592,0.5561388630712533,0.),(0.9540840705660083,0.29953895621804594,0.),(0.9540840705660083,0.29953895621804594,0.),(0.8310893844718592,0.5561388630712533,0.),(0.9540840705660083,0.29953895621804594,0.),(0.9862299090912843,0.16538006655518403,0.),(0.9862299090912843,0.16538006655518403,0.),(0.9540840705660083,0.29953895621804594,0.),(0.07505650511901447,-0.9971792822954755,0.),(0.07505650511901447,-0.9971792822954755,0.),(0.07505650511901447,-0.9971792822954755,0.),(0.07505650511901447,-0.9971792822954755,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.9655584237881841,-0.2601863375576772,0.),(-0.9655584237881841,-0.2601863375576772,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.006729681688991534,-0.9999773554357945,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.006729681688991534,-0.9999773554357945,0.),(-0.006729681688991534,-0.9999773554357945,0.),(0.21785673822142915,-0.9759807588326319,0.),(-0.006729681688991534,-0.9999773554357945,0.),(0.21785673822142915,-0.9759807588326319,0.),(0.21785673822142915,-0.9759807588326319,0.),(0.426740401850111,-0.9043741645075924,0.),(0.21785673822142915,-0.9759807588326319,0.),(0.426740401850111,-0.9043741645075924,0.),(0.426740401850111,-0.9043741645075924,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.426740401850111,-0.9043741645075924,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.8920265571908663,-0.45198298780619,0.),(0.8920265571908663,-0.45198298780619,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.8920265571908663,-0.45198298780619,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.8920265571908663,-0.45198298780619,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.9150023212001752,0.40344857441598614,0.),(0.9150023212001752,0.40344857441598614,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.9150023212001752,0.40344857441598614,0.),(0.6471347723667976,0.7623756202776772,0.),(0.6471347723667976,0.7623756202776772,0.),(0.9150023212001752,0.40344857441598614,0.),(0.6471347723667976,0.7623756202776772,0.),(0.36235316167200854,0.93204087154282,0.),(0.6471347723667976,0.7623756202776772,0.),(0.36235316167200854,0.93204087154282,0.),(0.36235316167200854,0.93204087154282,0.),(0.2550849049142149,0.9669186580498412,0.),(0.36235316167200854,0.93204087154282,0.),(0.2550849049142149,0.9669186580498412,0.),(0.2550849049142149,0.9669186580498412,0.),(0.28595039760148855,0.9582444208611657,0.),(0.2550849049142149,0.9669186580498412,0.),(0.28595039760148855,0.9582444208611657,0.),(0.28595039760148855,0.9582444208611657,0.),(0.42364706687595166,0.9058273360455641,0.),(0.28595039760148855,0.9582444208611657,0.),(0.42364706687595166,0.9058273360455641,0.),(0.42364706687595166,0.9058273360455641,0.),(0.6276382490359698,0.7785051241623668,0.),(0.42364706687595166,0.9058273360455641,0.),(0.6276382490359698,0.7785051241623668,0.),(0.6276382490359698,0.7785051241623668,0.),(0.8269599887954417,0.5622607730683717,0.),(0.8269599887954417,0.5622607730683717,0.),(0.6276382490359698,0.7785051241623668,0.),(0.8269599887954417,0.5622607730683717,0.),(0.9588699203284513,0.2838458664298454,0.),(0.9588699203284513,0.2838458664298454,0.),(0.8269599887954417,0.5622607730683717,0.),(0.9588699203284513,0.2838458664298454,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.9588699203284513,0.2838458664298454,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.957401173102709,-0.2887611361342741,0.),(0.957401173102709,-0.2887611361342741,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.957401173102709,-0.2887611361342741,0.),(0.835029876011192,-0.5502046039145194,0.),(0.835029876011192,-0.5502046039145194,0.),(0.957401173102709,-0.2887611361342741,0.),(0.835029876011192,-0.5502046039145194,0.),(0.644888194762835,-0.7642769238015314,0.),(0.644888194762835,-0.7642769238015314,0.),(0.835029876011192,-0.5502046039145194,0.),(0.644888194762835,-0.7642769238015314,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.644888194762835,-0.7642769238015314,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.202992057833538,-0.9791803840235496,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.202992057833538,-0.9791803840235496,0.),(0.202992057833538,-0.9791803840235496,0.),(0.008487459676545215,-0.9999639808654306,0.),(0.202992057833538,-0.9791803840235496,0.),(0.008487459676545215,-0.9999639808654306,0.),(0.008487459676545215,-0.9999639808654306,0.),(-0.17916273136199512,-0.9838194527914711,0.),(0.008487459676545215,-0.9999639808654306,0.),(-0.17916273136199512,-0.9838194527914711,0.),(-0.17916273136199512,-0.9838194527914711,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.17916273136199512,-0.9838194527914711,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.9876333514957574,-0.15678125848856422,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.9876333514957574,-0.15678125848856422,0.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(8,5,9),(9,5,10),(9,10,11),(11,10,12),(12,10,13),(12,13,14),(14,13,15),(15,13,16),(16,13,17),(16,17,18),(18,17,19),(19,17,20),(19,20,21),(19,21,22),(23,24,25),(24,23,26),(27,28,29),(28,27,30),(31,32,33),(32,31,34),(35,36,37),(36,35,38),(39,40,41),(40,39,42),(40,42,43),(40,43,44),(44,43,45),(44,45,46),(44,46,47),(47,46,48),(47,48,49),(47,49,50),(47,50,51),(51,50,52),(51,52,53),(51,53,54),(54,53,55),(55,53,56),(57,58,59),(58,57,60),(61,62,63),(62,61,64),(65,66,67),(66,65,68),(69,70,71),(70,69,72),(73,74,75),(74,73,76),(77,78,79),(78,77,80),(81,82,83),(82,81,84),(85,86,87),(86,85,88),(89,90,91),(90,89,92),(93,94,95),(94,93,96),(97,98,99),(98,97,100),(101,102,103),(102,101,104),(105,106,107),(106,105,108),(109,110,111),(110,109,112),(113,114,115),(114,113,116),(117,118,119),(118,117,120),(121,122,123),(122,121,124),(125,126,127),(126,125,128),(129,130,131),(130,129,132),(133,134,135),(134,133,136),(137,138,139),(138,137,140),(141,142,143),(142,141,144),(145,146,147),(146,145,148),(149,150,151),(150,149,152),(153,154,155),(154,153,156),(157,158,159),(158,157,160),(161,162,163),(162,161,164),(165,166,167),(166,165,168),(169,170,171),(170,169,172),(173,174,175),(174,173,176),(177,178,179),(178,177,180),(181,182,183),(182,181,184),(185,186,187),(186,185,188),(189,190,191),(190,189,192),(193,194,195),(194,193,196),(197,198,199),(198,197,200),(201,202,203),(202,201,204),(205,206,207),(206,205,208),(209,210,211),(210,209,212),(213,214,215),(214,213,216),(217,218,219),(218,217,220),(221,222,223),(222,221,224),(225,226,227),(226,225,228),(229,230,231),(230,229,232),(233,234,235),(234,233,236),(237,238,239),(238,237,240),(241,242,243),(242,241,244),(245,246,247),(246,245,248),(249,250,251),(250,249,252),(253,254,255),(254,253,256),(257,258,259),(258,257,260),(261,262,263),(262,261,264),(265,266,267),(266,265,268),(269,270,271),(270,269,272),(273,274,275),(274,273,276),(277,278,279),(278,277,280),(281,282,283),(282,281,284),(285,286,287),(286,285,288),(289,290,291),(290,289,292),(293,294,295),(294,293,296),(297,298,299),(298,297,300),(301,302,303),(302,301,304),(305,306,307),(306,305,308),(309,310,311),(310,309,312),(313,314,315),(314,313,316),(317,318,319),(318,317,320),(321,322,323),(322,321,324),(325,326,327),(326,325,328),(326,328,329),(329,328,330),(329,330,331),(331,330,332),(331,333,334),(333,331,332),(335,336,337),(336,335,338),(339,340,341),(340,339,342),(343,344,345),(344,343,346),(347,348,349),(348,347,350),(351,352,353),(352,351,354),(355,356,357),(356,355,358),(359,360,361),(360,359,362),(360,362,363),(360,363,364),(364,363,365),(364,365,366),(364,366,367),(367,366,368),(368,366,369),(368,369,370),(370,369,371),(371,369,372),(371,372,373),(371,373,374),(371,374,375),(375,374,376),(375,376,377),(375,377,378),(379,380,381),(380,379,382),(383,384,385),(384,383,386),(386,383,387),(387,383,388),(387,388,389),(389,388,390),(390,388,391),(390,391,392),(390,392,393),(393,392,394),(393,394,395),(393,395,396),(396,395,397),(397,395,398),(398,395,399),(398,399,400),(400,399,401),(401,399,402),(403,404,405),(404,403,406),(407,408,409),(408,407,410),(411,412,413),(412,411,414),(415,416,417),(416,415,418),(419,420,421),(420,419,422),(423,424,425),(424,423,426),(427,428,429),(428,427,430),(431,432,433),(432,431,434),(435,436,437),(436,435,438),(439,440,441),(440,439,442),(443,444,445),(444,443,446),(447,448,449),(448,447,450),(451,452,453),(452,451,454),(455,456,457),(456,455,458),(459,460,461),(460,459,462),(463,464,465),(464,463,466),(467,468,469),(468,467,470),(471,472,473),(472,471,474),(475,476,477),(476,475,478),(479,480,481),(480,479,482),(483,484,485),(484,483,486),(487,488,489),(488,487,490),(491,492,493),(492,491,494),(495,496,497),(496,495,498),(499,500,501),(500,499,502),(503,504,505),(504,503,506),(507,508,509),(508,507,510),(511,512,513),(512,511,514),(515,516,517),(516,515,518),(519,520,521),(520,519,522),(523,524,525),(524,523,526),(527,528,529),(528,527,530),(531,532,533),(532,531,534),(535,536,537),(536,535,538),(539,540,541),(540,539,542),(543,544,545),(544,543,546),(546,543,547),(547,543,540),(547,540,542),(548,544,546),(549,550,551),(550,549,552),(553,554,555),(554,553,556),(557,558,559),(558,557,560),(561,562,563),(562,561,564),(565,566,567),(566,565,568),(569,570,571),(570,569,572),(573,574,575),(574,573,576),(574,576,577),(574,577,578),(574,578,579),(574,579,580),(580,579,581),(581,579,582),(581,582,583),(583,582,584),(584,582,585),(585,582,586),(585,586,587),(587,586,588),(588,586,589),(588,589,590),(591,592,593),(592,591,594),(594,591,595),(595,591,596),(596,591,597),(597,591,598),(597,598,599),(597,599,600),(600,599,601),(600,601,602),(600,602,603),(600,603,604),(604,603,605),(604,605,606),(604,606,607),(607,606,608),(609,610,611),(610,609,612),(613,614,615),(614,613,616),(617,618,619),(618,617,620),(621,622,623),(622,621,624),(625,626,627),(626,625,628),(629,630,631),(630,629,632),(633,634,635),(634,633,636),(637,638,639),(638,637,640),(641,642,643),(642,641,644),(645,646,647),(646,645,648),(649,650,651),(650,649,652),(653,654,655),(654,653,656),(657,658,659),(658,657,660),(661,662,663),(662,661,664),(665,666,667),(666,665,668),(669,670,671),(670,669,672),(673,674,675),(674,673,676),(677,678,679),(678,677,680),(681,682,683),(682,681,684),(685,686,687),(686,685,688),(686,688,689),(689,688,690),(690,688,691),(691,688,692),(691,692,693),(693,692,694),(693,694,695),(695,694,696),(696,694,697),(696,697,698),(698,697,699),(698,699,700),(700,699,701),(700,701,702),(702,701,703),(702,703,704),(704,703,705),(704,705,706),(706,705,707),(706,707,708),(708,707,709),(708,709,710),(710,709,711),(711,709,712),(712,709,713),(712,713,714),(714,713,715),(714,715,716),(716,715,717),(716,717,718),(718,717,719),(718,719,720),(720,719,721),(720,721,722),(723,724,725),(724,723,726),(724,726,727),(727,726,728),(727,728,729),(729,728,685),(729,685,730),(730,685,687),(730,687,731),(730,731,732),(732,731,733),(732,733,734),(732,734,735),(735,734,736),(735,736,737),(737,736,738),(737,738,739),(739,738,740),(739,740,741),(739,741,742),(742,741,743),(742,743,744),(744,743,745),(744,745,746),(746,745,747),(747,745,748),(747,748,749),(749,748,750),(749,750,751),(751,750,752),(751,752,753),(753,752,754),(753,754,755),(753,755,711),(711,755,756),(711,756,710),(757,758,759),(758,757,760),(760,757,761),(760,761,762),(762,761,763),(762,763,764),(764,763,765),(764,765,766),(766,765,767),(767,765,768),(767,768,769),(769,768,770),(770,768,771),(770,771,772),(772,771,773),(772,773,774),(774,773,775),(774,775,776),(776,775,777),(777,775,778),(777,778,779),(779,778,780),(779,780,781),(781,780,782),(781,782,783),(781,783,784),(784,783,785),(784,785,786),(786,785,787),(786,787,788),(788,787,789),(788,789,790),(790,789,791),(791,789,792),(791,792,793),(793,792,794),(764,795,796),(795,764,766),(796,795,797),(796,797,798),(796,798,799),(796,799,800),(800,799,801),(800,801,802),(802,801,803),(802,803,804),(802,804,805),(805,804,806),(805,806,807),(807,806,808),(807,808,809),(809,808,810),(809,810,811),(811,810,812),(811,812,813),(813,812,814),(813,814,815),(815,814,816),(815,816,817),(817,816,794),(817,794,792),(817,792,818),(817,818,819),(819,818,820),(819,820,821),(821,820,822),(821,822,823),(823,822,824),(823,824,825),(825,824,826),(825,826,827),(827,826,828),(829,830,831),(830,829,832),(833,834,835),(834,833,836),(837,838,839),(838,837,840),(841,842,843),(842,841,844),(845,846,847),(846,845,848),(849,850,851),(850,849,852),(853,854,855),(854,853,856),(856,853,857),(857,853,858),(857,858,859),(859,858,860),(860,858,861),(861,858,862),(861,862,863),(861,863,864),(864,863,865),(864,865,866),(866,865,867),(867,865,868),(868,865,869),(868,869,870),(870,869,871),(871,869,872),(872,869,873),(872,873,874),(875,876,877),(876,875,878),(878,875,879),(878,879,880),(880,879,855),(880,855,881),(881,855,854),(881,854,882),(881,882,883),(881,883,884),(884,883,885),(884,885,886),(886,885,887),(886,887,888),(888,887,889),(888,889,890),(888,890,891),(891,890,892),(892,890,893),(892,893,894),(894,893,895),(895,893,896),(896,893,897),(897,893,898),(897,898,899),(899,898,900),(899,900,901),(902,903,904),(903,902,905),(905,902,906),(906,902,907),(906,907,908),(908,907,909),(908,909,910),(908,910,911),(911,910,912),(911,912,913),(911,913,914),(914,913,915),(914,915,916),(914,916,917),(917,916,918),(917,918,919),(919,918,920),(919,920,921),(919,921,896),(896,921,922),(896,922,895),(923,924,925),(924,923,926),(924,926,927),(924,927,928),(928,927,929),(928,929,930),(930,929,931),(931,929,932),(931,932,933),(933,932,934),(934,932,935),(934,935,936),(936,935,937),(937,935,938),(937,938,939),(939,938,940),(939,940,941),(941,940,942),(942,940,943),(942,943,944),(944,943,945),(946,947,948),(947,946,949),(947,949,950),(950,949,951),(950,951,952),(952,951,953),(952,953,954),(954,953,955),(955,953,956),(956,953,957),(956,957,958),(958,957,959),(958,959,960),(960,959,961),(960,961,962),(962,961,963),(963,961,964),(963,964,965),(963,965,966),(966,965,967),(966,967,945),(966,945,943),(966,943,968),(966,968,969),(969,968,970),(969,970,971),(971,970,972),(954,973,952),(973,954,974),(973,974,975),(973,975,976),(976,975,977),(976,977,978),(976,978,979),(976,979,980),(980,979,981),(981,979,982),(981,982,983),(983,982,984),(983,984,985),(983,985,986),(983,986,987),(987,986,988),(987,988,989),(987,989,990),(987,990,991),(991,990,992),(993,994,995),(994,993,996),(997,998,999),(998,997,1000),(1001,1002,1003),(1002,1001,1004),(1005,1006,1007),(1006,1005,1008),(1009,1010,1011),(1010,1009,1012),(1013,1014,1015),(1014,1013,1016),(1017,1018,1019),(1018,1017,1020),(1021,1022,1023),(1022,1021,1024),(1025,1026,1027),(1026,1025,1028),(1029,1030,1031),(1030,1029,1032),(1033,1034,1035),(1034,1033,1036),(1037,1038,1039),(1038,1037,1040),(1041,1042,1043),(1042,1041,1044),(1045,1046,1047),(1046,1045,1048),(1049,1050,1051),(1050,1049,1052),(1053,1054,1055),(1054,1053,1056),(1057,1058,1059),(1058,1057,1060),(1061,1062,1063),(1062,1061,1064),(1064,1061,1065),(1065,1061,1066),(1067,1068,1069),(1068,1067,1070),(1071,1072,1073),(1072,1071,1074),(1075,1076,1077),(1076,1075,1078),(1079,1080,1081),(1080,1079,1082),(1083,1084,1085),(1084,1083,1086),(1087,1088,1089),(1088,1087,1090),(1091,1092,1093),(1092,1091,1094),(1095,1096,1097),(1096,1095,1098),(1099,1100,1101),(1100,1099,1102),(1103,1104,1105),(1104,1103,1106),(1107,1108,1109),(1108,1107,1110),(1111,1112,1113),(1112,1111,1114),(1115,1116,1117),(1116,1115,1118),(1119,1120,1121),(1120,1119,1122),(1123,1124,1125),(1124,1123,1126),(1127,1128,1129),(1128,1127,1130),(1131,1132,1133),(1132,1131,1134),(1135,1136,1137),(1136,1135,1138),(1139,1140,1141),(1140,1139,1142),(1143,1144,1145),(1144,1143,1146),(1147,1148,1149),(1148,1147,1150),(1151,1152,1153),(1152,1151,1154),(1155,1156,1157),(1156,1155,1158),(1159,1160,1161),(1160,1159,1162),(1163,1164,1165),(1164,1163,1166),(1167,1168,1169),(1168,1167,1170),(1171,1172,1173),(1172,1171,1174),(1175,1176,1177),(1176,1175,1178),(1179,1180,1181),(1180,1179,1182),(1183,1184,1185),(1184,1183,1186),(1187,1188,1189),(1188,1187,1190),(1191,1192,1193),(1192,1191,1194),(1195,1196,1197),(1196,1195,1198),(1199,1200,1201),(1200,1199,1202),(1203,1204,1205),(1204,1203,1206),(1207,1208,1209),(1208,1207,1210),(1211,1212,1213),(1212,1211,1214),(1215,1216,1217),(1216,1215,1218),(1219,1220,1221),(1220,1219,1222),(1223,1224,1225),(1224,1223,1226),(1227,1228,1229),(1228,1227,1230),(1231,1232,1233),(1232,1231,1234),(1235,1236,1237),(1236,1235,1238),(1239,1240,1241),(1240,1239,1242),(1243,1244,1245),(1244,1243,1246),(1247,1248,1249),(1248,1247,1250),(1251,1252,1253),(1252,1251,1254),(1255,1256,1257),(1256,1255,1258),(1259,1260,1261),(1260,1259,1262),(1263,1264,1265),(1264,1263,1266),(1267,1268,1269),(1268,1267,1270)),$); +#147=IFCCARTESIANPOINTLIST3D(((0.3,-300.,5.),(0.3,-500.,0.),(0.3,-500.,5.),(0.3,-300.,0.),(97.845,-490.393,5.),(0.3,-300.,5.),(0.3,-500.,5.),(58.827,-294.236,5.),(115.105,-277.164,5.),(191.642,-461.94,5.),(166.971,-249.441,5.),(212.432,-212.132,5.),(278.085,-415.735,5.),(249.741,-166.671,5.),(277.464,-114.805,5.),(294.536,-58.527,5.),(353.853,-353.553,5.),(300.3,0.,5.),(500.3,0.,5.),(416.035,-277.785,5.),(462.24,-191.342,5.),(490.693,-97.545,5.),(0.3,-300.,5.),(58.827,-294.236,0.),(0.3,-300.,0.),(58.827,-294.236,5.),(300.3,0.,5.),(500.3,0.,0.),(300.3,0.,0.),(500.3,0.,5.),(300.3,0.,5.),(294.536,-58.527,0.),(294.536,-58.527,5.),(300.3,0.,0.),(191.642,-461.94,5.),(97.845,-490.393,0.),(191.642,-461.94,0.),(97.845,-490.393,5.),(0.3,-300.,0.),(97.845,-490.393,0.),(0.3,-500.,0.),(58.827,-294.236,0.),(115.105,-277.164,0.),(191.642,-461.94,0.),(166.971,-249.441,0.),(212.432,-212.132,0.),(278.085,-415.735,0.),(249.741,-166.671,0.),(277.464,-114.805,0.),(294.536,-58.527,0.),(353.853,-353.553,0.),(300.3,0.,0.),(500.3,0.,0.),(416.035,-277.785,0.),(462.24,-191.342,0.),(490.693,-97.545,0.),(490.693,-97.545,0.),(462.24,-191.342,5.),(462.24,-191.342,0.),(490.693,-97.545,5.),(462.24,-191.342,0.),(416.035,-277.785,5.),(416.035,-277.785,0.),(462.24,-191.342,5.),(500.3,0.,0.),(490.693,-97.545,5.),(490.693,-97.545,0.),(500.3,0.,5.),(278.085,-415.735,5.),(191.642,-461.94,0.),(278.085,-415.735,0.),(191.642,-461.94,5.),(353.853,-353.553,5.),(278.085,-415.735,0.),(353.853,-353.553,0.),(278.085,-415.735,5.),(58.827,-294.236,5.),(115.105,-277.164,0.),(58.827,-294.236,0.),(115.105,-277.164,5.),(416.035,-277.785,0.),(353.853,-353.553,5.),(353.853,-353.553,0.),(416.035,-277.785,5.),(294.536,-58.527,5.),(277.464,-114.805,0.),(277.464,-114.805,5.),(294.536,-58.527,0.),(97.845,-490.393,5.),(0.3,-500.,0.),(97.845,-490.393,0.),(0.3,-500.,5.),(877.313,53.797,0.),(881.793,37.789,5.),(881.793,37.789,0.),(877.313,53.797,5.),(871.041,68.83,0.),(877.313,53.797,5.),(877.313,53.797,0.),(871.041,68.83,5.),(813.425,-115.375,5.),(798.774,-120.117,0.),(813.425,-115.375,0.),(798.774,-120.117,5.),(827.53,-108.736,5.),(813.425,-115.375,0.),(827.53,-108.736,0.),(813.425,-115.375,5.),(705.8,-107.143,5.),(692.962,-97.994,0.),(705.8,-107.143,0.),(692.962,-97.994,5.),(884.434,-15.353,0.),(881.604,-32.57,5.),(881.604,-32.57,0.),(884.434,-15.353,5.),(885.377,2.85,0.),(884.434,-15.353,5.),(884.434,-15.353,0.),(885.377,2.85,5.),(683.164,95.825,5.),(668.786,76.852,0.),(668.786,76.852,5.),(683.164,95.825,0.),(683.164,95.825,5.),(700.79,110.973,0.),(683.164,95.825,0.),(700.79,110.973,5.),(720.806,121.793,5.),(743.212,128.285,0.),(720.806,121.793,0.),(743.212,128.285,5.),(743.212,128.285,5.),(768.006,130.449,0.),(743.212,128.285,0.),(768.006,130.449,5.),(700.79,110.973,5.),(720.806,121.793,0.),(700.79,110.973,0.),(720.806,121.793,5.),(800.367,126.383,5.),(815.29,121.301,0.),(800.367,126.383,0.),(815.29,121.301,5.),(768.174,102.448,5.),(751.506,100.965,0.),(768.174,102.448,0.),(751.506,100.965,5.),(791.292,99.367,5.),(768.174,102.448,0.),(791.292,99.367,0.),(768.174,102.448,5.),(884.481,20.807,0.),(885.377,2.85,5.),(885.377,2.85,0.),(884.481,20.807,5.),(861.955,-77.91,0.),(852.052,-89.977,5.),(852.052,-89.977,0.),(861.955,-77.91,5.),(870.287,-64.051,0.),(861.955,-77.91,5.),(861.955,-77.91,0.),(870.287,-64.051,5.),(652.354,28.939,5.),(650.3,0.,0.),(650.3,0.,5.),(652.354,28.939,0.),(658.516,54.557,5.),(652.354,28.939,0.),(652.354,28.939,5.),(658.516,54.557,0.),(815.29,121.301,5.),(829.374,114.185,0.),(815.29,121.301,0.),(829.374,114.185,5.),(881.793,37.789,0.),(884.481,20.807,5.),(884.481,20.807,0.),(881.793,37.789,5.),(689.808,-40.22,0.),(697.275,-56.542,5.),(697.275,-56.542,0.),(689.808,-40.22,5.),(697.275,-56.542,0.),(707.728,-70.506,5.),(707.728,-70.506,0.),(697.275,-56.542,5.),(650.3,0.,5.),(653.821,-31.522,0.),(653.821,-31.522,5.),(650.3,0.,0.),(653.821,-31.522,5.),(664.385,-61.368,0.),(664.385,-61.368,5.),(653.821,-31.522,0.),(664.385,-61.368,5.),(672.255,-75.107,0.),(672.255,-75.107,5.),(664.385,-61.368,0.),(685.328,-21.541,0.),(689.808,-40.22,5.),(689.808,-40.22,0.),(685.328,-21.541,5.),(668.786,76.852,5.),(658.516,54.557,0.),(658.516,54.557,5.),(668.786,76.852,0.),(881.604,-32.57,0.),(876.889,-48.803,5.),(876.889,-48.803,0.),(881.604,-32.57,5.),(767.839,-123.91,5.),(750.946,-122.862,0.),(767.839,-123.91,0.),(750.946,-122.862,5.),(783.579,-122.962,5.),(767.839,-123.91,0.),(783.579,-122.962,0.),(767.839,-123.91,5.),(798.774,-120.117,5.),(783.579,-122.962,0.),(798.774,-120.117,0.),(783.579,-122.962,5.),(829.374,114.185,5.),(842.228,105.251,0.),(829.374,114.185,0.),(842.228,105.251,5.),(853.456,94.714,0.),(863.061,82.574,5.),(863.061,82.574,0.),(853.456,94.714,5.),(863.061,82.574,0.),(871.041,68.83,5.),(871.041,68.83,0.),(863.061,82.574,5.),(768.006,130.449,5.),(784.606,129.433,0.),(768.006,130.449,0.),(784.606,129.433,5.),(784.606,129.433,5.),(800.367,126.383,0.),(784.606,129.433,0.),(800.367,126.383,5.),(876.889,-48.803,0.),(870.287,-64.051,5.),(870.287,-64.051,0.),(876.889,-48.803,5.),(842.228,105.251,5.),(853.456,94.714,0.),(842.228,105.251,0.),(853.456,94.714,5.),(750.946,-122.862,5.),(734.975,-119.718,0.),(750.946,-122.862,0.),(734.975,-119.718,5.),(719.926,-114.479,5.),(705.8,-107.143,0.),(719.926,-114.479,0.),(705.8,-107.143,5.),(672.255,-75.107,5.),(681.781,-87.316,0.),(681.781,-87.316,5.),(672.255,-75.107,0.),(692.962,-97.994,5.),(681.781,-87.316,0.),(692.962,-97.994,0.),(681.781,-87.316,5.),(734.975,-119.718,5.),(719.926,-114.479,0.),(734.975,-119.718,0.),(719.926,-114.479,5.),(683.835,-0.503,0.),(685.328,-21.541,5.),(685.328,-21.541,0.),(683.835,-0.503,5.),(840.577,-100.253,5.),(827.53,-108.736,0.),(840.577,-100.253,0.),(827.53,-108.736,5.),(767.671,-96.076,5.),(785.219,-94.463,0.),(767.671,-96.076,0.),(785.219,-94.463,5.),(750.406,-94.478,5.),(767.671,-96.076,0.),(750.406,-94.478,0.),(767.671,-96.076,5.),(685.391,25.261,0.),(683.835,-0.503,5.),(683.835,-0.503,0.),(685.391,25.261,5.),(690.059,47.053,0.),(685.391,25.261,5.),(685.391,25.261,0.),(690.059,47.053,5.),(852.052,-89.977,5.),(840.577,-100.253,0.),(852.052,-89.977,0.),(840.577,-100.253,5.),(707.728,-70.506,5.),(720.434,-81.693,0.),(707.728,-70.506,0.),(720.434,-81.693,5.),(-867.339,-122.904,5.),(-900.538,-122.904,0.),(-867.339,-122.904,0.),(-900.538,-122.904,5.),(-717.104,-122.904,5.),(-748.459,-122.904,0.),(-717.104,-122.904,0.),(-748.459,-122.904,5.),(-649.7,122.904,0.),(-717.104,-122.904,5.),(-717.104,-122.904,0.),(-649.7,122.904,5.),(-826.762,122.904,5.),(-873.543,-43.092,0.),(-873.543,-43.092,5.),(-826.762,122.904,0.),(-64.254,843.159,0.),(-64.254,650.,5.),(-64.254,650.,0.),(-64.254,843.159,5.),(-64.254,650.,5.),(-95.441,895.808,5.),(-95.441,650.,5.),(-64.254,843.159,5.),(-62.074,895.808,5.),(64.854,650.,5.),(67.034,702.817,5.),(98.221,650.,5.),(98.221,895.808,5.),(67.034,895.808,5.),(-740.914,-46.403,0.),(-733.201,-88.531,5.),(-733.201,-88.531,0.),(-740.914,-46.403,5.),(-720.961,-35.044,5.),(-733.201,-88.531,0.),(-733.201,-88.531,5.),(-720.961,-35.044,0.),(-815.193,64.386,0.),(-867.339,-122.904,5.),(-867.339,-122.904,0.),(-815.193,64.386,5.),(-807.983,93.226,0.),(-815.193,64.386,5.),(-815.193,64.386,0.),(-807.983,93.226,5.),(-800.27,64.386,5.),(-748.459,-122.904,0.),(-748.459,-122.904,5.),(-800.27,64.386,0.),(-932.396,122.904,0.),(-895.005,-38.229,5.),(-895.005,-38.229,0.),(-932.396,122.904,5.),(-932.396,122.904,0.),(-900.538,-122.904,0.),(-965.763,122.904,0.),(-895.005,-38.229,0.),(-884.609,-88.531,0.),(-867.339,-122.904,0.),(-873.543,-43.092,0.),(-826.762,122.904,0.),(-815.193,64.386,0.),(-807.983,93.226,0.),(-787.527,122.904,0.),(-800.27,64.386,0.),(-748.459,-122.904,0.),(-752.316,-1.509,0.),(-740.914,-46.403,0.),(-733.201,-88.531,0.),(-717.104,-122.904,0.),(-720.961,-35.044,0.),(-682.396,122.904,0.),(-649.7,122.904,0.),(-873.543,-43.092,5.),(-884.609,-88.531,0.),(-884.609,-88.531,5.),(-873.543,-43.092,0.),(-900.538,-122.904,5.),(-932.396,122.904,5.),(-965.763,122.904,5.),(-895.005,-38.229,5.),(-884.609,-88.531,5.),(-867.339,-122.904,5.),(-873.543,-43.092,5.),(-826.762,122.904,5.),(-815.193,64.386,5.),(-807.983,93.226,5.),(-787.527,122.904,5.),(-800.27,64.386,5.),(-748.459,-122.904,5.),(-752.316,-1.509,5.),(-740.914,-46.403,5.),(-733.201,-88.531,5.),(-717.104,-122.904,5.),(-720.961,-35.044,5.),(-682.396,122.904,5.),(-649.7,122.904,5.),(812.02,90.124,5.),(791.292,99.367,0.),(812.02,90.124,0.),(791.292,99.367,5.),(829.207,75.285,5.),(812.02,90.124,0.),(829.207,75.285,0.),(812.02,90.124,5.),(850.36,-19.356,5.),(845.911,-39.026,0.),(845.911,-39.026,5.),(850.36,-19.356,0.),(845.911,-39.026,5.),(838.497,-55.992,0.),(838.497,-55.992,5.),(845.911,-39.026,0.),(721.786,89.102,5.),(708.734,78.722,0.),(721.786,89.102,0.),(708.734,78.722,5.),(708.734,78.722,0.),(697.84,64.874,5.),(697.84,64.874,0.),(708.734,78.722,5.),(838.497,-55.992,5.),(828.117,-70.255,0.),(828.117,-70.255,5.),(838.497,-55.992,0.),(815.442,-81.552,5.),(828.117,-70.255,0.),(815.442,-81.552,0.),(828.117,-70.255,5.),(697.84,64.874,0.),(690.059,47.053,5.),(690.059,47.053,0.),(697.84,64.874,5.),(736.044,96.517,5.),(721.786,89.102,0.),(736.044,96.517,0.),(721.786,89.102,5.),(751.506,100.965,5.),(736.044,96.517,0.),(751.506,100.965,0.),(736.044,96.517,5.),(720.434,-81.693,5.),(734.66,-89.684,0.),(720.434,-81.693,0.),(734.66,-89.684,5.),(734.66,-89.684,5.),(750.406,-94.478,0.),(734.66,-89.684,0.),(750.406,-94.478,5.),(841.698,55.416,5.),(849.307,31.124,0.),(849.307,31.124,5.),(841.698,55.416,0.),(849.307,31.124,5.),(851.843,3.018,0.),(851.843,3.018,5.),(849.307,31.124,0.),(785.219,-94.463,5.),(801.143,-89.621,0.),(785.219,-94.463,0.),(801.143,-89.621,5.),(829.207,75.285,5.),(841.698,55.416,0.),(841.698,55.416,5.),(829.207,75.285,0.),(801.143,-89.621,5.),(815.442,-81.552,0.),(801.143,-89.621,0.),(815.442,-81.552,5.),(851.843,3.018,5.),(850.36,-19.356,0.),(850.36,-19.356,5.),(851.843,3.018,0.),(-682.396,122.904,5.),(-720.961,-35.044,0.),(-720.961,-35.044,5.),(-682.396,122.904,0.),(-965.763,122.904,5.),(-900.538,-122.904,0.),(-900.538,-122.904,5.),(-965.763,122.904,0.),(-807.983,93.226,5.),(-800.27,64.386,0.),(-800.27,64.386,5.),(-807.983,93.226,0.),(-826.762,122.904,5.),(-787.527,122.904,0.),(-826.762,122.904,0.),(-787.527,122.904,5.),(-682.396,122.904,5.),(-649.7,122.904,0.),(-682.396,122.904,0.),(-649.7,122.904,5.),(-787.527,122.904,0.),(-752.316,-1.509,5.),(-752.316,-1.509,0.),(-787.527,122.904,5.),(-752.316,-1.509,0.),(-740.914,-46.403,5.),(-740.914,-46.403,0.),(-752.316,-1.509,5.),(-895.005,-38.229,0.),(-884.609,-88.531,5.),(-884.609,-88.531,0.),(-895.005,-38.229,5.),(-965.763,122.904,5.),(-932.396,122.904,0.),(-965.763,122.904,0.),(-932.396,122.904,5.),(67.034,895.808,5.),(98.221,895.808,0.),(67.034,895.808,0.),(98.221,895.808,5.),(67.034,895.808,5.),(67.034,702.817,0.),(67.034,702.817,5.),(67.034,895.808,0.),(-95.441,895.808,5.),(-95.441,650.,0.),(-95.441,650.,5.),(-95.441,895.808,0.),(-64.254,650.,5.),(-95.441,650.,0.),(-64.254,650.,0.),(-95.441,650.,5.),(-95.441,895.808,5.),(-62.074,895.808,0.),(-95.441,895.808,0.),(-62.074,895.808,5.),(-62.074,895.808,0.),(67.034,702.817,5.),(67.034,702.817,0.),(-62.074,895.808,5.),(98.221,895.808,0.),(67.034,702.817,0.),(67.034,895.808,0.),(98.221,650.,0.),(-62.074,895.808,0.),(-95.441,650.,0.),(-95.441,895.808,0.),(-64.254,843.159,0.),(64.854,650.,0.),(-64.254,650.,0.),(98.221,650.,5.),(64.854,650.,0.),(98.221,650.,0.),(64.854,650.,5.),(-64.254,843.159,5.),(64.854,650.,0.),(64.854,650.,5.),(-64.254,843.159,0.),(98.221,895.808,0.),(98.221,650.,5.),(98.221,650.,0.),(98.221,895.808,5.),(-293.936,58.527,0.),(-299.7,0.,5.),(-299.7,0.,0.),(-293.936,58.527,5.),(249.741,-166.671,5.),(212.432,-212.132,0.),(212.432,-212.132,5.),(249.741,-166.671,0.),(166.971,-249.441,5.),(212.432,-212.132,0.),(166.971,-249.441,0.),(212.432,-212.132,5.),(-490.093,97.545,0.),(-299.7,0.,0.),(-499.7,0.,0.),(-461.64,191.342,0.),(-415.435,277.785,0.),(-353.253,353.553,0.),(-277.485,415.735,0.),(-293.936,58.527,0.),(-276.864,114.805,0.),(-191.042,461.94,0.),(-249.141,166.671,0.),(-211.832,212.132,0.),(-166.371,249.441,0.),(-97.245,490.393,0.),(-114.505,277.164,0.),(-58.227,294.236,0.),(0.3,500.,0.),(0.3,300.,0.),(-299.7,0.,5.),(-490.093,97.545,5.),(-499.7,0.,5.),(-461.64,191.342,5.),(-415.435,277.785,5.),(-353.253,353.553,5.),(-277.485,415.735,5.),(-293.936,58.527,5.),(-276.864,114.805,5.),(-191.042,461.94,5.),(-249.141,166.671,5.),(-211.832,212.132,5.),(-166.371,249.441,5.),(-97.245,490.393,5.),(-114.505,277.164,5.),(-58.227,294.236,5.),(0.3,500.,5.),(0.3,300.,5.),(0.3,500.,0.),(0.3,300.,5.),(0.3,300.,0.),(0.3,500.,5.),(-114.505,277.164,5.),(-166.371,249.441,0.),(-114.505,277.164,0.),(-166.371,249.441,5.),(-58.227,294.236,5.),(-114.505,277.164,0.),(-58.227,294.236,0.),(-114.505,277.164,5.),(0.3,300.,5.),(-58.227,294.236,0.),(0.3,300.,0.),(-58.227,294.236,5.),(115.105,-277.164,5.),(166.971,-249.441,0.),(115.105,-277.164,0.),(166.971,-249.441,5.),(-299.7,0.,5.),(-499.7,0.,0.),(-299.7,0.,0.),(-499.7,0.,5.),(277.464,-114.805,5.),(249.741,-166.671,0.),(249.741,-166.671,5.),(277.464,-114.805,0.),(-97.245,490.393,5.),(0.3,500.,0.),(-97.245,490.393,0.),(0.3,500.,5.),(-490.093,97.545,5.),(-499.7,0.,0.),(-499.7,0.,5.),(-490.093,97.545,0.),(-276.864,114.805,0.),(-293.936,58.527,5.),(-293.936,58.527,0.),(-276.864,114.805,5.),(-211.832,212.132,0.),(-249.141,166.671,5.),(-249.141,166.671,0.),(-211.832,212.132,5.),(-249.141,166.671,0.),(-276.864,114.805,5.),(-276.864,114.805,0.),(-249.141,166.671,5.),(-461.64,191.342,5.),(-490.093,97.545,0.),(-490.093,97.545,5.),(-461.64,191.342,0.),(-353.253,353.553,5.),(-277.485,415.735,0.),(-353.253,353.553,0.),(-277.485,415.735,5.),(-353.253,353.553,5.),(-415.435,277.785,0.),(-415.435,277.785,5.),(-353.253,353.553,0.),(-415.435,277.785,5.),(-461.64,191.342,0.),(-461.64,191.342,5.),(-415.435,277.785,0.),(-191.042,461.94,5.),(-97.245,490.393,0.),(-191.042,461.94,0.),(-97.245,490.393,5.),(-277.485,415.735,5.),(-191.042,461.94,0.),(-277.485,415.735,0.),(-191.042,461.94,5.),(-166.371,249.441,5.),(-211.832,212.132,0.),(-166.371,249.441,0.),(-211.832,212.132,5.),(683.164,95.825,0.),(685.391,25.261,0.),(683.835,-0.503,0.),(700.79,110.973,0.),(690.059,47.053,0.),(697.84,64.874,0.),(708.734,78.722,0.),(720.806,121.793,0.),(721.786,89.102,0.),(743.212,128.285,0.),(736.044,96.517,0.),(751.506,100.965,0.),(768.006,130.449,0.),(768.174,102.448,0.),(784.606,129.433,0.),(791.292,99.367,0.),(800.367,126.383,0.),(812.02,90.124,0.),(815.29,121.301,0.),(829.207,75.285,0.),(829.374,114.185,0.),(841.698,55.416,0.),(842.228,105.251,0.),(849.307,31.124,0.),(853.456,94.714,0.),(851.843,3.018,0.),(852.052,-89.977,0.),(861.955,-77.91,0.),(863.061,82.574,0.),(870.287,-64.051,0.),(871.041,68.83,0.),(876.889,-48.803,0.),(877.313,53.797,0.),(881.604,-32.57,0.),(881.793,37.789,0.),(884.434,-15.353,0.),(884.481,20.807,0.),(885.377,2.85,0.),(652.354,28.939,0.),(653.821,-31.522,0.),(650.3,0.,0.),(658.516,54.557,0.),(664.385,-61.368,0.),(668.786,76.852,0.),(672.255,-75.107,0.),(681.781,-87.316,0.),(685.328,-21.541,0.),(692.962,-97.994,0.),(689.808,-40.22,0.),(697.275,-56.542,0.),(705.8,-107.143,0.),(707.728,-70.506,0.),(719.926,-114.479,0.),(720.434,-81.693,0.),(734.975,-119.718,0.),(734.66,-89.684,0.),(750.406,-94.478,0.),(750.946,-122.862,0.),(767.671,-96.076,0.),(767.839,-123.91,0.),(785.219,-94.463,0.),(783.579,-122.962,0.),(798.774,-120.117,0.),(801.143,-89.621,0.),(813.425,-115.375,0.),(815.442,-81.552,0.),(827.53,-108.736,0.),(828.117,-70.255,0.),(840.577,-100.253,0.),(838.497,-55.992,0.),(845.911,-39.026,0.),(850.36,-19.356,0.),(653.821,-31.522,5.),(652.354,28.939,5.),(650.3,0.,5.),(658.516,54.557,5.),(664.385,-61.368,5.),(668.786,76.852,5.),(672.255,-75.107,5.),(683.164,95.825,5.),(681.781,-87.316,5.),(683.835,-0.503,5.),(685.328,-21.541,5.),(692.962,-97.994,5.),(689.808,-40.22,5.),(697.275,-56.542,5.),(705.8,-107.143,5.),(707.728,-70.506,5.),(719.926,-114.479,5.),(720.434,-81.693,5.),(734.975,-119.718,5.),(734.66,-89.684,5.),(750.406,-94.478,5.),(750.946,-122.862,5.),(767.671,-96.076,5.),(767.839,-123.91,5.),(785.219,-94.463,5.),(783.579,-122.962,5.),(798.774,-120.117,5.),(801.143,-89.621,5.),(813.425,-115.375,5.),(815.442,-81.552,5.),(827.53,-108.736,5.),(828.117,-70.255,5.),(840.577,-100.253,5.),(838.497,-55.992,5.),(845.911,-39.026,5.),(852.052,-89.977,5.),(850.36,-19.356,5.),(851.843,3.018,5.),(685.391,25.261,5.),(700.79,110.973,5.),(690.059,47.053,5.),(697.84,64.874,5.),(708.734,78.722,5.),(720.806,121.793,5.),(721.786,89.102,5.),(743.212,128.285,5.),(736.044,96.517,5.),(751.506,100.965,5.),(768.006,130.449,5.),(768.174,102.448,5.),(784.606,129.433,5.),(791.292,99.367,5.),(800.367,126.383,5.),(812.02,90.124,5.),(815.29,121.301,5.),(829.207,75.285,5.),(829.374,114.185,5.),(841.698,55.416,5.),(842.228,105.251,5.),(849.307,31.124,5.),(853.456,94.714,5.),(861.955,-77.91,5.),(863.061,82.574,5.),(870.287,-64.051,5.),(871.041,68.83,5.),(876.889,-48.803,5.),(877.313,53.797,5.),(881.604,-32.57,5.),(881.793,37.789,5.),(884.434,-15.353,5.),(884.481,20.807,5.),(885.377,2.85,5.),(0.3,200.,0.),(200.3,0.,0.),(0.3,0.,0.),(200.3,200.,0.),(200.3,0.,100.),(0.3,200.,100.),(0.3,0.,100.),(200.3,200.,100.),(200.3,0.,100.),(0.3,0.,0.),(200.3,0.,0.),(0.3,0.,100.),(0.3,200.,100.),(0.3,0.,0.),(0.3,0.,100.),(0.3,200.,0.),(0.3,200.,100.),(200.3,200.,0.),(0.3,200.,0.),(200.3,200.,100.),(200.3,200.,0.),(200.3,0.,100.),(200.3,0.,0.),(200.3,200.,100.),(-51.846,-658.384,0.),(-61.907,-715.56,0.),(-69.703,-668.716,0.),(-58.532,-701.413,0.),(-48.409,-689.487,0.),(-30.426,-652.096,0.),(-40.659,-684.755,0.),(-30.908,-681.376,0.),(-5.401,-678.672,0.),(-6.742,-650.,0.),(18.975,-652.201,0.),(19.478,-681.648,0.),(41.464,-658.803,0.),(29.323,-685.368,0.),(37.44,-690.577,0.),(43.942,-697.242,0.),(59.929,-669.681,0.),(48.946,-705.332,0.),(54.458,-725.788,0.),(85.645,-723.441,0.),(73.573,-684.708,0.),(82.208,-702.943,0.),(-90.621,-699.736,0.),(-91.103,-733.857,0.),(-93.261,-717.74,0.),(-84.626,-748.34,0.),(-82.698,-682.948,0.),(-73.748,-760.895,0.),(-58.385,-771.227,0.),(-59.517,-727.632,0.),(-52.349,-737.357,0.),(-39.732,-778.668,0.),(-35.393,-746.014,0.),(-10.934,-786.569,0.),(-3.305,-754.879,0.),(32.829,-798.558,0.),(30.125,-763.284,0.),(51.105,-770.557,0.),(46.075,-805.118,0.),(54.961,-813.062,0.),(69.758,-781.77,0.),(59.991,-822.43,0.),(61.668,-833.266,0.),(68.103,-882.981,0.),(81.789,-867.555,0.),(82.795,-795.624,0.),(90.214,-849.635,0.),(90.466,-811.951,0.),(93.023,-830.584,0.),(-71.967,-818.343,0.),(-98.941,-844.396,0.),(-102.651,-821.026,0.),(-89.153,-865.208,0.),(-73.895,-882.29,0.),(-68.341,-835.132,0.),(-53.774,-894.467,0.),(-61.823,-848.608,0.),(-51.658,-859.297,0.),(-28.519,-901.761,0.),(-37.091,-867.723,0.),(-19.276,-873.193,0.),(2.144,-904.192,0.),(0.635,-875.017,0.),(18.157,-873.633,0.),(27.149,-901.782,0.),(33.499,-869.484,0.),(49.512,-894.551,0.),(45.928,-862.923,0.),(54.71,-854.309,0.),(59.929,-844.228,0.),(-98.941,-844.396,5.),(-71.967,-818.343,5.),(-102.651,-821.026,5.),(-89.153,-865.208,5.),(-73.895,-882.29,5.),(-68.341,-835.132,5.),(-53.774,-894.467,5.),(-61.823,-848.608,5.),(-51.658,-859.297,5.),(-28.519,-901.761,5.),(-37.091,-867.723,5.),(-19.276,-873.193,5.),(2.144,-904.192,5.),(0.635,-875.017,5.),(18.157,-873.633,5.),(27.149,-901.782,5.),(33.499,-869.484,5.),(49.512,-894.551,5.),(45.928,-862.923,5.),(54.71,-854.309,5.),(68.103,-882.981,5.),(59.929,-844.228,5.),(61.668,-833.266,5.),(-91.103,-733.857,5.),(-90.621,-699.736,5.),(-93.261,-717.74,5.),(-84.626,-748.34,5.),(-82.698,-682.948,5.),(-73.748,-760.895,5.),(-69.703,-668.716,5.),(-58.385,-771.227,5.),(-61.907,-715.56,5.),(-59.517,-727.632,5.),(-52.349,-737.357,5.),(-39.732,-778.668,5.),(-35.393,-746.014,5.),(-10.934,-786.569,5.),(-3.305,-754.879,5.),(32.829,-798.558,5.),(30.125,-763.284,5.),(51.105,-770.557,5.),(46.075,-805.118,5.),(54.961,-813.062,5.),(69.758,-781.77,5.),(59.991,-822.43,5.),(81.789,-867.555,5.),(82.795,-795.624,5.),(90.214,-849.635,5.),(90.466,-811.951,5.),(93.023,-830.584,5.),(-51.846,-658.384,5.),(-58.532,-701.413,5.),(-48.409,-689.487,5.),(-30.426,-652.096,5.),(-40.659,-684.755,5.),(-30.908,-681.376,5.),(-5.401,-678.672,5.),(-6.742,-650.,5.),(18.975,-652.201,5.),(19.478,-681.648,5.),(41.464,-658.803,5.),(29.323,-685.368,5.),(37.44,-690.577,5.),(43.942,-697.242,5.),(59.929,-669.681,5.),(48.946,-705.332,5.),(54.458,-725.788,5.),(85.645,-723.441,5.),(73.573,-684.708,5.),(82.208,-702.943,5.),(-102.651,-821.026,5.),(-71.967,-818.343,0.),(-102.651,-821.026,0.),(-71.967,-818.343,5.),(-71.967,-818.343,0.),(-68.341,-835.132,5.),(-68.341,-835.132,0.),(-71.967,-818.343,5.),(-68.341,-835.132,0.),(-61.823,-848.608,5.),(-61.823,-848.608,0.),(-68.341,-835.132,5.),(-61.823,-848.608,0.),(-51.658,-859.297,5.),(-51.658,-859.297,0.),(-61.823,-848.608,5.),(-51.658,-859.297,5.),(-37.091,-867.723,0.),(-51.658,-859.297,0.),(-37.091,-867.723,5.),(-37.091,-867.723,5.),(-19.276,-873.193,0.),(-37.091,-867.723,0.),(-19.276,-873.193,5.),(-19.276,-873.193,5.),(0.635,-875.017,0.),(-19.276,-873.193,0.),(0.635,-875.017,5.),(0.635,-875.017,5.),(18.157,-873.633,0.),(0.635,-875.017,0.),(18.157,-873.633,5.),(18.157,-873.633,5.),(33.499,-869.484,0.),(18.157,-873.633,0.),(33.499,-869.484,5.),(33.499,-869.484,5.),(45.928,-862.923,0.),(33.499,-869.484,0.),(45.928,-862.923,5.),(45.928,-862.923,5.),(54.71,-854.309,0.),(45.928,-862.923,0.),(54.71,-854.309,5.),(59.929,-844.228,5.),(54.71,-854.309,0.),(54.71,-854.309,5.),(59.929,-844.228,0.),(61.668,-833.266,5.),(59.929,-844.228,0.),(59.929,-844.228,5.),(61.668,-833.266,0.),(59.991,-822.43,5.),(61.668,-833.266,0.),(61.668,-833.266,5.),(59.991,-822.43,0.),(54.961,-813.062,5.),(59.991,-822.43,0.),(59.991,-822.43,5.),(54.961,-813.062,0.),(54.961,-813.062,5.),(46.075,-805.118,0.),(54.961,-813.062,0.),(46.075,-805.118,5.),(46.075,-805.118,5.),(32.829,-798.558,0.),(46.075,-805.118,0.),(32.829,-798.558,5.),(32.829,-798.558,5.),(-10.934,-786.569,0.),(32.829,-798.558,0.),(-39.732,-778.668,0.),(-39.732,-778.668,5.),(-10.934,-786.569,5.),(-39.732,-778.668,5.),(-58.385,-771.227,0.),(-39.732,-778.668,0.),(-58.385,-771.227,5.),(-58.385,-771.227,5.),(-73.748,-760.895,0.),(-58.385,-771.227,0.),(-73.748,-760.895,5.),(-84.626,-748.34,5.),(-73.748,-760.895,0.),(-73.748,-760.895,5.),(-84.626,-748.34,0.),(-91.103,-733.857,5.),(-84.626,-748.34,0.),(-84.626,-748.34,5.),(-91.103,-733.857,0.),(-93.261,-717.74,5.),(-91.103,-733.857,0.),(-91.103,-733.857,5.),(-93.261,-717.74,0.),(-90.621,-699.736,5.),(-93.261,-717.74,0.),(-93.261,-717.74,5.),(-90.621,-699.736,0.),(-82.698,-682.948,5.),(-90.621,-699.736,0.),(-90.621,-699.736,5.),(-82.698,-682.948,0.),(-69.703,-668.716,5.),(-82.698,-682.948,0.),(-82.698,-682.948,5.),(-69.703,-668.716,0.),(-69.703,-668.716,5.),(-51.846,-658.384,0.),(-69.703,-668.716,0.),(-51.846,-658.384,5.),(-51.846,-658.384,5.),(-30.426,-652.096,0.),(-51.846,-658.384,0.),(-30.426,-652.096,5.),(-30.426,-652.096,5.),(-6.742,-650.,0.),(-30.426,-652.096,0.),(-6.742,-650.,5.),(-6.742,-650.,5.),(18.975,-652.201,0.),(-6.742,-650.,0.),(18.975,-652.201,5.),(18.975,-652.201,5.),(41.464,-658.803,0.),(18.975,-652.201,0.),(41.464,-658.803,5.),(41.464,-658.803,5.),(59.929,-669.681,0.),(41.464,-658.803,0.),(59.929,-669.681,5.),(59.929,-669.681,0.),(73.573,-684.708,5.),(73.573,-684.708,0.),(59.929,-669.681,5.),(73.573,-684.708,0.),(82.208,-702.943,5.),(82.208,-702.943,0.),(73.573,-684.708,5.),(82.208,-702.943,0.),(85.645,-723.441,5.),(85.645,-723.441,0.),(82.208,-702.943,5.),(85.645,-723.441,5.),(54.458,-725.788,0.),(85.645,-723.441,0.),(54.458,-725.788,5.),(48.946,-705.332,5.),(54.458,-725.788,0.),(54.458,-725.788,5.),(48.946,-705.332,0.),(43.942,-697.242,5.),(48.946,-705.332,0.),(48.946,-705.332,5.),(43.942,-697.242,0.),(37.44,-690.577,5.),(43.942,-697.242,0.),(43.942,-697.242,5.),(37.44,-690.577,0.),(37.44,-690.577,5.),(29.323,-685.368,0.),(37.44,-690.577,0.),(29.323,-685.368,5.),(29.323,-685.368,5.),(19.478,-681.648,0.),(29.323,-685.368,0.),(19.478,-681.648,5.),(19.478,-681.648,5.),(-5.401,-678.672,0.),(19.478,-681.648,0.),(-5.401,-678.672,5.),(-5.401,-678.672,5.),(-30.908,-681.376,0.),(-5.401,-678.672,0.),(-30.908,-681.376,5.),(-30.908,-681.376,5.),(-40.659,-684.755,0.),(-30.908,-681.376,0.),(-40.659,-684.755,5.),(-40.659,-684.755,5.),(-48.409,-689.487,0.),(-40.659,-684.755,0.),(-48.409,-689.487,5.),(-48.409,-689.487,0.),(-58.532,-701.413,5.),(-58.532,-701.413,0.),(-48.409,-689.487,5.),(-58.532,-701.413,0.),(-61.907,-715.56,5.),(-61.907,-715.56,0.),(-58.532,-701.413,5.),(-61.907,-715.56,0.),(-59.517,-727.632,5.),(-59.517,-727.632,0.),(-61.907,-715.56,5.),(-59.517,-727.632,0.),(-52.349,-737.357,5.),(-52.349,-737.357,0.),(-59.517,-727.632,5.),(-52.349,-737.357,5.),(-35.393,-746.014,0.),(-52.349,-737.357,0.),(-35.393,-746.014,5.),(-35.393,-746.014,5.),(-3.305,-754.879,0.),(-35.393,-746.014,0.),(-3.305,-754.879,5.),(-3.305,-754.879,5.),(30.125,-763.284,0.),(-3.305,-754.879,0.),(30.125,-763.284,5.),(30.125,-763.284,5.),(51.105,-770.557,0.),(30.125,-763.284,0.),(51.105,-770.557,5.),(51.105,-770.557,5.),(69.758,-781.77,0.),(51.105,-770.557,0.),(69.758,-781.77,5.),(69.758,-781.77,0.),(82.795,-795.624,5.),(82.795,-795.624,0.),(69.758,-781.77,5.),(82.795,-795.624,0.),(90.466,-811.951,5.),(90.466,-811.951,0.),(82.795,-795.624,5.),(90.466,-811.951,0.),(93.023,-830.584,5.),(93.023,-830.584,0.),(90.466,-811.951,5.),(93.023,-830.584,0.),(90.214,-849.635,5.),(90.214,-849.635,0.),(93.023,-830.584,5.),(90.214,-849.635,0.),(81.789,-867.555,5.),(81.789,-867.555,0.),(90.214,-849.635,5.),(81.789,-867.555,0.),(68.103,-882.981,5.),(68.103,-882.981,0.),(81.789,-867.555,5.),(68.103,-882.981,5.),(49.512,-894.551,0.),(68.103,-882.981,0.),(49.512,-894.551,5.),(49.512,-894.551,5.),(27.149,-901.782,0.),(49.512,-894.551,0.),(27.149,-901.782,5.),(27.149,-901.782,5.),(2.144,-904.192,0.),(27.149,-901.782,0.),(2.144,-904.192,5.),(2.144,-904.192,5.),(-28.519,-901.761,0.),(2.144,-904.192,0.),(-28.519,-901.761,5.),(-28.519,-901.761,5.),(-53.774,-894.467,0.),(-28.519,-901.761,0.),(-53.774,-894.467,5.),(-53.774,-894.467,5.),(-73.895,-882.29,0.),(-53.774,-894.467,0.),(-73.895,-882.29,5.),(-89.153,-865.208,5.),(-73.895,-882.29,0.),(-73.895,-882.29,5.),(-89.153,-865.208,0.),(-98.941,-844.396,5.),(-89.153,-865.208,0.),(-89.153,-865.208,5.),(-98.941,-844.396,0.),(-102.651,-821.026,5.),(-98.941,-844.396,0.),(-98.941,-844.396,5.),(-102.651,-821.026,0.))); +#148=IFCSTYLEDITEM(#146,(#151),$); +#149=IFCSURFACESTYLERENDERING(#150,0.,$,$,$,$,$,$,.NOTDEFINED.); +#150=IFCCOLOURRGB($,0.,0.,0.); +#151=IFCSURFACESTYLE('virtual_black',.BOTH.,(#149)); +#152=IFCPRODUCTDEFINITIONSHAPE($,$,(#145)); +ENDSEC; +END-ISO-10303-21; diff --git a/tests/fixtures/bsi_ifc4_building_structural.ifc b/tests/fixtures/bsi_ifc4_building_structural.ifc new file mode 100644 index 0000000..0a0fc46 --- /dev/null +++ b/tests/fixtures/bsi_ifc4_building_structural.ifc @@ -0,0 +1,348 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [ReferenceView_V1.2]'),'2;1'); +FILE_NAME('Building-Structural.ifc','2026-06-23T11:53:44',(''),(''),'Sketchup-IFC-manager 5.6.0 / SketchUp 2026 (26.2.242)','BIM_Tools - Sketchup_IFC_manager - 5.6.0','None'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#1=IFCOWNERHISTORY(#2,#5,$,.ADDED.,1782208424,#2,#5,1782208424); +#2=IFCPERSONANDORGANIZATION(#3,#4,$); +#3=IFCPERSON('3720f2e9-0107-4ce6-b699-e20d9bd03331','Jan B.',$,$,$,$,$,$); +#4=IFCORGANIZATION($,'buildingSMART International','buildingSMART is the worldwide industry body driving the digital transformation of the built environment.',$,$); +#5=IFCAPPLICATION(#6,'5.6.0','IFC manager for sketchup','su_ifcmanager'); +#6=IFCORGANIZATION($,'BIM-Tools',$,$,$); +#7=IFCAXIS2PLACEMENT3D(#8,#9,#10); +#8=IFCCARTESIANPOINT((0.,0.,0.)); +#9=IFCDIRECTION((0.,0.,1.)); +#10=IFCDIRECTION((1.,0.,0.)); +#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.001,#7,$); +#12=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#11,$,.MODEL_VIEW.,$); +#13=IFCPROJECT('2Ndyd$OSX7s9A04nc4lyye',#1,'ifc silly sample scene - project','Demystifying IFC with a playful scene using diverse building elements and compositions.',$,$,$,(#11),#14); +#14=IFCUNITASSIGNMENT((#15,#16,#17)); +#15=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#16=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#17=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); +#18=IFCPROJECTEDCRS('EPSG:32760','EPSG:32760 - WGS 84 / UTM zone 60S','WGS 84',$,$,$,#19); +#19=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.); +#20=IFCMAPCONVERSION(#11,#18,729013.3488297004,9063992.684697364,1.3000000000000018,0.4999999999999999,0.8660254037844387,0.001); +#21=IFCSITE('23sFQGRy90RxVbRHD9iSE2',#1,'environment - site','A sample scene environment, showcasing the surrounding landscape.',$,#23,$,$,.COMPLEX.,$,$,0.,$,$); +#22=IFCRELAGGREGATES('2CQv4GL4b7CAJ85_K3JELu',#1,'ifc silly sample scene - project container',$,#13,(#21)); +#23=IFCLOCALPLACEMENT($,#24); +#24=IFCAXIS2PLACEMENT3D(#25,#26,#27); +#25=IFCCARTESIANPOINT((-28841.016,-14200.,-1300.)); +#26=IFCDIRECTION((0.,0.,1.)); +#27=IFCDIRECTION((0.4999999999999999,-0.8660254037844387,0.)); +#28=IFCSITE('1Pbuu0tu59NfhrTsztVBK1',#1,'house - site','Smoke curls from a friendly chimney, promising warmth within this idyllic hilltop house.',$,#30,$,$,.PARTIAL.,$,$,0.,$,$); +#29=IFCRELAGGREGATES('1dTrjE0av2oPdgHCxN2ciG',#1,'environment - site container',$,#21,(#28)); +#30=IFCLOCALPLACEMENT(#23,#31); +#31=IFCAXIS2PLACEMENT3D(#32,#33,#34); +#32=IFCCARTESIANPOINT((0.,40000.,0.)); +#33=IFCDIRECTION((0.,0.,1.)); +#34=IFCDIRECTION((0.4999999999999999,0.8660254037844387,0.)); +#35=IFCBUILDING('0c$N1CTon2BB2Sp89385G8',#1,'Single-family house','The main building structure, providing shelter and space.','house',#40,$,'house - building',.ELEMENT.,$,$,$); +#36=IFCCLASSIFICATION('Molio','1.0','2023-01-23','CCI Construction',$,'https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0',$); +#37=IFCCLASSIFICATIONREFERENCE('https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0/class/E-AAA','E-AAA','Single-family house',#36,$,$); +#38=IFCRELASSOCIATESCLASSIFICATION('0KUjZ7xmPCDwkLM2vZpxtC',#1,'CCI Construction Classification',$,(#35),#37); +#39=IFCRELAGGREGATES('3m9zah5Cj4L9ySOtCdH2$U',#1,'house - site container',$,#28,(#35)); +#40=IFCLOCALPLACEMENT(#30,#41); +#41=IFCAXIS2PLACEMENT3D(#42,#43,#44); +#42=IFCCARTESIANPOINT((-2800.,-2800.,1300.)); +#43=IFCDIRECTION((0.,0.,1.)); +#44=IFCDIRECTION((1.,0.,0.)); +#45=IFCBUILDINGSTOREY('1Ano2ZUxnEIvVQ_beukl8b',#1,'00 groundfloor','The ground floor, forming the base level of the building.','buildingstorey',#47,$,$,.ELEMENT.,0.); +#46=IFCRELAGGREGATES('1d5Yu$YKL4kwFRaH2hYkmD',#1,'Single-family house container',$,#35,(#45)); +#47=IFCLOCALPLACEMENT(#40,#7); +#48=IFCFOOTINGTYPE('39zsrh6sTE69jN0aDa_2y3',#1,'house - foundation','A house strip footing, ensuring stability and support.',$,$,$,'884636','strip_footing',.STRIP_FOOTING.); +#49=IFCRELDEFINESBYTYPE('2Ca0YqD5bBUxjYPcKrr8dB',#1,$,$,(#50),#48); +#50=IFCFOOTING('0pFmhV8oD1dB40_b4pscr8',#1,'house - foundation','A house strip footing, ensuring stability and support.','strip_footing',#54,#66,'454425.1027891.979946.932083.920028',$); +#51=IFCRELASSOCIATESMATERIAL('0oKrXjQf58gwTDmoHg_xVx',#1,$,$,(#50),#52); +#52=IFCMATERIAL('concrete_reinforced_in-situ',$,$); +#53=IFCRELCONTAINEDINSPATIALSTRUCTURE('1ReYcPVFLE5AgeE5A8QZSF',#1,$,$,(#50,#69,#93,#112,#131,#147),#45); +#54=IFCLOCALPLACEMENT(#47,#55); +#55=IFCAXIS2PLACEMENT3D(#56,#57,#58); +#56=IFCCARTESIANPOINT((0.,0.,-500.)); +#57=IFCDIRECTION((0.,0.,1.)); +#58=IFCDIRECTION((1.,0.,0.)); +#59=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#60)); +#60=IFCTRIANGULATEDFACESET(#61,((-1.46491765327155E-18,-1.,5.0132737467518135E-17),(-1.46491765327155E-18,-1.,5.0132737467518135E-17),(-1.46491765327155E-18,-1.,5.0132737467518135E-17),(-1.46491765327155E-18,-1.,5.0132737467518135E-17),(6.273704223900299E-15,1.,1.203185699219874E-16),(6.273704223900299E-15,1.,1.203185699219874E-16),(6.273704223900299E-15,1.,1.203185699219874E-16),(6.273704223900299E-15,1.,1.203185699219874E-16),(1.,-1.925097118752768E-14,-3.224219057469083E-30),(1.,-1.925097118752768E-14,-3.224219057469083E-30),(1.,-1.925097118752768E-14,-3.224219057469083E-30),(1.,-1.925097118752768E-14,-3.224219057469083E-30),(-1.0828671292983906E-14,-1.,9.565299016287626E-30),(-1.0828671292983906E-14,-1.,9.565299016287626E-30),(-1.0828671292983906E-14,-1.,9.565299016287626E-30),(-1.0828671292983906E-14,-1.,9.565299016287626E-30),(2.0085356046416778E-16,1.,8.447344007909837E-30),(2.0085356046416778E-16,1.,8.447344007909837E-30),(2.0085356046416778E-16,1.,8.447344007909837E-30),(2.0085356046416778E-16,1.,8.447344007909837E-30),(1.,6.93550613764915E-15,8.768674695539108E-31),(1.,6.93550613764915E-15,8.768674695539108E-31),(1.,6.93550613764915E-15,8.768674695539108E-31),(1.,6.93550613764915E-15,8.768674695539108E-31),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(1.,-2.159564075523967E-15,-1.59357953415006E-30),(1.,-2.159564075523967E-15,-1.59357953415006E-30),(1.,-2.159564075523967E-15,-1.59357953415006E-30),(1.,-2.159564075523967E-15,-1.59357953415006E-30),(2.2581771231866958E-14,-1.,3.7345825983413234E-14),(2.2581771231866958E-14,-1.,3.7345825983413234E-14),(2.2581771231866958E-14,-1.,3.7345825983413234E-14),(2.2581771231866958E-14,-1.,3.7345825983413234E-14),(-1.,-2.2298598362803405E-16,3.007964247999072E-17),(-1.,-2.2298598362803405E-16,3.007964247999072E-17),(-1.,-2.2298598362803405E-16,3.007964247999072E-17),(-1.,-2.2298598362803405E-16,3.007964247999072E-17),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(6.356640738391217E-18,-2.142368366667172E-17,-1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(5.486730273252906E-18,3.135196050775392E-17,1.),(4.898136526411117E-15,-1.,1.5526841401514399E-16),(4.898136526411117E-15,-1.,1.5526841401514399E-16),(4.898136526411117E-15,-1.,1.5526841401514399E-16),(4.898136526411117E-15,-1.,1.5526841401514399E-16),(1.5250536565293434E-16,1.,5.0132737467518166E-17),(1.5250536565293434E-16,1.,5.0132737467518166E-17),(1.5250536565293434E-16,1.,5.0132737467518166E-17),(1.5250536565293434E-16,1.,5.0132737467518166E-17),(1.,-8.570965950653055E-16,1.8299061265187592E-31),(1.,-8.570965950653055E-16,1.8299061265187592E-31),(1.,-8.570965950653055E-16,1.8299061265187592E-31),(1.,-8.570965950653055E-16,1.8299061265187592E-31),(-1.,4.607945231056927E-16,1.443822839064524E-15),(-1.,4.607945231056927E-16,1.443822839064524E-15),(-1.,4.607945231056927E-16,1.443822839064524E-15),(-1.,4.607945231056927E-16,1.443822839064524E-15),(-1.,6.742225102692942E-16,1.9250971187526995E-15),(-1.,6.742225102692942E-16,1.9250971187526995E-15),(-1.,6.742225102692942E-16,1.9250971187526995E-15),(-1.,6.742225102692942E-16,1.9250971187526995E-15),(-4.0106189974014464E-16,-1.,1.1581246614468541E-30),(-4.0106189974014464E-16,-1.,1.1581246614468541E-30),(-4.0106189974014464E-16,-1.,1.1581246614468541E-30),(-4.0106189974014464E-16,-1.,1.1581246614468541E-30)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24),(25,26,27),(26,25,28),(29,30,31),(30,29,32),(33,34,35),(34,33,36),(37,38,39),(38,37,40),(41,42,43),(42,41,44),(43,42,45),(42,44,46),(46,44,47),(47,44,48),(48,44,49),(49,44,50),(42,51,45),(51,42,52),(51,52,49),(51,49,53),(53,49,54),(53,54,55),(55,54,56),(54,49,50),(45,56,43),(56,45,55),(57,58,59),(58,57,60),(60,57,61),(62,63,64),(65,66,58),(66,65,67),(67,65,61),(67,61,68),(68,61,69),(69,61,57),(68,69,70),(68,70,62),(71,66,72),(66,71,59),(66,59,58),(72,66,63),(72,63,62),(72,62,70),(73,74,75),(74,73,76),(77,78,79),(78,77,80),(81,82,83),(82,81,84),(85,86,87),(86,85,88),(89,90,91),(90,89,92),(93,94,95),(94,93,96)),$); +#61=IFCCARTESIANPOINTLIST3D(((4300.,-100.,250.),(-100.,-100.,-50.),(4300.,-100.,-50.),(-100.,-100.,250.),(350.,350.,-50.),(3850.,350.,250.),(3850.,350.,-50.),(350.,350.,250.),(350.,1700.,-50.),(350.,350.,250.),(350.,350.,-50.),(350.,1700.,250.),(3850.,1700.,-50.),(350.,1700.,250.),(350.,1700.,-50.),(3850.,1700.,250.),(350.,2150.,250.),(5250.,2150.,-50.),(350.,2150.,-50.),(5250.,2150.,250.),(350.,5650.,-50.),(350.,2150.,250.),(350.,2150.,-50.),(350.,5650.,250.),(3850.,1700.,250.),(3850.,350.,-50.),(3850.,350.,250.),(3850.,1700.,-50.),(4300.,1700.,-50.),(4300.,-100.,250.),(4300.,-100.,-50.),(4300.,1700.,250.),(5700.,1700.,250.),(4300.,1700.,-50.),(5700.,1700.,-50.),(4300.,1700.,250.),(-100.,6100.,250.),(-100.,-100.,-50.),(-100.,-100.,250.),(-100.,6100.,-50.),(-100.,6100.,-50.),(350.,5650.,-50.),(-100.,-100.,-50.),(5700.,6100.,-50.),(350.,350.,-50.),(4600.,5650.,-50.),(4600.,4500.,-50.),(5250.,4500.,-50.),(5250.,2150.,-50.),(5700.,1700.,-50.),(350.,1700.,-50.),(350.,2150.,-50.),(3850.,1700.,-50.),(4300.,1700.,-50.),(3850.,350.,-50.),(4300.,-100.,-50.),(4300.,-100.,250.),(350.,350.,250.),(-100.,-100.,250.),(3850.,350.,250.),(3850.,1700.,250.),(5250.,4500.,250.),(4600.,5650.,250.),(4600.,4500.,250.),(350.,1700.,250.),(350.,5650.,250.),(350.,2150.,250.),(5250.,2150.,250.),(4300.,1700.,250.),(5700.,1700.,250.),(-100.,6100.,250.),(5700.,6100.,250.),(4600.,5650.,-50.),(350.,5650.,250.),(350.,5650.,-50.),(4600.,5650.,250.),(-100.,6100.,250.),(5700.,6100.,-50.),(-100.,6100.,-50.),(5700.,6100.,250.),(5700.,6100.,-50.),(5700.,1700.,250.),(5700.,1700.,-50.),(5700.,6100.,250.),(5250.,4500.,250.),(5250.,2150.,-50.),(5250.,2150.,250.),(5250.,4500.,-50.),(4600.,5650.,250.),(4600.,4500.,-50.),(4600.,4500.,250.),(4600.,5650.,-50.),(5250.,4500.,250.),(4600.,4500.,-50.),(5250.,4500.,-50.),(4600.,4500.,250.))); +#62=IFCSTYLEDITEM(#60,(#65),$); +#63=IFCSURFACESTYLERENDERING(#64,0.,$,$,$,$,$,$,.NOTDEFINED.); +#64=IFCCOLOURRGB($,0.5764705882352941,0.5764705882352941,0.5764705882352941); +#65=IFCSURFACESTYLE('concrete_reinforced_in-situ',.BOTH.,(#63)); +#66=IFCPRODUCTDEFINITIONSHAPE($,$,(#59)); +#67=IFCWALLTYPE('0_8SeeJGr948J4bU1RPXce',#1,'house - outer wall - house back','A solid outer wall, forming the back of the house.',$,$,$,'919510','solidwall',.SOLIDWALL.); +#68=IFCRELDEFINESBYTYPE('1Dq$Dv2C19kvvXmEBQkP5l',#1,$,$,(#69),#67); +#69=IFCWALL('0DyViLJJ175RvWQi1rE7a6',#1,'house - outer wall - house back','A solid outer wall, forming the back of the house.','solidwall',#78,#90,'454425.1027891.979946.932083.920030',$); +#70=IFCRELASSOCIATESMATERIAL('0sAYN8OJzFKu1rNoJBdSki',#1,$,$,(#69,#93,#112,#131,#147),#71); +#71=IFCMATERIAL('stone_sand-lime',$,$); +#72=IFCQUANTITYVOLUME('NetVolume',$,$,4.286515368539449,$); +#73=IFCQUANTITYLENGTH('Width',$,$,200.,$); +#74=IFCQUANTITYLENGTH('Length',$,$,5200.,$); +#75=IFCQUANTITYAREA('NetSideArea',$,$,21.432576842688732,$); +#76=IFCELEMENTQUANTITY('3hkprKd8L4Kgi5Lbl29P_N',#1,'Qto_WallBaseQuantities',$,'BaseQuantities',(#72,#73,#74,#75)); +#77=IFCRELDEFINESBYPROPERTIES('1oV94qe_X5PwtMoo0RgYnY',#1,$,$,(#69),#76); +#78=IFCLOCALPLACEMENT(#47,#79); +#79=IFCAXIS2PLACEMENT3D(#80,#81,#82); +#80=IFCCARTESIANPOINT((200.,5900.,0.)); +#81=IFCDIRECTION((0.,0.,1.)); +#82=IFCDIRECTION((1.,0.,0.)); +#83=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#84)); +#84=IFCTRIANGULATEDFACESET(#85,((4.9811294426698665E-15,1.,1.1730609307457722E-14),(4.9811294426698665E-15,1.,1.1730609307457722E-14),(4.9811294426698665E-15,1.,1.1730609307457722E-14),(4.9811294426698665E-15,1.,1.1730609307457722E-14),(4.9811294426698665E-15,1.,1.1730609307457722E-14),(-1.,-3.788930638371891E-14,-4.025217430232042E-15),(-1.,-3.788930638371891E-14,-4.025217430232042E-15),(-1.,-3.788930638371891E-14,-4.025217430232042E-15),(-1.,-3.788930638371891E-14,-4.025217430232042E-15),(1.,-2.6040631536465974E-13,-3.111357568595145E-14),(1.,-2.6040631536465974E-13,-3.111357568595145E-14),(1.,-2.6040631536465974E-13,-3.111357568595145E-14),(1.,-2.6040631536465974E-13,-3.111357568595145E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(-1.705971520025655E-15,-1.,-1.3039587602823116E-14),(1.755639795722081E-14,-1.,4.083747681338051E-14),(1.755639795722081E-14,-1.,4.083747681338051E-14),(1.755639795722081E-14,-1.,4.083747681338051E-14),(1.755639795722081E-14,-1.,4.083747681338051E-14),(-2.4465543524841362E-14,-1.,-2.679959415877872E-14),(-2.4465543524841362E-14,-1.,-2.679959415877872E-14),(-2.4465543524841362E-14,-1.,-2.679959415877872E-14),(-2.4465543524841362E-14,-1.,-2.679959415877872E-14),(-2.4465543524841362E-14,-1.,-2.6799594158773663E-14),(-2.4465543524841362E-14,-1.,-2.6799594158773663E-14),(-2.4465543524841362E-14,-1.,-2.6799594158773663E-14),(-2.4465543524841362E-14,-1.,-2.6799594158773663E-14),(1.3781639673495278E-14,-1.,-3.9561305662955703E-14),(1.3781639673495278E-14,-1.,-3.9561305662955703E-14),(1.3781639673495278E-14,-1.,-3.9561305662955703E-14),(1.3781639673495278E-14,-1.,-3.9561305662955703E-14),(-0.707106781186619,1.3390512319648198E-17,0.7071067811864763),(-0.707106781186619,1.3390512319648198E-17,0.7071067811864763),(-0.707106781186619,1.3390512319648198E-17,0.7071067811864763),(-0.707106781186619,1.3390512319648198E-17,0.7071067811864763),(0.7071067811865721,-6.629412403154337E-14,-0.7071067811865229),(0.7071067811865721,-6.629412403154337E-14,-0.7071067811865229),(0.7071067811865721,-6.629412403154337E-14,-0.7071067811865229),(0.7071067811865721,-6.629412403154337E-14,-0.7071067811865229),(-1.,1.487416814333745E-17,-4.078105374761528E-15),(-1.,1.487416814333745E-17,-4.078105374761528E-15),(-1.,1.487416814333745E-17,-4.078105374761528E-15),(-1.,1.487416814333745E-17,-4.078105374761528E-15),(0.7071067811865587,1.3432091943849734E-15,0.7071067811865365),(0.7071067811865587,1.3432091943849734E-15,0.7071067811865365),(0.7071067811865587,1.3432091943849734E-15,0.7071067811865365),(0.7071067811865587,1.3432091943849734E-15,0.7071067811865365),(0.7071067811865704,-3.058010723403225E-14,-0.7071067811865248),(0.7071067811865704,-3.058010723403225E-14,-0.7071067811865248),(0.7071067811865704,-3.058010723403225E-14,-0.7071067811865248),(0.7071067811865704,-3.058010723403225E-14,-0.7071067811865248),(1.,-1.487416814333745E-17,1.3101998118915924E-14),(1.,-1.487416814333745E-17,1.3101998118915924E-14),(1.,-1.487416814333745E-17,1.3101998118915924E-14),(1.,-1.487416814333745E-17,1.3101998118915924E-14),(0.7071067811865513,-1.276250399837179E-13,-0.7071067811865437),(0.7071067811865513,-1.276250399837179E-13,-0.7071067811865437),(0.7071067811865513,-1.276250399837179E-13,-0.7071067811865437),(0.7071067811865513,-1.276250399837179E-13,-0.7071067811865437),(-0.707106781186549,2.6792114994504473E-14,0.707106781186546),(-0.707106781186549,2.6792114994504473E-14,0.707106781186546),(-0.707106781186549,2.6792114994504473E-14,0.707106781186546),(-0.707106781186549,2.6792114994504473E-14,0.707106781186546),(-0.7071067811865493,9.958960163943525E-14,0.7071067811865457),(-0.7071067811865493,9.958960163943525E-14,0.7071067811865457),(-0.7071067811865493,9.958960163943525E-14,0.7071067811865457),(-0.7071067811865493,9.958960163943525E-14,0.7071067811865457),(-4.07810537476144E-15,6.497202775792069E-14,1.),(-4.07810537476144E-15,6.497202775792069E-14,1.),(-4.07810537476144E-15,6.497202775792069E-14,1.),(-4.07810537476144E-15,6.497202775792069E-14,1.),(0.7071067811865519,-3.341504802643175E-15,0.7071067811865432),(0.7071067811865519,-3.341504802643175E-15,0.7071067811865432),(0.7071067811865519,-3.341504802643175E-15,0.7071067811865432),(0.7071067811865519,-3.341504802643175E-15,0.7071067811865432),(-0.7071067811865523,1.2257118890087393E-15,-0.7071067811865428),(-0.7071067811865523,1.2257118890087393E-15,-0.7071067811865428),(-0.7071067811865523,1.2257118890087393E-15,-0.7071067811865428),(-0.7071067811865523,1.2257118890087393E-15,-0.7071067811865428),(0.7071067811865457,2.607957648797087E-14,0.7071067811865495),(0.7071067811865457,2.607957648797087E-14,0.7071067811865495),(0.7071067811865457,2.607957648797087E-14,0.7071067811865495),(0.7071067811865457,2.607957648797087E-14,0.7071067811865495),(-0.7071067811865144,2.8075565123731614E-14,0.7071067811865807),(-0.7071067811865144,2.8075565123731614E-14,0.7071067811865807),(-0.7071067811865144,2.8075565123731614E-14,0.7071067811865807),(-0.7071067811865144,2.8075565123731614E-14,0.7071067811865807),(0.7071067811865266,1.6974679768819556E-14,0.7071067811865686),(0.7071067811865266,1.6974679768819556E-14,0.7071067811865686),(0.7071067811865266,1.6974679768819556E-14,0.7071067811865686),(0.7071067811865266,1.6974679768819556E-14,0.7071067811865686),(2.2353202173936503E-15,-1.,-3.5469636219794095E-15),(2.2353202173936503E-15,-1.,-3.5469636219794095E-15),(2.2353202173936503E-15,-1.,-3.5469636219794095E-15),(2.2353202173936503E-15,-1.,-3.5469636219794095E-15),(2.2353202173936503E-15,-1.,-3.5469636219794095E-15),(-0.7071067811865488,-6.717931797737223E-15,0.7071067811865462),(-0.7071067811865488,-6.717931797737223E-15,0.7071067811865462),(-0.7071067811865488,-6.717931797737223E-15,0.7071067811865462),(-0.7071067811865488,-6.717931797737223E-15,0.7071067811865462),(-0.7071067811865488,-6.717931797737223E-15,0.7071067811865462),(-0.7071067811865488,-6.717931797737223E-15,0.7071067811865462),(-0.7071067811865488,-6.717931797737223E-15,0.7071067811865462),(-0.7071067811865488,-6.717931797737223E-15,0.7071067811865462),(-0.7071067811865488,-6.717931797737223E-15,0.7071067811865462),(-0.7071067811865488,-6.717931797737223E-15,0.7071067811865462),(8.633435846569322E-16,-2.22213358824778E-14,-1.),(8.633435846569322E-16,-2.22213358824778E-14,-1.),(8.633435846569322E-16,-2.22213358824778E-14,-1.),(8.633435846569322E-16,-2.22213358824778E-14,-1.),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578),(0.7071067811865375,-1.3442768272883055E-13,0.7071067811865578)),$,((1,2,3),(2,1,4),(4,1,5),(6,7,8),(7,6,9),(10,11,12),(11,10,13),(14,15,16),(17,18,19),(20,21,22),(21,20,16),(21,16,15),(21,15,23),(21,23,19),(21,19,18),(21,18,24),(21,24,25),(21,25,26),(21,26,27),(25,28,26),(28,25,29),(30,31,32),(28,33,26),(33,28,34),(33,34,35),(35,34,32),(35,32,36),(35,36,37),(36,32,31),(38,39,40),(39,38,41),(42,43,44),(43,42,45),(46,47,48),(47,46,49),(50,51,52),(51,50,53),(54,55,56),(55,54,57),(58,59,60),(59,58,61),(62,63,64),(63,62,65),(66,67,68),(67,66,69),(70,71,72),(71,70,73),(74,75,76),(75,74,77),(78,79,80),(79,78,81),(82,83,84),(83,82,85),(86,87,88),(87,86,89),(90,91,92),(91,90,93),(94,95,96),(95,94,97),(98,99,100),(99,98,101),(102,103,104),(103,102,105),(106,107,108),(107,106,109),(110,111,112),(111,110,113),(114,115,116),(115,114,117),(117,114,118),(119,120,121),(120,119,122),(122,119,123),(122,123,124),(125,126,127),(126,125,128),(128,125,122),(128,122,124),(129,130,131),(130,129,132),(133,134,135),(136,137,138),(139,140,141),(142,143,144),(145,146,147),(146,145,134),(146,134,148),(148,134,133),(146,148,137),(146,137,149),(149,137,136),(146,149,140),(146,140,150),(150,140,139),(146,150,143),(146,143,142)),$); +#85=IFCCARTESIANPOINTLIST3D(((0.,100.,3375.736),(5200.,100.,-250.),(0.,100.,-250.),(5200.,100.,1975.736),(1900.,100.,5275.736),(0.,100.,3375.736),(0.,-100.,-250.),(0.,-100.,3375.736),(0.,100.,-250.),(5200.,-100.,-250.),(5200.,100.,1975.736),(5200.,-100.,1975.736),(5200.,100.,-250.),(4760.355,-100.,2415.381),(4618.934,-100.,2273.959),(5200.,-100.,1975.736),(3835.355,-100.,3340.381),(3693.934,-100.,3198.959),(4689.645,-100.,2486.091),(5200.,-100.,-250.),(0.,-100.,3375.736),(0.,-100.,-250.),(4548.223,-100.,2344.67),(3623.223,-100.,3269.67),(3764.645,-100.,3411.091),(1031.066,-100.,4123.959),(889.645,-100.,4265.381),(2768.934,-100.,4123.959),(2910.355,-100.,4265.381),(1950.,-100.,5225.736),(1950.,-100.,5025.736),(2839.645,-100.,4336.091),(1101.777,-100.,4194.67),(2698.223,-100.,4194.67),(960.355,-100.,4336.091),(1850.,-100.,5025.736),(1850.,-100.,5225.736),(1101.777,0.,4194.67),(889.645,0.,4265.381),(1031.066,0.,4123.959),(960.355,0.,4336.091),(2910.355,0.,4265.381),(2698.223,0.,4194.67),(2768.934,0.,4123.959),(2839.645,0.,4336.091),(3835.355,0.,3340.381),(3623.223,0.,3269.67),(3693.934,0.,3198.959),(3764.645,0.,3411.091),(4760.355,0.,2415.381),(4548.223,0.,2344.67),(4618.934,0.,2273.959),(4689.645,0.,2486.091),(4760.355,-100.,2415.381),(4618.934,0.,2273.959),(4618.934,-100.,2273.959),(4760.355,0.,2415.381),(3623.223,0.,3269.67),(3764.645,-100.,3411.091),(3623.223,-100.,3269.67),(3764.645,0.,3411.091),(1950.,0.,5225.736),(1950.,-100.,5025.736),(1950.,-100.,5225.736),(1950.,0.,5025.736),(1031.066,-100.,4123.959),(889.645,0.,4265.381),(889.645,-100.,4265.381),(1031.066,0.,4123.959),(4548.223,0.,2344.67),(4689.645,-100.,2486.091),(4548.223,-100.,2344.67),(4689.645,0.,2486.091),(1850.,-100.,5025.736),(1850.,0.,5225.736),(1850.,-100.,5225.736),(1850.,0.,5025.736),(2698.223,-100.,4194.67),(2839.645,0.,4336.091),(2839.645,-100.,4336.091),(2698.223,0.,4194.67),(2910.355,0.,4265.381),(2768.934,-100.,4123.959),(2910.355,-100.,4265.381),(2768.934,0.,4123.959),(3835.355,-100.,3340.381),(3693.934,0.,3198.959),(3693.934,-100.,3198.959),(3835.355,0.,3340.381),(1950.,-100.,5025.736),(1850.,0.,5025.736),(1850.,-100.,5025.736),(1950.,0.,5025.736),(3693.934,0.,3198.959),(3623.223,-100.,3269.67),(3693.934,-100.,3198.959),(3623.223,0.,3269.67),(960.355,-100.,4336.091),(1101.777,0.,4194.67),(1101.777,-100.,4194.67),(960.355,0.,4336.091),(2768.934,-100.,4123.959),(2698.223,0.,4194.67),(2698.223,-100.,4194.67),(2768.934,0.,4123.959),(1031.066,-100.,4123.959),(1101.777,0.,4194.67),(1031.066,0.,4123.959),(1101.777,-100.,4194.67),(4548.223,-100.,2344.67),(4618.934,0.,2273.959),(4548.223,0.,2344.67),(4618.934,-100.,2273.959),(1950.,0.,5225.736),(1850.,0.,5025.736),(1950.,0.,5025.736),(1850.,0.,5225.736),(1900.,0.,5275.736),(1850.,0.,5225.736),(960.355,-100.,4336.091),(1850.,-100.,5225.736),(960.355,0.,4336.091),(1900.,0.,5275.736),(1900.,100.,5275.736),(889.645,0.,4265.381),(0.,-100.,3375.736),(889.645,-100.,4265.381),(0.,100.,3375.736),(5200.,100.,-250.),(0.,-100.,-250.),(0.,100.,-250.),(5200.,-100.,-250.),(2839.645,-100.,4336.091),(1950.,0.,5225.736),(1950.,-100.,5225.736),(3764.645,-100.,3411.091),(2910.355,0.,4265.381),(2910.355,-100.,4265.381),(4689.645,-100.,2486.091),(3835.355,0.,3340.381),(3835.355,-100.,3340.381),(5200.,-100.,1975.736),(4760.355,0.,2415.381),(4760.355,-100.,2415.381),(1900.,0.,5275.736),(5200.,100.,1975.736),(1900.,100.,5275.736),(2839.645,0.,4336.091),(3764.645,0.,3411.091),(4689.645,0.,2486.091))); +#86=IFCSTYLEDITEM(#84,(#89),$); +#87=IFCSURFACESTYLERENDERING(#88,0.,$,$,$,$,$,$,.NOTDEFINED.); +#88=IFCCOLOURRGB($,1.,1.,1.); +#89=IFCSURFACESTYLE('stone_sand-lime',.BOTH.,(#87)); +#90=IFCPRODUCTDEFINITIONSHAPE($,$,(#83)); +#91=IFCWALLTYPE('0KOC4PbVP4CgUUcPIljzX8',#1,'house - outer wall - house front','A solid outer wall, forming the front of the house.',$,$,$,'919267','solidwall',.SOLIDWALL.); +#92=IFCRELDEFINESBYTYPE('2j$nW3pT9Fewa4SjRDvSsa',#1,$,$,(#93),#91); +#93=IFCWALL('3SGBcf7Lv0r80vKtUCgOpf',#1,'house - outer wall - house front','A solid outer wall, forming the front of the house.','solidwall',#100,#109,'454425.1027891.979946.932083.920035',$); +#94=IFCQUANTITYVOLUME('NetVolume',$,$,2.9313093077792756,$); +#95=IFCQUANTITYLENGTH('Width',$,$,200.,$); +#96=IFCQUANTITYLENGTH('Length',$,$,3800.,$); +#97=IFCQUANTITYAREA('NetSideArea',$,$,14.656546538889096,$); +#98=IFCELEMENTQUANTITY('16ypQdqOfFPRN_JffpLWds',#1,'Qto_WallBaseQuantities',$,'BaseQuantities',(#94,#95,#96,#97)); +#99=IFCRELDEFINESBYPROPERTIES('1nAyJKS612oQ79hEiQiVgg',#1,$,$,(#93),#98); +#100=IFCLOCALPLACEMENT(#47,#101); +#101=IFCAXIS2PLACEMENT3D(#102,#103,#104); +#102=IFCCARTESIANPOINT((0.,0.,0.)); +#103=IFCDIRECTION((0.,0.,1.)); +#104=IFCDIRECTION((1.,-7.168623403958414E-16,0.)); +#105=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#106)); +#106=IFCTRIANGULATEDFACESET(#107,((0.,1.1550582712516207E-14,1.),(0.,1.1550582712516207E-14,1.),(0.,1.1550582712516207E-14,1.),(0.,1.1550582712516207E-14,1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-1.8932661725304286E-30,0.),(1.,-1.8932661725304286E-30,0.),(1.,-1.8932661725304286E-30,0.),(1.,-1.8932661725304286E-30,0.),(-1.,1.8932661725304286E-30,0.),(-1.,1.8932661725304286E-30,0.),(-1.,1.8932661725304286E-30,0.),(-1.,1.8932661725304286E-30,0.),(2.6683192199736136E-28,-1.1550582712516207E-14,-1.),(2.6683192199736136E-28,-1.1550582712516207E-14,-1.),(2.6683192199736136E-28,-1.1550582712516207E-14,-1.),(2.6683192199736136E-28,-1.1550582712516207E-14,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,1.1550582712516422E-14,0.),(1.,1.1550582712516422E-14,0.),(1.,1.1550582712516422E-14,0.),(1.,1.1550582712516422E-14,0.),(-1.,-1.1550582712516422E-14,2.6683192199736127E-28),(-1.,-1.1550582712516422E-14,2.6683192199736127E-28),(-1.,-1.1550582712516422E-14,2.6683192199736127E-28),(-1.,-1.1550582712516422E-14,2.6683192199736127E-28),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(3.933735155787816E-16,1.,1.3194156759284187E-14),(-0.7071067811865455,4.61702870412606E-14,0.7071067811865497),(-0.7071067811865455,4.61702870412606E-14,0.7071067811865497),(-0.7071067811865455,4.61702870412606E-14,0.7071067811865497),(-0.7071067811865455,4.61702870412606E-14,0.7071067811865497),(-0.7071067811865455,4.61702870412606E-14,0.7071067811865497),(-0.7071067811865455,4.61702870412606E-14,0.7071067811865497),(-0.7071067811865455,4.61702870412606E-14,0.7071067811865497),(-0.7071067811865455,4.61702870412606E-14,0.7071067811865497),(-0.7071067811865455,4.61702870412606E-14,0.7071067811865497),(-0.7071067811865455,4.61702870412606E-14,0.7071067811865497),(-1.276171150417997E-15,1.,1.2761711504181268E-15),(-1.276171150417997E-15,1.,1.2761711504181268E-15),(-1.276171150417997E-15,1.,1.2761711504181268E-15),(-1.276171150417997E-15,1.,1.2761711504181268E-15),(1.2761711504180312E-15,1.,1.2761711504180075E-15),(1.2761711504180312E-15,1.,1.2761711504180075E-15),(1.2761711504180312E-15,1.,1.2761711504180075E-15),(1.2761711504180312E-15,1.,1.2761711504180075E-15),(-1.,9.023892744154552E-15,2.4364510409213664E-14),(-1.,9.023892744154552E-15,2.4364510409213664E-14),(-1.,9.023892744154552E-15,2.4364510409213664E-14),(-1.,9.023892744154552E-15,2.4364510409213664E-14),(0.707106781186557,-2.6823203325055444E-14,0.7071067811865381),(0.707106781186557,-2.6823203325055444E-14,0.7071067811865381),(0.707106781186557,-2.6823203325055444E-14,0.7071067811865381),(0.707106781186557,-2.6823203325055444E-14,0.7071067811865381),(1.,1.4799184100408844E-13,-6.497202775791329E-14),(1.,1.4799184100408844E-13,-6.497202775791329E-14),(1.,1.4799184100408844E-13,-6.497202775791329E-14),(1.,1.4799184100408844E-13,-6.497202775791329E-14),(-0.7071067811865521,2.5526613436237096E-15,-0.7071067811865429),(-0.7071067811865521,2.5526613436237096E-15,-0.7071067811865429),(-0.7071067811865521,2.5526613436237096E-15,-0.7071067811865429),(-0.7071067811865521,2.5526613436237096E-15,-0.7071067811865429),(0.7071067811865704,6.256046213579085E-14,-0.7071067811865246),(0.7071067811865704,6.256046213579085E-14,-0.7071067811865246),(0.7071067811865704,6.256046213579085E-14,-0.7071067811865246),(0.7071067811865704,6.256046213579085E-14,-0.7071067811865246),(-0.7071067811865511,-1.2803825152143146E-14,0.7071067811865439),(-0.7071067811865511,-1.2803825152143146E-14,0.7071067811865439),(-0.7071067811865511,-1.2803825152143146E-14,0.7071067811865439),(-0.7071067811865511,-1.2803825152143146E-14,0.7071067811865439),(0.707106781186563,-5.5041527586499864E-15,0.7071067811865321),(0.707106781186563,-5.5041527586499864E-15,0.7071067811865321),(0.707106781186563,-5.5041527586499864E-15,0.7071067811865321),(0.707106781186563,-5.5041527586499864E-15,0.7071067811865321),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.7071067811864788,5.125688251852756E-15,0.7071067811866163),(-0.7071067811864788,5.125688251852756E-15,0.7071067811866163),(-0.7071067811864788,5.125688251852756E-15,0.7071067811866163),(-0.7071067811864788,5.125688251852756E-15,0.7071067811866163),(-1.6127472346338368E-27,1.,4.465001265314941E-15),(-1.6127472346338368E-27,1.,4.465001265314941E-15),(-1.6127472346338368E-27,1.,4.465001265314941E-15),(-1.6127472346338368E-27,1.,4.465001265314941E-15),(-1.6127472346338368E-27,1.,4.465001265314941E-15),(-1.,3.764916747943196E-14,4.977688896942616E-17),(-1.,3.764916747943196E-14,4.977688896942616E-17),(-1.,3.764916747943196E-14,4.977688896942616E-17),(-1.,3.764916747943196E-14,4.977688896942616E-17),(0.707106781186534,1.3284458036190054E-14,0.707106781186561),(0.707106781186534,1.3284458036190054E-14,0.707106781186561),(0.707106781186534,1.3284458036190054E-14,0.707106781186561),(0.707106781186534,1.3284458036190054E-14,0.707106781186561),(0.707106781186534,1.3284458036190054E-14,0.707106781186561),(0.707106781186534,1.3284458036190054E-14,0.707106781186561),(0.707106781186534,1.3284458036190054E-14,0.707106781186561),(0.707106781186534,1.3284458036190054E-14,0.707106781186561),(0.707106781186534,1.3284458036190054E-14,0.707106781186561),(0.707106781186534,1.3284458036190054E-14,0.707106781186561),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(-4.871119585985193E-15,-1.,-1.0132084825662725E-14),(1.,6.309860718924715E-15,1.333823416031891E-29),(1.,6.309860718924715E-15,1.333823416031891E-29),(1.,6.309860718924715E-15,1.333823416031891E-29),(1.,6.309860718924715E-15,1.333823416031891E-29),(6.44563767439433E-17,-4.511946372076356E-16,-1.),(6.44563767439433E-17,-4.511946372076356E-16,-1.),(6.44563767439433E-17,-4.511946372076356E-16,-1.),(6.44563767439433E-17,-4.511946372076356E-16,-1.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24),(25,26,27),(26,25,28),(29,30,31),(30,29,32),(33,34,35),(34,33,36),(36,33,37),(37,33,38),(36,37,39),(36,39,40),(36,40,41),(42,43,44),(43,42,45),(45,42,33),(33,42,38),(38,42,46),(46,42,47),(47,42,48),(46,47,39),(39,47,40),(47,49,40),(49,47,50),(49,50,51),(49,51,52),(52,51,53),(53,51,54),(52,55,56),(55,52,53),(57,58,59),(58,57,60),(58,60,61),(61,60,62),(62,60,63),(62,63,64),(63,60,65),(66,59,58),(67,68,69),(68,67,70),(71,72,73),(72,71,74),(75,76,77),(76,75,78),(79,80,81),(80,79,82),(83,84,85),(84,83,86),(87,88,89),(88,87,90),(91,92,93),(92,91,94),(95,96,97),(96,95,98),(99,100,101),(100,99,102),(103,104,105),(104,103,106),(107,108,109),(108,107,110),(111,112,113),(112,111,114),(114,111,115),(116,117,118),(117,116,119),(120,121,122),(121,120,123),(121,123,124),(121,124,125),(124,123,126),(126,123,127),(127,123,128),(129,125,124),(130,131,132),(131,130,133),(131,133,134),(134,133,135),(135,133,136),(136,133,137),(136,137,138),(134,139,140),(139,134,141),(141,134,142),(142,134,135),(141,142,138),(141,138,137),(143,144,145),(144,143,146),(147,148,149),(148,147,150)),$); +#107=IFCCARTESIANPOINTLIST3D(((2350.,0.,3200.),(1850.,200.,3200.),(1850.,0.,3200.),(2350.,200.,3200.),(2600.,200.,2200.),(1600.,0.,2200.),(1600.,200.,2200.),(2600.,0.,2200.),(1600.,200.,-250.),(1600.,0.,2200.),(1600.,0.,-250.),(1600.,200.,2200.),(2600.,200.,2200.),(2600.,0.,-250.),(2600.,0.,2200.),(2600.,200.,-250.),(1850.,200.,3700.),(2350.,0.,3700.),(1850.,0.,3700.),(2350.,200.,3700.),(200.,200.,-250.),(1600.,0.,-250.),(200.,0.,-250.),(1600.,200.,-250.),(1850.,200.,3200.),(1850.,0.,3700.),(1850.,0.,3200.),(1850.,200.,3700.),(2350.,200.,3700.),(2350.,0.,3200.),(2350.,0.,3700.),(2350.,200.,3200.),(2600.,200.,2200.),(4000.,200.,-250.),(2600.,200.,-250.),(4000.,200.,3375.736),(2350.,200.,3200.),(1850.,200.,3200.),(2350.,200.,3700.),(2968.934,200.,4123.959),(3110.355,200.,4265.381),(200.,200.,3375.736),(1600.,200.,-250.),(200.,200.,-250.),(1600.,200.,2200.),(1850.,200.,3700.),(1231.066,200.,4123.959),(1089.645,200.,4265.381),(2898.223,200.,4194.67),(1301.777,200.,4194.67),(1160.355,200.,4336.091),(3039.645,200.,4336.091),(2050.,200.,5025.736),(2050.,200.,5225.736),(2150.,200.,5025.736),(2150.,200.,5225.736),(200.,0.,3375.736),(1089.645,100.,4265.381),(200.,200.,3375.736),(2100.,0.,5275.736),(1160.355,100.,4336.091),(1160.355,200.,4336.091),(2050.,100.,5225.736),(2050.,200.,5225.736),(2100.,100.,5275.736),(1089.645,200.,4265.381),(1089.645,100.,4265.381),(1301.777,100.,4194.67),(1231.066,100.,4123.959),(1160.355,100.,4336.091),(2898.223,100.,4194.67),(3110.355,100.,4265.381),(2968.934,100.,4123.959),(3039.645,100.,4336.091),(2150.,200.,5225.736),(2150.,100.,5025.736),(2150.,100.,5225.736),(2150.,200.,5025.736),(1231.066,200.,4123.959),(1089.645,100.,4265.381),(1231.066,100.,4123.959),(1089.645,200.,4265.381),(2050.,200.,5025.736),(2050.,100.,5225.736),(2050.,100.,5025.736),(2050.,200.,5225.736),(1160.355,100.,4336.091),(1301.777,200.,4194.67),(1301.777,100.,4194.67),(1160.355,200.,4336.091),(2898.223,100.,4194.67),(3039.645,200.,4336.091),(3039.645,100.,4336.091),(2898.223,200.,4194.67),(3110.355,200.,4265.381),(2968.934,100.,4123.959),(3110.355,100.,4265.381),(2968.934,200.,4123.959),(2968.934,200.,4123.959),(2898.223,100.,4194.67),(2968.934,100.,4123.959),(2898.223,200.,4194.67),(2050.,100.,5025.736),(2150.,200.,5025.736),(2050.,200.,5025.736),(2150.,100.,5025.736),(1301.777,100.,4194.67),(1231.066,200.,4123.959),(1231.066,100.,4123.959),(1301.777,200.,4194.67),(2050.,100.,5225.736),(2150.,100.,5025.736),(2050.,100.,5025.736),(2150.,100.,5225.736),(2100.,100.,5275.736),(200.,200.,3375.736),(200.,0.,-250.),(200.,0.,3375.736),(200.,200.,-250.),(2100.,0.,5275.736),(2150.,100.,5225.736),(2100.,100.,5275.736),(4000.,0.,3375.736),(3039.645,100.,4336.091),(2150.,200.,5225.736),(3110.355,100.,4265.381),(3110.355,200.,4265.381),(4000.,200.,3375.736),(3039.645,200.,4336.091),(4000.,0.,-250.),(2600.,0.,2200.),(2600.,0.,-250.),(4000.,0.,3375.736),(1600.,0.,2200.),(2350.,0.,3200.),(2350.,0.,3700.),(2100.,0.,5275.736),(1850.,0.,3700.),(200.,0.,-250.),(1600.,0.,-250.),(200.,0.,3375.736),(1850.,0.,3200.),(4000.,200.,-250.),(4000.,0.,3375.736),(4000.,0.,-250.),(4000.,200.,3375.736),(4000.,200.,-250.),(2600.,0.,-250.),(2600.,200.,-250.),(4000.,0.,-250.))); +#108=IFCSTYLEDITEM(#106,(#89),$); +#109=IFCPRODUCTDEFINITIONSHAPE($,$,(#105)); +#110=IFCWALLTYPE('2JyKYAYaHEEwkOiNxZBS0J',#1,'house - outer wall - house front right','A solid outer wall, forming the front right side of the house.',$,$,$,'919673','solidwall',.SOLIDWALL.); +#111=IFCRELDEFINESBYTYPE('0Lutqys6D3UQmJeJXWcI9a',#1,$,$,(#112),#110); +#112=IFCWALL('3oNJ9yHi5FJuFnK8yg68Yt',#1,'house - outer wall - house front right','A solid outer wall, forming the front right side of the house.','solidwall',#119,#128,'454425.1027891.979946.932083.920036',$); +#113=IFCQUANTITYVOLUME('NetVolume',$,$,0.7456913421348147,$); +#114=IFCQUANTITYLENGTH('Width',$,$,200.,$); +#115=IFCQUANTITYLENGTH('Length',$,$,1300.,$); +#116=IFCQUANTITYAREA('NetSideArea',$,$,3.728456710673145,$); +#117=IFCELEMENTQUANTITY('3bBRc0zyj8ePcw96tcBOrQ',#1,'Qto_WallBaseQuantities',$,'BaseQuantities',(#113,#114,#115,#116)); +#118=IFCRELDEFINESBYPROPERTIES('03Urj8W8HEYfq2z7EyWvm1',#1,$,$,(#112),#117); +#119=IFCLOCALPLACEMENT(#47,#120); +#120=IFCAXIS2PLACEMENT3D(#121,#122,#123); +#121=IFCCARTESIANPOINT((5400.,1900.,0.)); +#122=IFCDIRECTION((7.573624267414214E-15,-8.358548678879859E-30,1.)); +#123=IFCDIRECTION((-1.,-1.0829689592158854E-14,7.573624267414214E-15)); +#124=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#125)); +#125=IFCTRIANGULATEDFACESET(#126,((-2.661898271520319E-14,-1.,4.476505013608623E-15),(-2.661898271520319E-14,-1.,4.476505013608623E-15),(-2.661898271520319E-14,-1.,4.476505013608623E-15),(-2.661898271520319E-14,-1.,4.476505013608623E-15),(-2.661898271520319E-14,-1.,4.476505013608623E-15),(-2.661898271520319E-14,-1.,4.476505013608623E-15),(-2.661898271520319E-14,-1.,4.476505013608623E-15),(-2.661898271520319E-14,-1.,4.476505013608623E-15),(6.264249027916633E-15,-1.,-1.7866396105848336E-14),(6.264249027916633E-15,-1.,-1.7866396105848336E-14),(6.264249027916633E-15,-1.,-1.7866396105848336E-14),(6.264249027916633E-15,-1.,-1.7866396105848336E-14),(-0.7071067811865585,1.0329135437736341E-14,-0.7071067811865368),(-0.7071067811865585,1.0329135437736341E-14,-0.7071067811865368),(-0.7071067811865585,1.0329135437736341E-14,-0.7071067811865368),(-0.7071067811865585,1.0329135437736341E-14,-0.7071067811865368),(0.7071067811865657,7.646135024566304E-14,0.7071067811865295),(0.7071067811865657,7.646135024566304E-14,0.7071067811865295),(0.7071067811865657,7.646135024566304E-14,0.7071067811865295),(0.7071067811865657,7.646135024566304E-14,0.7071067811865295),(-0.7071067811865025,1.8175258417197414E-15,0.7071067811865925),(-0.7071067811865025,1.8175258417197414E-15,0.7071067811865925),(-0.7071067811865025,1.8175258417197414E-15,0.7071067811865925),(-0.7071067811865025,1.8175258417197414E-15,0.7071067811865925),(1.8345276457941856E-16,-2.3349322475495577E-14,-1.),(1.8345276457941856E-16,-2.3349322475495577E-14,-1.),(1.8345276457941856E-16,-2.3349322475495577E-14,-1.),(1.8345276457941856E-16,-2.3349322475495577E-14,-1.),(-1.,-2.3572001107331336E-13,1.4709264666823317E-14),(-1.,-2.3572001107331336E-13,1.4709264666823317E-14),(-1.,-2.3572001107331336E-13,1.4709264666823317E-14),(-1.,-2.3572001107331336E-13,1.4709264666823317E-14),(1.,-1.4430286570848327E-14,2.3040049383719444E-18),(1.,-1.4430286570848327E-14,2.3040049383719444E-18),(1.,-1.4430286570848327E-14,2.3040049383719444E-18),(1.,-1.4430286570848327E-14,2.3040049383719444E-18),(-0.7071067811865394,-7.445967753945548E-14,0.7071067811865558),(-0.7071067811865394,-7.445967753945548E-14,0.7071067811865558),(-0.7071067811865394,-7.445967753945548E-14,0.7071067811865558),(-0.7071067811865394,-7.445967753945548E-14,0.7071067811865558),(-0.7071067811865394,-7.445967753945548E-14,0.7071067811865558),(-0.7071067811865394,-7.445967753945548E-14,0.7071067811865558),(-0.7071067811865394,-7.445967753945548E-14,0.7071067811865558),(-0.7071067811865394,-7.445967753945548E-14,0.7071067811865558),(1.8833504969879846E-14,1.,-7.418145606654705E-15),(1.8833504969879846E-14,1.,-7.418145606654705E-15),(1.8833504969879846E-14,1.,-7.418145606654705E-15),(1.8833504969879846E-14,1.,-7.418145606654705E-15)),$,((1,2,3),(2,1,4),(2,4,5),(2,5,6),(4,1,7),(8,6,5),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24),(25,26,27),(26,25,28),(29,30,31),(30,29,32),(33,34,35),(34,33,36),(37,38,39),(40,41,42),(41,40,43),(41,43,44),(42,41,38),(42,38,37),(45,46,47),(46,45,48)),$); +#126=IFCCARTESIANPOINTLIST3D(((1300.,-100.,3275.736),(0.,-100.,-250.),(1300.,-100.,-250.),(651.777,-100.,2344.67),(581.066,-100.,2273.959),(0.,-100.,1975.736),(510.355,-100.,2486.091),(439.645,-100.,2415.381),(651.777,0.,2344.67),(439.645,0.,2415.381),(581.066,0.,2273.959),(510.355,0.,2486.091),(510.355,-100.,2486.091),(651.777,0.,2344.67),(651.777,-100.,2344.67),(510.355,0.,2486.091),(581.066,0.,2273.959),(439.645,-100.,2415.381),(581.066,-100.,2273.959),(439.645,0.,2415.381),(581.066,-100.,2273.959),(651.777,0.,2344.67),(581.066,0.,2273.959),(651.777,-100.,2344.67),(1300.,100.,-250.),(0.,-100.,-250.),(0.,100.,-250.),(1300.,-100.,-250.),(0.,-100.,1975.736),(0.,100.,-250.),(0.,-100.,-250.),(0.,100.,1975.736),(1300.,100.,-250.),(1300.,-100.,3275.736),(1300.,-100.,-250.),(1300.,100.,3275.736),(1300.,-100.,3275.736),(510.355,0.,2486.091),(510.355,-100.,2486.091),(0.,100.,1975.736),(439.645,0.,2415.381),(1300.,100.,3275.736),(0.,-100.,1975.736),(439.645,-100.,2415.381),(0.,100.,1975.736),(1300.,100.,-250.),(0.,100.,-250.),(1300.,100.,3275.736))); +#127=IFCSTYLEDITEM(#125,(#89),$); +#128=IFCPRODUCTDEFINITIONSHAPE($,$,(#124)); +#129=IFCCHIMNEYTYPE('2vWR$XNSf2qhsAEJMXcZLU',#1,'house - chimney','A chimney, standing tall and proud, guiding smoke away from the home.',$,$,$,'884350','flue',.USERDEFINED.); +#130=IFCRELDEFINESBYTYPE('22pEICzjP0uQNvM7rXMZ6g',#1,$,$,(#131),#129); +#131=IFCCHIMNEY('3Fbgsvr8nAYfGs9y5keub0',#1,'house - chimney','A chimney, standing tall and proud, guiding smoke away from the home.','flue',#132,#144,'454425.1027891.979946.932083.2023772',$); +#132=IFCLOCALPLACEMENT(#47,#133); +#133=IFCAXIS2PLACEMENT3D(#134,#135,#136); +#134=IFCCARTESIANPOINT((4700.,5300.,0.)); +#135=IFCDIRECTION((0.,0.,1.)); +#136=IFCDIRECTION((-1.3173934614068503E-15,-1.,0.)); +#137=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#138,#141)); +#138=IFCTRIANGULATEDFACESET(#139,((1.,1.1428889650288931E-15,-1.7079616105392333E-16),(1.,1.1428889650288931E-15,-1.7079616105392333E-16),(1.,1.1428889650288931E-15,-1.7079616105392333E-16),(1.,1.1428889650288931E-15,-1.7079616105392333E-16),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-4.404519077503367E-16,-1.216614111042097E-15,-1.),(-4.404519077503367E-16,-1.216614111042097E-15,-1.),(-4.404519077503367E-16,-1.216614111042097E-15,-1.),(-4.404519077503367E-16,-1.216614111042097E-15,-1.),(1.932260958298326E-14,-1.,4.812742796881703E-15),(1.932260958298326E-14,-1.,4.812742796881703E-15),(1.932260958298326E-14,-1.,4.812742796881703E-15),(1.932260958298326E-14,-1.,4.812742796881703E-15),(-2.284521082752207E-17,1.,0.),(-2.284521082752207E-17,1.,0.),(-2.284521082752207E-17,1.,0.),(-2.284521082752207E-17,1.,0.),(0.9486832980505189,-0.3162277660168231,4.503028113945746E-16),(0.9486832980505189,-0.3162277660168231,4.503028113945746E-16),(0.9486832980505189,-0.3162277660168231,4.503028113945746E-16),(0.9486832980505189,-0.3162277660168231,4.503028113945746E-16),(0.9486832980505189,-0.3162277660168231,4.503028113945746E-16),(3.1628776618586504E-30,1.2031856992204359E-14,1.),(3.1628776618586504E-30,1.2031856992204359E-14,1.),(3.1628776618586504E-30,1.2031856992204359E-14,1.),(3.1628776618586504E-30,1.2031856992204359E-14,1.),(2.284521082752207E-17,-1.,0.),(2.284521082752207E-17,-1.,0.),(2.284521082752207E-17,-1.,0.),(2.284521082752207E-17,-1.,0.),(2.284521082752207E-17,-1.,0.),(2.284521082752207E-17,-1.,0.),(2.284521082752207E-17,-1.,0.),(2.284521082752207E-17,-1.,0.),(-1.,-4.029468829054302E-15,-1.9625459803697525E-16),(-1.,-4.029468829054302E-15,-1.9625459803697525E-16),(-1.,-4.029468829054302E-15,-1.9625459803697525E-16),(-1.,-4.029468829054302E-15,-1.9625459803697525E-16),(1.800491663919249E-16,-9.023892744152575E-15,-1.),(1.800491663919249E-16,-9.023892744152575E-15,-1.),(1.800491663919249E-16,-9.023892744152575E-15,-1.),(1.800491663919249E-16,-9.023892744152575E-15,-1.),(-0.9486832980505118,-0.3162277660168441,2.7451152156169216E-15),(-0.9486832980505118,-0.3162277660168441,2.7451152156169216E-15),(-0.9486832980505118,-0.3162277660168441,2.7451152156169216E-15),(-0.9486832980505118,-0.3162277660168441,2.7451152156169216E-15),(-0.9486832980505118,-0.3162277660168441,2.7451152156169216E-15)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(8,5,9),(8,9,10),(10,9,11),(11,9,12),(12,9,13),(5,14,15),(14,5,16),(16,5,7),(14,16,17),(14,17,18),(14,18,19),(14,19,20),(14,20,13),(14,13,9),(21,22,23),(22,21,24),(25,26,27),(26,25,28),(29,30,31),(30,29,32),(33,34,35),(34,33,36),(36,33,37),(38,39,40),(39,38,41),(42,43,44),(43,42,45),(43,45,46),(46,45,47),(44,48,49),(48,44,43),(49,48,47),(49,47,45),(50,51,52),(51,50,53),(54,55,56),(55,54,57),(58,59,60),(59,58,61),(61,58,62)),$); +#139=IFCCARTESIANPOINTLIST3D(((700.,700.,-250.),(700.,0.,4700.),(700.,0.,-250.),(700.,700.,4700.),(0.,0.,4700.),(263.397,150.,4700.),(250.,200.,4700.),(300.,113.397,4700.),(700.,0.,4700.),(350.,100.,4700.),(400.,113.397,4700.),(436.603,150.,4700.),(450.,200.,4700.),(700.,700.,4700.),(0.,700.,4700.),(263.397,250.,4700.),(300.,286.603,4700.),(350.,300.,4700.),(400.,286.603,4700.),(436.603,250.,4700.),(700.,700.,-250.),(0.,0.,-250.),(0.,700.,-250.),(700.,0.,-250.),(500.,300.,700.),(200.,300.,300.),(500.,300.,300.),(200.,300.,700.),(0.,700.,4700.),(700.,700.,-250.),(0.,700.,-250.),(700.,700.,4700.),(200.,300.,300.),(100.,0.,700.),(100.,0.,300.),(116.667,50.,700.),(200.,300.,700.),(600.,0.,300.),(200.,300.,300.),(100.,0.,300.),(500.,300.,300.),(700.,0.,-250.),(600.,0.,300.),(0.,0.,-250.),(700.,0.,4700.),(600.,0.,700.),(100.,0.,700.),(100.,0.,300.),(0.,0.,4700.),(0.,700.,4700.),(0.,0.,-250.),(0.,0.,4700.),(0.,700.,-250.),(116.667,50.,700.),(600.,0.,700.),(100.,0.,700.),(583.333,50.,700.),(583.333,50.,700.),(600.,0.,300.),(600.,0.,700.),(500.,300.,300.),(500.,300.,700.))); +#140=IFCSTYLEDITEM(#138,(#89),$); +#141=IFCTRIANGULATEDFACESET(#142,((0.8660254037844475,-0.49999999999998496,-1.389426387474337E-16),(0.49999999999996514,-0.8660254037844588,-2.6441663130442275E-16),(0.8660254037844493,-0.49999999999998185,-1.3894263874742806E-16),(0.49999999999996364,-0.8660254037844597,-2.6441663130442083E-16),(-0.8660254037844538,0.49999999999997397,4.818331962219046E-16),(-0.5000000000000346,0.8660254037844188,1.392004735703411E-16),(-0.5000000000000336,0.8660254037844193,1.392004735703392E-16),(-0.8660254037844549,0.49999999999997186,4.81833196221904E-16),(-0.8660254037844273,-0.5000000000000197,-5.700127056491173E-16),(-1.,-1.6171073399747118E-14,-8.817950942720281E-17),(-1.,-1.3299061495040901E-14,-8.817950942719746E-17),(-0.8660254037844263,-0.5000000000000218,-5.700127056491173E-16),(-2.4004711383966796E-14,0.9701425001453376,-0.24253562503631018),(-2.4004711383966796E-14,0.9701425001453376,-0.24253562503631018),(-2.4004711383966796E-14,0.9701425001453376,-0.24253562503631018),(-2.4004711383966796E-14,0.9701425001453376,-0.24253562503631018),(-2.4004711383966796E-14,0.9701425001453376,-0.24253562503631018),(-2.4004711383966796E-14,0.9701425001453376,-0.24253562503631018),(-2.4004711383966796E-14,0.9701425001453376,-0.24253562503631018),(1.7389063657870903E-14,-0.9701425001453303,-0.24253562503633982),(1.7389063657870903E-14,-0.9701425001453303,-0.24253562503633982),(1.7389063657870903E-14,-0.9701425001453303,-0.24253562503633982),(1.7389063657870903E-14,-0.9701425001453303,-0.24253562503633982),(1.7389063657870903E-14,-0.9701425001453303,-0.24253562503633982),(-8.708917960971257E-17,1.2226263772440967E-14,1.),(-8.708917960971257E-17,1.2226263772440967E-14,1.),(-8.708917960971257E-17,1.2226263772440967E-14,1.),(-8.708917960971257E-17,1.2226263772440967E-14,1.),(-8.708917960971257E-17,1.2226263772440967E-14,1.),(-8.708917960971257E-17,1.2226263772440967E-14,1.),(-8.708917960971257E-17,1.2226263772440967E-14,1.),(-8.708917960971257E-17,1.2226263772440967E-14,1.),(-6.815141820410568E-16,-1.646623560614838E-14,-1.),(-6.815141820410568E-16,-1.646623560614838E-14,-1.),(-6.815141820410568E-16,-1.646623560614838E-14,-1.),(-6.815141820410568E-16,-1.646623560614838E-14,-1.),(-6.815141820410568E-16,-1.646623560614838E-14,-1.),(-6.815141820410568E-16,-1.646623560614838E-14,-1.),(-6.815141820410568E-16,-1.646623560614838E-14,-1.),(-6.815141820410568E-16,-1.646623560614838E-14,-1.),(-6.815141820410568E-16,-1.646623560614838E-14,-1.),(1.,-6.236107377798383E-14,1.9000613460615482E-16),(0.8660254037844839,0.4999999999999216,-3.6638489249847504E-16),(0.8660254037844851,0.49999999999991973,-3.663848924984712E-16),(1.,-5.998297474860927E-14,1.9000613460615403E-16),(9.358070330260165E-16,-1.6754987712617552E-14,-1.),(9.358070330260165E-16,-1.6754987712617552E-14,-1.),(9.358070330260165E-16,-1.6754987712617552E-14,-1.),(9.358070330260165E-16,-1.6754987712617552E-14,-1.),(9.358070330260165E-16,-1.6754987712617552E-14,-1.),(9.358070330260165E-16,-1.6754987712617552E-14,-1.),(9.358070330260165E-16,-1.6754987712617552E-14,-1.),(9.358070330260165E-16,-1.6754987712617552E-14,-1.),(9.358070330260165E-16,-1.6754987712617552E-14,-1.),(-5.195231725710407E-15,-1.,-5.0935900712064705E-17),(0.49999999999996364,-0.8660254037844597,-2.6441663130442083E-16),(-6.183057476373683E-15,-1.,-5.0935900712064994E-17),(0.49999999999996514,-0.8660254037844588,-2.6441663130442275E-16),(-0.4999999999999174,-0.8660254037844863,-3.4276296232769373E-16),(-5.195231725710407E-15,-1.,-5.0935900712064705E-17),(-6.183057476373683E-15,-1.,-5.0935900712064994E-17),(-0.4999999999999189,-0.8660254037844854,-3.4276296232769516E-16),(0.5000000000000531,0.8660254037844081,-1.2417073468224445E-15),(-6.91478025464307E-15,1.,-9.63416900320066E-16),(0.5000000000000545,0.8660254037844074,-1.2417073468224425E-15),(-7.445279268888173E-15,1.,-9.634169003200647E-16),(-1.,-1.3299061495040901E-14,-8.817950942719746E-17),(-0.8660254037844549,0.49999999999997186,4.81833196221904E-16),(-0.8660254037844538,0.49999999999997397,4.818331962219046E-16),(-1.,-1.6171073399747118E-14,-8.817950942720281E-17),(-0.8571428571428575,-0.2857142857142929,-0.42857142857142305),(-0.8571428571428575,-0.2857142857142929,-0.42857142857142305),(-0.8571428571428575,-0.2857142857142929,-0.42857142857142305),(-0.8571428571428575,-0.2857142857142929,-0.42857142857142305),(-0.8660254037844263,-0.5000000000000218,-5.700127056491173E-16),(-0.4999999999999189,-0.8660254037844854,-3.4276296232769516E-16),(-0.4999999999999174,-0.8660254037844863,-3.4276296232769373E-16),(-0.8660254037844273,-0.5000000000000197,-5.700127056491173E-16),(-7.445279268888173E-15,1.,-9.634169003200647E-16),(-0.5000000000000346,0.8660254037844188,1.392004735703411E-16),(-6.91478025464307E-15,1.,-9.63416900320066E-16),(-0.5000000000000336,0.8660254037844193,1.392004735703392E-16),(0.8660254037844475,-0.49999999999998496,-1.389426387474337E-16),(1.,-5.998297474860927E-14,1.9000613460615403E-16),(1.,-6.236107377798383E-14,1.9000613460615482E-16),(0.8660254037844493,-0.49999999999998185,-1.3894263874742806E-16),(0.857142857142863,-0.28571428571427926,-0.42857142857142155),(0.857142857142863,-0.28571428571427926,-0.42857142857142155),(0.857142857142863,-0.28571428571427926,-0.42857142857142155),(0.857142857142863,-0.28571428571427926,-0.42857142857142155),(0.8660254037844851,0.49999999999991973,-3.663848924984712E-16),(0.5000000000000531,0.8660254037844081,-1.2417073468224445E-15),(0.5000000000000545,0.8660254037844074,-1.2417073468224425E-15),(0.8660254037844839,0.4999999999999216,-3.6638489249847504E-16)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(14,16,17),(17,16,18),(18,16,19),(20,21,22),(21,20,23),(23,20,24),(25,26,27),(26,25,28),(26,28,29),(29,28,30),(29,30,31),(29,31,32),(33,34,35),(34,33,36),(36,33,37),(38,39,40),(39,38,41),(39,41,37),(39,37,33),(42,43,44),(43,42,45),(46,47,48),(47,46,49),(49,46,50),(51,52,53),(52,51,54),(54,51,48),(48,51,46),(55,56,57),(56,55,58),(59,60,61),(60,59,62),(63,64,65),(64,63,66),(67,68,69),(68,67,70),(71,72,73),(72,71,74),(75,76,77),(76,75,78),(79,80,81),(80,79,82),(83,84,85),(84,83,86),(87,88,89),(88,87,90),(91,92,93),(92,91,94)),$); +#142=IFCCARTESIANPOINTLIST3D(((263.397,250.,900.),(300.,286.603,4700.),(263.397,250.,4700.),(300.,286.603,900.),(436.603,150.,4700.),(400.,113.397,900.),(400.,113.397,4700.),(436.603,150.,900.),(436.603,250.,4700.),(450.,200.,900.),(450.,200.,4700.),(436.603,250.,900.),(63.962,50.,700.),(583.333,50.,700.),(116.667,50.,700.),(180.629,100.,900.),(636.038,50.,700.),(519.371,100.,900.),(350.,100.,900.),(452.705,300.,900.),(163.962,350.,700.),(536.038,350.,700.),(247.295,300.,900.),(350.,300.,900.),(116.667,50.,700.),(163.962,350.,700.),(63.962,50.,700.),(200.,300.,700.),(536.038,350.,700.),(500.,300.,700.),(583.333,50.,700.),(636.038,50.,700.),(452.705,300.,900.),(400.,286.603,900.),(350.,300.,900.),(436.603,250.,900.),(450.,200.,900.),(400.,113.397,900.),(519.371,100.,900.),(350.,100.,900.),(436.603,150.,900.),(250.,200.,900.),(263.397,150.,4700.),(263.397,150.,900.),(250.,200.,4700.),(247.295,300.,900.),(263.397,250.,900.),(250.,200.,900.),(300.,286.603,900.),(350.,300.,900.),(180.629,100.,900.),(300.,113.397,900.),(350.,100.,900.),(263.397,150.,900.),(350.,300.,4700.),(300.,286.603,900.),(350.,300.,900.),(300.,286.603,4700.),(400.,286.603,900.),(350.,300.,4700.),(350.,300.,900.),(400.,286.603,4700.),(300.,113.397,4700.),(350.,100.,900.),(300.,113.397,900.),(350.,100.,4700.),(450.,200.,4700.),(436.603,150.,900.),(436.603,150.,4700.),(450.,200.,900.),(519.371,100.,900.),(536.038,350.,700.),(636.038,50.,700.),(452.705,300.,900.),(436.603,250.,900.),(400.,286.603,4700.),(400.,286.603,900.),(436.603,250.,4700.),(350.,100.,4700.),(400.,113.397,900.),(350.,100.,900.),(400.,113.397,4700.),(263.397,250.,900.),(250.,200.,4700.),(250.,200.,900.),(263.397,250.,4700.),(163.962,350.,700.),(180.629,100.,900.),(63.962,50.,700.),(247.295,300.,900.),(263.397,150.,900.),(300.,113.397,4700.),(300.,113.397,900.),(263.397,150.,4700.))); +#143=IFCSTYLEDITEM(#141,(#89),$); +#144=IFCPRODUCTDEFINITIONSHAPE($,$,(#137)); +#145=IFCWALLTYPE('3sv$5PJEr5hP_mSgN$A$GJ',#1,'house - inner wall','A solid inner wall, providing structural support within the house.',$,$,$,'919726','solidwall',.SOLIDWALL.); +#146=IFCRELDEFINESBYTYPE('03jzp7gAn8ZhZ3yNm_TOEt',#1,$,$,(#147),#145); +#147=IFCWALL('37GxndZsXCwBzM0QrdRDLo',#1,'house - inner wall','A solid inner wall, providing structural support within the house.','solidwall',#154,#163,'454425.1027891.979946.932083.2037932.920033',$); +#148=IFCQUANTITYVOLUME('NetVolume',$,$,3.0445740264050034,$); +#149=IFCQUANTITYLENGTH('Width',$,$,200.,$); +#150=IFCQUANTITYLENGTH('Length',$,$,3900.,$); +#151=IFCQUANTITYAREA('NetSideArea',$,$,15.22287013201683,$); +#152=IFCELEMENTQUANTITY('2ILQY4UQX6Hw0M8$NmV8EN',#1,'Qto_WallBaseQuantities',$,'BaseQuantities',(#148,#149,#150,#151)); +#153=IFCRELDEFINESBYPROPERTIES('3vQjmX5VP7zR3_yDAASj0o',#1,$,$,(#147),#152); +#154=IFCLOCALPLACEMENT(#47,#155); +#155=IFCAXIS2PLACEMENT3D(#156,#157,#158); +#156=IFCCARTESIANPOINT((4100.,1900.,0.)); +#157=IFCDIRECTION((7.573624267414218E-15,-7.358313131164392E-30,1.)); +#158=IFCDIRECTION((-1.,-1.0678030306608418E-14,7.573624267414218E-15)); +#159=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#160)); +#160=IFCTRIANGULATEDFACESET(#161,((-7.573624267414215E-15,1.3622338373475804E-31,-1.),(-7.573624267414215E-15,1.3622338373475804E-31,-1.),(-7.573624267414215E-15,1.3622338373475804E-31,-1.),(-7.573624267414215E-15,1.3622338373475804E-31,-1.),(1.,-2.2791814966265E-16,-7.573624267414215E-15),(1.,-2.2791814966265E-16,-7.573624267414215E-15),(1.,-2.2791814966265E-16,-7.573624267414215E-15),(1.,-2.2791814966265E-16,-7.573624267414215E-15),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(4.4052702174763076E-15,1.,-7.389549145832176E-16),(-0.7071067811865542,1.456211527056186E-13,0.7071067811865409),(-0.7071067811865542,1.456211527056186E-13,0.7071067811865409),(-0.7071067811865542,1.456211527056186E-13,0.7071067811865409),(-0.7071067811865542,1.456211527056186E-13,0.7071067811865409),(-1.,2.2791814966265E-16,7.573624267414215E-15),(-1.,2.2791814966265E-16,7.573624267414215E-15),(-1.,2.2791814966265E-16,7.573624267414215E-15),(-1.,2.2791814966265E-16,7.573624267414215E-15),(7.573624267414641E-15,3.6095570976610856E-14,1.),(7.573624267414641E-15,3.6095570976610856E-14,1.),(7.573624267414641E-15,3.6095570976610856E-14,1.),(7.573624267414641E-15,3.6095570976610856E-14,1.),(0.7071067811865381,9.84835966355381E-15,0.707106781186557),(0.7071067811865381,9.84835966355381E-15,0.707106781186557),(0.7071067811865381,9.84835966355381E-15,0.707106781186557),(0.7071067811865381,9.84835966355381E-15,0.707106781186557),(-0.7071067811865345,5.722903046632063E-16,0.7071067811865607),(-0.7071067811865345,5.722903046632063E-16,0.7071067811865607),(-0.7071067811865345,5.722903046632063E-16,0.7071067811865607),(-0.7071067811865345,5.722903046632063E-16,0.7071067811865607),(-0.7071067811865345,5.722903046632063E-16,0.7071067811865607),(-0.7071067811865345,5.722903046632063E-16,0.7071067811865607),(-0.7071067811865345,5.722903046632063E-16,0.7071067811865607),(-0.7071067811865345,5.722903046632063E-16,0.7071067811865607),(-1.4674833195258958E-14,-1.,6.380855752085726E-16),(-1.4674833195258958E-14,-1.,6.380855752085726E-16),(-1.4674833195258958E-14,-1.,6.380855752085726E-16),(-1.4674833195258958E-14,-1.,6.380855752085726E-16),(-0.7071067811865756,-6.357642206799978E-14,-0.7071067811865196),(-0.7071067811865756,-6.357642206799978E-14,-0.7071067811865196),(-0.7071067811865756,-6.357642206799978E-14,-0.7071067811865196),(-0.7071067811865756,-6.357642206799978E-14,-0.7071067811865196),(0.7071067811865529,1.0195785339222503E-13,0.7071067811865422),(0.7071067811865529,1.0195785339222503E-13,0.7071067811865422),(0.7071067811865529,1.0195785339222503E-13,0.7071067811865422),(0.7071067811865529,1.0195785339222503E-13,0.7071067811865422),(-1.,1.1756142296897498E-13,-1.9498053965047103E-14),(-1.,1.1756142296897498E-13,-1.9498053965047103E-14),(-1.,1.1756142296897498E-13,-1.9498053965047103E-14),(-1.,1.1756142296897498E-13,-1.9498053965047103E-14),(1.,-1.1756142296897498E-13,1.949805396505874E-14),(1.,-1.1756142296897498E-13,1.949805396505874E-14),(1.,-1.1756142296897498E-13,1.949805396505874E-14),(1.,-1.1756142296897498E-13,1.949805396505874E-14),(0.7071067811865349,-1.4282745190209122E-16,0.7071067811865603),(0.7071067811865349,-1.4282745190209122E-16,0.7071067811865603),(0.7071067811865349,-1.4282745190209122E-16,0.7071067811865603),(0.7071067811865349,-1.4282745190209122E-16,0.7071067811865603),(-0.7071067811865421,-1.460958033574882E-14,0.707106781186553),(-0.7071067811865421,-1.460958033574882E-14,0.707106781186553),(-0.7071067811865421,-1.460958033574882E-14,0.707106781186553),(-0.7071067811865421,-1.460958033574882E-14,0.707106781186553),(0.707106781186591,1.0288569416990323E-15,-0.7071067811865042),(0.707106781186591,1.0288569416990323E-15,-0.7071067811865042),(0.707106781186591,1.0288569416990323E-15,-0.7071067811865042),(0.707106781186591,1.0288569416990323E-15,-0.7071067811865042),(-0.707106781186591,-1.0288569416990323E-15,0.7071067811865042),(-0.707106781186591,-1.0288569416990323E-15,0.7071067811865042),(-0.707106781186591,-1.0288569416990323E-15,0.7071067811865042),(-0.707106781186591,-1.0288569416990323E-15,0.7071067811865042),(-0.7071067811865833,2.8378170286942335E-14,0.7071067811865117),(-0.7071067811865833,2.8378170286942335E-14,0.7071067811865117),(-0.7071067811865833,2.8378170286942335E-14,0.7071067811865117),(-0.7071067811865833,2.8378170286942335E-14,0.7071067811865117),(-0.7071067811865296,2.628887142738077E-16,-0.7071067811865657),(-0.7071067811865296,2.628887142738077E-16,-0.7071067811865657),(-0.7071067811865296,2.628887142738077E-16,-0.7071067811865657),(-0.7071067811865296,2.628887142738077E-16,-0.7071067811865657),(0.7071067811865638,-2.0014995352191287E-16,0.7071067811865313),(0.7071067811865638,-2.0014995352191287E-16,0.7071067811865313),(0.7071067811865638,-2.0014995352191287E-16,0.7071067811865313),(0.7071067811865638,-2.0014995352191287E-16,0.7071067811865313),(0.7071067811865464,2.4550279566219946E-16,0.7071067811865488),(0.7071067811865464,2.4550279566219946E-16,0.7071067811865488),(0.7071067811865464,2.4550279566219946E-16,0.7071067811865488),(0.7071067811865464,2.4550279566219946E-16,0.7071067811865488),(-7.573624267414215E-15,1.3622338373475804E-31,-1.),(-7.573624267414215E-15,1.3622338373475804E-31,-1.),(-7.573624267414215E-15,1.3622338373475804E-31,-1.),(-7.573624267414215E-15,1.3622338373475804E-31,-1.),(1.,-1.7984408250306067E-16,-7.514514211763427E-15),(1.,-1.7984408250306067E-16,-7.514514211763427E-15),(1.,-1.7984408250306067E-16,-7.514514211763427E-15),(1.,-1.7984408250306067E-16,-7.514514211763427E-15),(-2.98647878913672E-15,-2.3687718453397838E-15,-1.),(-2.98647878913672E-15,-2.3687718453397838E-15,-1.),(-2.98647878913672E-15,-2.3687718453397838E-15,-1.),(-2.98647878913672E-15,-2.3687718453397838E-15,-1.),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.994839256222842E-14,-1.,2.0142154177648575E-15),(-1.,2.6172812981112938E-15,-2.3040049383672112E-18),(-1.,2.6172812981112938E-15,-2.3040049383672112E-18),(-1.,2.6172812981112938E-15,-2.3040049383672112E-18),(-1.,2.6172812981112938E-15,-2.3040049383672112E-18)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(14,16,10),(14,10,12),(14,12,17),(17,12,18),(14,17,19),(20,21,22),(17,23,19),(23,17,24),(23,24,25),(25,24,22),(25,22,26),(25,26,27),(26,22,21),(28,14,19),(29,30,31),(30,29,32),(33,34,35),(34,33,36),(37,38,39),(38,37,40),(41,42,43),(42,41,44),(45,46,47),(48,49,50),(49,48,51),(49,51,52),(52,51,46),(52,46,45),(53,54,55),(54,53,56),(57,58,59),(58,57,60),(61,62,63),(62,61,64),(65,66,67),(66,65,68),(69,70,71),(70,69,72),(73,74,75),(74,73,76),(77,78,79),(78,77,80),(81,82,83),(82,81,84),(85,86,87),(86,85,88),(89,90,91),(90,89,92),(93,94,95),(94,93,96),(97,98,99),(98,97,100),(101,102,103),(102,101,104),(105,106,107),(106,105,108),(109,110,111),(110,109,112),(113,114,115),(114,113,116),(117,118,119),(118,117,120),(120,117,121),(121,117,122),(122,117,123),(123,117,124),(124,117,125),(125,117,126),(127,128,125),(128,127,129),(129,127,130),(129,130,131),(131,130,132),(132,130,133),(131,132,134),(135,131,134),(124,128,136),(128,124,125),(121,137,138),(137,121,139),(139,121,122),(139,122,140),(141,142,143),(142,141,144)),$); +#161=IFCCARTESIANPOINTLIST3D(((2500.,100.,2200.),(1500.,-100.,2200.),(1500.,100.,2200.),(2500.,-100.,2200.),(1500.,100.,-250.),(1500.,-100.,2200.),(1500.,-100.,-250.),(1500.,100.,2200.),(0.,100.,-250.),(1500.,100.,2200.),(1500.,100.,-250.),(0.,100.,3275.736),(2500.,100.,-250.),(3900.,100.,3375.736),(3900.,100.,-250.),(2500.,100.,2200.),(1131.066,100.,4123.959),(989.645,100.,4265.381),(2868.934,100.,4123.959),(1950.,100.,5225.736),(1950.,100.,5025.736),(1060.355,100.,4336.091),(2798.223,100.,4194.67),(1201.777,100.,4194.67),(2939.645,100.,4336.091),(2050.,100.,5025.736),(2050.,100.,5225.736),(3010.355,100.,4265.381),(1950.,-100.,5225.736),(1060.355,100.,4336.091),(1060.355,-100.,4336.091),(1950.,100.,5225.736),(2500.,-100.,2200.),(2500.,100.,-250.),(2500.,-100.,-250.),(2500.,100.,2200.),(2050.,-100.,5025.736),(1950.,100.,5025.736),(1950.,-100.,5025.736),(2050.,100.,5025.736),(2939.645,-100.,4336.091),(2050.,100.,5225.736),(2050.,-100.,5225.736),(2939.645,100.,4336.091),(989.645,-100.,4265.381),(135.355,0.,3411.091),(135.355,-100.,3411.091),(64.645,-100.,3340.381),(0.,100.,3275.736),(0.,-100.,3275.736),(64.645,0.,3340.381),(989.645,100.,4265.381),(276.777,0.,3269.67),(64.645,0.,3340.381),(206.066,0.,3198.959),(135.355,0.,3411.091),(135.355,0.,3411.091),(276.777,-100.,3269.67),(135.355,-100.,3411.091),(276.777,0.,3269.67),(206.066,-100.,3198.959),(64.645,0.,3340.381),(64.645,-100.,3340.381),(206.066,0.,3198.959),(2050.,100.,5225.736),(2050.,-100.,5025.736),(2050.,-100.,5225.736),(2050.,100.,5025.736),(1950.,100.,5025.736),(1950.,-100.,5225.736),(1950.,-100.,5025.736),(1950.,100.,5225.736),(1131.066,-100.,4123.959),(989.645,100.,4265.381),(989.645,-100.,4265.381),(1131.066,100.,4123.959),(206.066,-100.,3198.959),(276.777,0.,3269.67),(206.066,0.,3198.959),(276.777,-100.,3269.67),(2798.223,100.,4194.67),(2939.645,-100.,4336.091),(2798.223,-100.,4194.67),(2939.645,100.,4336.091),(3010.355,100.,4265.381),(2868.934,-100.,4123.959),(3010.355,-100.,4265.381),(2868.934,100.,4123.959),(1201.777,-100.,4194.67),(1131.066,100.,4123.959),(1131.066,-100.,4123.959),(1201.777,100.,4194.67),(1060.355,100.,4336.091),(1201.777,-100.,4194.67),(1060.355,-100.,4336.091),(1201.777,100.,4194.67),(2868.934,-100.,4123.959),(2798.223,100.,4194.67),(2798.223,-100.,4194.67),(2868.934,100.,4123.959),(3900.,-100.,3375.736),(3010.355,100.,4265.381),(3010.355,-100.,4265.381),(3900.,100.,3375.736),(2500.,100.,-250.),(3900.,-100.,-250.),(2500.,-100.,-250.),(3900.,100.,-250.),(3900.,100.,-250.),(3900.,-100.,3375.736),(3900.,-100.,-250.),(3900.,100.,3375.736),(1500.,100.,-250.),(0.,-100.,-250.),(0.,100.,-250.),(1500.,-100.,-250.),(3900.,-100.,3375.736),(2500.,-100.,-250.),(3900.,-100.,-250.),(2500.,-100.,2200.),(1500.,-100.,2200.),(206.066,-100.,3198.959),(276.777,-100.,3269.67),(135.355,-100.,3411.091),(2868.934,-100.,4123.959),(3010.355,-100.,4265.381),(2798.223,-100.,4194.67),(1131.066,-100.,4123.959),(1201.777,-100.,4194.67),(2939.645,-100.,4336.091),(1060.355,-100.,4336.091),(2050.,-100.,5025.736),(2050.,-100.,5225.736),(1950.,-100.,5025.736),(1950.,-100.,5225.736),(989.645,-100.,4265.381),(0.,-100.,-250.),(1500.,-100.,-250.),(0.,-100.,3275.736),(64.645,-100.,3340.381),(0.,-100.,3275.736),(0.,100.,-250.),(0.,-100.,-250.),(0.,100.,3275.736))); +#162=IFCSTYLEDITEM(#160,(#89),$); +#163=IFCPRODUCTDEFINITIONSHAPE($,$,(#159)); +#164=IFCROOFTYPE('0GE$iSXKL8jAEeHi$mszPq',#1,'house - roof','A sturdy roof, sheltering the house from the elements.',$,$,$,'902509','gable_roof',.GABLE_ROOF.); +#165=IFCRELDEFINESBYTYPE('3vwqwSGfL8LeMOHvcbNbYk',#1,$,$,(#166),#164); +#166=IFCROOF('2iPwJwpPDCSgMheXwk9cBT',#1,'house - roof','A sturdy roof, sheltering the house from the elements.','gable_roof',#168,$,'454425.1027891.979946.932084',$); +#167=IFCRELCONTAINEDINSPATIALSTRUCTURE('0_unXV8QD96hSTT1bwsdmY',#1,$,$,(#166,#305),#28); +#168=IFCLOCALPLACEMENT(#30,#169); +#169=IFCAXIS2PLACEMENT3D(#170,#171,#172); +#170=IFCCARTESIANPOINT((-2800.,-2800.,3100.)); +#171=IFCDIRECTION((0.,0.,1.)); +#172=IFCDIRECTION((1.,0.,0.)); +#173=IFCBEAMTYPE('1_UeVn6yDFiQNhUkRsBNZI',#1,'house - girder','A strong girder, providing essential support for structures.',$,$,$,'902302','girder_segment',.USERDEFINED.); +#174=IFCRELDEFINESBYTYPE('0QaU_JWFP0egFTAfCdiIGO',#1,$,$,(#175,#197,#213,#229,#245,#261),#173); +#175=IFCBEAM('0fqX614OH1YO1Njdxms2$Q',#1,'girder','A strong girder, providing essential support for structures.','girder_segment',#184,#196,'454425.1027891.979946.932084.902513',$); +#176=IFCRELASSOCIATESMATERIAL('1NsDI1QVHFMfwizftDPlfC',#1,$,$,(#175,#197,#213,#229,#245,#261),#177); +#177=IFCMATERIAL('wood_spruce_beam',$,$); +#178=IFCQUANTITYVOLUME('NetVolume',$,$,0.05400000000000022,$); +#179=IFCQUANTITYLENGTH('Length',$,$,2700.,$); +#180=IFCQUANTITYAREA('CrossSectionArea',$,$,0.020000000000000503,$); +#181=IFCELEMENTQUANTITY('19$drdf1j0_f$49_UFH4NQ',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#178,#179,#180)); +#182=IFCRELDEFINESBYPROPERTIES('3wJx8B_VH3aRJ3sLNPN_J9',#1,$,$,(#175),#181); +#183=IFCRELAGGREGATES('3YpecVm4P1fPcAgmGN$OMa',#1,'house - roof container',$,#166,(#175,#197,#213,#229,#245,#261,#276,#292)); +#184=IFCLOCALPLACEMENT(#168,#185); +#185=IFCAXIS2PLACEMENT3D(#186,#187,#188); +#186=IFCCARTESIANPOINT((4748.223,1900.,544.67)); +#187=IFCDIRECTION((8.27211307593222E-17,-1.,-4.506746872148008E-17)); +#188=IFCDIRECTION((0.7071067811865472,5.979740166137521E-17,-0.707106781186548)); +#189=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#190)); +#190=IFCTRIANGULATEDFACESET(#191,((1.,3.3306690738754706E-16,1.1924617671900018E-16),(1.,3.3306690738754706E-16,1.1924617671900018E-16),(1.,3.3306690738754706E-16,1.1924617671900018E-16),(1.,3.3306690738754706E-16,1.1924617671900018E-16),(7.2164496600635185E-16,-1.,-3.26409460204307E-32),(7.2164496600635185E-16,-1.,-3.26409460204307E-32),(7.2164496600635185E-16,-1.,-3.26409460204307E-32),(7.2164496600635185E-16,-1.,-3.26409460204307E-32),(-1.,-3.3306690738754706E-16,-1.1924617671900018E-16),(-1.,-3.3306690738754706E-16,-1.1924617671900018E-16),(-1.,-3.3306690738754706E-16,-1.1924617671900018E-16),(-1.,-3.3306690738754706E-16,-1.1924617671900018E-16),(-7.2164496600635185E-16,1.,3.26409460204307E-32),(-7.2164496600635185E-16,1.,3.26409460204307E-32),(-7.2164496600635185E-16,1.,3.26409460204307E-32),(-7.2164496600635185E-16,1.,3.26409460204307E-32),(2.5841397986964437E-17,2.0082800523541053E-32,-1.),(2.5841397986964437E-17,2.0082800523541053E-32,-1.),(2.5841397986964437E-17,2.0082800523541053E-32,-1.),(2.5841397986964437E-17,2.0082800523541053E-32,-1.),(-2.5841397986963688E-17,-9.809939192804824E-16,1.),(-2.5841397986963688E-17,-9.809939192804824E-16,1.),(-2.5841397986963688E-17,-9.809939192804824E-16,1.),(-2.5841397986963688E-17,-9.809939192804824E-16,1.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#191=IFCCARTESIANPOINTLIST3D(((100.,200.,-2700.),(100.,0.,0.),(100.,0.,-2700.),(100.,200.,0.),(100.,0.,0.),(0.,0.,-2700.),(100.,0.,-2700.),(0.,0.,0.),(0.,0.,0.),(0.,200.,-2700.),(0.,0.,-2700.),(0.,200.,0.),(0.,200.,0.),(100.,200.,-2700.),(0.,200.,-2700.),(100.,200.,0.),(0.,200.,-2700.),(100.,0.,-2700.),(0.,0.,-2700.),(100.,200.,-2700.),(0.,0.,0.),(100.,200.,0.),(0.,200.,0.),(100.,0.,0.))); +#192=IFCSTYLEDITEM(#190,(#195),$); +#193=IFCSURFACESTYLERENDERING(#194,0.,$,$,$,$,$,$,.NOTDEFINED.); +#194=IFCCOLOURRGB($,0.7058823529411765,0.6352941176470588,0.49019607843137253); +#195=IFCSURFACESTYLE('wood_spruce_beam',.BOTH.,(#193)); +#196=IFCPRODUCTDEFINITIONSHAPE($,$,(#189)); +#197=IFCBEAM('0rh7bRO0L9fg1NzgGKU$Ut',#1,'girder','A strong girder, providing essential support for structures.','girder_segment',#203,#212,'454425.1027891.979946.932084.902515',$); +#198=IFCQUANTITYVOLUME('NetVolume',$,$,0.11600000000000245,$); +#199=IFCQUANTITYLENGTH('Length',$,$,5800.,$); +#200=IFCQUANTITYAREA('CrossSectionArea',$,$,0.02000000000000051,$); +#201=IFCELEMENTQUANTITY('2cRUAjExjAb9g9L2XAYQlF',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#198,#199,#200)); +#202=IFCRELDEFINESBYPROPERTIES('3mmtHmLXD3eOF9zTWsZaJW',#1,$,$,(#197),#201); +#203=IFCLOCALPLACEMENT(#168,#204); +#204=IFCAXIS2PLACEMENT3D(#205,#206,#207); +#205=IFCCARTESIANPOINT((2968.934,100.,2323.959)); +#206=IFCDIRECTION((4.0636983087920376E-17,1.,-3.925231146709433E-17)); +#207=IFCDIRECTION((0.707106781186548,-5.649026192406043E-17,-0.7071067811865472)); +#208=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#209)); +#209=IFCTRIANGULATEDFACESET(#210,((-1.,-3.3306690738754696E-16,-5.5511151231257784E-17),(-1.,-3.3306690738754696E-16,-5.5511151231257784E-17),(-1.,-3.3306690738754696E-16,-5.5511151231257784E-17),(-1.,-3.3306690738754696E-16,-5.5511151231257784E-17),(-7.216449660063519E-16,1.,1.5194923147441628E-32),(-7.216449660063519E-16,1.,1.5194923147441628E-32),(-7.216449660063519E-16,1.,1.5194923147441628E-32),(-7.216449660063519E-16,1.,1.5194923147441628E-32),(1.,3.3306690738754696E-16,5.5511151231257784E-17),(1.,3.3306690738754696E-16,5.5511151231257784E-17),(1.,3.3306690738754696E-16,5.5511151231257784E-17),(1.,3.3306690738754696E-16,5.5511151231257784E-17),(7.216449660063519E-16,-1.,-1.5194923147441628E-32),(7.216449660063519E-16,-1.,-1.5194923147441628E-32),(7.216449660063519E-16,-1.,-1.5194923147441628E-32),(7.216449660063519E-16,-1.,-1.5194923147441628E-32),(-5.551115123125786E-17,-4.3140830754274083E-32,1.),(-5.551115123125786E-17,-4.3140830754274083E-32,1.),(-5.551115123125786E-17,-4.3140830754274083E-32,1.),(-5.551115123125786E-17,-4.3140830754274083E-32,1.),(5.551115123125625E-17,2.107320271046997E-15,-1.),(5.551115123125625E-17,2.107320271046997E-15,-1.),(5.551115123125625E-17,2.107320271046997E-15,-1.),(5.551115123125625E-17,2.107320271046997E-15,-1.)),$,((3,2,1),(4,1,2),(7,6,5),(8,5,6),(11,10,9),(12,9,10),(15,14,13),(16,13,14),(19,18,17),(20,17,18),(23,22,21),(24,21,22)),$); +#210=IFCCARTESIANPOINTLIST3D(((-100.,-200.,5800.),(-100.,0.,0.),(-100.,0.,5800.),(-100.,-200.,0.),(-100.,0.,0.),(0.,0.,5800.),(-100.,0.,5800.),(0.,0.,0.),(0.,0.,0.),(0.,-200.,5800.),(0.,0.,5800.),(0.,-200.,0.),(0.,-200.,0.),(-100.,-200.,5800.),(0.,-200.,5800.),(-100.,-200.,0.),(0.,-200.,5800.),(-100.,0.,5800.),(0.,0.,5800.),(-100.,-200.,5800.),(0.,0.,0.),(-100.,-200.,0.),(0.,-200.,0.),(-100.,0.,0.))); +#211=IFCSTYLEDITEM(#209,(#195),$); +#212=IFCPRODUCTDEFINITIONSHAPE($,$,(#208)); +#213=IFCBEAM('3roxUKbVv98xiUcl22_T07',#1,'girder','A strong girder, providing essential support for structures.','girder_segment',#219,#228,'454425.1027891.979946.932084.902519',$); +#214=IFCQUANTITYVOLUME('NetVolume',$,$,0.011999999999998975,$); +#215=IFCQUANTITYLENGTH('Length',$,$,600.,$); +#216=IFCQUANTITYAREA('CrossSectionArea',$,$,0.020000000000000486,$); +#217=IFCELEMENTQUANTITY('1DSAthV5z4_B1cmsdtVHuf',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#214,#215,#216)); +#218=IFCRELDEFINESBYPROPERTIES('1UqjCSXHX84RL8RLdxQSl2',#1,$,$,(#213),#217); +#219=IFCLOCALPLACEMENT(#168,#220); +#220=IFCAXIS2PLACEMENT3D(#221,#222,#223); +#221=IFCCARTESIANPOINT((4748.223,5300.,544.67)); +#222=IFCDIRECTION((3.7338368651192706E-16,-1.,-3.4018669938152444E-16)); +#223=IFCDIRECTION((0.7071067811865472,-4.3787816729471714E-17,-0.707106781186548)); +#224=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#225)); +#225=IFCTRIANGULATEDFACESET(#226,((1.,3.3306690738754696E-16,5.366077952355484E-16),(1.,3.3306690738754696E-16,5.366077952355484E-16),(1.,3.3306690738754696E-16,5.366077952355484E-16),(1.,3.3306690738754696E-16,5.366077952355484E-16),(7.216449660063519E-16,-1.,-1.468842570919512E-31),(7.216449660063519E-16,-1.,-1.468842570919512E-31),(7.216449660063519E-16,-1.,-1.468842570919512E-31),(7.216449660063519E-16,-1.,-1.468842570919512E-31),(-1.,-3.3306690738754696E-16,-5.366077952355484E-16),(-1.,-3.3306690738754696E-16,-5.366077952355484E-16),(-1.,-3.3306690738754696E-16,-5.366077952355484E-16),(-1.,-3.3306690738754696E-16,-5.366077952355484E-16),(-7.216449660063519E-16,1.,1.468842570919512E-31),(-7.216449660063519E-16,1.,1.468842570919512E-31),(-7.216449660063519E-16,1.,1.468842570919512E-31),(-7.216449660063519E-16,1.,1.468842570919512E-31),(5.742532885991589E-18,4.462844560786505E-33,-1.),(5.742532885991589E-18,4.462844560786505E-33,-1.),(5.742532885991589E-18,4.462844560786505E-33,-1.),(5.742532885991589E-18,4.462844560786505E-33,-1.),(-5.742532885991422E-18,-2.1799864872897677E-16,1.),(-5.742532885991422E-18,-2.1799864872897677E-16,1.),(-5.742532885991422E-18,-2.1799864872897677E-16,1.),(-5.742532885991422E-18,-2.1799864872897677E-16,1.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#226=IFCCARTESIANPOINTLIST3D(((100.,200.,-600.),(100.,0.,0.),(100.,0.,-600.),(100.,200.,0.),(100.,0.,0.),(0.,0.,-600.),(100.,0.,-600.),(0.,0.,0.),(0.,0.,0.),(0.,200.,-600.),(0.,0.,-600.),(0.,200.,0.),(0.,200.,0.),(100.,200.,-600.),(0.,200.,-600.),(100.,200.,0.),(0.,200.,-600.),(100.,0.,-600.),(0.,0.,-600.),(100.,200.,-600.),(0.,0.,0.),(100.,200.,0.),(0.,200.,0.),(100.,0.,0.))); +#227=IFCSTYLEDITEM(#225,(#195),$); +#228=IFCPRODUCTDEFINITIONSHAPE($,$,(#224)); +#229=IFCBEAM('0Lvk$Qa81D5et3l3a4S9Vk',#1,'girder','A strong girder, providing essential support for structures.','girder_segment',#235,#244,'454425.1027891.979946.932084.902516',$); +#230=IFCQUANTITYVOLUME('NetVolume',$,$,0.08000000000000054,$); +#231=IFCQUANTITYLENGTH('Length',$,$,4000.,$); +#232=IFCQUANTITYAREA('CrossSectionArea',$,$,0.02000000000000048,$); +#233=IFCELEMENTQUANTITY('0jhhk080jB_vq5U3vdfbhV',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#230,#231,#232)); +#234=IFCRELDEFINESBYPROPERTIES('0t4vIWNOH4TuoEMwPzfp$l',#1,$,$,(#229),#233); +#235=IFCLOCALPLACEMENT(#168,#236); +#236=IFCAXIS2PLACEMENT3D(#237,#238,#239); +#237=IFCCARTESIANPOINT((3823.223,1900.,1469.67)); +#238=IFCDIRECTION((-1.5656965033853333E-17,-1.,-1.7663540160193257E-17)); +#239=IFCDIRECTION((0.7071067811865472,5.979740166137521E-17,-0.707106781186548)); +#240=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#241)); +#241=IFCTRIANGULATEDFACESET(#242,((1.,3.3306690738754706E-16,8.049116928532481E-17),(1.,3.3306690738754706E-16,8.049116928532481E-17),(1.,3.3306690738754706E-16,8.049116928532481E-17),(1.,3.3306690738754706E-16,8.049116928532481E-17),(7.216449660063518E-16,-1.,-2.2032638563790633E-32),(7.216449660063518E-16,-1.,-2.2032638563790633E-32),(7.216449660063518E-16,-1.,-2.2032638563790633E-32),(7.216449660063518E-16,-1.,-2.2032638563790633E-32),(-1.,-3.3306690738754706E-16,-8.049116928532481E-17),(-1.,-3.3306690738754706E-16,-8.049116928532481E-17),(-1.,-3.3306690738754706E-16,-8.049116928532481E-17),(-1.,-3.3306690738754706E-16,-8.049116928532481E-17),(-7.216449660063518E-16,1.,2.2032638563790633E-32),(-7.216449660063518E-16,1.,2.2032638563790633E-32),(-7.216449660063518E-16,1.,2.2032638563790633E-32),(-7.216449660063518E-16,1.,2.2032638563790633E-32),(3.82835525732808E-17,2.9752297071912793E-32,-1.),(3.82835525732808E-17,2.9752297071912793E-32,-1.),(3.82835525732808E-17,2.9752297071912793E-32,-1.),(3.82835525732808E-17,2.9752297071912793E-32,-1.),(-3.8283552573279685E-17,-1.4533243248599799E-15,1.),(-3.8283552573279685E-17,-1.4533243248599799E-15,1.),(-3.8283552573279685E-17,-1.4533243248599799E-15,1.),(-3.8283552573279685E-17,-1.4533243248599799E-15,1.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#242=IFCCARTESIANPOINTLIST3D(((100.,200.,-4000.),(100.,0.,0.),(100.,0.,-4000.),(100.,200.,0.),(100.,0.,0.),(0.,0.,-4000.),(100.,0.,-4000.),(0.,0.,0.),(0.,0.,0.),(0.,200.,-4000.),(0.,0.,-4000.),(0.,200.,0.),(0.,200.,0.),(100.,200.,-4000.),(0.,200.,-4000.),(100.,200.,0.),(0.,200.,-4000.),(100.,0.,-4000.),(0.,0.,-4000.),(100.,200.,-4000.),(0.,0.,0.),(100.,200.,0.),(0.,200.,0.),(100.,0.,0.))); +#243=IFCSTYLEDITEM(#241,(#195),$); +#244=IFCPRODUCTDEFINITIONSHAPE($,$,(#240)); +#245=IFCBEAM('2ddLgAnQf4mBfh5IpUp54U',#1,'girder','A strong girder, providing essential support for structures.','girder_segment',#251,#260,'454425.1027891.979946.932084.902517',$); +#246=IFCQUANTITYVOLUME('NetVolume',$,$,0.11600000000000235,$); +#247=IFCQUANTITYLENGTH('Length',$,$,5800.,$); +#248=IFCQUANTITYAREA('CrossSectionArea',$,$,0.020000000000000493,$); +#249=IFCELEMENTQUANTITY('2UR3uT7K16fBzZtaOnSKjy',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#246,#247,#248)); +#250=IFCRELDEFINESBYPROPERTIES('2p7xyguVn9Fuu2aQAQaScf',#1,$,$,(#245),#249); +#251=IFCLOCALPLACEMENT(#168,#252); +#252=IFCAXIS2PLACEMENT3D(#253,#254,#255); +#253=IFCCARTESIANPOINT((2050.,100.,3225.736)); +#254=IFCDIRECTION((7.038531937459524E-17,-1.,-2.3801837657530415E-32)); +#255=IFCDIRECTION((1.,7.038531937459524E-17,-8.881784197001246E-16)); +#256=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#257)); +#257=IFCTRIANGULATEDFACESET(#258,((1.,3.3306690738754696E-16,5.5511151231257784E-17),(1.,3.3306690738754696E-16,5.5511151231257784E-17),(1.,3.3306690738754696E-16,5.5511151231257784E-17),(1.,3.3306690738754696E-16,5.5511151231257784E-17),(7.216449660063519E-16,-1.,-1.5194923147441628E-32),(7.216449660063519E-16,-1.,-1.5194923147441628E-32),(7.216449660063519E-16,-1.,-1.5194923147441628E-32),(7.216449660063519E-16,-1.,-1.5194923147441628E-32),(-1.,-3.3306690738754696E-16,-5.5511151231257784E-17),(-1.,-3.3306690738754696E-16,-5.5511151231257784E-17),(-1.,-3.3306690738754696E-16,-5.5511151231257784E-17),(-1.,-3.3306690738754696E-16,-5.5511151231257784E-17),(-7.216449660063519E-16,1.,1.5194923147441628E-32),(-7.216449660063519E-16,1.,1.5194923147441628E-32),(-7.216449660063519E-16,1.,1.5194923147441628E-32),(-7.216449660063519E-16,1.,1.5194923147441628E-32),(5.551115123125786E-17,4.3140830754274083E-32,-1.),(5.551115123125786E-17,4.3140830754274083E-32,-1.),(5.551115123125786E-17,4.3140830754274083E-32,-1.),(5.551115123125786E-17,4.3140830754274083E-32,-1.),(-5.551115123125625E-17,-2.107320271046997E-15,1.),(-5.551115123125625E-17,-2.107320271046997E-15,1.),(-5.551115123125625E-17,-2.107320271046997E-15,1.),(-5.551115123125625E-17,-2.107320271046997E-15,1.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#258=IFCCARTESIANPOINTLIST3D(((100.,200.,-5800.),(100.,0.,0.),(100.,0.,-5800.),(100.,200.,0.),(100.,0.,0.),(0.,0.,-5800.),(100.,0.,-5800.),(0.,0.,0.),(0.,0.,0.),(0.,200.,-5800.),(0.,0.,-5800.),(0.,200.,0.),(0.,200.,0.),(100.,200.,-5800.),(0.,200.,-5800.),(100.,200.,0.),(0.,200.,-5800.),(100.,0.,-5800.),(0.,0.,-5800.),(100.,200.,-5800.),(0.,0.,0.),(100.,200.,0.),(0.,200.,0.),(100.,0.,0.))); +#259=IFCSTYLEDITEM(#257,(#195),$); +#260=IFCPRODUCTDEFINITIONSHAPE($,$,(#256)); +#261=IFCBEAM('2fjJuPht9EIQaZQYZfC1Op',#1,'girder','A strong girder, providing essential support for structures.','girder_segment',#267,#273,'454425.1027891.979946.932084.902512',$); +#262=IFCQUANTITYVOLUME('NetVolume',$,$,0.11600000000000235,$); +#263=IFCQUANTITYLENGTH('Length',$,$,5800.,$); +#264=IFCQUANTITYAREA('CrossSectionArea',$,$,0.020000000000000493,$); +#265=IFCELEMENTQUANTITY('0WHjnPa4j8felpsOvHemt0',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#262,#263,#264)); +#266=IFCRELDEFINESBYPROPERTIES('3HYZbgUgr3aBDhe21HscN1',#1,$,$,(#261),#265); +#267=IFCLOCALPLACEMENT(#168,#268); +#268=IFCAXIS2PLACEMENT3D(#269,#270,#271); +#269=IFCCARTESIANPOINT((1231.066,100.,2323.959)); +#270=IFCDIRECTION((1.487416814333745E-17,-1.,1.880229722470312E-33)); +#271=IFCDIRECTION((0.7071067811865482,1.0517625158662842E-17,0.7071067811865468)); +#272=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#257)); +#273=IFCPRODUCTDEFINITIONSHAPE($,$,(#272)); +#274=IFCDISCRETEACCESSORYTYPE('1i7uuLYVf6ShdGFfCgAhuD',#1,'beam shoe','A robust shoe, providing stable support for beams.',$,$,$,'880093','shoe',.SHOE.); +#275=IFCRELDEFINESBYTYPE('2WxkgoJp57vPJ9Jr6S$j_w',#1,$,$,(#276,#292),#274); +#276=IFCDISCRETEACCESSORY('38dURdIk57HPT_EckeLnt6',#1,'beam shoe','A robust shoe, providing stable support for beams.','shoe',#279,#291,'454425.1027891.979946.932084.2037920.2037925',$); +#277=IFCRELASSOCIATESMATERIAL('0h96c29SfAxQbCDOLFZN7y',#1,$,$,(#276,#292),#278); +#278=IFCMATERIAL('metal_steel-galvanized',$,$); +#279=IFCLOCALPLACEMENT(#168,#280); +#280=IFCAXIS2PLACEMENT3D(#281,#282,#283); +#281=IFCCARTESIANPOINT((4783.579,5300.,509.315)); +#282=IFCDIRECTION((1.487416814333745E-17,-1.,0.)); +#283=IFCDIRECTION((-0.7071067811865945,-1.051762515866353E-17,0.7071067811865007)); +#284=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#285)); +#285=IFCTRIANGULATEDFACESET(#286,((-2.510024628003296E-13,5.105552743534459E-13,1.),(-2.510024628003296E-13,5.105552743534459E-13,1.),(-2.510024628003296E-13,5.105552743534459E-13,1.),(-2.510024628003296E-13,5.105552743534459E-13,1.),(-2.510024628003296E-13,5.105552743534459E-13,1.),(-2.510024628003296E-13,5.105552743534459E-13,1.),(-2.510024628003296E-13,5.105552743534459E-13,1.),(-2.510024628003296E-13,5.105552743534459E-13,1.),(-2.510024628003296E-13,5.105552743534459E-13,1.),(-2.510024628003296E-13,5.105552743534459E-13,1.),(1.,-5.78981307342019E-14,-1.489467835798555E-13),(1.,-5.78981307342019E-14,-1.489467835798555E-13),(1.,-5.78981307342019E-14,-1.489467835798555E-13),(1.,-5.78981307342019E-14,-1.489467835798555E-13),(6.872280522429719E-14,-1.,0.),(6.872280522429719E-14,-1.,0.),(6.872280522429719E-14,-1.,0.),(6.872280522429719E-14,-1.,0.),(1.,7.632783294297951E-14,3.110398740866835E-14),(1.,7.632783294297951E-14,3.110398740866835E-14),(1.,7.632783294297951E-14,3.110398740866835E-14),(1.,7.632783294297951E-14,3.110398740866835E-14),(1.,7.632783294297951E-14,3.110398740866835E-14),(-3.735345366351339E-13,-0.6050832675335698,-0.7961621941230935),(-3.735345366351339E-13,-0.6050832675335698,-0.7961621941230935),(-3.735345366351339E-13,-0.6050832675335698,-0.7961621941230935),(-3.735345366351339E-13,-0.6050832675335698,-0.7961621941230935),(2.0949908474676704E-13,-0.6050832675334072,-0.7961621941232171),(2.0949908474676704E-13,-0.6050832675334072,-0.7961621941232171),(2.0949908474676704E-13,-0.6050832675334072,-0.7961621941232171),(2.0949908474676704E-13,-0.6050832675334072,-0.7961621941232171),(-0.,-0.,-1.),(-0.,-0.,-1.),(-0.,-0.,-1.),(-0.,-0.,-1.),(-0.,-0.,-1.),(-0.,-0.,-1.),(-0.,-0.,-1.),(-0.,-0.,-1.),(-1.,2.992051051364796E-14,4.773785893591513E-14),(-1.,2.992051051364796E-14,4.773785893591513E-14),(-1.,2.992051051364796E-14,4.773785893591513E-14),(-1.,2.992051051364796E-14,4.773785893591513E-14),(-1.,2.992051051364796E-14,4.773785893591513E-14),(-4.997030444161708E-14,-1.,-3.3689199578799613E-12),(-4.997030444161708E-14,-1.,-3.3689199578799613E-12),(-4.997030444161708E-14,-1.,-3.3689199578799613E-12),(-4.997030444161708E-14,-1.,-3.3689199578799613E-12),(-4.997030444161708E-14,-1.,-3.3689199578799613E-12),(3.083274104062946E-14,-1.,-1.4438228390530732E-12),(3.083274104062946E-14,-1.,-1.4438228390530732E-12),(3.083274104062946E-14,-1.,-1.4438228390530732E-12),(3.083274104062946E-14,-1.,-1.4438228390530732E-12),(3.083274104062946E-14,-1.,-1.4438228390530732E-12),(-1.,-5.3734794391857564E-14,7.5588181517279E-14),(-1.,-5.3734794391857564E-14,7.5588181517279E-14),(-1.,-5.3734794391857564E-14,7.5588181517279E-14),(-1.,-5.3734794391857564E-14,7.5588181517279E-14),(-1.,2.770006446439765E-14,-3.6095570976613566E-12),(-1.,2.770006446439765E-14,-3.6095570976613566E-12),(-1.,2.770006446439765E-14,-3.6095570976613566E-12),(-1.,2.770006446439765E-14,-3.6095570976613566E-12),(1.2416876415955632E-12,-1.1208135741380136E-26,-1.),(1.2416876415955632E-12,-1.1208135741380136E-26,-1.),(1.2416876415955632E-12,-1.1208135741380136E-26,-1.),(1.2416876415955632E-12,-1.1208135741380136E-26,-1.),(1.,-5.5455640080026557E-14,0.),(1.,-5.5455640080026557E-14,0.),(1.,-5.5455640080026557E-14,0.),(1.,-5.5455640080026557E-14,0.),(1.2994405551581886E-13,-5.604067870690068E-27,-1.),(1.2994405551581886E-13,-5.604067870690068E-27,-1.),(1.2994405551581886E-13,-5.604067870690068E-27,-1.),(1.2994405551581886E-13,-5.604067870690068E-27,-1.),(5.362377208939506E-14,1.,-1.3926637620898714E-13),(5.362377208939506E-14,1.,-1.3926637620898714E-13),(5.362377208939506E-14,1.,-1.3926637620898714E-13),(5.362377208939506E-14,1.,-1.3926637620898714E-13),(5.362377208939506E-14,1.,-1.3926637620898714E-13),(5.362377208939506E-14,1.,-1.3926637620898714E-13),(-0.7071067811865883,0.7071067811865067,-3.063019509727667E-12),(-0.7071067811865883,0.7071067811865067,-3.063019509727667E-12),(-0.7071067811865883,0.7071067811865067,-3.063019509727667E-12),(-0.7071067811865883,0.7071067811865067,-3.063019509727667E-12),(0.70710678118667,0.7071067811864251,-2.041749214560281E-12),(0.70710678118667,0.7071067811864251,-2.041749214560281E-12),(0.70710678118667,0.7071067811864251,-2.041749214560281E-12),(0.70710678118667,0.7071067811864251,-2.041749214560281E-12)),$,((3,2,1),(4,1,2),(5,1,4),(8,7,6),(9,6,7),(10,9,7),(4,10,7),(2,10,4),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(23,19,22),(26,25,24),(27,24,25),(30,29,28),(31,28,29),(34,33,32),(35,32,33),(36,33,34),(37,35,33),(39,38,37),(35,37,38),(42,41,40),(43,40,41),(44,40,43),(47,46,45),(48,45,46),(48,46,49),(52,51,50),(53,50,51),(54,50,53),(57,56,55),(58,55,56),(61,60,59),(62,59,60),(65,64,63),(66,63,64),(69,68,67),(70,67,68),(73,72,71),(74,71,72),(77,76,75),(78,75,76),(79,78,76),(80,79,76),(83,82,81),(84,81,82),(87,86,85),(88,85,86)),$); +#286=IFCCARTESIANPOINTLIST3D(((-104.,-150.,0.),(-50.,0.,0.),(-50.,-150.,0.),(-54.,4.,0.),(-104.,-46.,0.),(104.,-150.,0.),(54.,4.,0.),(104.,-46.,0.),(50.,-150.,0.),(50.,0.,0.),(54.,4.,-80.),(54.,-150.,-4.),(54.,4.,-4.),(54.,-50.,-80.),(50.,0.,-80.),(-50.,0.,0.),(50.,0.,0.),(-50.,0.,-80.),(-50.,-50.,-80.),(-50.,0.,0.),(-50.,0.,-80.),(-50.,-150.,0.),(-50.,-150.,-4.),(-54.,-50.,-80.),(-50.,-150.,-4.),(-50.,-50.,-80.),(-54.,-150.,-4.),(54.,-50.,-80.),(50.,-150.,-4.),(54.,-150.,-4.),(50.,-50.,-80.),(54.,4.,-80.),(50.,0.,-80.),(54.,-50.,-80.),(-54.,4.,-80.),(50.,-50.,-80.),(-50.,0.,-80.),(-54.,-50.,-80.),(-50.,-50.,-80.),(50.,-150.,0.),(50.,0.,-80.),(50.,0.,0.),(50.,-50.,-80.),(50.,-150.,-4.),(-50.,-150.,-4.),(-104.,-150.,0.),(-50.,-150.,0.),(-54.,-150.,-4.),(-104.,-150.,-4.),(104.,-150.,-4.),(50.,-150.,0.),(104.,-150.,0.),(50.,-150.,-4.),(54.,-150.,-4.),(-54.,4.,-4.),(-54.,-50.,-80.),(-54.,4.,-80.),(-54.,-150.,-4.),(-104.,-46.,0.),(-104.,-150.,-4.),(-104.,-46.,-4.),(-104.,-150.,0.),(-54.,4.,-4.),(-104.,-150.,-4.),(-54.,-150.,-4.),(-104.,-46.,-4.),(104.,-150.,-4.),(104.,-46.,0.),(104.,-46.,-4.),(104.,-150.,0.),(54.,4.,-4.),(104.,-150.,-4.),(104.,-46.,-4.),(54.,-150.,-4.),(-54.,4.,0.),(54.,4.,-4.),(54.,4.,0.),(-54.,4.,-4.),(-54.,4.,-80.),(54.,4.,-80.),(-104.,-46.,0.),(-54.,4.,-4.),(-54.,4.,0.),(-104.,-46.,-4.),(54.,4.,-4.),(104.,-46.,0.),(54.,4.,0.),(104.,-46.,-4.))); +#287=IFCSTYLEDITEM(#285,(#290),$); +#288=IFCSURFACESTYLERENDERING(#289,0.,$,$,$,$,$,$,.NOTDEFINED.); +#289=IFCCOLOURRGB($,0.6,0.6,0.6); +#290=IFCSURFACESTYLE('metal_steel-galvanized',.BOTH.,(#288)); +#291=IFCPRODUCTDEFINITIONSHAPE($,$,(#284)); +#292=IFCDISCRETEACCESSORY('0kNW_gyKT7mgsI4WnaPU0I',#1,'beam shoe','A robust shoe, providing stable support for beams.','shoe',#293,#302,'454425.1027891.979946.932084.2037920.2037924',$); +#293=IFCLOCALPLACEMENT(#168,#294); +#294=IFCAXIS2PLACEMENT3D(#295,#296,#297); +#295=IFCCARTESIANPOINT((4783.579,4600.,509.315)); +#296=IFCDIRECTION((1.487416814333745E-17,-1.,0.)); +#297=IFCDIRECTION((0.7071067811865945,1.051762515866353E-17,-0.7071067811865006)); +#298=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#299)); +#299=IFCTRIANGULATEDFACESET(#300,((2.510024628003296E-13,-5.105552743534459E-13,-1.),(2.510024628003296E-13,-5.105552743534459E-13,-1.),(2.510024628003296E-13,-5.105552743534459E-13,-1.),(2.510024628003296E-13,-5.105552743534459E-13,-1.),(2.510024628003296E-13,-5.105552743534459E-13,-1.),(2.510024628003296E-13,-5.105552743534459E-13,-1.),(2.510024628003296E-13,-5.105552743534459E-13,-1.),(2.510024628003296E-13,-5.105552743534459E-13,-1.),(2.510024628003296E-13,-5.105552743534459E-13,-1.),(2.510024628003296E-13,-5.105552743534459E-13,-1.),(-1.,5.78981307342019E-14,1.489467835798555E-13),(-1.,5.78981307342019E-14,1.489467835798555E-13),(-1.,5.78981307342019E-14,1.489467835798555E-13),(-1.,5.78981307342019E-14,1.489467835798555E-13),(-6.872280522429719E-14,1.,0.),(-6.872280522429719E-14,1.,0.),(-6.872280522429719E-14,1.,0.),(-6.872280522429719E-14,1.,0.),(-1.,-7.632783294297951E-14,-3.110398740866835E-14),(-1.,-7.632783294297951E-14,-3.110398740866835E-14),(-1.,-7.632783294297951E-14,-3.110398740866835E-14),(-1.,-7.632783294297951E-14,-3.110398740866835E-14),(-1.,-7.632783294297951E-14,-3.110398740866835E-14),(3.735345366351339E-13,0.6050832675335698,0.7961621941230935),(3.735345366351339E-13,0.6050832675335698,0.7961621941230935),(3.735345366351339E-13,0.6050832675335698,0.7961621941230935),(3.735345366351339E-13,0.6050832675335698,0.7961621941230935),(-2.0949908474676704E-13,0.6050832675334072,0.7961621941232171),(-2.0949908474676704E-13,0.6050832675334072,0.7961621941232171),(-2.0949908474676704E-13,0.6050832675334072,0.7961621941232171),(-2.0949908474676704E-13,0.6050832675334072,0.7961621941232171),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(1.,-2.992051051364796E-14,-4.773785893591513E-14),(1.,-2.992051051364796E-14,-4.773785893591513E-14),(1.,-2.992051051364796E-14,-4.773785893591513E-14),(1.,-2.992051051364796E-14,-4.773785893591513E-14),(1.,-2.992051051364796E-14,-4.773785893591513E-14),(4.997030444161708E-14,1.,3.3689199578799613E-12),(4.997030444161708E-14,1.,3.3689199578799613E-12),(4.997030444161708E-14,1.,3.3689199578799613E-12),(4.997030444161708E-14,1.,3.3689199578799613E-12),(4.997030444161708E-14,1.,3.3689199578799613E-12),(-3.083274104062946E-14,1.,1.4438228390530732E-12),(-3.083274104062946E-14,1.,1.4438228390530732E-12),(-3.083274104062946E-14,1.,1.4438228390530732E-12),(-3.083274104062946E-14,1.,1.4438228390530732E-12),(-3.083274104062946E-14,1.,1.4438228390530732E-12),(1.,5.3734794391857564E-14,-7.5588181517279E-14),(1.,5.3734794391857564E-14,-7.5588181517279E-14),(1.,5.3734794391857564E-14,-7.5588181517279E-14),(1.,5.3734794391857564E-14,-7.5588181517279E-14),(1.,-2.770006446439765E-14,3.6095570976613566E-12),(1.,-2.770006446439765E-14,3.6095570976613566E-12),(1.,-2.770006446439765E-14,3.6095570976613566E-12),(1.,-2.770006446439765E-14,3.6095570976613566E-12),(-1.2416876415955632E-12,1.1208135741380136E-26,1.),(-1.2416876415955632E-12,1.1208135741380136E-26,1.),(-1.2416876415955632E-12,1.1208135741380136E-26,1.),(-1.2416876415955632E-12,1.1208135741380136E-26,1.),(-1.,5.5455640080026557E-14,0.),(-1.,5.5455640080026557E-14,0.),(-1.,5.5455640080026557E-14,0.),(-1.,5.5455640080026557E-14,0.),(-1.2994405551581886E-13,5.604067870690068E-27,1.),(-1.2994405551581886E-13,5.604067870690068E-27,1.),(-1.2994405551581886E-13,5.604067870690068E-27,1.),(-1.2994405551581886E-13,5.604067870690068E-27,1.),(-5.362377208939506E-14,-1.,1.3926637620898714E-13),(-5.362377208939506E-14,-1.,1.3926637620898714E-13),(-5.362377208939506E-14,-1.,1.3926637620898714E-13),(-5.362377208939506E-14,-1.,1.3926637620898714E-13),(-5.362377208939506E-14,-1.,1.3926637620898714E-13),(-5.362377208939506E-14,-1.,1.3926637620898714E-13),(0.7071067811865883,-0.7071067811865067,3.063019509727667E-12),(0.7071067811865883,-0.7071067811865067,3.063019509727667E-12),(0.7071067811865883,-0.7071067811865067,3.063019509727667E-12),(0.7071067811865883,-0.7071067811865067,3.063019509727667E-12),(-0.70710678118667,-0.7071067811864251,2.041749214560281E-12),(-0.70710678118667,-0.7071067811864251,2.041749214560281E-12),(-0.70710678118667,-0.7071067811864251,2.041749214560281E-12),(-0.70710678118667,-0.7071067811864251,2.041749214560281E-12)),$,((1,2,3),(2,1,4),(4,1,5),(6,7,8),(7,6,9),(7,9,10),(7,10,4),(4,10,2),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(22,19,23),(24,25,26),(25,24,27),(28,29,30),(29,28,31),(32,33,34),(33,32,35),(34,33,36),(33,35,37),(37,38,39),(38,37,35),(40,41,42),(41,40,43),(43,40,44),(45,46,47),(46,45,48),(49,46,48),(50,51,52),(51,50,53),(53,50,54),(55,56,57),(56,55,58),(59,60,61),(60,59,62),(63,64,65),(64,63,66),(67,68,69),(68,67,70),(71,72,73),(72,71,74),(75,76,77),(76,75,78),(76,78,79),(76,79,80),(81,82,83),(82,81,84),(85,86,87),(86,85,88)),$); +#300=IFCCARTESIANPOINTLIST3D(((104.,150.,0.),(50.,0.,0.),(50.,150.,0.),(54.,-4.,0.),(104.,46.,0.),(-104.,150.,0.),(-54.,-4.,0.),(-104.,46.,0.),(-50.,150.,0.),(-50.,0.,0.),(-54.,-4.,80.),(-54.,150.,4.),(-54.,-4.,4.),(-54.,50.,80.),(-50.,0.,80.),(50.,0.,0.),(-50.,0.,0.),(50.,0.,80.),(50.,50.,80.),(50.,0.,0.),(50.,0.,80.),(50.,150.,0.),(50.,150.,4.),(54.,50.,80.),(50.,150.,4.),(50.,50.,80.),(54.,150.,4.),(-54.,50.,80.),(-50.,150.,4.),(-54.,150.,4.),(-50.,50.,80.),(-54.,-4.,80.),(-50.,0.,80.),(-54.,50.,80.),(54.,-4.,80.),(-50.,50.,80.),(50.,0.,80.),(54.,50.,80.),(50.,50.,80.),(-50.,150.,0.),(-50.,0.,80.),(-50.,0.,0.),(-50.,50.,80.),(-50.,150.,4.),(50.,150.,4.),(104.,150.,0.),(50.,150.,0.),(54.,150.,4.),(104.,150.,4.),(-104.,150.,4.),(-50.,150.,0.),(-104.,150.,0.),(-50.,150.,4.),(-54.,150.,4.),(54.,-4.,4.),(54.,50.,80.),(54.,-4.,80.),(54.,150.,4.),(104.,46.,0.),(104.,150.,4.),(104.,46.,4.),(104.,150.,0.),(54.,-4.,4.),(104.,150.,4.),(54.,150.,4.),(104.,46.,4.),(-104.,150.,4.),(-104.,46.,0.),(-104.,46.,4.),(-104.,150.,0.),(-54.,-4.,4.),(-104.,150.,4.),(-104.,46.,4.),(-54.,150.,4.),(54.,-4.,0.),(-54.,-4.,4.),(-54.,-4.,0.),(54.,-4.,4.),(54.,-4.,80.),(-54.,-4.,80.),(104.,46.,0.),(54.,-4.,4.),(54.,-4.,0.),(104.,46.,4.),(-54.,-4.,4.),(-104.,46.,0.),(-54.,-4.,0.),(-104.,46.,4.))); +#301=IFCSTYLEDITEM(#299,(#290),$); +#302=IFCPRODUCTDEFINITIONSHAPE($,$,(#298)); +#303=IFCBUILDINGELEMENTPROXYTYPE('3mjKLn_DjE4Beriey9bTvr',#1,'origin','The local position for coordination of aspect models.',$,$,$,'1028017','origin',.USERDEFINED.); +#304=IFCRELDEFINESBYTYPE('21U96ixejDwQmHCVkbTd2U',#1,$,$,(#305),#303); +#305=IFCBUILDINGELEMENTPROXY('2F44QMqSH3TOkM$SZoqCBe',#1,'origin','The local position for coordination of aspect models.','origin',#308,#320,'454425.1027891.1032757',$); +#306=IFCRELASSOCIATESMATERIAL('1QcTgcyaP1C9MT3_T1ZeJj',#1,$,$,(#305),#307); +#307=IFCMATERIAL('virtual_white',$,$); +#308=IFCLOCALPLACEMENT(#30,#309); +#309=IFCAXIS2PLACEMENT3D(#310,#311,#312); +#310=IFCCARTESIANPOINT((-5800.,-5800.,1300.)); +#311=IFCDIRECTION((0.,0.,1.)); +#312=IFCDIRECTION((1.,0.,0.)); +#313=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#314)); +#314=IFCTRIANGULATEDFACESET(#315,((1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#315=IFCCARTESIANPOINTLIST3D(((1000.,1000.,0.),(1000.,0.,1000.),(1000.,0.,0.),(1000.,1000.,1000.),(0.,1000.,1000.),(1000.,1000.,0.),(0.,1000.,0.),(1000.,1000.,1000.),(1000.,1000.,0.),(0.,0.,0.),(0.,1000.,0.),(1000.,0.,0.),(0.,1000.,1000.),(0.,0.,0.),(0.,0.,1000.),(0.,1000.,0.),(1000.,0.,1000.),(0.,1000.,1000.),(0.,0.,1000.),(1000.,1000.,1000.),(1000.,0.,1000.),(0.,0.,0.),(1000.,0.,0.),(0.,0.,1000.))); +#316=IFCSTYLEDITEM(#314,(#319),$); +#317=IFCSURFACESTYLERENDERING(#318,0.,$,$,$,$,$,$,.NOTDEFINED.); +#318=IFCCOLOURRGB($,1.,1.,1.); +#319=IFCSURFACESTYLE('virtual_white',.BOTH.,(#317)); +#320=IFCPRODUCTDEFINITIONSHAPE($,$,(#313)); +#321=IFCBUILDINGELEMENTPROXYTYPE('2IpkHFcdnD3xuZl6H52fWn',#1,'geo-reference','The reference point for transforming the local engineering coordinate system into the coordinate reference system of the underlying map.',$,$,$,'1028019','origin',.USERDEFINED.); +#322=IFCRELDEFINESBYTYPE('3530pFWy94WO4ESJ$CWAXG',#1,$,$,(#323),#321); +#323=IFCBUILDINGELEMENTPROXY('3Fit2Fad92zf2f6aWdJtF5',#1,'geo-reference','The reference point for transforming the local engineering coordinate system into the coordinate reference system of the underlying map.','origin',#327,#339,'454425.1032696',$); +#324=IFCRELASSOCIATESMATERIAL('2EBkr99ef9S8X3ZQxjf56M',#1,$,$,(#323),#325); +#325=IFCMATERIAL('virtual_black',$,$); +#326=IFCRELCONTAINEDINSPATIALSTRUCTURE('1TQuSfFPH3LQf64TA8Xh2z',#1,$,$,(#323),#21); +#327=IFCLOCALPLACEMENT(#23,#328); +#328=IFCAXIS2PLACEMENT3D(#329,#330,#331); +#329=IFCCARTESIANPOINT((0.,0.,0.)); +#330=IFCDIRECTION((0.,0.,1.)); +#331=IFCDIRECTION((1.,1.487416814333745E-17,0.)); +#332=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#333)); +#333=IFCTRIANGULATEDFACESET(#334,((-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-0.09801728974624706,0.9951847119559265,-2.8293428708776068E-14),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-0.09801728974624706,0.9951847119559265,-2.8293428708776068E-14),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-0.9951847119558951,0.09801728974656551,1.7414784486937357E-13),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(-0.9951847119558951,0.09801728974656551,1.7414784486937357E-13),(0.38268339078040076,-0.9238795497362281,0.),(0.19509039794782512,-0.980785265299474,0.),(0.38268339078040076,-0.9238795497362281,0.),(0.19509039794782512,-0.980785265299474,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9238795497362351,-0.3826833907803836,0.),(0.9238795497362351,-0.3826833907803836,0.),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9238795497362351,-0.3826833907803836,0.),(0.8314696223790943,-0.5555702179389808,0.),(0.8314696223790943,-0.5555702179389808,0.),(0.9238795497362351,-0.3826833907803836,0.),(0.9951847119559278,-0.09801728974623324,-9.75332807319653E-13),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9951847119559278,-0.09801728974623324,-9.75332807319653E-13),(0.5555702179389931,-0.8314696223790862,0.),(0.38268339078040076,-0.9238795497362281,0.),(0.5555702179389931,-0.8314696223790862,0.),(0.38268339078040076,-0.9238795497362281,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.5555702179389931,-0.8314696223790862,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.5555702179389931,-0.8314696223790862,0.),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-0.38268349542963814,0.9238795063890931,0.),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-0.38268349542963814,0.9238795063890931,0.),(0.8314696223790943,-0.5555702179389808,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.8314696223790943,-0.5555702179389808,0.),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(-0.9238795063891102,0.38268349542959684,0.),(-0.9238795063891102,0.38268349542959684,0.),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(0.19509039794782512,-0.980785265299474,0.),(0.09801728974630905,-0.9951847119559203,0.),(0.19509039794782512,-0.980785265299474,0.),(0.09801728974630905,-0.9951847119559203,0.),(0.9447142547101878,0.3278947650502742,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9447142547101878,0.3278947650502742,0.),(0.8957596329165385,0.44453872726369803,0.),(0.9447142547101878,0.3278947650502742,0.),(0.9447142547101878,0.3278947650502742,0.),(0.8957596329165385,0.44453872726369803,0.),(0.36763569523471507,-0.9299698896143292,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.36763569523471507,-0.9299698896143292,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.36763569523471507,-0.9299698896143292,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.36763569523471507,-0.9299698896143292,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.6371382701240347,-0.7707495214032589,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.6371382701240347,-0.7707495214032589,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9752819685766632,-0.22096398296833067,0.),(0.9752819685766632,-0.22096398296833067,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9999995436725548,-0.0009553296197073197,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9999995436725548,-0.0009553296197073197,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.8576732356667385,0.5141951194059969,0.),(-0.8576732356667385,0.5141951194059969,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.3790838524776873,0.9253623251411714,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.3790838524776873,0.9253623251411714,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.012947889549911789,0.9999161725645823,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.012947889549911789,0.9999161725645823,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.3790838524776873,0.9253623251411714,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.3790838524776873,0.9253623251411714,0.),(0.25678560352314495,0.9664683925629717,0.),(0.38760898056242665,0.9218238867524298,0.),(0.25678560352314495,0.9664683925629717,0.),(0.38760898056242665,0.9218238867524298,0.),(-0.021878265380184617,-0.9997606421058765,0.),(0.18338909196229686,-0.9830404065699663,0.),(-0.021878265380184617,-0.9997606421058765,0.),(0.18338909196229686,-0.9830404065699663,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.021878265380184617,-0.9997606421058765,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.021878265380184617,-0.9997606421058765,0.),(0.9946569870411934,0.10323506250366385,0.),(0.9999995436725548,-0.0009553296197073197,0.),(0.9999995436725548,-0.0009553296197073197,0.),(0.9946569870411934,0.10323506250366385,0.),(0.817214458947544,-0.5763336950821748,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.817214458947544,-0.5763336950821748,0.),(0.8893220941653559,-0.45728132788180387,0.),(0.817214458947544,-0.5763336950821748,0.),(0.817214458947544,-0.5763336950821748,0.),(0.8893220941653559,-0.45728132788180387,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9447848469584931,0.32769130741845615,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9447848469584931,0.32769130741845615,0.),(0.38760898056242665,0.9218238867524298,0.),(0.5120817306320317,0.8589367270951357,0.),(0.38760898056242665,0.9218238867524298,0.),(0.5120817306320317,0.8589367270951357,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9946569870411934,0.10323506250366385,0.),(0.9946569870411934,0.10323506250366385,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9453223709696031,0.3261374172713214,0.),(0.8598493850403663,0.5105477793955271,0.),(0.8598493850403663,0.5105477793955271,0.),(0.9453223709696031,0.3261374172713214,0.),(0.8598493850403663,0.5105477793955271,0.),(0.7345761428927619,0.6785262635247017,0.),(0.7345761428927619,0.6785262635247017,0.),(0.8598493850403663,0.5105477793955271,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9088850097664936,-0.41704680675166556,0.),(-0.9088850097664936,-0.41704680675166556,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9088850097664936,-0.41704680675166556,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.9088850097664936,-0.41704680675166556,0.),(0.9882991966281712,0.15252769566249838,0.),(0.9453223709696031,0.3261374172713214,0.),(0.9453223709696031,0.3261374172713214,0.),(0.9882991966281712,0.15252769566249838,0.),(-0.8576732356667385,0.5141951194059969,0.),(-0.9447848469584931,0.32769130741845615,0.),(-0.9447848469584931,0.32769130741845615,0.),(-0.8576732356667385,0.5141951194059969,0.),(0.9752819685766632,-0.22096398296833067,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.9752819685766632,-0.22096398296833067,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(-0.12780975406149545,-0.991798702745038,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(-0.12780975406149545,-0.991798702745038,0.),(0.12233197847190952,-0.9924892377467619,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(0.12233197847190952,-0.9924892377467619,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.12233197847190952,-0.9924892377467619,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.12233197847190952,-0.9924892377467619,0.),(0.5120817306320317,0.8589367270951357,0.),(0.6291972681526775,0.7772456482664974,0.),(0.5120817306320317,0.8589367270951357,0.),(0.6291972681526775,0.7772456482664974,0.),(0.7362866814501166,0.6766697294243142,0.),(0.8266452258336311,0.5627234406051209,0.),(0.8266452258336311,0.5627234406051209,0.),(0.7362866814501166,0.6766697294243142,0.),(0.8266452258336311,0.5627234406051209,0.),(0.8957596329165385,0.44453872726369803,0.),(0.8957596329165385,0.44453872726369803,0.),(0.8266452258336311,0.5627234406051209,0.),(-0.012947889549911789,0.9999161725645823,0.),(0.12580746189129235,0.9920546771889498,0.),(-0.012947889549911789,0.9999161725645823,0.),(0.12580746189129235,0.9920546771889498,0.),(0.12580746189129235,0.9920546771889498,0.),(0.25678560352314495,0.9664683925629717,0.),(0.12580746189129235,0.9920546771889498,0.),(0.25678560352314495,0.9664683925629717,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.8893220941653559,-0.45728132788180387,0.),(0.8893220941653559,-0.45728132788180387,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.6291972681526775,0.7772456482664974,0.),(0.7362866814501166,0.6766697294243142,0.),(0.6291972681526775,0.7772456482664974,0.),(0.7362866814501166,0.6766697294243142,0.),(-0.12780975406149545,-0.991798702745038,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.12780975406149545,-0.991798702745038,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.39586511141738157,-0.9183086700900217,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.39586511141738157,-0.9183086700900217,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.6371382701240347,-0.7707495214032589,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.6371382701240347,-0.7707495214032589,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.39586511141738157,-0.9183086700900217,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.39586511141738157,-0.9183086700900217,0.),(0.9999861252731272,0.00526775675575694,0.),(0.9882991966281712,0.15252769566249838,0.),(0.9882991966281712,0.15252769566249838,0.),(0.9999861252731272,0.00526775675575694,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.0002958514360789271,0.9999999562359629,0.),(-0.19223371225305855,0.981349173267807,0.),(0.0002958514360789271,0.9999999562359629,0.),(-0.19223371225305855,0.981349173267807,0.),(0.19272392771065497,0.9812530191993186,0.),(0.0002958514360789271,0.9999999562359629,0.),(0.19272392771065497,0.9812530191993186,0.),(0.0002958514360789271,0.9999999562359629,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9999861252731272,0.00526775675575694,0.),(0.9999861252731272,0.00526775675575694,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.7345761428927619,0.6785262635247017,0.),(0.578454045877275,0.8157149727743213,0.),(0.7345761428927619,0.6785262635247017,0.),(0.578454045877275,0.8157149727743213,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.9643985522083707,-0.2644530818470427,0.),(0.9643985522083707,-0.2644530818470427,0.),(0.9643985522083707,-0.2644530818470427,0.),(0.9643985522083707,-0.2644530818470427,0.),(-0.9625082715910013,0.27125233108473634,0.),(-0.9672095041928837,0.2539798712476175,0.),(-0.9672095041928837,0.2539798712476175,0.),(-0.9625082715910013,0.27125233108473634,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.9769988877805387,0.21324439799345352,0.),(0.9836499297931796,0.18009113142482358,0.),(0.9836499297931796,0.18009113142482358,0.),(0.9769988877805387,0.21324439799345352,0.),(-0.9731576010320436,0.23013970442658913,0.),(-0.9748015785129227,0.22307371545907045,0.),(-0.9748015785129227,0.22307371545907045,0.),(-0.9731576010320436,0.23013970442658913,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9633571078061799,-0.268222077464389,0.),(0.9633571078061799,-0.268222077464389,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9701425001453329,-0.24253562503632958,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9701425001453329,-0.24253562503632958,0.),(-0.9649338002855462,-0.2624933543282454,0.),(-0.9638016856477805,-0.2666201619204687,0.),(-0.9638016856477805,-0.2666201619204687,0.),(-0.9649338002855462,-0.2624933543282454,0.),(0.9741171320751483,0.2260438298155657,0.),(0.9767827016489056,0.21423247596819933,0.),(0.9767827016489056,0.21423247596819933,0.),(0.9741171320751483,0.2260438298155657,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(-0.9672095041928837,0.2539798712476175,0.),(-0.9716008047066287,0.2366260262385175,0.),(-0.9716008047066287,0.2366260262385175,0.),(-0.9672095041928837,0.2539798712476175,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.9501115102274097,0.31191043287038495,0.),(-0.9501115102274097,0.31191043287038495,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.9501115102274097,0.31191043287038495,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.9501115102274097,0.31191043287038495,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.7089870822585878,-0.7052214667680322,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.7089870822585878,-0.7052214667680322,0.),(0.7089870822585878,-0.7052214667680322,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.7089870822585878,-0.7052214667680322,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.7411781990788633,0.6713083324450941,0.),(-0.7411781990788633,0.6713083324450941,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.7411781990788633,0.6713083324450941,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.7411781990788633,0.6713083324450941,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.370770082790638,-0.9287246877882721,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.370770082790638,-0.9287246877882721,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.18338909196229686,-0.9830404065699663,0.),(0.370770082790638,-0.9287246877882721,0.),(0.18338909196229686,-0.9830404065699663,0.),(0.370770082790638,-0.9287246877882721,0.),(0.578454045877275,0.8157149727743213,0.),(0.392800811108307,0.9196235766837736,0.),(0.578454045877275,0.8157149727743213,0.),(0.392800811108307,0.9196235766837736,0.),(0.392800811108307,0.9196235766837736,0.),(0.19272392771065497,0.9812530191993186,0.),(0.392800811108307,0.9196235766837736,0.),(0.19272392771065497,0.9812530191993186,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.19223371225305855,0.981349173267807,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.19223371225305855,0.981349173267807,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.9714624054277151,0.23719358094307266,0.),(-0.9731576010320436,0.23013970442658913,0.),(-0.9731576010320436,0.23013970442658913,0.),(-0.9714624054277151,0.23719358094307266,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9660482448389756,-0.2583617398987992,0.),(-0.9649338002855462,-0.2624933543282454,0.),(-0.9649338002855462,-0.2624933543282454,0.),(-0.9660482448389756,-0.2583617398987992,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.9622060458243664,0.2723224657993486,0.),(0.965807041701975,0.25926194899923066,0.),(0.965807041701975,0.25926194899923066,0.),(0.9622060458243664,0.2723224657993486,0.),(0.965807041701975,0.25926194899923066,0.),(0.9769988877805387,0.21324439799345352,0.),(0.9769988877805387,0.21324439799345352,0.),(0.965807041701975,0.25926194899923066,0.),(0.9767827016489056,0.21423247596819933,0.),(0.9793050618474799,0.20238971278181062,0.),(0.9793050618474799,0.20238971278181062,0.),(0.9767827016489056,0.21423247596819933,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.8311604628836111,0.5560326293834755,0.),(0.8311604628836111,0.5560326293834755,0.),(0.8311604628836111,0.5560326293834755,0.),(0.8311604628836111,0.5560326293834755,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(-0.8313835216090105,-0.5556990552421339,0.),(-0.8313835216090105,-0.5556990552421339,0.),(-0.8313835216090105,-0.5556990552421339,0.),(-0.8313835216090105,-0.5556990552421339,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.9807852652994644,-0.19509039794787292,0.),(0.9951847119559052,-0.09801728974646383,0.),(0.9951847119559052,-0.09801728974646383,0.),(0.9807852652994644,-0.19509039794787292,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.7071067811865489,0.7071067811865461,0.),(-0.7071067811865489,0.7071067811865461,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.5555702260896939,0.8314696169329622,0.),(-0.7071067811865489,0.7071067811865461,0.),(-0.5555702260896939,0.8314696169329622,0.),(-0.7071067811865489,0.7071067811865461,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.555570226089786,-0.8314696169329004,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.555570226089786,-0.8314696169329004,0.),(0.19509039794791153,-0.9807852652994568,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.19509039794791153,-0.9807852652994568,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.09801728974643438,-0.9951847119559081,0.),(0.19509039794791153,-0.9807852652994568,0.),(0.09801728974643438,-0.9951847119559081,0.),(0.19509039794791153,-0.9807852652994568,0.),(-0.38268349542963814,0.9238795063890931,0.),(-0.5555702260896939,0.8314696169329622,0.),(-0.38268349542963814,0.9238795063890931,0.),(-0.5555702260896939,0.8314696169329622,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(-0.9238795063891102,0.38268349542959684,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.9238795063891102,0.38268349542959684,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.09801728974637888,0.9951847119559135,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.09801728974637888,0.9951847119559135,0.),(-0.98078526529947,0.19509039794784488,0.),(-0.9951847119559265,0.09801728974624783,0.),(-0.9951847119559265,0.09801728974624783,0.),(-0.98078526529947,0.19509039794784488,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.9807852652994644,-0.19509039794787292,0.),(0.9807852652994644,-0.19509039794787292,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.7071067811865351,-0.70710678118656,0.),(0.8314696169328859,-0.5555702260898077,0.),(0.8314696169328859,-0.5555702260898077,0.),(0.7071067811865351,-0.70710678118656,0.),(0.8314696169328859,-0.5555702260898077,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.8314696169328859,-0.5555702260898077,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.98078526529947,0.19509039794784488,0.),(-0.98078526529947,0.19509039794784488,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.3826833907803875,0.9238795497362333,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.3826833907803875,0.9238795497362333,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.3826833907803875,0.9238795497362333,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.3826833907803875,0.9238795497362333,0.),(0.555570226089786,-0.8314696169329004,0.),(0.7071067811865351,-0.70710678118656,0.),(0.555570226089786,-0.8314696169329004,0.),(0.7071067811865351,-0.70710678118656,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.08709942068020388,0.9961996240298292,0.),(-0.08709942068020388,0.9961996240298292,0.),(-0.08709942068020388,0.9961996240298292,0.),(-0.08709942068020388,0.9961996240298292,0.),(0.9774618285571268,0.21111223013780628,0.),(0.9455208071073157,0.3255616736152011,0.),(0.9455208071073157,0.3255616736152011,0.),(0.9774618285571268,0.21111223013780628,0.),(0.9455208071073157,0.3255616736152011,0.),(0.82228120474033,0.5690813828713708,0.),(0.82228120474033,0.5690813828713708,0.),(0.9455208071073157,0.3255616736152011,0.),(0.82228120474033,0.5690813828713708,0.),(0.618991963670469,0.7853973191394131,0.),(0.618991963670469,0.7853973191394131,0.),(0.82228120474033,0.5690813828713708,0.),(0.618991963670469,0.7853973191394131,0.),(0.3996723632402599,0.9166580616903697,0.),(0.618991963670469,0.7853973191394131,0.),(0.3996723632402599,0.9166580616903697,0.),(0.3996723632402599,0.9166580616903697,0.),(0.19339585438116996,0.9811208098436082,0.),(0.3996723632402599,0.9166580616903697,0.),(0.19339585438116996,0.9811208098436082,0.),(0.19339585438116996,0.9811208098436082,0.),(0.006270084827264089,0.9999803428249272,0.),(0.19339585438116996,0.9811208098436082,0.),(0.006270084827264089,0.9999803428249272,0.),(0.006270084827264089,0.9999803428249272,0.),(-0.1706379345644615,0.9853337989166792,0.),(0.006270084827264089,0.9999803428249272,0.),(-0.1706379345644615,0.9853337989166792,0.),(-0.1706379345644615,0.9853337989166792,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.1706379345644615,0.9853337989166792,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.5602022188465279,-0.8283558860776129,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.5602022188465279,-0.8283558860776129,0.),(-0.5602022188465279,-0.8283558860776129,0.),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.5602022188465279,-0.8283558860776129,0.),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.26435381846863887,-0.964425766278074,1.1000904274438964E-30),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.26435381846863887,-0.964425766278074,1.1000904274438964E-30),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.4669255000030771,-0.8842966569239514,0.),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.4669255000030771,-0.8842966569239514,0.),(-0.4669255000030771,-0.8842966569239514,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.4669255000030771,-0.8842966569239514,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.0014495197728581503,0.9999989494456624,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.0014495197728581503,0.9999989494456624,0.),(-0.0014495197728581503,0.9999989494456624,0.),(0.18439541958058675,0.9828521400687388,0.),(-0.0014495197728581503,0.9999989494456624,0.),(0.18439541958058675,0.9828521400687388,0.),(0.18439541958058675,0.9828521400687388,0.),(0.397653234982458,0.9175357784348174,0.),(0.18439541958058675,0.9828521400687388,0.),(0.397653234982458,0.9175357784348174,0.),(0.397653234982458,0.9175357784348174,0.),(0.6311132446113388,0.7756907067099287,0.),(0.397653234982458,0.9175357784348174,0.),(0.6311132446113388,0.7756907067099287,0.),(0.6311132446113388,0.7756907067099287,0.),(0.8310893844718592,0.5561388630712533,0.),(0.8310893844718592,0.5561388630712533,0.),(0.6311132446113388,0.7756907067099287,0.),(0.8310893844718592,0.5561388630712533,0.),(0.9540840705660083,0.29953895621804594,0.),(0.9540840705660083,0.29953895621804594,0.),(0.8310893844718592,0.5561388630712533,0.),(0.9540840705660083,0.29953895621804594,0.),(0.9862299090912843,0.16538006655518403,0.),(0.9862299090912843,0.16538006655518403,0.),(0.9540840705660083,0.29953895621804594,0.),(0.07505650511901447,-0.9971792822954755,0.),(0.07505650511901447,-0.9971792822954755,0.),(0.07505650511901447,-0.9971792822954755,0.),(0.07505650511901447,-0.9971792822954755,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.9655584237881841,-0.2601863375576772,0.),(-0.9655584237881841,-0.2601863375576772,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.006729681688991534,-0.9999773554357945,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.006729681688991534,-0.9999773554357945,0.),(-0.006729681688991534,-0.9999773554357945,0.),(0.21785673822142915,-0.9759807588326319,0.),(-0.006729681688991534,-0.9999773554357945,0.),(0.21785673822142915,-0.9759807588326319,0.),(0.21785673822142915,-0.9759807588326319,0.),(0.426740401850111,-0.9043741645075924,0.),(0.21785673822142915,-0.9759807588326319,0.),(0.426740401850111,-0.9043741645075924,0.),(0.426740401850111,-0.9043741645075924,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.426740401850111,-0.9043741645075924,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.8920265571908663,-0.45198298780619,0.),(0.8920265571908663,-0.45198298780619,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.8920265571908663,-0.45198298780619,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.8920265571908663,-0.45198298780619,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.9150023212001752,0.40344857441598614,0.),(0.9150023212001752,0.40344857441598614,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.9150023212001752,0.40344857441598614,0.),(0.6471347723667976,0.7623756202776772,0.),(0.6471347723667976,0.7623756202776772,0.),(0.9150023212001752,0.40344857441598614,0.),(0.6471347723667976,0.7623756202776772,0.),(0.36235316167200854,0.93204087154282,0.),(0.6471347723667976,0.7623756202776772,0.),(0.36235316167200854,0.93204087154282,0.),(0.36235316167200854,0.93204087154282,0.),(0.2550849049142149,0.9669186580498412,0.),(0.36235316167200854,0.93204087154282,0.),(0.2550849049142149,0.9669186580498412,0.),(0.2550849049142149,0.9669186580498412,0.),(0.28595039760148855,0.9582444208611657,0.),(0.2550849049142149,0.9669186580498412,0.),(0.28595039760148855,0.9582444208611657,0.),(0.28595039760148855,0.9582444208611657,0.),(0.42364706687595166,0.9058273360455641,0.),(0.28595039760148855,0.9582444208611657,0.),(0.42364706687595166,0.9058273360455641,0.),(0.42364706687595166,0.9058273360455641,0.),(0.6276382490359698,0.7785051241623668,0.),(0.42364706687595166,0.9058273360455641,0.),(0.6276382490359698,0.7785051241623668,0.),(0.6276382490359698,0.7785051241623668,0.),(0.8269599887954417,0.5622607730683717,0.),(0.8269599887954417,0.5622607730683717,0.),(0.6276382490359698,0.7785051241623668,0.),(0.8269599887954417,0.5622607730683717,0.),(0.9588699203284513,0.2838458664298454,0.),(0.9588699203284513,0.2838458664298454,0.),(0.8269599887954417,0.5622607730683717,0.),(0.9588699203284513,0.2838458664298454,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.9588699203284513,0.2838458664298454,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.957401173102709,-0.2887611361342741,0.),(0.957401173102709,-0.2887611361342741,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.957401173102709,-0.2887611361342741,0.),(0.835029876011192,-0.5502046039145194,0.),(0.835029876011192,-0.5502046039145194,0.),(0.957401173102709,-0.2887611361342741,0.),(0.835029876011192,-0.5502046039145194,0.),(0.644888194762835,-0.7642769238015314,0.),(0.644888194762835,-0.7642769238015314,0.),(0.835029876011192,-0.5502046039145194,0.),(0.644888194762835,-0.7642769238015314,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.644888194762835,-0.7642769238015314,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.202992057833538,-0.9791803840235496,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.202992057833538,-0.9791803840235496,0.),(0.202992057833538,-0.9791803840235496,0.),(0.008487459676545215,-0.9999639808654306,0.),(0.202992057833538,-0.9791803840235496,0.),(0.008487459676545215,-0.9999639808654306,0.),(0.008487459676545215,-0.9999639808654306,0.),(-0.17916273136199512,-0.9838194527914711,0.),(0.008487459676545215,-0.9999639808654306,0.),(-0.17916273136199512,-0.9838194527914711,0.),(-0.17916273136199512,-0.9838194527914711,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.17916273136199512,-0.9838194527914711,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.9876333514957574,-0.15678125848856422,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.9876333514957574,-0.15678125848856422,0.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(8,5,9),(9,5,10),(9,10,11),(11,10,12),(12,10,13),(12,13,14),(14,13,15),(15,13,16),(16,13,17),(16,17,18),(18,17,19),(19,17,20),(19,20,21),(19,21,22),(23,24,25),(24,23,26),(27,28,29),(28,27,30),(31,32,33),(32,31,34),(35,36,37),(36,35,38),(39,40,41),(40,39,42),(40,42,43),(40,43,44),(44,43,45),(44,45,46),(44,46,47),(47,46,48),(47,48,49),(47,49,50),(47,50,51),(51,50,52),(51,52,53),(51,53,54),(54,53,55),(55,53,56),(57,58,59),(58,57,60),(61,62,63),(62,61,64),(65,66,67),(66,65,68),(69,70,71),(70,69,72),(73,74,75),(74,73,76),(77,78,79),(78,77,80),(81,82,83),(82,81,84),(85,86,87),(86,85,88),(89,90,91),(90,89,92),(93,94,95),(94,93,96),(97,98,99),(98,97,100),(101,102,103),(102,101,104),(105,106,107),(106,105,108),(109,110,111),(110,109,112),(113,114,115),(114,113,116),(117,118,119),(118,117,120),(121,122,123),(122,121,124),(125,126,127),(126,125,128),(129,130,131),(130,129,132),(133,134,135),(134,133,136),(137,138,139),(138,137,140),(141,142,143),(142,141,144),(145,146,147),(146,145,148),(149,150,151),(150,149,152),(153,154,155),(154,153,156),(157,158,159),(158,157,160),(161,162,163),(162,161,164),(165,166,167),(166,165,168),(169,170,171),(170,169,172),(173,174,175),(174,173,176),(177,178,179),(178,177,180),(181,182,183),(182,181,184),(185,186,187),(186,185,188),(189,190,191),(190,189,192),(193,194,195),(194,193,196),(197,198,199),(198,197,200),(201,202,203),(202,201,204),(205,206,207),(206,205,208),(209,210,211),(210,209,212),(213,214,215),(214,213,216),(217,218,219),(218,217,220),(221,222,223),(222,221,224),(225,226,227),(226,225,228),(229,230,231),(230,229,232),(233,234,235),(234,233,236),(237,238,239),(238,237,240),(241,242,243),(242,241,244),(245,246,247),(246,245,248),(249,250,251),(250,249,252),(253,254,255),(254,253,256),(257,258,259),(258,257,260),(261,262,263),(262,261,264),(265,266,267),(266,265,268),(269,270,271),(270,269,272),(273,274,275),(274,273,276),(277,278,279),(278,277,280),(281,282,283),(282,281,284),(285,286,287),(286,285,288),(289,290,291),(290,289,292),(293,294,295),(294,293,296),(297,298,299),(298,297,300),(301,302,303),(302,301,304),(305,306,307),(306,305,308),(309,310,311),(310,309,312),(313,314,315),(314,313,316),(317,318,319),(318,317,320),(321,322,323),(322,321,324),(325,326,327),(326,325,328),(326,328,329),(329,328,330),(329,330,331),(331,330,332),(331,333,334),(333,331,332),(335,336,337),(336,335,338),(339,340,341),(340,339,342),(343,344,345),(344,343,346),(347,348,349),(348,347,350),(351,352,353),(352,351,354),(355,356,357),(356,355,358),(359,360,361),(360,359,362),(360,362,363),(360,363,364),(364,363,365),(364,365,366),(364,366,367),(367,366,368),(368,366,369),(368,369,370),(370,369,371),(371,369,372),(371,372,373),(371,373,374),(371,374,375),(375,374,376),(375,376,377),(375,377,378),(379,380,381),(380,379,382),(383,384,385),(384,383,386),(386,383,387),(387,383,388),(387,388,389),(389,388,390),(390,388,391),(390,391,392),(390,392,393),(393,392,394),(393,394,395),(393,395,396),(396,395,397),(397,395,398),(398,395,399),(398,399,400),(400,399,401),(401,399,402),(403,404,405),(404,403,406),(407,408,409),(408,407,410),(411,412,413),(412,411,414),(415,416,417),(416,415,418),(419,420,421),(420,419,422),(423,424,425),(424,423,426),(427,428,429),(428,427,430),(431,432,433),(432,431,434),(435,436,437),(436,435,438),(439,440,441),(440,439,442),(443,444,445),(444,443,446),(447,448,449),(448,447,450),(451,452,453),(452,451,454),(455,456,457),(456,455,458),(459,460,461),(460,459,462),(463,464,465),(464,463,466),(467,468,469),(468,467,470),(471,472,473),(472,471,474),(475,476,477),(476,475,478),(479,480,481),(480,479,482),(483,484,485),(484,483,486),(487,488,489),(488,487,490),(491,492,493),(492,491,494),(495,496,497),(496,495,498),(499,500,501),(500,499,502),(503,504,505),(504,503,506),(507,508,509),(508,507,510),(511,512,513),(512,511,514),(515,516,517),(516,515,518),(519,520,521),(520,519,522),(523,524,525),(524,523,526),(527,528,529),(528,527,530),(531,532,533),(532,531,534),(535,536,537),(536,535,538),(539,540,541),(540,539,542),(543,544,545),(544,543,546),(546,543,547),(547,543,540),(547,540,542),(548,544,546),(549,550,551),(550,549,552),(553,554,555),(554,553,556),(557,558,559),(558,557,560),(561,562,563),(562,561,564),(565,566,567),(566,565,568),(569,570,571),(570,569,572),(573,574,575),(574,573,576),(574,576,577),(574,577,578),(574,578,579),(574,579,580),(580,579,581),(581,579,582),(581,582,583),(583,582,584),(584,582,585),(585,582,586),(585,586,587),(587,586,588),(588,586,589),(588,589,590),(591,592,593),(592,591,594),(594,591,595),(595,591,596),(596,591,597),(597,591,598),(597,598,599),(597,599,600),(600,599,601),(600,601,602),(600,602,603),(600,603,604),(604,603,605),(604,605,606),(604,606,607),(607,606,608),(609,610,611),(610,609,612),(613,614,615),(614,613,616),(617,618,619),(618,617,620),(621,622,623),(622,621,624),(625,626,627),(626,625,628),(629,630,631),(630,629,632),(633,634,635),(634,633,636),(637,638,639),(638,637,640),(641,642,643),(642,641,644),(645,646,647),(646,645,648),(649,650,651),(650,649,652),(653,654,655),(654,653,656),(657,658,659),(658,657,660),(661,662,663),(662,661,664),(665,666,667),(666,665,668),(669,670,671),(670,669,672),(673,674,675),(674,673,676),(677,678,679),(678,677,680),(681,682,683),(682,681,684),(685,686,687),(686,685,688),(686,688,689),(689,688,690),(690,688,691),(691,688,692),(691,692,693),(693,692,694),(693,694,695),(695,694,696),(696,694,697),(696,697,698),(698,697,699),(698,699,700),(700,699,701),(700,701,702),(702,701,703),(702,703,704),(704,703,705),(704,705,706),(706,705,707),(706,707,708),(708,707,709),(708,709,710),(710,709,711),(711,709,712),(712,709,713),(712,713,714),(714,713,715),(714,715,716),(716,715,717),(716,717,718),(718,717,719),(718,719,720),(720,719,721),(720,721,722),(723,724,725),(724,723,726),(724,726,727),(727,726,728),(727,728,729),(729,728,685),(729,685,730),(730,685,687),(730,687,731),(730,731,732),(732,731,733),(732,733,734),(732,734,735),(735,734,736),(735,736,737),(737,736,738),(737,738,739),(739,738,740),(739,740,741),(739,741,742),(742,741,743),(742,743,744),(744,743,745),(744,745,746),(746,745,747),(747,745,748),(747,748,749),(749,748,750),(749,750,751),(751,750,752),(751,752,753),(753,752,754),(753,754,755),(753,755,711),(711,755,756),(711,756,710),(757,758,759),(758,757,760),(760,757,761),(760,761,762),(762,761,763),(762,763,764),(764,763,765),(764,765,766),(766,765,767),(767,765,768),(767,768,769),(769,768,770),(770,768,771),(770,771,772),(772,771,773),(772,773,774),(774,773,775),(774,775,776),(776,775,777),(777,775,778),(777,778,779),(779,778,780),(779,780,781),(781,780,782),(781,782,783),(781,783,784),(784,783,785),(784,785,786),(786,785,787),(786,787,788),(788,787,789),(788,789,790),(790,789,791),(791,789,792),(791,792,793),(793,792,794),(764,795,796),(795,764,766),(796,795,797),(796,797,798),(796,798,799),(796,799,800),(800,799,801),(800,801,802),(802,801,803),(802,803,804),(802,804,805),(805,804,806),(805,806,807),(807,806,808),(807,808,809),(809,808,810),(809,810,811),(811,810,812),(811,812,813),(813,812,814),(813,814,815),(815,814,816),(815,816,817),(817,816,794),(817,794,792),(817,792,818),(817,818,819),(819,818,820),(819,820,821),(821,820,822),(821,822,823),(823,822,824),(823,824,825),(825,824,826),(825,826,827),(827,826,828),(829,830,831),(830,829,832),(833,834,835),(834,833,836),(837,838,839),(838,837,840),(841,842,843),(842,841,844),(845,846,847),(846,845,848),(849,850,851),(850,849,852),(853,854,855),(854,853,856),(856,853,857),(857,853,858),(857,858,859),(859,858,860),(860,858,861),(861,858,862),(861,862,863),(861,863,864),(864,863,865),(864,865,866),(866,865,867),(867,865,868),(868,865,869),(868,869,870),(870,869,871),(871,869,872),(872,869,873),(872,873,874),(875,876,877),(876,875,878),(878,875,879),(878,879,880),(880,879,855),(880,855,881),(881,855,854),(881,854,882),(881,882,883),(881,883,884),(884,883,885),(884,885,886),(886,885,887),(886,887,888),(888,887,889),(888,889,890),(888,890,891),(891,890,892),(892,890,893),(892,893,894),(894,893,895),(895,893,896),(896,893,897),(897,893,898),(897,898,899),(899,898,900),(899,900,901),(902,903,904),(903,902,905),(905,902,906),(906,902,907),(906,907,908),(908,907,909),(908,909,910),(908,910,911),(911,910,912),(911,912,913),(911,913,914),(914,913,915),(914,915,916),(914,916,917),(917,916,918),(917,918,919),(919,918,920),(919,920,921),(919,921,896),(896,921,922),(896,922,895),(923,924,925),(924,923,926),(924,926,927),(924,927,928),(928,927,929),(928,929,930),(930,929,931),(931,929,932),(931,932,933),(933,932,934),(934,932,935),(934,935,936),(936,935,937),(937,935,938),(937,938,939),(939,938,940),(939,940,941),(941,940,942),(942,940,943),(942,943,944),(944,943,945),(946,947,948),(947,946,949),(947,949,950),(950,949,951),(950,951,952),(952,951,953),(952,953,954),(954,953,955),(955,953,956),(956,953,957),(956,957,958),(958,957,959),(958,959,960),(960,959,961),(960,961,962),(962,961,963),(963,961,964),(963,964,965),(963,965,966),(966,965,967),(966,967,945),(966,945,943),(966,943,968),(966,968,969),(969,968,970),(969,970,971),(971,970,972),(954,973,952),(973,954,974),(973,974,975),(973,975,976),(976,975,977),(976,977,978),(976,978,979),(976,979,980),(980,979,981),(981,979,982),(981,982,983),(983,982,984),(983,984,985),(983,985,986),(983,986,987),(987,986,988),(987,988,989),(987,989,990),(987,990,991),(991,990,992),(993,994,995),(994,993,996),(997,998,999),(998,997,1000),(1001,1002,1003),(1002,1001,1004),(1005,1006,1007),(1006,1005,1008),(1009,1010,1011),(1010,1009,1012),(1013,1014,1015),(1014,1013,1016),(1017,1018,1019),(1018,1017,1020),(1021,1022,1023),(1022,1021,1024),(1025,1026,1027),(1026,1025,1028),(1029,1030,1031),(1030,1029,1032),(1033,1034,1035),(1034,1033,1036),(1037,1038,1039),(1038,1037,1040),(1041,1042,1043),(1042,1041,1044),(1045,1046,1047),(1046,1045,1048),(1049,1050,1051),(1050,1049,1052),(1053,1054,1055),(1054,1053,1056),(1057,1058,1059),(1058,1057,1060),(1061,1062,1063),(1062,1061,1064),(1064,1061,1065),(1065,1061,1066),(1067,1068,1069),(1068,1067,1070),(1071,1072,1073),(1072,1071,1074),(1075,1076,1077),(1076,1075,1078),(1079,1080,1081),(1080,1079,1082),(1083,1084,1085),(1084,1083,1086),(1087,1088,1089),(1088,1087,1090),(1091,1092,1093),(1092,1091,1094),(1095,1096,1097),(1096,1095,1098),(1099,1100,1101),(1100,1099,1102),(1103,1104,1105),(1104,1103,1106),(1107,1108,1109),(1108,1107,1110),(1111,1112,1113),(1112,1111,1114),(1115,1116,1117),(1116,1115,1118),(1119,1120,1121),(1120,1119,1122),(1123,1124,1125),(1124,1123,1126),(1127,1128,1129),(1128,1127,1130),(1131,1132,1133),(1132,1131,1134),(1135,1136,1137),(1136,1135,1138),(1139,1140,1141),(1140,1139,1142),(1143,1144,1145),(1144,1143,1146),(1147,1148,1149),(1148,1147,1150),(1151,1152,1153),(1152,1151,1154),(1155,1156,1157),(1156,1155,1158),(1159,1160,1161),(1160,1159,1162),(1163,1164,1165),(1164,1163,1166),(1167,1168,1169),(1168,1167,1170),(1171,1172,1173),(1172,1171,1174),(1175,1176,1177),(1176,1175,1178),(1179,1180,1181),(1180,1179,1182),(1183,1184,1185),(1184,1183,1186),(1187,1188,1189),(1188,1187,1190),(1191,1192,1193),(1192,1191,1194),(1195,1196,1197),(1196,1195,1198),(1199,1200,1201),(1200,1199,1202),(1203,1204,1205),(1204,1203,1206),(1207,1208,1209),(1208,1207,1210),(1211,1212,1213),(1212,1211,1214),(1215,1216,1217),(1216,1215,1218),(1219,1220,1221),(1220,1219,1222),(1223,1224,1225),(1224,1223,1226),(1227,1228,1229),(1228,1227,1230),(1231,1232,1233),(1232,1231,1234),(1235,1236,1237),(1236,1235,1238),(1239,1240,1241),(1240,1239,1242),(1243,1244,1245),(1244,1243,1246),(1247,1248,1249),(1248,1247,1250),(1251,1252,1253),(1252,1251,1254),(1255,1256,1257),(1256,1255,1258),(1259,1260,1261),(1260,1259,1262),(1263,1264,1265),(1264,1263,1266),(1267,1268,1269),(1268,1267,1270)),$); +#334=IFCCARTESIANPOINTLIST3D(((0.3,-300.,5.),(0.3,-500.,0.),(0.3,-500.,5.),(0.3,-300.,0.),(97.845,-490.393,5.),(0.3,-300.,5.),(0.3,-500.,5.),(58.827,-294.236,5.),(115.105,-277.164,5.),(191.642,-461.94,5.),(166.971,-249.441,5.),(212.432,-212.132,5.),(278.085,-415.735,5.),(249.741,-166.671,5.),(277.464,-114.805,5.),(294.536,-58.527,5.),(353.853,-353.553,5.),(300.3,0.,5.),(500.3,0.,5.),(416.035,-277.785,5.),(462.24,-191.342,5.),(490.693,-97.545,5.),(0.3,-300.,5.),(58.827,-294.236,0.),(0.3,-300.,0.),(58.827,-294.236,5.),(300.3,0.,5.),(500.3,0.,0.),(300.3,0.,0.),(500.3,0.,5.),(300.3,0.,5.),(294.536,-58.527,0.),(294.536,-58.527,5.),(300.3,0.,0.),(191.642,-461.94,5.),(97.845,-490.393,0.),(191.642,-461.94,0.),(97.845,-490.393,5.),(0.3,-300.,0.),(97.845,-490.393,0.),(0.3,-500.,0.),(58.827,-294.236,0.),(115.105,-277.164,0.),(191.642,-461.94,0.),(166.971,-249.441,0.),(212.432,-212.132,0.),(278.085,-415.735,0.),(249.741,-166.671,0.),(277.464,-114.805,0.),(294.536,-58.527,0.),(353.853,-353.553,0.),(300.3,0.,0.),(500.3,0.,0.),(416.035,-277.785,0.),(462.24,-191.342,0.),(490.693,-97.545,0.),(490.693,-97.545,0.),(462.24,-191.342,5.),(462.24,-191.342,0.),(490.693,-97.545,5.),(462.24,-191.342,0.),(416.035,-277.785,5.),(416.035,-277.785,0.),(462.24,-191.342,5.),(500.3,0.,0.),(490.693,-97.545,5.),(490.693,-97.545,0.),(500.3,0.,5.),(278.085,-415.735,5.),(191.642,-461.94,0.),(278.085,-415.735,0.),(191.642,-461.94,5.),(353.853,-353.553,5.),(278.085,-415.735,0.),(353.853,-353.553,0.),(278.085,-415.735,5.),(58.827,-294.236,5.),(115.105,-277.164,0.),(58.827,-294.236,0.),(115.105,-277.164,5.),(416.035,-277.785,0.),(353.853,-353.553,5.),(353.853,-353.553,0.),(416.035,-277.785,5.),(294.536,-58.527,5.),(277.464,-114.805,0.),(277.464,-114.805,5.),(294.536,-58.527,0.),(97.845,-490.393,5.),(0.3,-500.,0.),(97.845,-490.393,0.),(0.3,-500.,5.),(877.313,53.797,0.),(881.793,37.789,5.),(881.793,37.789,0.),(877.313,53.797,5.),(871.041,68.83,0.),(877.313,53.797,5.),(877.313,53.797,0.),(871.041,68.83,5.),(813.425,-115.375,5.),(798.774,-120.117,0.),(813.425,-115.375,0.),(798.774,-120.117,5.),(827.53,-108.736,5.),(813.425,-115.375,0.),(827.53,-108.736,0.),(813.425,-115.375,5.),(705.8,-107.143,5.),(692.962,-97.994,0.),(705.8,-107.143,0.),(692.962,-97.994,5.),(884.434,-15.353,0.),(881.604,-32.57,5.),(881.604,-32.57,0.),(884.434,-15.353,5.),(885.377,2.85,0.),(884.434,-15.353,5.),(884.434,-15.353,0.),(885.377,2.85,5.),(683.164,95.825,5.),(668.786,76.852,0.),(668.786,76.852,5.),(683.164,95.825,0.),(683.164,95.825,5.),(700.79,110.973,0.),(683.164,95.825,0.),(700.79,110.973,5.),(720.806,121.793,5.),(743.212,128.285,0.),(720.806,121.793,0.),(743.212,128.285,5.),(743.212,128.285,5.),(768.006,130.449,0.),(743.212,128.285,0.),(768.006,130.449,5.),(700.79,110.973,5.),(720.806,121.793,0.),(700.79,110.973,0.),(720.806,121.793,5.),(800.367,126.383,5.),(815.29,121.301,0.),(800.367,126.383,0.),(815.29,121.301,5.),(768.174,102.448,5.),(751.506,100.965,0.),(768.174,102.448,0.),(751.506,100.965,5.),(791.292,99.367,5.),(768.174,102.448,0.),(791.292,99.367,0.),(768.174,102.448,5.),(884.481,20.807,0.),(885.377,2.85,5.),(885.377,2.85,0.),(884.481,20.807,5.),(861.955,-77.91,0.),(852.052,-89.977,5.),(852.052,-89.977,0.),(861.955,-77.91,5.),(870.287,-64.051,0.),(861.955,-77.91,5.),(861.955,-77.91,0.),(870.287,-64.051,5.),(652.354,28.939,5.),(650.3,0.,0.),(650.3,0.,5.),(652.354,28.939,0.),(658.516,54.557,5.),(652.354,28.939,0.),(652.354,28.939,5.),(658.516,54.557,0.),(815.29,121.301,5.),(829.374,114.185,0.),(815.29,121.301,0.),(829.374,114.185,5.),(881.793,37.789,0.),(884.481,20.807,5.),(884.481,20.807,0.),(881.793,37.789,5.),(689.808,-40.22,0.),(697.275,-56.542,5.),(697.275,-56.542,0.),(689.808,-40.22,5.),(697.275,-56.542,0.),(707.728,-70.506,5.),(707.728,-70.506,0.),(697.275,-56.542,5.),(650.3,0.,5.),(653.821,-31.522,0.),(653.821,-31.522,5.),(650.3,0.,0.),(653.821,-31.522,5.),(664.385,-61.368,0.),(664.385,-61.368,5.),(653.821,-31.522,0.),(664.385,-61.368,5.),(672.255,-75.107,0.),(672.255,-75.107,5.),(664.385,-61.368,0.),(685.328,-21.541,0.),(689.808,-40.22,5.),(689.808,-40.22,0.),(685.328,-21.541,5.),(668.786,76.852,5.),(658.516,54.557,0.),(658.516,54.557,5.),(668.786,76.852,0.),(881.604,-32.57,0.),(876.889,-48.803,5.),(876.889,-48.803,0.),(881.604,-32.57,5.),(767.839,-123.91,5.),(750.946,-122.862,0.),(767.839,-123.91,0.),(750.946,-122.862,5.),(783.579,-122.962,5.),(767.839,-123.91,0.),(783.579,-122.962,0.),(767.839,-123.91,5.),(798.774,-120.117,5.),(783.579,-122.962,0.),(798.774,-120.117,0.),(783.579,-122.962,5.),(829.374,114.185,5.),(842.228,105.251,0.),(829.374,114.185,0.),(842.228,105.251,5.),(853.456,94.714,0.),(863.061,82.574,5.),(863.061,82.574,0.),(853.456,94.714,5.),(863.061,82.574,0.),(871.041,68.83,5.),(871.041,68.83,0.),(863.061,82.574,5.),(768.006,130.449,5.),(784.606,129.433,0.),(768.006,130.449,0.),(784.606,129.433,5.),(784.606,129.433,5.),(800.367,126.383,0.),(784.606,129.433,0.),(800.367,126.383,5.),(876.889,-48.803,0.),(870.287,-64.051,5.),(870.287,-64.051,0.),(876.889,-48.803,5.),(842.228,105.251,5.),(853.456,94.714,0.),(842.228,105.251,0.),(853.456,94.714,5.),(750.946,-122.862,5.),(734.975,-119.718,0.),(750.946,-122.862,0.),(734.975,-119.718,5.),(719.926,-114.479,5.),(705.8,-107.143,0.),(719.926,-114.479,0.),(705.8,-107.143,5.),(672.255,-75.107,5.),(681.781,-87.316,0.),(681.781,-87.316,5.),(672.255,-75.107,0.),(692.962,-97.994,5.),(681.781,-87.316,0.),(692.962,-97.994,0.),(681.781,-87.316,5.),(734.975,-119.718,5.),(719.926,-114.479,0.),(734.975,-119.718,0.),(719.926,-114.479,5.),(683.835,-0.503,0.),(685.328,-21.541,5.),(685.328,-21.541,0.),(683.835,-0.503,5.),(840.577,-100.253,5.),(827.53,-108.736,0.),(840.577,-100.253,0.),(827.53,-108.736,5.),(767.671,-96.076,5.),(785.219,-94.463,0.),(767.671,-96.076,0.),(785.219,-94.463,5.),(750.406,-94.478,5.),(767.671,-96.076,0.),(750.406,-94.478,0.),(767.671,-96.076,5.),(685.391,25.261,0.),(683.835,-0.503,5.),(683.835,-0.503,0.),(685.391,25.261,5.),(690.059,47.053,0.),(685.391,25.261,5.),(685.391,25.261,0.),(690.059,47.053,5.),(852.052,-89.977,5.),(840.577,-100.253,0.),(852.052,-89.977,0.),(840.577,-100.253,5.),(707.728,-70.506,5.),(720.434,-81.693,0.),(707.728,-70.506,0.),(720.434,-81.693,5.),(-867.339,-122.904,5.),(-900.538,-122.904,0.),(-867.339,-122.904,0.),(-900.538,-122.904,5.),(-717.104,-122.904,5.),(-748.459,-122.904,0.),(-717.104,-122.904,0.),(-748.459,-122.904,5.),(-649.7,122.904,0.),(-717.104,-122.904,5.),(-717.104,-122.904,0.),(-649.7,122.904,5.),(-826.762,122.904,5.),(-873.543,-43.092,0.),(-873.543,-43.092,5.),(-826.762,122.904,0.),(-64.254,843.159,0.),(-64.254,650.,5.),(-64.254,650.,0.),(-64.254,843.159,5.),(-64.254,650.,5.),(-95.441,895.808,5.),(-95.441,650.,5.),(-64.254,843.159,5.),(-62.074,895.808,5.),(64.854,650.,5.),(67.034,702.817,5.),(98.221,650.,5.),(98.221,895.808,5.),(67.034,895.808,5.),(-740.914,-46.403,0.),(-733.201,-88.531,5.),(-733.201,-88.531,0.),(-740.914,-46.403,5.),(-720.961,-35.044,5.),(-733.201,-88.531,0.),(-733.201,-88.531,5.),(-720.961,-35.044,0.),(-815.193,64.386,0.),(-867.339,-122.904,5.),(-867.339,-122.904,0.),(-815.193,64.386,5.),(-807.983,93.226,0.),(-815.193,64.386,5.),(-815.193,64.386,0.),(-807.983,93.226,5.),(-800.27,64.386,5.),(-748.459,-122.904,0.),(-748.459,-122.904,5.),(-800.27,64.386,0.),(-932.396,122.904,0.),(-895.005,-38.229,5.),(-895.005,-38.229,0.),(-932.396,122.904,5.),(-932.396,122.904,0.),(-900.538,-122.904,0.),(-965.763,122.904,0.),(-895.005,-38.229,0.),(-884.609,-88.531,0.),(-867.339,-122.904,0.),(-873.543,-43.092,0.),(-826.762,122.904,0.),(-815.193,64.386,0.),(-807.983,93.226,0.),(-787.527,122.904,0.),(-800.27,64.386,0.),(-748.459,-122.904,0.),(-752.316,-1.509,0.),(-740.914,-46.403,0.),(-733.201,-88.531,0.),(-717.104,-122.904,0.),(-720.961,-35.044,0.),(-682.396,122.904,0.),(-649.7,122.904,0.),(-873.543,-43.092,5.),(-884.609,-88.531,0.),(-884.609,-88.531,5.),(-873.543,-43.092,0.),(-900.538,-122.904,5.),(-932.396,122.904,5.),(-965.763,122.904,5.),(-895.005,-38.229,5.),(-884.609,-88.531,5.),(-867.339,-122.904,5.),(-873.543,-43.092,5.),(-826.762,122.904,5.),(-815.193,64.386,5.),(-807.983,93.226,5.),(-787.527,122.904,5.),(-800.27,64.386,5.),(-748.459,-122.904,5.),(-752.316,-1.509,5.),(-740.914,-46.403,5.),(-733.201,-88.531,5.),(-717.104,-122.904,5.),(-720.961,-35.044,5.),(-682.396,122.904,5.),(-649.7,122.904,5.),(812.02,90.124,5.),(791.292,99.367,0.),(812.02,90.124,0.),(791.292,99.367,5.),(829.207,75.285,5.),(812.02,90.124,0.),(829.207,75.285,0.),(812.02,90.124,5.),(850.36,-19.356,5.),(845.911,-39.026,0.),(845.911,-39.026,5.),(850.36,-19.356,0.),(845.911,-39.026,5.),(838.497,-55.992,0.),(838.497,-55.992,5.),(845.911,-39.026,0.),(721.786,89.102,5.),(708.734,78.722,0.),(721.786,89.102,0.),(708.734,78.722,5.),(708.734,78.722,0.),(697.84,64.874,5.),(697.84,64.874,0.),(708.734,78.722,5.),(838.497,-55.992,5.),(828.117,-70.255,0.),(828.117,-70.255,5.),(838.497,-55.992,0.),(815.442,-81.552,5.),(828.117,-70.255,0.),(815.442,-81.552,0.),(828.117,-70.255,5.),(697.84,64.874,0.),(690.059,47.053,5.),(690.059,47.053,0.),(697.84,64.874,5.),(736.044,96.517,5.),(721.786,89.102,0.),(736.044,96.517,0.),(721.786,89.102,5.),(751.506,100.965,5.),(736.044,96.517,0.),(751.506,100.965,0.),(736.044,96.517,5.),(720.434,-81.693,5.),(734.66,-89.684,0.),(720.434,-81.693,0.),(734.66,-89.684,5.),(734.66,-89.684,5.),(750.406,-94.478,0.),(734.66,-89.684,0.),(750.406,-94.478,5.),(841.698,55.416,5.),(849.307,31.124,0.),(849.307,31.124,5.),(841.698,55.416,0.),(849.307,31.124,5.),(851.843,3.018,0.),(851.843,3.018,5.),(849.307,31.124,0.),(785.219,-94.463,5.),(801.143,-89.621,0.),(785.219,-94.463,0.),(801.143,-89.621,5.),(829.207,75.285,5.),(841.698,55.416,0.),(841.698,55.416,5.),(829.207,75.285,0.),(801.143,-89.621,5.),(815.442,-81.552,0.),(801.143,-89.621,0.),(815.442,-81.552,5.),(851.843,3.018,5.),(850.36,-19.356,0.),(850.36,-19.356,5.),(851.843,3.018,0.),(-682.396,122.904,5.),(-720.961,-35.044,0.),(-720.961,-35.044,5.),(-682.396,122.904,0.),(-965.763,122.904,5.),(-900.538,-122.904,0.),(-900.538,-122.904,5.),(-965.763,122.904,0.),(-807.983,93.226,5.),(-800.27,64.386,0.),(-800.27,64.386,5.),(-807.983,93.226,0.),(-826.762,122.904,5.),(-787.527,122.904,0.),(-826.762,122.904,0.),(-787.527,122.904,5.),(-682.396,122.904,5.),(-649.7,122.904,0.),(-682.396,122.904,0.),(-649.7,122.904,5.),(-787.527,122.904,0.),(-752.316,-1.509,5.),(-752.316,-1.509,0.),(-787.527,122.904,5.),(-752.316,-1.509,0.),(-740.914,-46.403,5.),(-740.914,-46.403,0.),(-752.316,-1.509,5.),(-895.005,-38.229,0.),(-884.609,-88.531,5.),(-884.609,-88.531,0.),(-895.005,-38.229,5.),(-965.763,122.904,5.),(-932.396,122.904,0.),(-965.763,122.904,0.),(-932.396,122.904,5.),(67.034,895.808,5.),(98.221,895.808,0.),(67.034,895.808,0.),(98.221,895.808,5.),(67.034,895.808,5.),(67.034,702.817,0.),(67.034,702.817,5.),(67.034,895.808,0.),(-95.441,895.808,5.),(-95.441,650.,0.),(-95.441,650.,5.),(-95.441,895.808,0.),(-64.254,650.,5.),(-95.441,650.,0.),(-64.254,650.,0.),(-95.441,650.,5.),(-95.441,895.808,5.),(-62.074,895.808,0.),(-95.441,895.808,0.),(-62.074,895.808,5.),(-62.074,895.808,0.),(67.034,702.817,5.),(67.034,702.817,0.),(-62.074,895.808,5.),(98.221,895.808,0.),(67.034,702.817,0.),(67.034,895.808,0.),(98.221,650.,0.),(-62.074,895.808,0.),(-95.441,650.,0.),(-95.441,895.808,0.),(-64.254,843.159,0.),(64.854,650.,0.),(-64.254,650.,0.),(98.221,650.,5.),(64.854,650.,0.),(98.221,650.,0.),(64.854,650.,5.),(-64.254,843.159,5.),(64.854,650.,0.),(64.854,650.,5.),(-64.254,843.159,0.),(98.221,895.808,0.),(98.221,650.,5.),(98.221,650.,0.),(98.221,895.808,5.),(-293.936,58.527,0.),(-299.7,0.,5.),(-299.7,0.,0.),(-293.936,58.527,5.),(249.741,-166.671,5.),(212.432,-212.132,0.),(212.432,-212.132,5.),(249.741,-166.671,0.),(166.971,-249.441,5.),(212.432,-212.132,0.),(166.971,-249.441,0.),(212.432,-212.132,5.),(-490.093,97.545,0.),(-299.7,0.,0.),(-499.7,0.,0.),(-461.64,191.342,0.),(-415.435,277.785,0.),(-353.253,353.553,0.),(-277.485,415.735,0.),(-293.936,58.527,0.),(-276.864,114.805,0.),(-191.042,461.94,0.),(-249.141,166.671,0.),(-211.832,212.132,0.),(-166.371,249.441,0.),(-97.245,490.393,0.),(-114.505,277.164,0.),(-58.227,294.236,0.),(0.3,500.,0.),(0.3,300.,0.),(-299.7,0.,5.),(-490.093,97.545,5.),(-499.7,0.,5.),(-461.64,191.342,5.),(-415.435,277.785,5.),(-353.253,353.553,5.),(-277.485,415.735,5.),(-293.936,58.527,5.),(-276.864,114.805,5.),(-191.042,461.94,5.),(-249.141,166.671,5.),(-211.832,212.132,5.),(-166.371,249.441,5.),(-97.245,490.393,5.),(-114.505,277.164,5.),(-58.227,294.236,5.),(0.3,500.,5.),(0.3,300.,5.),(0.3,500.,0.),(0.3,300.,5.),(0.3,300.,0.),(0.3,500.,5.),(-114.505,277.164,5.),(-166.371,249.441,0.),(-114.505,277.164,0.),(-166.371,249.441,5.),(-58.227,294.236,5.),(-114.505,277.164,0.),(-58.227,294.236,0.),(-114.505,277.164,5.),(0.3,300.,5.),(-58.227,294.236,0.),(0.3,300.,0.),(-58.227,294.236,5.),(115.105,-277.164,5.),(166.971,-249.441,0.),(115.105,-277.164,0.),(166.971,-249.441,5.),(-299.7,0.,5.),(-499.7,0.,0.),(-299.7,0.,0.),(-499.7,0.,5.),(277.464,-114.805,5.),(249.741,-166.671,0.),(249.741,-166.671,5.),(277.464,-114.805,0.),(-97.245,490.393,5.),(0.3,500.,0.),(-97.245,490.393,0.),(0.3,500.,5.),(-490.093,97.545,5.),(-499.7,0.,0.),(-499.7,0.,5.),(-490.093,97.545,0.),(-276.864,114.805,0.),(-293.936,58.527,5.),(-293.936,58.527,0.),(-276.864,114.805,5.),(-211.832,212.132,0.),(-249.141,166.671,5.),(-249.141,166.671,0.),(-211.832,212.132,5.),(-249.141,166.671,0.),(-276.864,114.805,5.),(-276.864,114.805,0.),(-249.141,166.671,5.),(-461.64,191.342,5.),(-490.093,97.545,0.),(-490.093,97.545,5.),(-461.64,191.342,0.),(-353.253,353.553,5.),(-277.485,415.735,0.),(-353.253,353.553,0.),(-277.485,415.735,5.),(-353.253,353.553,5.),(-415.435,277.785,0.),(-415.435,277.785,5.),(-353.253,353.553,0.),(-415.435,277.785,5.),(-461.64,191.342,0.),(-461.64,191.342,5.),(-415.435,277.785,0.),(-191.042,461.94,5.),(-97.245,490.393,0.),(-191.042,461.94,0.),(-97.245,490.393,5.),(-277.485,415.735,5.),(-191.042,461.94,0.),(-277.485,415.735,0.),(-191.042,461.94,5.),(-166.371,249.441,5.),(-211.832,212.132,0.),(-166.371,249.441,0.),(-211.832,212.132,5.),(683.164,95.825,0.),(685.391,25.261,0.),(683.835,-0.503,0.),(700.79,110.973,0.),(690.059,47.053,0.),(697.84,64.874,0.),(708.734,78.722,0.),(720.806,121.793,0.),(721.786,89.102,0.),(743.212,128.285,0.),(736.044,96.517,0.),(751.506,100.965,0.),(768.006,130.449,0.),(768.174,102.448,0.),(784.606,129.433,0.),(791.292,99.367,0.),(800.367,126.383,0.),(812.02,90.124,0.),(815.29,121.301,0.),(829.207,75.285,0.),(829.374,114.185,0.),(841.698,55.416,0.),(842.228,105.251,0.),(849.307,31.124,0.),(853.456,94.714,0.),(851.843,3.018,0.),(852.052,-89.977,0.),(861.955,-77.91,0.),(863.061,82.574,0.),(870.287,-64.051,0.),(871.041,68.83,0.),(876.889,-48.803,0.),(877.313,53.797,0.),(881.604,-32.57,0.),(881.793,37.789,0.),(884.434,-15.353,0.),(884.481,20.807,0.),(885.377,2.85,0.),(652.354,28.939,0.),(653.821,-31.522,0.),(650.3,0.,0.),(658.516,54.557,0.),(664.385,-61.368,0.),(668.786,76.852,0.),(672.255,-75.107,0.),(681.781,-87.316,0.),(685.328,-21.541,0.),(692.962,-97.994,0.),(689.808,-40.22,0.),(697.275,-56.542,0.),(705.8,-107.143,0.),(707.728,-70.506,0.),(719.926,-114.479,0.),(720.434,-81.693,0.),(734.975,-119.718,0.),(734.66,-89.684,0.),(750.406,-94.478,0.),(750.946,-122.862,0.),(767.671,-96.076,0.),(767.839,-123.91,0.),(785.219,-94.463,0.),(783.579,-122.962,0.),(798.774,-120.117,0.),(801.143,-89.621,0.),(813.425,-115.375,0.),(815.442,-81.552,0.),(827.53,-108.736,0.),(828.117,-70.255,0.),(840.577,-100.253,0.),(838.497,-55.992,0.),(845.911,-39.026,0.),(850.36,-19.356,0.),(653.821,-31.522,5.),(652.354,28.939,5.),(650.3,0.,5.),(658.516,54.557,5.),(664.385,-61.368,5.),(668.786,76.852,5.),(672.255,-75.107,5.),(683.164,95.825,5.),(681.781,-87.316,5.),(683.835,-0.503,5.),(685.328,-21.541,5.),(692.962,-97.994,5.),(689.808,-40.22,5.),(697.275,-56.542,5.),(705.8,-107.143,5.),(707.728,-70.506,5.),(719.926,-114.479,5.),(720.434,-81.693,5.),(734.975,-119.718,5.),(734.66,-89.684,5.),(750.406,-94.478,5.),(750.946,-122.862,5.),(767.671,-96.076,5.),(767.839,-123.91,5.),(785.219,-94.463,5.),(783.579,-122.962,5.),(798.774,-120.117,5.),(801.143,-89.621,5.),(813.425,-115.375,5.),(815.442,-81.552,5.),(827.53,-108.736,5.),(828.117,-70.255,5.),(840.577,-100.253,5.),(838.497,-55.992,5.),(845.911,-39.026,5.),(852.052,-89.977,5.),(850.36,-19.356,5.),(851.843,3.018,5.),(685.391,25.261,5.),(700.79,110.973,5.),(690.059,47.053,5.),(697.84,64.874,5.),(708.734,78.722,5.),(720.806,121.793,5.),(721.786,89.102,5.),(743.212,128.285,5.),(736.044,96.517,5.),(751.506,100.965,5.),(768.006,130.449,5.),(768.174,102.448,5.),(784.606,129.433,5.),(791.292,99.367,5.),(800.367,126.383,5.),(812.02,90.124,5.),(815.29,121.301,5.),(829.207,75.285,5.),(829.374,114.185,5.),(841.698,55.416,5.),(842.228,105.251,5.),(849.307,31.124,5.),(853.456,94.714,5.),(861.955,-77.91,5.),(863.061,82.574,5.),(870.287,-64.051,5.),(871.041,68.83,5.),(876.889,-48.803,5.),(877.313,53.797,5.),(881.604,-32.57,5.),(881.793,37.789,5.),(884.434,-15.353,5.),(884.481,20.807,5.),(885.377,2.85,5.),(0.3,200.,0.),(200.3,0.,0.),(0.3,0.,0.),(200.3,200.,0.),(200.3,0.,100.),(0.3,200.,100.),(0.3,0.,100.),(200.3,200.,100.),(200.3,0.,100.),(0.3,0.,0.),(200.3,0.,0.),(0.3,0.,100.),(0.3,200.,100.),(0.3,0.,0.),(0.3,0.,100.),(0.3,200.,0.),(0.3,200.,100.),(200.3,200.,0.),(0.3,200.,0.),(200.3,200.,100.),(200.3,200.,0.),(200.3,0.,100.),(200.3,0.,0.),(200.3,200.,100.),(-51.846,-658.384,0.),(-61.907,-715.56,0.),(-69.703,-668.716,0.),(-58.532,-701.413,0.),(-48.409,-689.487,0.),(-30.426,-652.096,0.),(-40.659,-684.755,0.),(-30.908,-681.376,0.),(-5.401,-678.672,0.),(-6.742,-650.,0.),(18.975,-652.201,0.),(19.478,-681.648,0.),(41.464,-658.803,0.),(29.323,-685.368,0.),(37.44,-690.577,0.),(43.942,-697.242,0.),(59.929,-669.681,0.),(48.946,-705.332,0.),(54.458,-725.788,0.),(85.645,-723.441,0.),(73.573,-684.708,0.),(82.208,-702.943,0.),(-90.621,-699.736,0.),(-91.103,-733.857,0.),(-93.261,-717.74,0.),(-84.626,-748.34,0.),(-82.698,-682.948,0.),(-73.748,-760.895,0.),(-58.385,-771.227,0.),(-59.517,-727.632,0.),(-52.349,-737.357,0.),(-39.732,-778.668,0.),(-35.393,-746.014,0.),(-10.934,-786.569,0.),(-3.305,-754.879,0.),(32.829,-798.558,0.),(30.125,-763.284,0.),(51.105,-770.557,0.),(46.075,-805.118,0.),(54.961,-813.062,0.),(69.758,-781.77,0.),(59.991,-822.43,0.),(61.668,-833.266,0.),(68.103,-882.981,0.),(81.789,-867.555,0.),(82.795,-795.624,0.),(90.214,-849.635,0.),(90.466,-811.951,0.),(93.023,-830.584,0.),(-71.967,-818.343,0.),(-98.941,-844.396,0.),(-102.651,-821.026,0.),(-89.153,-865.208,0.),(-73.895,-882.29,0.),(-68.341,-835.132,0.),(-53.774,-894.467,0.),(-61.823,-848.608,0.),(-51.658,-859.297,0.),(-28.519,-901.761,0.),(-37.091,-867.723,0.),(-19.276,-873.193,0.),(2.144,-904.192,0.),(0.635,-875.017,0.),(18.157,-873.633,0.),(27.149,-901.782,0.),(33.499,-869.484,0.),(49.512,-894.551,0.),(45.928,-862.923,0.),(54.71,-854.309,0.),(59.929,-844.228,0.),(-98.941,-844.396,5.),(-71.967,-818.343,5.),(-102.651,-821.026,5.),(-89.153,-865.208,5.),(-73.895,-882.29,5.),(-68.341,-835.132,5.),(-53.774,-894.467,5.),(-61.823,-848.608,5.),(-51.658,-859.297,5.),(-28.519,-901.761,5.),(-37.091,-867.723,5.),(-19.276,-873.193,5.),(2.144,-904.192,5.),(0.635,-875.017,5.),(18.157,-873.633,5.),(27.149,-901.782,5.),(33.499,-869.484,5.),(49.512,-894.551,5.),(45.928,-862.923,5.),(54.71,-854.309,5.),(68.103,-882.981,5.),(59.929,-844.228,5.),(61.668,-833.266,5.),(-91.103,-733.857,5.),(-90.621,-699.736,5.),(-93.261,-717.74,5.),(-84.626,-748.34,5.),(-82.698,-682.948,5.),(-73.748,-760.895,5.),(-69.703,-668.716,5.),(-58.385,-771.227,5.),(-61.907,-715.56,5.),(-59.517,-727.632,5.),(-52.349,-737.357,5.),(-39.732,-778.668,5.),(-35.393,-746.014,5.),(-10.934,-786.569,5.),(-3.305,-754.879,5.),(32.829,-798.558,5.),(30.125,-763.284,5.),(51.105,-770.557,5.),(46.075,-805.118,5.),(54.961,-813.062,5.),(69.758,-781.77,5.),(59.991,-822.43,5.),(81.789,-867.555,5.),(82.795,-795.624,5.),(90.214,-849.635,5.),(90.466,-811.951,5.),(93.023,-830.584,5.),(-51.846,-658.384,5.),(-58.532,-701.413,5.),(-48.409,-689.487,5.),(-30.426,-652.096,5.),(-40.659,-684.755,5.),(-30.908,-681.376,5.),(-5.401,-678.672,5.),(-6.742,-650.,5.),(18.975,-652.201,5.),(19.478,-681.648,5.),(41.464,-658.803,5.),(29.323,-685.368,5.),(37.44,-690.577,5.),(43.942,-697.242,5.),(59.929,-669.681,5.),(48.946,-705.332,5.),(54.458,-725.788,5.),(85.645,-723.441,5.),(73.573,-684.708,5.),(82.208,-702.943,5.),(-102.651,-821.026,5.),(-71.967,-818.343,0.),(-102.651,-821.026,0.),(-71.967,-818.343,5.),(-71.967,-818.343,0.),(-68.341,-835.132,5.),(-68.341,-835.132,0.),(-71.967,-818.343,5.),(-68.341,-835.132,0.),(-61.823,-848.608,5.),(-61.823,-848.608,0.),(-68.341,-835.132,5.),(-61.823,-848.608,0.),(-51.658,-859.297,5.),(-51.658,-859.297,0.),(-61.823,-848.608,5.),(-51.658,-859.297,5.),(-37.091,-867.723,0.),(-51.658,-859.297,0.),(-37.091,-867.723,5.),(-37.091,-867.723,5.),(-19.276,-873.193,0.),(-37.091,-867.723,0.),(-19.276,-873.193,5.),(-19.276,-873.193,5.),(0.635,-875.017,0.),(-19.276,-873.193,0.),(0.635,-875.017,5.),(0.635,-875.017,5.),(18.157,-873.633,0.),(0.635,-875.017,0.),(18.157,-873.633,5.),(18.157,-873.633,5.),(33.499,-869.484,0.),(18.157,-873.633,0.),(33.499,-869.484,5.),(33.499,-869.484,5.),(45.928,-862.923,0.),(33.499,-869.484,0.),(45.928,-862.923,5.),(45.928,-862.923,5.),(54.71,-854.309,0.),(45.928,-862.923,0.),(54.71,-854.309,5.),(59.929,-844.228,5.),(54.71,-854.309,0.),(54.71,-854.309,5.),(59.929,-844.228,0.),(61.668,-833.266,5.),(59.929,-844.228,0.),(59.929,-844.228,5.),(61.668,-833.266,0.),(59.991,-822.43,5.),(61.668,-833.266,0.),(61.668,-833.266,5.),(59.991,-822.43,0.),(54.961,-813.062,5.),(59.991,-822.43,0.),(59.991,-822.43,5.),(54.961,-813.062,0.),(54.961,-813.062,5.),(46.075,-805.118,0.),(54.961,-813.062,0.),(46.075,-805.118,5.),(46.075,-805.118,5.),(32.829,-798.558,0.),(46.075,-805.118,0.),(32.829,-798.558,5.),(32.829,-798.558,5.),(-10.934,-786.569,0.),(32.829,-798.558,0.),(-39.732,-778.668,0.),(-39.732,-778.668,5.),(-10.934,-786.569,5.),(-39.732,-778.668,5.),(-58.385,-771.227,0.),(-39.732,-778.668,0.),(-58.385,-771.227,5.),(-58.385,-771.227,5.),(-73.748,-760.895,0.),(-58.385,-771.227,0.),(-73.748,-760.895,5.),(-84.626,-748.34,5.),(-73.748,-760.895,0.),(-73.748,-760.895,5.),(-84.626,-748.34,0.),(-91.103,-733.857,5.),(-84.626,-748.34,0.),(-84.626,-748.34,5.),(-91.103,-733.857,0.),(-93.261,-717.74,5.),(-91.103,-733.857,0.),(-91.103,-733.857,5.),(-93.261,-717.74,0.),(-90.621,-699.736,5.),(-93.261,-717.74,0.),(-93.261,-717.74,5.),(-90.621,-699.736,0.),(-82.698,-682.948,5.),(-90.621,-699.736,0.),(-90.621,-699.736,5.),(-82.698,-682.948,0.),(-69.703,-668.716,5.),(-82.698,-682.948,0.),(-82.698,-682.948,5.),(-69.703,-668.716,0.),(-69.703,-668.716,5.),(-51.846,-658.384,0.),(-69.703,-668.716,0.),(-51.846,-658.384,5.),(-51.846,-658.384,5.),(-30.426,-652.096,0.),(-51.846,-658.384,0.),(-30.426,-652.096,5.),(-30.426,-652.096,5.),(-6.742,-650.,0.),(-30.426,-652.096,0.),(-6.742,-650.,5.),(-6.742,-650.,5.),(18.975,-652.201,0.),(-6.742,-650.,0.),(18.975,-652.201,5.),(18.975,-652.201,5.),(41.464,-658.803,0.),(18.975,-652.201,0.),(41.464,-658.803,5.),(41.464,-658.803,5.),(59.929,-669.681,0.),(41.464,-658.803,0.),(59.929,-669.681,5.),(59.929,-669.681,0.),(73.573,-684.708,5.),(73.573,-684.708,0.),(59.929,-669.681,5.),(73.573,-684.708,0.),(82.208,-702.943,5.),(82.208,-702.943,0.),(73.573,-684.708,5.),(82.208,-702.943,0.),(85.645,-723.441,5.),(85.645,-723.441,0.),(82.208,-702.943,5.),(85.645,-723.441,5.),(54.458,-725.788,0.),(85.645,-723.441,0.),(54.458,-725.788,5.),(48.946,-705.332,5.),(54.458,-725.788,0.),(54.458,-725.788,5.),(48.946,-705.332,0.),(43.942,-697.242,5.),(48.946,-705.332,0.),(48.946,-705.332,5.),(43.942,-697.242,0.),(37.44,-690.577,5.),(43.942,-697.242,0.),(43.942,-697.242,5.),(37.44,-690.577,0.),(37.44,-690.577,5.),(29.323,-685.368,0.),(37.44,-690.577,0.),(29.323,-685.368,5.),(29.323,-685.368,5.),(19.478,-681.648,0.),(29.323,-685.368,0.),(19.478,-681.648,5.),(19.478,-681.648,5.),(-5.401,-678.672,0.),(19.478,-681.648,0.),(-5.401,-678.672,5.),(-5.401,-678.672,5.),(-30.908,-681.376,0.),(-5.401,-678.672,0.),(-30.908,-681.376,5.),(-30.908,-681.376,5.),(-40.659,-684.755,0.),(-30.908,-681.376,0.),(-40.659,-684.755,5.),(-40.659,-684.755,5.),(-48.409,-689.487,0.),(-40.659,-684.755,0.),(-48.409,-689.487,5.),(-48.409,-689.487,0.),(-58.532,-701.413,5.),(-58.532,-701.413,0.),(-48.409,-689.487,5.),(-58.532,-701.413,0.),(-61.907,-715.56,5.),(-61.907,-715.56,0.),(-58.532,-701.413,5.),(-61.907,-715.56,0.),(-59.517,-727.632,5.),(-59.517,-727.632,0.),(-61.907,-715.56,5.),(-59.517,-727.632,0.),(-52.349,-737.357,5.),(-52.349,-737.357,0.),(-59.517,-727.632,5.),(-52.349,-737.357,5.),(-35.393,-746.014,0.),(-52.349,-737.357,0.),(-35.393,-746.014,5.),(-35.393,-746.014,5.),(-3.305,-754.879,0.),(-35.393,-746.014,0.),(-3.305,-754.879,5.),(-3.305,-754.879,5.),(30.125,-763.284,0.),(-3.305,-754.879,0.),(30.125,-763.284,5.),(30.125,-763.284,5.),(51.105,-770.557,0.),(30.125,-763.284,0.),(51.105,-770.557,5.),(51.105,-770.557,5.),(69.758,-781.77,0.),(51.105,-770.557,0.),(69.758,-781.77,5.),(69.758,-781.77,0.),(82.795,-795.624,5.),(82.795,-795.624,0.),(69.758,-781.77,5.),(82.795,-795.624,0.),(90.466,-811.951,5.),(90.466,-811.951,0.),(82.795,-795.624,5.),(90.466,-811.951,0.),(93.023,-830.584,5.),(93.023,-830.584,0.),(90.466,-811.951,5.),(93.023,-830.584,0.),(90.214,-849.635,5.),(90.214,-849.635,0.),(93.023,-830.584,5.),(90.214,-849.635,0.),(81.789,-867.555,5.),(81.789,-867.555,0.),(90.214,-849.635,5.),(81.789,-867.555,0.),(68.103,-882.981,5.),(68.103,-882.981,0.),(81.789,-867.555,5.),(68.103,-882.981,5.),(49.512,-894.551,0.),(68.103,-882.981,0.),(49.512,-894.551,5.),(49.512,-894.551,5.),(27.149,-901.782,0.),(49.512,-894.551,0.),(27.149,-901.782,5.),(27.149,-901.782,5.),(2.144,-904.192,0.),(27.149,-901.782,0.),(2.144,-904.192,5.),(2.144,-904.192,5.),(-28.519,-901.761,0.),(2.144,-904.192,0.),(-28.519,-901.761,5.),(-28.519,-901.761,5.),(-53.774,-894.467,0.),(-28.519,-901.761,0.),(-53.774,-894.467,5.),(-53.774,-894.467,5.),(-73.895,-882.29,0.),(-53.774,-894.467,0.),(-73.895,-882.29,5.),(-89.153,-865.208,5.),(-73.895,-882.29,0.),(-73.895,-882.29,5.),(-89.153,-865.208,0.),(-98.941,-844.396,5.),(-89.153,-865.208,0.),(-89.153,-865.208,5.),(-98.941,-844.396,0.),(-102.651,-821.026,5.),(-98.941,-844.396,0.),(-98.941,-844.396,5.),(-102.651,-821.026,0.))); +#335=IFCSTYLEDITEM(#333,(#338),$); +#336=IFCSURFACESTYLERENDERING(#337,0.,$,$,$,$,$,$,.NOTDEFINED.); +#337=IFCCOLOURRGB($,0.,0.,0.); +#338=IFCSURFACESTYLE('virtual_black',.BOTH.,(#336)); +#339=IFCPRODUCTDEFINITIONSHAPE($,$,(#332)); +ENDSEC; +END-ISO-10303-21; diff --git a/tests/fixtures/bsi_ifc4x3_infra_bridge.ifc b/tests/fixtures/bsi_ifc4x3_infra_bridge.ifc new file mode 100644 index 0000000..6faf565 --- /dev/null +++ b/tests/fixtures/bsi_ifc4x3_infra_bridge.ifc @@ -0,0 +1,911 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [ReferenceView]'),'2;1'); +FILE_NAME('Infra-Bridge.ifc','2026-06-23T11:54:08',(''),(''),'Sketchup-IFC-manager 5.6.0 / SketchUp 2026 (26.2.242)','BIM_Tools - Sketchup_IFC_manager - 5.6.0','None'); +FILE_SCHEMA(('IFC4X3_ADD2')); +ENDSEC; +DATA; +#1=IFCOWNERHISTORY(#2,#5,$,.ADDED.,1782208448,#2,#5,1782208448); +#2=IFCPERSONANDORGANIZATION(#3,#4,$); +#3=IFCPERSON('3720f2e9-0107-4ce6-b699-e20d9bd03331','Jan B.',$,$,$,$,$,$); +#4=IFCORGANIZATION($,'buildingSMART International','buildingSMART is the worldwide industry body driving the digital transformation of the built environment.',$,$); +#5=IFCAPPLICATION(#6,'5.6.0','IFC manager for sketchup','su_ifcmanager'); +#6=IFCORGANIZATION($,'BIM-Tools',$,$,$); +#7=IFCAXIS2PLACEMENT3D(#8,#9,#10); +#8=IFCCARTESIANPOINT((0.,0.,0.)); +#9=IFCDIRECTION((0.,0.,1.)); +#10=IFCDIRECTION((1.,0.,0.)); +#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.001,#7,$); +#12=IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#11,$,.MODEL_VIEW.,$); +#13=IFCPROJECT('2Ndyd$OSX7s9A04nc4lyye',#1,'ifc silly sample scene - project','Demystifying IFC with a playful scene using diverse building elements and compositions.',$,$,$,(#11),#14); +#14=IFCUNITASSIGNMENT((#15,#16,#17)); +#15=IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.); +#16=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.); +#17=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.); +#18=IFCPROJECTEDCRS('EPSG:32760','EPSG:32760 - WGS 84 / UTM zone 60S','WGS 84',$,$,$,#19); +#19=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.); +#20=IFCMAPCONVERSION(#11,#18,729011.2258823584,9063960.607644705,0.,1.,0.,0.001); +#21=IFCSITE('23sFQGRy90RxVbRHD9iSE2',#1,'environment - site','A sample scene environment, showcasing the surrounding landscape.',$,#23,$,$,.COMPLEX.,$,$,0.,$,$); +#22=IFCRELAGGREGATES('17BtC9GYn2uf0pAOIfpWDT',#1,'ifc silly sample scene - project container',$,#13,(#21)); +#23=IFCLOCALPLACEMENT($,#7); +#24=IFCSITE('1adp27B_9CUfup2ojuKOng',#1,'road parking - site','A designated parking area, providing space for vehicles.',$,#26,$,$,.PARTIAL.,$,$,0.,$,$); +#25=IFCRELAGGREGATES('0ofLL1hxb8NhMvzJcyShSs',#1,'environment - site container',$,#21,(#24,#31,#473,#680,#897)); +#26=IFCLOCALPLACEMENT(#23,#27); +#27=IFCAXIS2PLACEMENT3D(#28,#29,#30); +#28=IFCCARTESIANPOINT((0.,20000.,0.)); +#29=IFCDIRECTION((0.,0.,1.)); +#30=IFCDIRECTION((-0.5000000000000002,0.8660254037844386,0.)); +#31=IFCSITE('3pnaj3EgL1cOScZHtoQhHO',#1,'road river bridge - site','The site of the road river bridge, connecting different areas.',$,#32,$,$,.PARTIAL.,$,$,0.,$,$); +#32=IFCLOCALPLACEMENT(#23,#33); +#33=IFCAXIS2PLACEMENT3D(#34,#35,#36); +#34=IFCCARTESIANPOINT((17320.508,30000.,0.)); +#35=IFCDIRECTION((0.,0.,1.)); +#36=IFCDIRECTION((-0.5000000000000003,0.8660254037844387,0.)); +#37=IFCBRIDGE('3vzNAxKB5AJA_Ehx4miINx',#1,'road river bridge','A sturdy bridge, spanning the river and connecting roads.','girder',#39,$,$,.ELEMENT.,.GIRDER.); +#38=IFCRELAGGREGATES('2hh4S4Jnf3If4pv8jcZg2D',#1,'road river bridge - site container',$,#31,(#37)); +#39=IFCLOCALPLACEMENT(#32,#40); +#40=IFCAXIS2PLACEMENT3D(#41,#42,#43); +#41=IFCCARTESIANPOINT((0.,0.,242.321)); +#42=IFCDIRECTION((0.,0.,1.)); +#43=IFCDIRECTION((6.552451679738486E-16,-1.,0.)); +#44=IFCBRIDGEPART('04kO$szQnDTAhzkZMdfItT',#1,'road rail bridge - approach','The approach to the road rail bridge, ensuring a smooth transition.','approach',#46,$,$,.COMPLEX.,.LATERAL.,.NOTDEFINED.); +#45=IFCRELAGGREGATES('1MNnhUupz9ovzqIkSYf$sQ',#1,'road river bridge container',$,#37,(#44,#104,#149,#281,#320)); +#46=IFCLOCALPLACEMENT(#39,#47); +#47=IFCAXIS2PLACEMENT3D(#48,#49,#50); +#48=IFCCARTESIANPOINT((4945.5,-1684.,0.)); +#49=IFCDIRECTION((0.,0.,1.)); +#50=IFCDIRECTION((-1.1497920904880453E-15,1.,0.)); +#51=IFCBRIDGEPART('2x$zQFzGD8YBtZ$7H7nm4c',#1,'bridge road - abutment','A strong abutment, providing essential support for the bridge road.','abutment',#53,$,$,.PARTIAL.,.LATERAL.,.ABUTMENT.); +#52=IFCRELAGGREGATES('39TJX3fXvE39kgWe$EcAFv',#1,'road rail bridge - approach container',$,#44,(#51)); +#53=IFCLOCALPLACEMENT(#46,#54); +#54=IFCAXIS2PLACEMENT3D(#55,#56,#57); +#55=IFCCARTESIANPOINT((-116.,-175.,-756.)); +#56=IFCDIRECTION((0.,0.,1.)); +#57=IFCDIRECTION((1.,-1.5942085368369878E-17,0.)); +#58=IFCBEAMTYPE('1eK6B0Mi1B0Q$hGc5HpQ8C',#1,'road river bridge - abutment support beam','A strong support beam, providing stability to the bridge abutment.',$,$,$,'932836','beam',.BEAM.); +#59=IFCRELDEFINESBYTYPE('1H6TKTC7nAmAfNJVAWZ$WF',#1,$,$,(#60,#117),#58); +#60=IFCBEAM('322tROdCvE68UcU2Qe02GA',#1,'road river bridge - abutment support beam','A strong support beam, providing stability to the bridge abutment.','beam',#67,#79,'454425.1027893.955984.955026.940383.937728',$); +#61=IFCRELASSOCIATESMATERIAL('0oKrXjQf58gwTDmoHg_xVx',#1,$,$,(#60,#117,#357,#407,#452,#519,#548,#722,#751),#62); +#62=IFCMATERIAL('concrete_reinforced_in-situ',$,$); +#63=IFCQUANTITYVOLUME('NetVolume',$,$,0.34611281403353344,$); +#64=IFCELEMENTQUANTITY('2xehPYDfb3$8BnA6Ivtm7x',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#63)); +#65=IFCRELDEFINESBYPROPERTIES('3EScvSO$r2Vvbm2cGpMOEI',#1,$,$,(#60),#64); +#66=IFCRELCONTAINEDINSPATIALSTRUCTURE('1vHLeCtHT2o8lT51yBjzT7',#1,$,$,(#60),#51); +#67=IFCLOCALPLACEMENT(#53,#68); +#68=IFCAXIS2PLACEMENT3D(#69,#70,#71); +#69=IFCCARTESIANPOINT((0.,0.,0.)); +#70=IFCDIRECTION((0.,0.,1.)); +#71=IFCDIRECTION((1.,-1.5942085368369878E-17,0.)); +#72=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#73)); +#73=IFCTRIANGULATEDFACESET(#74,((-5.55111512312578E-17,1.,-7.103709976535466E-32),(-5.55111512312578E-17,1.,-7.103709976535466E-32),(-5.55111512312578E-17,1.,-7.103709976535466E-32),(-5.55111512312578E-17,1.,-7.103709976535466E-32),(3.4694469519536136E-17,-0.09950371902099768,0.9950371902099893),(3.4694469519536136E-17,-0.09950371902099768,0.9950371902099893),(3.4694469519536136E-17,-0.09950371902099768,0.9950371902099893),(3.4694469519536136E-17,-0.09950371902099768,0.9950371902099893),(-1.,-2.6645352591003753E-15,1.2916281061441003E-15),(-1.,-2.6645352591003753E-15,1.2916281061441003E-15),(-1.,-2.6645352591003753E-15,1.2916281061441003E-15),(-1.,-2.6645352591003753E-15,1.2916281061441003E-15),(-1.,-2.6645352591003753E-15,1.2916281061441003E-15),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,-1.,-1.9918004582490323E-16),(0.,-1.,-1.9918004582490323E-16),(0.,-1.,-1.9918004582490323E-16),(0.,-1.,-1.9918004582490323E-16),(1.,2.775557561562892E-15,-6.585610861333043E-16),(1.,2.775557561562892E-15,-6.585610861333043E-16),(1.,2.775557561562892E-15,-6.585610861333043E-16),(1.,2.775557561562892E-15,-6.585610861333043E-16),(1.,2.775557561562892E-15,-6.585610861333043E-16),(-5.5511151231257815E-17,0.7071067811865487,0.7071067811865465),(-5.5511151231257815E-17,0.7071067811865487,0.7071067811865465),(-5.5511151231257815E-17,0.7071067811865487,0.7071067811865465),(-5.5511151231257815E-17,0.7071067811865487,0.7071067811865465)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(10,12,13),(14,15,16),(15,14,17),(18,19,20),(19,18,21),(22,23,24),(23,22,25),(24,23,26),(27,28,29),(28,27,30)),$); +#74=IFCCARTESIANPOINTLIST3D(((0.,175.,556.993),(3600.,175.,20.),(0.,175.,20.),(3600.,175.,556.993),(3600.,0.,539.493),(0.,175.,556.993),(0.,0.,539.493),(3600.,175.,556.993),(0.,175.,556.993),(0.,0.,0.),(0.,0.,539.493),(0.,175.,20.),(0.,195.,0.),(3600.,195.,0.),(0.,0.,0.),(0.,195.,0.),(3600.,0.,0.),(3600.,0.,539.493),(0.,0.,0.),(3600.,0.,0.),(0.,0.,539.493),(3600.,0.,0.),(3600.,175.,20.),(3600.,0.,539.493),(3600.,195.,0.),(3600.,175.,556.993),(0.,195.,0.),(3600.,175.,20.),(3600.,195.,0.),(0.,175.,20.)),$); +#75=IFCSTYLEDITEM(#73,(#78),$); +#76=IFCSURFACESTYLERENDERING(#77,0.,$,$,$,$,$,$,.NOTDEFINED.); +#77=IFCCOLOURRGB($,0.5764705882352941,0.5764705882352941,0.5764705882352941); +#78=IFCSURFACESTYLE('concrete_reinforced_in-situ',.BOTH.,(#76)); +#79=IFCPRODUCTDEFINITIONSHAPE($,$,(#72)); +#80=IFCSLABTYPE('2P22ivvyL7FPr7TM2U6vUb',#1,'bridge road - approach slab','A solid slab, ensuring a smooth transition, the bridge\X\27s welcome mat.',$,$,$,'938214','approach_slab',.APPROACH_SLAB.); +#81=IFCRELDEFINESBYTYPE('0uScXqGRf92hGOEuRY3eEf',#1,$,$,(#82,#132),#80); +#82=IFCSLAB('0W_tPyzHXFtwl0O2DZZAe3',#1,'bridge road - approach slab','A solid slab, ensuring a smooth transition, the bridge\X\27s welcome mat.','approach_slab',#91,#103,'454425.1027893.955984.955026.940384',$); +#83=IFCRELASSOCIATESMATERIAL('2VydWQfLvDSPW7gidaXJGH',#1,$,$,(#82,#132),#84); +#84=IFCMATERIAL('concrete_reinforced_prefab',$,$); +#85=IFCQUANTITYVOLUME('NetVolume',$,$,1.7534133355664374,$); +#86=IFCQUANTITYLENGTH('Depth',$,$,200.,$); +#87=IFCQUANTITYAREA('NetArea',$,$,8.767066677832185,$); +#88=IFCELEMENTQUANTITY('1ivBHfPB95LvD9CJzQpvXV',#1,'Qto_SlabBaseQuantities',$,'BaseQuantities',(#85,#86,#87)); +#89=IFCRELDEFINESBYPROPERTIES('1qweAE1j5D3A1sNyfU82iB',#1,$,$,(#82),#88); +#90=IFCRELCONTAINEDINSPATIALSTRUCTURE('2uZ51LuKD2_fxaPG8sy9Jr',#1,$,$,(#82),#44); +#91=IFCLOCALPLACEMENT(#46,#92); +#92=IFCAXIS2PLACEMENT3D(#93,#94,#95); +#93=IFCCARTESIANPOINT((-116.,-2443.111,-242.321)); +#94=IFCDIRECTION((-4.17885181061057E-19,-0.09950371902099887,0.9950371902099893)); +#95=IFCDIRECTION((1.,-2.637495052379839E-16,-2.9095177601844057E-17)); +#96=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#97)); +#97=IFCTRIANGULATEDFACESET(#98,((1.,1.5945161569481282E-18,9.00626766557405E-18),(1.,1.5945161569481282E-18,9.00626766557405E-18),(1.,1.5945161569481282E-18,9.00626766557405E-18),(1.,1.5945161569481282E-18,9.00626766557405E-18),(-1.,-1.5945161569481282E-18,-9.00626766557405E-18),(-1.,-1.5945161569481282E-18,-9.00626766557405E-18),(-1.,-1.5945161569481282E-18,-9.00626766557405E-18),(-1.,-1.5945161569481282E-18,-9.00626766557405E-18),(1.6860149244404218E-17,9.714451465470117E-17,1.),(1.6860149244404218E-17,9.714451465470117E-17,1.),(1.6860149244404218E-17,9.714451465470117E-17,1.),(1.6860149244404218E-17,9.714451465470117E-17,1.),(2.3799043148311285E-18,1.,-6.800116025829082E-16),(2.3799043148311285E-18,1.,-6.800116025829082E-16),(2.3799043148311285E-18,1.,-6.800116025829082E-16),(2.3799043148311285E-18,1.,-6.800116025829082E-16),(-1.6860149244404218E-17,-9.714451465470117E-17,-1.),(-1.6860149244404218E-17,-9.714451465470117E-17,-1.),(-1.6860149244404218E-17,-9.714451465470117E-17,-1.),(-1.6860149244404218E-17,-9.714451465470117E-17,-1.),(-2.3799043148311285E-18,-1.,6.800116025829082E-16),(-2.3799043148311285E-18,-1.,6.800116025829082E-16),(-2.3799043148311285E-18,-1.,6.800116025829082E-16),(-2.3799043148311285E-18,-1.,6.800116025829082E-16)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#98=IFCCARTESIANPOINTLIST3D(((3600.,2435.296,-200.),(3600.,0.,0.),(3600.,0.,-200.),(3600.,2435.296,0.),(0.,0.,0.),(0.,2435.296,-200.),(0.,0.,-200.),(0.,2435.296,0.),(3600.,0.,0.),(0.,2435.296,0.),(0.,0.,0.),(3600.,2435.296,0.),(0.,2435.296,-200.),(3600.,2435.296,0.),(3600.,2435.296,-200.),(0.,2435.296,0.),(3600.,2435.296,-200.),(0.,0.,-200.),(0.,2435.296,-200.),(3600.,0.,-200.),(3600.,0.,0.),(0.,0.,-200.),(3600.,0.,-200.),(0.,0.,0.)),$); +#99=IFCSTYLEDITEM(#97,(#102),$); +#100=IFCSURFACESTYLERENDERING(#101,0.,$,$,$,$,$,$,.NOTDEFINED.); +#101=IFCCOLOURRGB($,0.5764705882352941,0.5764705882352941,0.5764705882352941); +#102=IFCSURFACESTYLE('concrete_reinforced_prefab',.BOTH.,(#100)); +#103=IFCPRODUCTDEFINITIONSHAPE($,$,(#96)); +#104=IFCBRIDGEPART('2LBqtx8tXFcR8Qzu5tSZdh',#1,'road rail bridge - approach','The approach to the road rail bridge, ensuring a smooth transition.','approach',#105,$,$,.COMPLEX.,.LATERAL.,.NOTDEFINED.); +#105=IFCLOCALPLACEMENT(#39,#106); +#106=IFCAXIS2PLACEMENT3D(#107,#108,#109); +#107=IFCCARTESIANPOINT((-4945.5,-1684.,0.)); +#108=IFCDIRECTION((0.,0.,-1.)); +#109=IFCDIRECTION((-6.40370999830511E-16,-1.,0.)); +#110=IFCBRIDGEPART('2cU43jXGXEuv4mx7hSZu3S',#1,'bridge road - abutment','A strong abutment, providing essential support for the bridge road.','abutment',#112,$,$,.PARTIAL.,.LATERAL.,.ABUTMENT.); +#111=IFCRELAGGREGATES('1_PmJ17p98mA7vFRlGBp7t',#1,'road rail bridge - approach container',$,#104,(#110)); +#112=IFCLOCALPLACEMENT(#105,#113); +#113=IFCAXIS2PLACEMENT3D(#114,#115,#116); +#114=IFCCARTESIANPOINT((116.,175.,756.)); +#115=IFCDIRECTION((0.,0.,1.)); +#116=IFCDIRECTION((1.,-2.5762814944582876E-17,0.)); +#117=IFCBEAM('1Rd3zGyxjCSBQhmMuxTFJ7',#1,'road river bridge - abutment support beam','A strong support beam, providing stability to the bridge abutment.','beam',#122,#131,'454425.1027893.955984.955027.940383.937728',$); +#118=IFCQUANTITYVOLUME('NetVolume',$,$,0.3461128140335334,$); +#119=IFCELEMENTQUANTITY('32vSQLYkr3M9EQFAUjsCFV',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#118)); +#120=IFCRELDEFINESBYPROPERTIES('2LYw1u$2v2kPGqorffonC3',#1,$,$,(#117),#119); +#121=IFCRELCONTAINEDINSPATIALSTRUCTURE('0nM0dswAjDOAkOhVv7Wxbr',#1,$,$,(#117),#110); +#122=IFCLOCALPLACEMENT(#112,#123); +#123=IFCAXIS2PLACEMENT3D(#124,#125,#126); +#124=IFCCARTESIANPOINT((0.,0.,0.)); +#125=IFCDIRECTION((0.,0.,1.)); +#126=IFCDIRECTION((1.,-2.5762814944582876E-17,0.)); +#127=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#128)); +#128=IFCTRIANGULATEDFACESET(#129,((5.5511151231257796E-17,-1.,7.103709976535464E-32),(5.5511151231257796E-17,-1.,7.103709976535464E-32),(5.5511151231257796E-17,-1.,7.103709976535464E-32),(5.5511151231257796E-17,-1.,7.103709976535464E-32),(-3.4694469519536136E-17,0.09950371902099771,-0.9950371902099893),(-3.4694469519536136E-17,0.09950371902099771,-0.9950371902099893),(-3.4694469519536136E-17,0.09950371902099771,-0.9950371902099893),(-3.4694469519536136E-17,0.09950371902099771,-0.9950371902099893),(1.,2.6645352591003757E-15,-1.2916281061441003E-15),(1.,2.6645352591003757E-15,-1.2916281061441003E-15),(1.,2.6645352591003757E-15,-1.2916281061441003E-15),(1.,2.6645352591003757E-15,-1.2916281061441003E-15),(1.,2.6645352591003757E-15,-1.2916281061441003E-15),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,1.,1.9918004582490318E-16),(0.,1.,1.9918004582490318E-16),(0.,1.,1.9918004582490318E-16),(0.,1.,1.9918004582490318E-16),(-1.,-2.775557561562893E-15,6.585610861333043E-16),(-1.,-2.775557561562893E-15,6.585610861333043E-16),(-1.,-2.775557561562893E-15,6.585610861333043E-16),(-1.,-2.775557561562893E-15,6.585610861333043E-16),(-1.,-2.775557561562893E-15,6.585610861333043E-16),(5.551115123125782E-17,-0.7071067811865488,-0.7071067811865465),(5.551115123125782E-17,-0.7071067811865488,-0.7071067811865465),(5.551115123125782E-17,-0.7071067811865488,-0.7071067811865465),(5.551115123125782E-17,-0.7071067811865488,-0.7071067811865465)),$,((3,2,1),(4,1,2),(7,6,5),(8,5,6),(11,10,9),(12,9,10),(13,12,10),(16,15,14),(17,14,15),(20,19,18),(21,18,19),(24,23,22),(25,22,23),(26,23,24),(29,28,27),(30,27,28)),$); +#129=IFCCARTESIANPOINTLIST3D(((0.,-175.,-556.993),(-3600.,-175.,-20.),(0.,-175.,-20.),(-3600.,-175.,-556.993),(-3600.,0.,-539.493),(0.,-175.,-556.993),(0.,0.,-539.493),(-3600.,-175.,-556.993),(0.,-175.,-556.993),(0.,0.,0.),(0.,0.,-539.493),(0.,-175.,-20.),(0.,-195.,0.),(-3600.,-195.,0.),(0.,0.,0.),(0.,-195.,0.),(-3600.,0.,0.),(-3600.,0.,-539.493),(0.,0.,0.),(-3600.,0.,0.),(0.,0.,-539.493),(-3600.,0.,0.),(-3600.,-175.,-20.),(-3600.,0.,-539.493),(-3600.,-195.,0.),(-3600.,-175.,-556.993),(0.,-195.,0.),(-3600.,-175.,-20.),(-3600.,-195.,0.),(0.,-175.,-20.)),$); +#130=IFCSTYLEDITEM(#128,(#78),$); +#131=IFCPRODUCTDEFINITIONSHAPE($,$,(#127)); +#132=IFCSLAB('01itnAmhP3LAz9aL2vu3YJ',#1,'bridge road - approach slab','A solid slab, ensuring a smooth transition, the bridge\X\27s welcome mat.','approach_slab',#139,#148,'454425.1027893.955984.955027.940384',$); +#133=IFCQUANTITYVOLUME('NetVolume',$,$,1.7534133355664372,$); +#134=IFCQUANTITYLENGTH('Depth',$,$,200.,$); +#135=IFCQUANTITYAREA('NetArea',$,$,8.767066677832183,$); +#136=IFCELEMENTQUANTITY('17ThtJznfB3BG_bMvE$3E6',#1,'Qto_SlabBaseQuantities',$,'BaseQuantities',(#133,#134,#135)); +#137=IFCRELDEFINESBYPROPERTIES('1oMiVKAfL5cAocA022gk8s',#1,$,$,(#132),#136); +#138=IFCRELCONTAINEDINSPATIALSTRUCTURE('1w3AhsrQv24w7$dfzLtAgP',#1,$,$,(#132),#104); +#139=IFCLOCALPLACEMENT(#105,#140); +#140=IFCAXIS2PLACEMENT3D(#141,#142,#143); +#141=IFCCARTESIANPOINT((116.,2443.111,242.321)); +#142=IFCDIRECTION((7.884609113344608E-18,-0.09950371902099886,0.9950371902099893)); +#143=IFCDIRECTION((1.,-2.7357023481419706E-16,-2.909517760184405E-17)); +#144=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#145)); +#145=IFCTRIANGULATEDFACESET(#146,((-1.,-1.5945161569481282E-18,-9.00626766557405E-18),(-1.,-1.5945161569481282E-18,-9.00626766557405E-18),(-1.,-1.5945161569481282E-18,-9.00626766557405E-18),(-1.,-1.5945161569481282E-18,-9.00626766557405E-18),(1.,1.5945161569481282E-18,9.00626766557405E-18),(1.,1.5945161569481282E-18,9.00626766557405E-18),(1.,1.5945161569481282E-18,9.00626766557405E-18),(1.,1.5945161569481282E-18,9.00626766557405E-18),(-1.6860149244404218E-17,-9.714451465470117E-17,-1.),(-1.6860149244404218E-17,-9.714451465470117E-17,-1.),(-1.6860149244404218E-17,-9.714451465470117E-17,-1.),(-1.6860149244404218E-17,-9.714451465470117E-17,-1.),(-2.3799043148311285E-18,-1.,6.800116025829082E-16),(-2.3799043148311285E-18,-1.,6.800116025829082E-16),(-2.3799043148311285E-18,-1.,6.800116025829082E-16),(-2.3799043148311285E-18,-1.,6.800116025829082E-16),(1.6860149244404218E-17,9.714451465470117E-17,1.),(1.6860149244404218E-17,9.714451465470117E-17,1.),(1.6860149244404218E-17,9.714451465470117E-17,1.),(1.6860149244404218E-17,9.714451465470117E-17,1.),(2.3799043148311285E-18,1.,-6.800116025829082E-16),(2.3799043148311285E-18,1.,-6.800116025829082E-16),(2.3799043148311285E-18,1.,-6.800116025829082E-16),(2.3799043148311285E-18,1.,-6.800116025829082E-16)),$,((3,2,1),(4,1,2),(7,6,5),(8,5,6),(11,10,9),(12,9,10),(15,14,13),(16,13,14),(19,18,17),(20,17,18),(23,22,21),(24,21,22)),$); +#146=IFCCARTESIANPOINTLIST3D(((-3600.,-2435.296,200.),(-3600.,0.,0.),(-3600.,0.,200.),(-3600.,-2435.296,0.),(0.,0.,0.),(0.,-2435.296,200.),(0.,0.,200.),(0.,-2435.296,0.),(-3600.,0.,0.),(0.,-2435.296,0.),(0.,0.,0.),(-3600.,-2435.296,0.),(0.,-2435.296,200.),(-3600.,-2435.296,0.),(-3600.,-2435.296,200.),(0.,-2435.296,0.),(-3600.,-2435.296,200.),(0.,0.,200.),(0.,-2435.296,200.),(-3600.,0.,200.),(-3600.,0.,0.),(0.,0.,200.),(-3600.,0.,200.),(0.,0.,0.)),$); +#147=IFCSTYLEDITEM(#145,(#102),$); +#148=IFCPRODUCTDEFINITIONSHAPE($,$,(#144)); +#149=IFCBRIDGEPART('2r51NsY5P0QvEz_Kok7DQt',#1,'road rail bridge - deck','The deck, providing a stable surface for vehicles and trains on the road rail bridge.','deck',#150,$,$,.ELEMENT.,.LATERAL.,.DECK.); +#150=IFCLOCALPLACEMENT(#39,#151); +#151=IFCAXIS2PLACEMENT3D(#152,#153,#154); +#152=IFCCARTESIANPOINT((0.,0.,0.)); +#153=IFCDIRECTION((0.,0.,1.)); +#154=IFCDIRECTION((1.,7.971042684184348E-18,0.)); +#155=IFCRAILINGTYPE('0ItMoXs2f9z9AdtMaZMRJU',#1,'bridge road railing','A protective railing, ensuring safety along the bridge road.',$,$,$,'940388','guardrail',.GUARDRAIL.); +#156=IFCRELDEFINESBYTYPE('1ZVbB_6F5Bjv1T61DyznZD',#1,$,$,(#157,#213),#155); +#157=IFCRAILING('1PXj3pcJX7RgxexBEm0se9',#1,'bridge road railing','A protective railing, ensuring safety along the bridge road.','guardrail',#161,#173,'454425.1027893.955984.1885148.955012',$); +#158=IFCRELASSOCIATESMATERIAL('3dhBOWCMT9KfeOEyRiuLCQ',#1,$,$,(#157,#213,#265,#289,#301,#309,#370,#418,#460),#159); +#159=IFCMATERIAL('wood-generic',$,$); +#160=IFCRELCONTAINEDINSPATIALSTRUCTURE('3vxXJLiyzDF8ySUdvO0yAm',#1,$,$,(#157,#213,#265),#149); +#161=IFCLOCALPLACEMENT(#150,#162); +#162=IFCAXIS2PLACEMENT3D(#163,#164,#165); +#163=IFCCARTESIANPOINT((4945.5,-1684.,0.)); +#164=IFCDIRECTION((0.,0.,1.)); +#165=IFCDIRECTION((-9.019846706184311E-16,1.,0.)); +#166=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#167,#174,#177,#180,#183,#186,#189,#192,#195,#198,#201,#204,#207,#210)); +#167=IFCTRIANGULATEDFACESET(#168,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#168=IFCCARTESIANPOINTLIST3D(((-290.055,4543.5,-317.801),(-116.,4543.5,-56.),(-116.,4543.5,-336.),(-192.,4543.5,620.),(-96.,4543.5,-56.),(-96.,4543.5,620.),(-96.,4543.5,-56.),(-96.,4447.5,620.),(-96.,4447.5,-56.),(-96.,4543.5,620.),(-96.,4447.5,620.),(-192.,4543.5,620.),(-192.,4447.5,620.),(-96.,4543.5,620.),(-192.,4543.5,620.),(-290.055,4447.5,-317.801),(-192.,4447.5,620.),(-290.055,4543.5,-317.801),(-96.,4543.5,-56.),(-116.,4447.5,-56.),(-116.,4543.5,-56.),(-96.,4447.5,-56.),(-116.,4543.5,-336.),(-116.,4447.5,-56.),(-116.,4447.5,-336.),(-116.,4543.5,-56.),(-96.,4447.5,620.),(-116.,4447.5,-56.),(-96.,4447.5,-56.),(-290.055,4447.5,-317.801),(-116.,4447.5,-336.),(-192.,4447.5,620.),(-116.,4543.5,-336.),(-290.055,4447.5,-317.801),(-290.055,4543.5,-317.801),(-116.,4447.5,-336.)),$); +#169=IFCSTYLEDITEM(#167,(#172),$); +#170=IFCSURFACESTYLERENDERING(#171,0.,$,$,$,$,$,$,.NOTDEFINED.); +#171=IFCCOLOURRGB($,0.7058823529411765,0.6352941176470588,0.49019607843137253); +#172=IFCSURFACESTYLE('wood-generic',.BOTH.,(#170)); +#173=IFCPRODUCTDEFINITIONSHAPE($,$,(#166)); +#174=IFCTRIANGULATEDFACESET(#175,((-5.874930171974783E-17,6.58025080515205E-19,-1.),(-5.874930171974783E-17,6.58025080515205E-19,-1.),(-5.874930171974783E-17,6.58025080515205E-19,-1.),(-5.874930171974783E-17,6.58025080515205E-19,-1.),(1.,-5.444323400622572E-17,-5.874930171974788E-17),(1.,-5.444323400622572E-17,-5.874930171974788E-17),(1.,-5.444323400622572E-17,-5.874930171974788E-17),(1.,-5.444323400622572E-17,-5.874930171974788E-17),(5.874930171974783E-17,-6.58025080515205E-19,1.),(5.874930171974783E-17,-6.58025080515205E-19,1.),(5.874930171974783E-17,-6.58025080515205E-19,1.),(5.874930171974783E-17,-6.58025080515205E-19,1.),(1.067917225032119E-18,1.,6.5802508051520145E-19),(1.067917225032119E-18,1.,6.5802508051520145E-19),(1.067917225032119E-18,1.,6.5802508051520145E-19),(1.067917225032119E-18,1.,6.5802508051520145E-19),(-1.,5.444323400622572E-17,5.874930171974788E-17),(-1.,5.444323400622572E-17,5.874930171974788E-17),(-1.,5.444323400622572E-17,5.874930171974788E-17),(-1.,5.444323400622572E-17,5.874930171974788E-17),(-1.067917225032119E-18,-1.,-6.5802508051520145E-19),(-1.067917225032119E-18,-1.,-6.5802508051520145E-19),(-1.067917225032119E-18,-1.,-6.5802508051520145E-19),(-1.067917225032119E-18,-1.,-6.5802508051520145E-19)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#175=IFCCARTESIANPOINTLIST3D(((0.,9900.,-56.),(-96.,-9.,-56.),(-96.,9900.,-56.),(0.,-9.,-56.),(0.,9900.,-56.),(0.,-9.,140.),(0.,-9.,-56.),(0.,9900.,140.),(0.,-9.,140.),(-96.,9900.,140.),(-96.,-9.,140.),(0.,9900.,140.),(-96.,9900.,140.),(0.,9900.,-56.),(-96.,9900.,-56.),(0.,9900.,140.),(-96.,9900.,140.),(-96.,-9.,-56.),(-96.,-9.,140.),(-96.,9900.,-56.),(0.,-9.,140.),(-96.,-9.,-56.),(0.,-9.,-56.),(-96.,-9.,140.)),$); +#176=IFCSTYLEDITEM(#174,(#172),$); +#177=IFCTRIANGULATEDFACESET(#178,((-5.874930171974783E-17,6.58025080515205E-19,-1.),(-5.874930171974783E-17,6.58025080515205E-19,-1.),(-5.874930171974783E-17,6.58025080515205E-19,-1.),(-5.874930171974783E-17,6.58025080515205E-19,-1.),(1.,-5.444323400622572E-17,-5.874930171974788E-17),(1.,-5.444323400622572E-17,-5.874930171974788E-17),(1.,-5.444323400622572E-17,-5.874930171974788E-17),(1.,-5.444323400622572E-17,-5.874930171974788E-17),(5.874930171974783E-17,-6.58025080515205E-19,1.),(5.874930171974783E-17,-6.58025080515205E-19,1.),(5.874930171974783E-17,-6.58025080515205E-19,1.),(5.874930171974783E-17,-6.58025080515205E-19,1.),(1.067917225032119E-18,1.,6.5802508051520145E-19),(1.067917225032119E-18,1.,6.5802508051520145E-19),(1.067917225032119E-18,1.,6.5802508051520145E-19),(1.067917225032119E-18,1.,6.5802508051520145E-19),(-1.,5.444323400622572E-17,5.874930171974788E-17),(-1.,5.444323400622572E-17,5.874930171974788E-17),(-1.,5.444323400622572E-17,5.874930171974788E-17),(-1.,5.444323400622572E-17,5.874930171974788E-17),(-1.067917225032119E-18,-1.,-6.5802508051520145E-19),(-1.067917225032119E-18,-1.,-6.5802508051520145E-19),(-1.067917225032119E-18,-1.,-6.5802508051520145E-19),(-1.067917225032119E-18,-1.,-6.5802508051520145E-19)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#178=IFCCARTESIANPOINTLIST3D(((0.,9900.,404.),(-96.,-9.,404.),(-96.,9900.,404.),(0.,-9.,404.),(0.,9900.,404.),(0.,-9.,600.),(0.,-9.,404.),(0.,9900.,600.),(0.,-9.,600.),(-96.,9900.,600.),(-96.,-9.,600.),(0.,9900.,600.),(-96.,9900.,600.),(0.,9900.,404.),(-96.,9900.,404.),(0.,9900.,600.),(-96.,9900.,600.),(-96.,-9.,404.),(-96.,-9.,600.),(-96.,9900.,404.),(0.,-9.,600.),(-96.,-9.,404.),(0.,-9.,404.),(-96.,-9.,600.)),$); +#179=IFCSTYLEDITEM(#177,(#172),$); +#180=IFCTRIANGULATEDFACESET(#181,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#181=IFCCARTESIANPOINTLIST3D(((-290.055,943.5,-317.801),(-116.,943.5,-56.),(-116.,943.5,-336.),(-192.,943.5,620.),(-96.,943.5,-56.),(-96.,943.5,620.),(-96.,943.5,-56.),(-96.,847.5,620.),(-96.,847.5,-56.),(-96.,943.5,620.),(-96.,847.5,620.),(-192.,943.5,620.),(-192.,847.5,620.),(-96.,943.5,620.),(-192.,943.5,620.),(-290.055,847.5,-317.801),(-192.,847.5,620.),(-290.055,943.5,-317.801),(-96.,943.5,-56.),(-116.,847.5,-56.),(-116.,943.5,-56.),(-96.,847.5,-56.),(-116.,943.5,-336.),(-116.,847.5,-56.),(-116.,847.5,-336.),(-116.,943.5,-56.),(-96.,847.5,620.),(-116.,847.5,-56.),(-96.,847.5,-56.),(-290.055,847.5,-317.801),(-116.,847.5,-336.),(-192.,847.5,620.),(-116.,943.5,-336.),(-290.055,847.5,-317.801),(-290.055,943.5,-317.801),(-116.,847.5,-336.)),$); +#182=IFCSTYLEDITEM(#180,(#172),$); +#183=IFCTRIANGULATEDFACESET(#184,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#184=IFCCARTESIANPOINTLIST3D(((-290.055,6343.5,-317.801),(-116.,6343.5,-56.),(-116.,6343.5,-336.),(-192.,6343.5,620.),(-96.,6343.5,-56.),(-96.,6343.5,620.),(-96.,6343.5,-56.),(-96.,6247.5,620.),(-96.,6247.5,-56.),(-96.,6343.5,620.),(-96.,6247.5,620.),(-192.,6343.5,620.),(-192.,6247.5,620.),(-96.,6343.5,620.),(-192.,6343.5,620.),(-290.055,6247.5,-317.801),(-192.,6247.5,620.),(-290.055,6343.5,-317.801),(-96.,6343.5,-56.),(-116.,6247.5,-56.),(-116.,6343.5,-56.),(-96.,6247.5,-56.),(-116.,6343.5,-336.),(-116.,6247.5,-56.),(-116.,6247.5,-336.),(-116.,6343.5,-56.),(-96.,6247.5,620.),(-116.,6247.5,-56.),(-96.,6247.5,-56.),(-290.055,6247.5,-317.801),(-116.,6247.5,-336.),(-192.,6247.5,620.),(-116.,6343.5,-336.),(-290.055,6247.5,-317.801),(-290.055,6343.5,-317.801),(-116.,6247.5,-336.)),$); +#185=IFCSTYLEDITEM(#183,(#172),$); +#186=IFCTRIANGULATEDFACESET(#187,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#187=IFCCARTESIANPOINTLIST3D(((-290.055,5443.5,-317.801),(-116.,5443.5,-56.),(-116.,5443.5,-336.),(-192.,5443.5,620.),(-96.,5443.5,-56.),(-96.,5443.5,620.),(-96.,5443.5,-56.),(-96.,5347.5,620.),(-96.,5347.5,-56.),(-96.,5443.5,620.),(-96.,5347.5,620.),(-192.,5443.5,620.),(-192.,5347.5,620.),(-96.,5443.5,620.),(-192.,5443.5,620.),(-290.055,5347.5,-317.801),(-192.,5347.5,620.),(-290.055,5443.5,-317.801),(-96.,5443.5,-56.),(-116.,5347.5,-56.),(-116.,5443.5,-56.),(-96.,5347.5,-56.),(-116.,5443.5,-336.),(-116.,5347.5,-56.),(-116.,5347.5,-336.),(-116.,5443.5,-56.),(-96.,5347.5,620.),(-116.,5347.5,-56.),(-96.,5347.5,-56.),(-290.055,5347.5,-317.801),(-116.,5347.5,-336.),(-192.,5347.5,620.),(-116.,5443.5,-336.),(-290.055,5347.5,-317.801),(-290.055,5443.5,-317.801),(-116.,5347.5,-336.)),$); +#188=IFCSTYLEDITEM(#186,(#172),$); +#189=IFCTRIANGULATEDFACESET(#190,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#190=IFCCARTESIANPOINTLIST3D(((-290.055,3643.5,-317.801),(-116.,3643.5,-56.),(-116.,3643.5,-336.),(-192.,3643.5,620.),(-96.,3643.5,-56.),(-96.,3643.5,620.),(-96.,3643.5,-56.),(-96.,3547.5,620.),(-96.,3547.5,-56.),(-96.,3643.5,620.),(-96.,3547.5,620.),(-192.,3643.5,620.),(-192.,3547.5,620.),(-96.,3643.5,620.),(-192.,3643.5,620.),(-290.055,3547.5,-317.801),(-192.,3547.5,620.),(-290.055,3643.5,-317.801),(-96.,3643.5,-56.),(-116.,3547.5,-56.),(-116.,3643.5,-56.),(-96.,3547.5,-56.),(-116.,3643.5,-336.),(-116.,3547.5,-56.),(-116.,3547.5,-336.),(-116.,3643.5,-56.),(-96.,3547.5,620.),(-116.,3547.5,-56.),(-96.,3547.5,-56.),(-290.055,3547.5,-317.801),(-116.,3547.5,-336.),(-192.,3547.5,620.),(-116.,3643.5,-336.),(-290.055,3547.5,-317.801),(-290.055,3643.5,-317.801),(-116.,3547.5,-336.)),$); +#191=IFCSTYLEDITEM(#189,(#172),$); +#192=IFCTRIANGULATEDFACESET(#193,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#193=IFCCARTESIANPOINTLIST3D(((-290.055,7243.5,-317.801),(-116.,7243.5,-56.),(-116.,7243.5,-336.),(-192.,7243.5,620.),(-96.,7243.5,-56.),(-96.,7243.5,620.),(-96.,7243.5,-56.),(-96.,7147.5,620.),(-96.,7147.5,-56.),(-96.,7243.5,620.),(-96.,7147.5,620.),(-192.,7243.5,620.),(-192.,7147.5,620.),(-96.,7243.5,620.),(-192.,7243.5,620.),(-290.055,7147.5,-317.801),(-192.,7147.5,620.),(-290.055,7243.5,-317.801),(-96.,7243.5,-56.),(-116.,7147.5,-56.),(-116.,7243.5,-56.),(-96.,7147.5,-56.),(-116.,7243.5,-336.),(-116.,7147.5,-56.),(-116.,7147.5,-336.),(-116.,7243.5,-56.),(-96.,7147.5,620.),(-116.,7147.5,-56.),(-96.,7147.5,-56.),(-290.055,7147.5,-317.801),(-116.,7147.5,-336.),(-192.,7147.5,620.),(-116.,7243.5,-336.),(-290.055,7147.5,-317.801),(-290.055,7243.5,-317.801),(-116.,7147.5,-336.)),$); +#194=IFCSTYLEDITEM(#192,(#172),$); +#195=IFCTRIANGULATEDFACESET(#196,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#196=IFCCARTESIANPOINTLIST3D(((-290.055,2743.5,-317.801),(-116.,2743.5,-56.),(-116.,2743.5,-336.),(-192.,2743.5,620.),(-96.,2743.5,-56.),(-96.,2743.5,620.),(-96.,2743.5,-56.),(-96.,2647.5,620.),(-96.,2647.5,-56.),(-96.,2743.5,620.),(-96.,2647.5,620.),(-192.,2743.5,620.),(-192.,2647.5,620.),(-96.,2743.5,620.),(-192.,2743.5,620.),(-290.055,2647.5,-317.801),(-192.,2647.5,620.),(-290.055,2743.5,-317.801),(-96.,2743.5,-56.),(-116.,2647.5,-56.),(-116.,2743.5,-56.),(-96.,2647.5,-56.),(-116.,2743.5,-336.),(-116.,2647.5,-56.),(-116.,2647.5,-336.),(-116.,2743.5,-56.),(-96.,2647.5,620.),(-116.,2647.5,-56.),(-96.,2647.5,-56.),(-290.055,2647.5,-317.801),(-116.,2647.5,-336.),(-192.,2647.5,620.),(-116.,2743.5,-336.),(-290.055,2647.5,-317.801),(-290.055,2743.5,-317.801),(-116.,2647.5,-336.)),$); +#197=IFCSTYLEDITEM(#195,(#172),$); +#198=IFCTRIANGULATEDFACESET(#199,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#199=IFCCARTESIANPOINTLIST3D(((-290.055,8143.5,-317.801),(-116.,8143.5,-56.),(-116.,8143.5,-336.),(-192.,8143.5,620.),(-96.,8143.5,-56.),(-96.,8143.5,620.),(-96.,8143.5,-56.),(-96.,8047.5,620.),(-96.,8047.5,-56.),(-96.,8143.5,620.),(-96.,8047.5,620.),(-192.,8143.5,620.),(-192.,8047.5,620.),(-96.,8143.5,620.),(-192.,8143.5,620.),(-290.055,8047.5,-317.801),(-192.,8047.5,620.),(-290.055,8143.5,-317.801),(-96.,8143.5,-56.),(-116.,8047.5,-56.),(-116.,8143.5,-56.),(-96.,8047.5,-56.),(-116.,8143.5,-336.),(-116.,8047.5,-56.),(-116.,8047.5,-336.),(-116.,8143.5,-56.),(-96.,8047.5,620.),(-116.,8047.5,-56.),(-96.,8047.5,-56.),(-290.055,8047.5,-317.801),(-116.,8047.5,-336.),(-192.,8047.5,620.),(-116.,8143.5,-336.),(-290.055,8047.5,-317.801),(-290.055,8143.5,-317.801),(-116.,8047.5,-336.)),$); +#200=IFCSTYLEDITEM(#198,(#172),$); +#201=IFCTRIANGULATEDFACESET(#202,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#202=IFCCARTESIANPOINTLIST3D(((-290.055,1843.5,-317.801),(-116.,1843.5,-56.),(-116.,1843.5,-336.),(-192.,1843.5,620.),(-96.,1843.5,-56.),(-96.,1843.5,620.),(-96.,1843.5,-56.),(-96.,1747.5,620.),(-96.,1747.5,-56.),(-96.,1843.5,620.),(-96.,1747.5,620.),(-192.,1843.5,620.),(-192.,1747.5,620.),(-96.,1843.5,620.),(-192.,1843.5,620.),(-290.055,1747.5,-317.801),(-192.,1747.5,620.),(-290.055,1843.5,-317.801),(-96.,1843.5,-56.),(-116.,1747.5,-56.),(-116.,1843.5,-56.),(-96.,1747.5,-56.),(-116.,1843.5,-336.),(-116.,1747.5,-56.),(-116.,1747.5,-336.),(-116.,1843.5,-56.),(-96.,1747.5,620.),(-116.,1747.5,-56.),(-96.,1747.5,-56.),(-290.055,1747.5,-317.801),(-116.,1747.5,-336.),(-192.,1747.5,620.),(-116.,1843.5,-336.),(-290.055,1747.5,-317.801),(-290.055,1843.5,-317.801),(-116.,1747.5,-336.)),$); +#203=IFCSTYLEDITEM(#201,(#172),$); +#204=IFCTRIANGULATEDFACESET(#205,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#205=IFCCARTESIANPOINTLIST3D(((-290.055,9043.5,-317.801),(-116.,9043.5,-56.),(-116.,9043.5,-336.),(-192.,9043.5,620.),(-96.,9043.5,-56.),(-96.,9043.5,620.),(-96.,9043.5,-56.),(-96.,8947.5,620.),(-96.,8947.5,-56.),(-96.,9043.5,620.),(-96.,8947.5,620.),(-192.,9043.5,620.),(-192.,8947.5,620.),(-96.,9043.5,620.),(-192.,9043.5,620.),(-290.055,8947.5,-317.801),(-192.,8947.5,620.),(-290.055,9043.5,-317.801),(-96.,9043.5,-56.),(-116.,8947.5,-56.),(-116.,9043.5,-56.),(-96.,8947.5,-56.),(-116.,9043.5,-336.),(-116.,8947.5,-56.),(-116.,8947.5,-336.),(-116.,9043.5,-56.),(-96.,8947.5,620.),(-116.,8947.5,-56.),(-96.,8947.5,-56.),(-290.055,8947.5,-317.801),(-116.,8947.5,-336.),(-192.,8947.5,620.),(-116.,9043.5,-336.),(-290.055,8947.5,-317.801),(-290.055,9043.5,-317.801),(-116.,8947.5,-336.)),$); +#206=IFCSTYLEDITEM(#204,(#172),$); +#207=IFCTRIANGULATEDFACESET(#208,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#208=IFCCARTESIANPOINTLIST3D(((-290.055,9891.,-317.801),(-116.,9891.,-56.),(-116.,9891.,-336.),(-192.,9891.,620.),(-96.,9891.,-56.),(-96.,9891.,620.),(-96.,9891.,-56.),(-96.,9795.,620.),(-96.,9795.,-56.),(-96.,9891.,620.),(-96.,9795.,620.),(-192.,9891.,620.),(-192.,9795.,620.),(-96.,9891.,620.),(-192.,9891.,620.),(-290.055,9795.,-317.801),(-192.,9795.,620.),(-290.055,9891.,-317.801),(-96.,9891.,-56.),(-116.,9795.,-56.),(-116.,9891.,-56.),(-96.,9795.,-56.),(-116.,9891.,-336.),(-116.,9795.,-56.),(-116.,9795.,-336.),(-116.,9891.,-56.),(-96.,9795.,620.),(-116.,9795.,-56.),(-96.,9795.,-56.),(-290.055,9795.,-317.801),(-116.,9795.,-336.),(-192.,9795.,620.),(-116.,9891.,-336.),(-290.055,9795.,-317.801),(-290.055,9891.,-317.801),(-116.,9795.,-336.)),$); +#209=IFCSTYLEDITEM(#207,(#172),$); +#210=IFCTRIANGULATEDFACESET(#211,((3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(3.1096923861754684E-15,1.,1.6793345466340823E-16),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(-0.9945782078818076,1.6517035657171758E-16,0.10399129005167718),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(1.,-5.444323400622572E-17,0.),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-5.006682783063523E-16,-1.,-2.9120845570907494E-17),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076),(-0.10399129005167673,-1.6388562330871208E-15,-0.9945782078818076)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(7,8,9),(8,7,10),(11,12,13),(12,11,14),(15,16,17),(16,15,18),(19,20,21),(20,19,22),(23,24,25),(24,23,26),(27,28,29),(28,30,31),(30,28,32),(32,28,27),(33,34,35),(34,33,36)),$); +#211=IFCCARTESIANPOINTLIST3D(((-290.055,96.,-317.801),(-116.,96.,-56.),(-116.,96.,-336.),(-192.,96.,620.),(-96.,96.,-56.),(-96.,96.,620.),(-96.,96.,-56.),(-96.,0.,620.),(-96.,0.,-56.),(-96.,96.,620.),(-96.,0.,620.),(-192.,96.,620.),(-192.,0.,620.),(-96.,96.,620.),(-192.,96.,620.),(-290.055,0.,-317.801),(-192.,0.,620.),(-290.055,96.,-317.801),(-96.,96.,-56.),(-116.,0.,-56.),(-116.,96.,-56.),(-96.,0.,-56.),(-116.,96.,-336.),(-116.,0.,-56.),(-116.,0.,-336.),(-116.,96.,-56.),(-96.,0.,620.),(-116.,0.,-56.),(-96.,0.,-56.),(-290.055,0.,-317.801),(-116.,0.,-336.),(-192.,0.,620.),(-116.,96.,-336.),(-290.055,0.,-317.801),(-290.055,96.,-317.801),(-116.,0.,-336.)),$); +#212=IFCSTYLEDITEM(#210,(#172),$); +#213=IFCRAILING('1lX0aCXHj46eYgtlXl_65e',#1,'bridge road railing','A protective railing, ensuring safety along the bridge road.','guardrail',#214,#223,'454425.1027893.955984.1885148.955013',$); +#214=IFCLOCALPLACEMENT(#150,#215); +#215=IFCAXIS2PLACEMENT3D(#216,#217,#218); +#216=IFCCARTESIANPOINT((4945.5,1684.,0.)); +#217=IFCDIRECTION((0.,0.,-1.)); +#218=IFCDIRECTION((-3.508586796479452E-16,1.,0.)); +#219=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#220,#224,#227,#230,#233,#236,#239,#242,#245,#248,#251,#254,#257,#260)); +#220=IFCTRIANGULATEDFACESET(#221,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#221=IFCCARTESIANPOINTLIST3D(((290.055,-4543.5,317.801),(116.,-4543.5,56.),(116.,-4543.5,336.),(192.,-4543.5,-620.),(96.,-4543.5,56.),(96.,-4543.5,-620.),(96.,-4543.5,56.),(96.,-4447.5,-620.),(96.,-4447.5,56.),(96.,-4543.5,-620.),(96.,-4447.5,-620.),(192.,-4543.5,-620.),(192.,-4447.5,-620.),(96.,-4543.5,-620.),(192.,-4543.5,-620.),(290.055,-4447.5,317.801),(192.,-4447.5,-620.),(290.055,-4543.5,317.801),(96.,-4543.5,56.),(116.,-4447.5,56.),(116.,-4543.5,56.),(96.,-4447.5,56.),(116.,-4543.5,336.),(116.,-4447.5,56.),(116.,-4447.5,336.),(116.,-4543.5,56.),(96.,-4447.5,-620.),(116.,-4447.5,56.),(96.,-4447.5,56.),(290.055,-4447.5,317.801),(116.,-4447.5,336.),(192.,-4447.5,-620.),(116.,-4543.5,336.),(290.055,-4447.5,317.801),(290.055,-4543.5,317.801),(116.,-4447.5,336.)),$); +#222=IFCSTYLEDITEM(#220,(#172),$); +#223=IFCPRODUCTDEFINITIONSHAPE($,$,(#219)); +#224=IFCTRIANGULATEDFACESET(#225,((5.874930171974784E-17,-6.580250805151999E-19,1.),(5.874930171974784E-17,-6.580250805151999E-19,1.),(5.874930171974784E-17,-6.580250805151999E-19,1.),(5.874930171974784E-17,-6.580250805151999E-19,1.),(-1.,-3.2665940403735764E-17,5.874930171974787E-17),(-1.,-3.2665940403735764E-17,5.874930171974787E-17),(-1.,-3.2665940403735764E-17,5.874930171974787E-17),(-1.,-3.2665940403735764E-17,5.874930171974787E-17),(-5.874930171974784E-17,6.580250805151999E-19,-1.),(-5.874930171974784E-17,6.580250805151999E-19,-1.),(-5.874930171974784E-17,6.580250805151999E-19,-1.),(-5.874930171974784E-17,6.580250805151999E-19,-1.),(5.259354711419738E-17,-1.,-6.5802508051520145E-19),(5.259354711419738E-17,-1.,-6.5802508051520145E-19),(5.259354711419738E-17,-1.,-6.5802508051520145E-19),(5.259354711419738E-17,-1.,-6.5802508051520145E-19),(1.,3.2665940403735764E-17,-5.874930171974787E-17),(1.,3.2665940403735764E-17,-5.874930171974787E-17),(1.,3.2665940403735764E-17,-5.874930171974787E-17),(1.,3.2665940403735764E-17,-5.874930171974787E-17),(-5.259354711419738E-17,1.,6.5802508051520145E-19),(-5.259354711419738E-17,1.,6.5802508051520145E-19),(-5.259354711419738E-17,1.,6.5802508051520145E-19),(-5.259354711419738E-17,1.,6.5802508051520145E-19)),$,((3,2,1),(4,1,2),(7,6,5),(8,5,6),(11,10,9),(12,9,10),(15,14,13),(16,13,14),(19,18,17),(20,17,18),(23,22,21),(24,21,22)),$); +#225=IFCCARTESIANPOINTLIST3D(((0.,-9900.,56.),(96.,9.,56.),(96.,-9900.,56.),(0.,9.,56.),(0.,-9900.,56.),(0.,9.,-140.),(0.,9.,56.),(0.,-9900.,-140.),(0.,9.,-140.),(96.,-9900.,-140.),(96.,9.,-140.),(0.,-9900.,-140.),(96.,-9900.,-140.),(0.,-9900.,56.),(96.,-9900.,56.),(0.,-9900.,-140.),(96.,-9900.,-140.),(96.,9.,56.),(96.,9.,-140.),(96.,-9900.,56.),(0.,9.,-140.),(96.,9.,56.),(0.,9.,56.),(96.,9.,-140.)),$); +#226=IFCSTYLEDITEM(#224,(#172),$); +#227=IFCTRIANGULATEDFACESET(#228,((5.874930171974784E-17,-6.580250805151999E-19,1.),(5.874930171974784E-17,-6.580250805151999E-19,1.),(5.874930171974784E-17,-6.580250805151999E-19,1.),(5.874930171974784E-17,-6.580250805151999E-19,1.),(-1.,-3.2665940403735764E-17,5.874930171974787E-17),(-1.,-3.2665940403735764E-17,5.874930171974787E-17),(-1.,-3.2665940403735764E-17,5.874930171974787E-17),(-1.,-3.2665940403735764E-17,5.874930171974787E-17),(-5.874930171974784E-17,6.580250805151999E-19,-1.),(-5.874930171974784E-17,6.580250805151999E-19,-1.),(-5.874930171974784E-17,6.580250805151999E-19,-1.),(-5.874930171974784E-17,6.580250805151999E-19,-1.),(5.259354711419738E-17,-1.,-6.5802508051520145E-19),(5.259354711419738E-17,-1.,-6.5802508051520145E-19),(5.259354711419738E-17,-1.,-6.5802508051520145E-19),(5.259354711419738E-17,-1.,-6.5802508051520145E-19),(1.,3.2665940403735764E-17,-5.874930171974787E-17),(1.,3.2665940403735764E-17,-5.874930171974787E-17),(1.,3.2665940403735764E-17,-5.874930171974787E-17),(1.,3.2665940403735764E-17,-5.874930171974787E-17),(-5.259354711419738E-17,1.,6.5802508051520145E-19),(-5.259354711419738E-17,1.,6.5802508051520145E-19),(-5.259354711419738E-17,1.,6.5802508051520145E-19),(-5.259354711419738E-17,1.,6.5802508051520145E-19)),$,((3,2,1),(4,1,2),(7,6,5),(8,5,6),(11,10,9),(12,9,10),(15,14,13),(16,13,14),(19,18,17),(20,17,18),(23,22,21),(24,21,22)),$); +#228=IFCCARTESIANPOINTLIST3D(((0.,-9900.,-404.),(96.,9.,-404.),(96.,-9900.,-404.),(0.,9.,-404.),(0.,-9900.,-404.),(0.,9.,-600.),(0.,9.,-404.),(0.,-9900.,-600.),(0.,9.,-600.),(96.,-9900.,-600.),(96.,9.,-600.),(0.,-9900.,-600.),(96.,-9900.,-600.),(0.,-9900.,-404.),(96.,-9900.,-404.),(0.,-9900.,-600.),(96.,-9900.,-600.),(96.,9.,-404.),(96.,9.,-600.),(96.,-9900.,-404.),(0.,9.,-600.),(96.,9.,-404.),(0.,9.,-404.),(96.,9.,-600.)),$); +#229=IFCSTYLEDITEM(#227,(#172),$); +#230=IFCTRIANGULATEDFACESET(#231,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#231=IFCCARTESIANPOINTLIST3D(((290.055,-943.5,317.801),(116.,-943.5,56.),(116.,-943.5,336.),(192.,-943.5,-620.),(96.,-943.5,56.),(96.,-943.5,-620.),(96.,-943.5,56.),(96.,-847.5,-620.),(96.,-847.5,56.),(96.,-943.5,-620.),(96.,-847.5,-620.),(192.,-943.5,-620.),(192.,-847.5,-620.),(96.,-943.5,-620.),(192.,-943.5,-620.),(290.055,-847.5,317.801),(192.,-847.5,-620.),(290.055,-943.5,317.801),(96.,-943.5,56.),(116.,-847.5,56.),(116.,-943.5,56.),(96.,-847.5,56.),(116.,-943.5,336.),(116.,-847.5,56.),(116.,-847.5,336.),(116.,-943.5,56.),(96.,-847.5,-620.),(116.,-847.5,56.),(96.,-847.5,56.),(290.055,-847.5,317.801),(116.,-847.5,336.),(192.,-847.5,-620.),(116.,-943.5,336.),(290.055,-847.5,317.801),(290.055,-943.5,317.801),(116.,-847.5,336.)),$); +#232=IFCSTYLEDITEM(#230,(#172),$); +#233=IFCTRIANGULATEDFACESET(#234,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#234=IFCCARTESIANPOINTLIST3D(((290.055,-6343.5,317.801),(116.,-6343.5,56.),(116.,-6343.5,336.),(192.,-6343.5,-620.),(96.,-6343.5,56.),(96.,-6343.5,-620.),(96.,-6343.5,56.),(96.,-6247.5,-620.),(96.,-6247.5,56.),(96.,-6343.5,-620.),(96.,-6247.5,-620.),(192.,-6343.5,-620.),(192.,-6247.5,-620.),(96.,-6343.5,-620.),(192.,-6343.5,-620.),(290.055,-6247.5,317.801),(192.,-6247.5,-620.),(290.055,-6343.5,317.801),(96.,-6343.5,56.),(116.,-6247.5,56.),(116.,-6343.5,56.),(96.,-6247.5,56.),(116.,-6343.5,336.),(116.,-6247.5,56.),(116.,-6247.5,336.),(116.,-6343.5,56.),(96.,-6247.5,-620.),(116.,-6247.5,56.),(96.,-6247.5,56.),(290.055,-6247.5,317.801),(116.,-6247.5,336.),(192.,-6247.5,-620.),(116.,-6343.5,336.),(290.055,-6247.5,317.801),(290.055,-6343.5,317.801),(116.,-6247.5,336.)),$); +#235=IFCSTYLEDITEM(#233,(#172),$); +#236=IFCTRIANGULATEDFACESET(#237,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#237=IFCCARTESIANPOINTLIST3D(((290.055,-5443.5,317.801),(116.,-5443.5,56.),(116.,-5443.5,336.),(192.,-5443.5,-620.),(96.,-5443.5,56.),(96.,-5443.5,-620.),(96.,-5443.5,56.),(96.,-5347.5,-620.),(96.,-5347.5,56.),(96.,-5443.5,-620.),(96.,-5347.5,-620.),(192.,-5443.5,-620.),(192.,-5347.5,-620.),(96.,-5443.5,-620.),(192.,-5443.5,-620.),(290.055,-5347.5,317.801),(192.,-5347.5,-620.),(290.055,-5443.5,317.801),(96.,-5443.5,56.),(116.,-5347.5,56.),(116.,-5443.5,56.),(96.,-5347.5,56.),(116.,-5443.5,336.),(116.,-5347.5,56.),(116.,-5347.5,336.),(116.,-5443.5,56.),(96.,-5347.5,-620.),(116.,-5347.5,56.),(96.,-5347.5,56.),(290.055,-5347.5,317.801),(116.,-5347.5,336.),(192.,-5347.5,-620.),(116.,-5443.5,336.),(290.055,-5347.5,317.801),(290.055,-5443.5,317.801),(116.,-5347.5,336.)),$); +#238=IFCSTYLEDITEM(#236,(#172),$); +#239=IFCTRIANGULATEDFACESET(#240,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#240=IFCCARTESIANPOINTLIST3D(((290.055,-3643.5,317.801),(116.,-3643.5,56.),(116.,-3643.5,336.),(192.,-3643.5,-620.),(96.,-3643.5,56.),(96.,-3643.5,-620.),(96.,-3643.5,56.),(96.,-3547.5,-620.),(96.,-3547.5,56.),(96.,-3643.5,-620.),(96.,-3547.5,-620.),(192.,-3643.5,-620.),(192.,-3547.5,-620.),(96.,-3643.5,-620.),(192.,-3643.5,-620.),(290.055,-3547.5,317.801),(192.,-3547.5,-620.),(290.055,-3643.5,317.801),(96.,-3643.5,56.),(116.,-3547.5,56.),(116.,-3643.5,56.),(96.,-3547.5,56.),(116.,-3643.5,336.),(116.,-3547.5,56.),(116.,-3547.5,336.),(116.,-3643.5,56.),(96.,-3547.5,-620.),(116.,-3547.5,56.),(96.,-3547.5,56.),(290.055,-3547.5,317.801),(116.,-3547.5,336.),(192.,-3547.5,-620.),(116.,-3643.5,336.),(290.055,-3547.5,317.801),(290.055,-3643.5,317.801),(116.,-3547.5,336.)),$); +#241=IFCSTYLEDITEM(#239,(#172),$); +#242=IFCTRIANGULATEDFACESET(#243,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#243=IFCCARTESIANPOINTLIST3D(((290.055,-7243.5,317.801),(116.,-7243.5,56.),(116.,-7243.5,336.),(192.,-7243.5,-620.),(96.,-7243.5,56.),(96.,-7243.5,-620.),(96.,-7243.5,56.),(96.,-7147.5,-620.),(96.,-7147.5,56.),(96.,-7243.5,-620.),(96.,-7147.5,-620.),(192.,-7243.5,-620.),(192.,-7147.5,-620.),(96.,-7243.5,-620.),(192.,-7243.5,-620.),(290.055,-7147.5,317.801),(192.,-7147.5,-620.),(290.055,-7243.5,317.801),(96.,-7243.5,56.),(116.,-7147.5,56.),(116.,-7243.5,56.),(96.,-7147.5,56.),(116.,-7243.5,336.),(116.,-7147.5,56.),(116.,-7147.5,336.),(116.,-7243.5,56.),(96.,-7147.5,-620.),(116.,-7147.5,56.),(96.,-7147.5,56.),(290.055,-7147.5,317.801),(116.,-7147.5,336.),(192.,-7147.5,-620.),(116.,-7243.5,336.),(290.055,-7147.5,317.801),(290.055,-7243.5,317.801),(116.,-7147.5,336.)),$); +#244=IFCSTYLEDITEM(#242,(#172),$); +#245=IFCTRIANGULATEDFACESET(#246,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#246=IFCCARTESIANPOINTLIST3D(((290.055,-2743.5,317.801),(116.,-2743.5,56.),(116.,-2743.5,336.),(192.,-2743.5,-620.),(96.,-2743.5,56.),(96.,-2743.5,-620.),(96.,-2743.5,56.),(96.,-2647.5,-620.),(96.,-2647.5,56.),(96.,-2743.5,-620.),(96.,-2647.5,-620.),(192.,-2743.5,-620.),(192.,-2647.5,-620.),(96.,-2743.5,-620.),(192.,-2743.5,-620.),(290.055,-2647.5,317.801),(192.,-2647.5,-620.),(290.055,-2743.5,317.801),(96.,-2743.5,56.),(116.,-2647.5,56.),(116.,-2743.5,56.),(96.,-2647.5,56.),(116.,-2743.5,336.),(116.,-2647.5,56.),(116.,-2647.5,336.),(116.,-2743.5,56.),(96.,-2647.5,-620.),(116.,-2647.5,56.),(96.,-2647.5,56.),(290.055,-2647.5,317.801),(116.,-2647.5,336.),(192.,-2647.5,-620.),(116.,-2743.5,336.),(290.055,-2647.5,317.801),(290.055,-2743.5,317.801),(116.,-2647.5,336.)),$); +#247=IFCSTYLEDITEM(#245,(#172),$); +#248=IFCTRIANGULATEDFACESET(#249,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#249=IFCCARTESIANPOINTLIST3D(((290.055,-8143.5,317.801),(116.,-8143.5,56.),(116.,-8143.5,336.),(192.,-8143.5,-620.),(96.,-8143.5,56.),(96.,-8143.5,-620.),(96.,-8143.5,56.),(96.,-8047.5,-620.),(96.,-8047.5,56.),(96.,-8143.5,-620.),(96.,-8047.5,-620.),(192.,-8143.5,-620.),(192.,-8047.5,-620.),(96.,-8143.5,-620.),(192.,-8143.5,-620.),(290.055,-8047.5,317.801),(192.,-8047.5,-620.),(290.055,-8143.5,317.801),(96.,-8143.5,56.),(116.,-8047.5,56.),(116.,-8143.5,56.),(96.,-8047.5,56.),(116.,-8143.5,336.),(116.,-8047.5,56.),(116.,-8047.5,336.),(116.,-8143.5,56.),(96.,-8047.5,-620.),(116.,-8047.5,56.),(96.,-8047.5,56.),(290.055,-8047.5,317.801),(116.,-8047.5,336.),(192.,-8047.5,-620.),(116.,-8143.5,336.),(290.055,-8047.5,317.801),(290.055,-8143.5,317.801),(116.,-8047.5,336.)),$); +#250=IFCSTYLEDITEM(#248,(#172),$); +#251=IFCTRIANGULATEDFACESET(#252,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#252=IFCCARTESIANPOINTLIST3D(((290.055,-1843.5,317.801),(116.,-1843.5,56.),(116.,-1843.5,336.),(192.,-1843.5,-620.),(96.,-1843.5,56.),(96.,-1843.5,-620.),(96.,-1843.5,56.),(96.,-1747.5,-620.),(96.,-1747.5,56.),(96.,-1843.5,-620.),(96.,-1747.5,-620.),(192.,-1843.5,-620.),(192.,-1747.5,-620.),(96.,-1843.5,-620.),(192.,-1843.5,-620.),(290.055,-1747.5,317.801),(192.,-1747.5,-620.),(290.055,-1843.5,317.801),(96.,-1843.5,56.),(116.,-1747.5,56.),(116.,-1843.5,56.),(96.,-1747.5,56.),(116.,-1843.5,336.),(116.,-1747.5,56.),(116.,-1747.5,336.),(116.,-1843.5,56.),(96.,-1747.5,-620.),(116.,-1747.5,56.),(96.,-1747.5,56.),(290.055,-1747.5,317.801),(116.,-1747.5,336.),(192.,-1747.5,-620.),(116.,-1843.5,336.),(290.055,-1747.5,317.801),(290.055,-1843.5,317.801),(116.,-1747.5,336.)),$); +#253=IFCSTYLEDITEM(#251,(#172),$); +#254=IFCTRIANGULATEDFACESET(#255,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#255=IFCCARTESIANPOINTLIST3D(((290.055,-9043.5,317.801),(116.,-9043.5,56.),(116.,-9043.5,336.),(192.,-9043.5,-620.),(96.,-9043.5,56.),(96.,-9043.5,-620.),(96.,-9043.5,56.),(96.,-8947.5,-620.),(96.,-8947.5,56.),(96.,-9043.5,-620.),(96.,-8947.5,-620.),(192.,-9043.5,-620.),(192.,-8947.5,-620.),(96.,-9043.5,-620.),(192.,-9043.5,-620.),(290.055,-8947.5,317.801),(192.,-8947.5,-620.),(290.055,-9043.5,317.801),(96.,-9043.5,56.),(116.,-8947.5,56.),(116.,-9043.5,56.),(96.,-8947.5,56.),(116.,-9043.5,336.),(116.,-8947.5,56.),(116.,-8947.5,336.),(116.,-9043.5,56.),(96.,-8947.5,-620.),(116.,-8947.5,56.),(96.,-8947.5,56.),(290.055,-8947.5,317.801),(116.,-8947.5,336.),(192.,-8947.5,-620.),(116.,-9043.5,336.),(290.055,-8947.5,317.801),(290.055,-9043.5,317.801),(116.,-8947.5,336.)),$); +#256=IFCSTYLEDITEM(#254,(#172),$); +#257=IFCTRIANGULATEDFACESET(#258,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#258=IFCCARTESIANPOINTLIST3D(((290.055,-9891.,317.801),(116.,-9891.,56.),(116.,-9891.,336.),(192.,-9891.,-620.),(96.,-9891.,56.),(96.,-9891.,-620.),(96.,-9891.,56.),(96.,-9795.,-620.),(96.,-9795.,56.),(96.,-9891.,-620.),(96.,-9795.,-620.),(192.,-9891.,-620.),(192.,-9795.,-620.),(96.,-9891.,-620.),(192.,-9891.,-620.),(290.055,-9795.,317.801),(192.,-9795.,-620.),(290.055,-9891.,317.801),(96.,-9891.,56.),(116.,-9795.,56.),(116.,-9891.,56.),(96.,-9795.,56.),(116.,-9891.,336.),(116.,-9795.,56.),(116.,-9795.,336.),(116.,-9891.,56.),(96.,-9795.,-620.),(116.,-9795.,56.),(96.,-9795.,56.),(290.055,-9795.,317.801),(116.,-9795.,336.),(192.,-9795.,-620.),(116.,-9891.,336.),(290.055,-9795.,317.801),(290.055,-9891.,317.801),(116.,-9795.,336.)),$); +#259=IFCSTYLEDITEM(#257,(#172),$); +#260=IFCTRIANGULATEDFACESET(#261,((-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-3.0560309218362393E-15,-1.,-1.6793345466340823E-16),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.,-0.,-1.),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.9945782078818075,-7.853346999699425E-17,-0.10399129005167716),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(-1.,-3.2665940403735764E-17,-0.),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(4.470068139671228E-16,1.,2.9120845570907494E-17),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076),(0.10399129005167673,1.6479148285093492E-15,0.9945782078818076)),$,((3,2,1),(4,1,2),(5,4,2),(6,4,5),(9,8,7),(10,7,8),(13,12,11),(14,11,12),(17,16,15),(18,15,16),(21,20,19),(22,19,20),(25,24,23),(26,23,24),(29,28,27),(31,30,28),(32,28,30),(27,28,32),(35,34,33),(36,33,34)),$); +#261=IFCCARTESIANPOINTLIST3D(((290.055,-96.,317.801),(116.,-96.,56.),(116.,-96.,336.),(192.,-96.,-620.),(96.,-96.,56.),(96.,-96.,-620.),(96.,-96.,56.),(96.,0.,-620.),(96.,0.,56.),(96.,-96.,-620.),(96.,0.,-620.),(192.,-96.,-620.),(192.,0.,-620.),(96.,-96.,-620.),(192.,-96.,-620.),(290.055,0.,317.801),(192.,0.,-620.),(290.055,-96.,317.801),(96.,-96.,56.),(116.,0.,56.),(116.,-96.,56.),(96.,0.,56.),(116.,-96.,336.),(116.,0.,56.),(116.,0.,336.),(116.,-96.,56.),(96.,0.,-620.),(116.,0.,56.),(96.,0.,56.),(290.055,0.,317.801),(116.,0.,336.),(192.,0.,-620.),(116.,-96.,336.),(290.055,0.,317.801),(290.055,-96.,317.801),(116.,0.,336.)),$); +#262=IFCSTYLEDITEM(#260,(#172),$); +#263=IFCSLABTYPE('3bGgvP661A1hp1j7jEW32Y',#1,'road river bridge - bridge deck','The bridge deck, providing a stable surface for vehicles to cross the river.',$,$,$,'940317','floor',.FLOOR.); +#264=IFCRELDEFINESBYTYPE('1vqNCJkYr8EBQCzGPtylE1',#1,$,$,(#265),#263); +#265=IFCSLAB('3ObOfBTNz2dhgWxUzdmDpl',#1,'road river bridge - bridge deck','The bridge deck, providing a stable surface for vehicles to cross the river.','floor',#271,#280,'454425.1027893.955984.1885148.955028',$); +#266=IFCQUANTITYVOLUME('NetVolume',$,$,1.8689166720000028,$); +#267=IFCQUANTITYLENGTH('Depth',$,$,56.,$); +#268=IFCQUANTITYAREA('NetArea',$,$,33.373512000000055,$); +#269=IFCELEMENTQUANTITY('0cEJ_evQ575wyugUDLblO7',#1,'Qto_SlabBaseQuantities',$,'BaseQuantities',(#266,#267,#268)); +#270=IFCRELDEFINESBYPROPERTIES('3EXBljMFD0_Be0O_iMTXPQ',#1,$,$,(#265),#269); +#271=IFCLOCALPLACEMENT(#150,#272); +#272=IFCAXIS2PLACEMENT3D(#273,#274,#275); +#273=IFCCARTESIANPOINT((4945.5,-1675.,-56.)); +#274=IFCDIRECTION((0.,0.,1.)); +#275=IFCDIRECTION((-7.503253850679952E-16,1.,0.)); +#276=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#277)); +#277=IFCTRIANGULATEDFACESET(#278,((0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.1102230246251563E-16,-1.,0.),(-1.1102230246251563E-16,-1.,0.),(-1.1102230246251563E-16,-1.,0.),(-1.1102230246251563E-16,-1.,0.),(-1.,-1.6653345369377343E-16,0.),(-1.,-1.6653345369377343E-16,0.),(-1.,-1.6653345369377343E-16,0.),(-1.,-1.6653345369377343E-16,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.1102230246251563E-16,1.,0.),(1.1102230246251563E-16,1.,0.),(1.1102230246251563E-16,1.,0.),(1.1102230246251563E-16,1.,0.),(1.,1.6653345369377343E-16,0.),(1.,1.6653345369377343E-16,0.),(1.,1.6653345369377343E-16,0.),(1.,1.6653345369377343E-16,0.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#278=IFCCARTESIANPOINTLIST3D(((3359.,-9.,56.),(-9.,9900.,56.),(-9.,-9.,56.),(3359.,9900.,56.),(3359.,-9.,56.),(-9.,-9.,0.),(3359.,-9.,0.),(-9.,-9.,56.),(-9.,9900.,56.),(-9.,-9.,0.),(-9.,-9.,56.),(-9.,9900.,0.),(3359.,9900.,0.),(-9.,-9.,0.),(-9.,9900.,0.),(3359.,-9.,0.),(-9.,9900.,56.),(3359.,9900.,0.),(-9.,9900.,0.),(3359.,9900.,56.),(3359.,9900.,0.),(3359.,-9.,56.),(3359.,-9.,0.),(3359.,9900.,56.)),$); +#279=IFCSTYLEDITEM(#277,(#172),$); +#280=IFCPRODUCTDEFINITIONSHAPE($,$,(#276)); +#281=IFCBRIDGEPART('2F86AY9Dn33gptJs5BIFJi',#1,'road rail bridge - superstructure','The superstructure, forming the main body of the road rail bridge.','superstructure',#282,$,$,.ELEMENT.,.LATERAL.,.SUPERSTRUCTURE.); +#282=IFCLOCALPLACEMENT(#39,#283); +#283=IFCAXIS2PLACEMENT3D(#284,#285,#286); +#284=IFCCARTESIANPOINT((0.,0.,0.)); +#285=IFCDIRECTION((0.,0.,1.)); +#286=IFCDIRECTION((1.,7.971042684184348E-18,0.)); +#287=IFCBEAMTYPE('3TYSLbvAz9IPwu6QjzMvAt',#1,'road river bridge - main girder','The main girder, providing essential support for the road river bridge.',$,$,$,'940385','girder_segment',.GIRDER_SEGMENT.); +#288=IFCRELDEFINESBYTYPE('2VKUU$jJj8G9QOqS8_4OTn',#1,$,$,(#289,#301,#309),#287); +#289=IFCBEAM('1dmYPmycr2LPQju29cHK45',#1,'road river bridge - main girder','The main girder, providing essential support for the road river bridge.','girder_segment',#291,#300,'454425.1027893.955984.1885150.955006',$); +#290=IFCRELCONTAINEDINSPATIALSTRUCTURE('3Qrk8BSmDCC9sT2lu19fhS',#1,$,$,(#289,#301,#309),#281); +#291=IFCLOCALPLACEMENT(#282,#292); +#292=IFCAXIS2PLACEMENT3D(#293,#294,#295); +#293=IFCCARTESIANPOINT((4945.5,-1675.,-356.)); +#294=IFCDIRECTION((1.,-9.91229679478457E-16,0.)); +#295=IFCDIRECTION((8.881784197001252E-16,1.,0.)); +#296=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#297)); +#297=IFCTRIANGULATEDFACESET(#298,((2.17475562759527E-15,0.,1.),(2.17475562759527E-15,0.,1.),(2.17475562759527E-15,0.,1.),(2.17475562759527E-15,0.,1.),(-2.17475562759527E-15,0.,-1.),(-2.17475562759527E-15,0.,-1.),(-2.17475562759527E-15,0.,-1.),(-2.17475562759527E-15,0.,-1.),(-1.,0.,2.1649348980190556E-15),(-1.,0.,2.1649348980190556E-15),(-1.,0.,2.1649348980190556E-15),(-1.,0.,2.1649348980190556E-15),(0.,-1.,-0.),(0.,-1.,-0.),(0.,-1.,-0.),(0.,-1.,-0.),(1.,0.,-2.1649348980190556E-15),(1.,0.,-2.1649348980190556E-15),(1.,0.,-2.1649348980190556E-15),(1.,0.,-2.1649348980190556E-15),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#298=IFCCARTESIANPOINTLIST3D(((125.,300.,0.),(-125.,0.,0.),(125.,0.,0.),(-125.,300.,0.),(-125.,300.,-9891.),(125.,0.,-9891.),(-125.,0.,-9891.),(125.,300.,-9891.),(-125.,300.,-9891.),(-125.,0.,0.),(-125.,300.,0.),(-125.,0.,-9891.),(125.,0.,-9891.),(-125.,0.,0.),(-125.,0.,-9891.),(125.,0.,0.),(125.,0.,-9891.),(125.,300.,0.),(125.,0.,0.),(125.,300.,-9891.),(125.,300.,0.),(-125.,300.,-9891.),(-125.,300.,0.),(125.,300.,-9891.)),$); +#299=IFCSTYLEDITEM(#297,(#172),$); +#300=IFCPRODUCTDEFINITIONSHAPE($,$,(#296)); +#301=IFCBEAM('0fDVrF0456nhTwgIrF5CPd',#1,'road river bridge - main girder','The main girder, providing essential support for the road river bridge.','girder_segment',#302,#308,'454425.1027893.955984.1885150.955009',$); +#302=IFCLOCALPLACEMENT(#282,#303); +#303=IFCAXIS2PLACEMENT3D(#304,#305,#306); +#304=IFCCARTESIANPOINT((4945.5,0.,-356.)); +#305=IFCDIRECTION((1.,-9.91229679478457E-16,0.)); +#306=IFCDIRECTION((8.881784197001252E-16,1.,0.)); +#307=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#297)); +#308=IFCPRODUCTDEFINITIONSHAPE($,$,(#307)); +#309=IFCBEAM('2kSK2Jw$z3JQs2YiiWmHXV',#1,'road river bridge - main girder','The main girder, providing essential support for the road river bridge.','girder_segment',#310,#319,'454425.1027893.955984.1885150.955007',$); +#310=IFCLOCALPLACEMENT(#282,#311); +#311=IFCAXIS2PLACEMENT3D(#312,#313,#314); +#312=IFCCARTESIANPOINT((4945.5,1675.,-356.)); +#313=IFCDIRECTION((-1.,-1.4512609746968885E-15,0.)); +#314=IFCDIRECTION((-1.4531106615889175E-15,1.,0.)); +#315=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#316)); +#316=IFCTRIANGULATEDFACESET(#317,((-2.19468323430573E-15,-0.,-1.),(-2.19468323430573E-15,-0.,-1.),(-2.19468323430573E-15,-0.,-1.),(-2.19468323430573E-15,-0.,-1.),(2.19468323430573E-15,0.,1.),(2.19468323430573E-15,0.,1.),(2.19468323430573E-15,0.,1.),(2.19468323430573E-15,0.,1.),(1.,0.,-2.2153926106831904E-15),(1.,0.,-2.2153926106831904E-15),(1.,0.,-2.2153926106831904E-15),(1.,0.,-2.2153926106831904E-15),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(-1.,0.,2.2153926106831904E-15),(-1.,0.,2.2153926106831904E-15),(-1.,0.,2.2153926106831904E-15),(-1.,0.,2.2153926106831904E-15),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.)),$,((3,2,1),(4,1,2),(7,6,5),(8,5,6),(11,10,9),(12,9,10),(15,14,13),(16,13,14),(19,18,17),(20,17,18),(23,22,21),(24,21,22)),$); +#317=IFCCARTESIANPOINTLIST3D(((-125.,-300.,0.),(125.,0.,0.),(-125.,0.,0.),(125.,-300.,0.),(125.,-300.,9891.),(-125.,0.,9891.),(125.,0.,9891.),(-125.,-300.,9891.),(125.,-300.,9891.),(125.,0.,0.),(125.,-300.,0.),(125.,0.,9891.),(-125.,0.,9891.),(125.,0.,0.),(125.,0.,9891.),(-125.,0.,0.),(-125.,0.,9891.),(-125.,-300.,0.),(-125.,0.,0.),(-125.,-300.,9891.),(-125.,-300.,0.),(125.,-300.,9891.),(125.,-300.,0.),(-125.,-300.,9891.)),$); +#318=IFCSTYLEDITEM(#316,(#172),$); +#319=IFCPRODUCTDEFINITIONSHAPE($,$,(#315)); +#320=IFCBRIDGEPART('1KPYb5dSn3C9_LNpDoIOdf',#1,'road river bridge - substructure','The substructure, providing essential support for the road river bridge.','substructure',#321,$,$,.COMPLEX.,.LATERAL.,.SUBSTRUCTURE.); +#321=IFCLOCALPLACEMENT(#39,#322); +#322=IFCAXIS2PLACEMENT3D(#323,#324,#325); +#323=IFCCARTESIANPOINT((0.,0.,0.)); +#324=IFCDIRECTION((0.,0.,1.)); +#325=IFCDIRECTION((1.,7.971042684184348E-18,0.)); +#326=IFCBRIDGEPART('0kTVfaOTj2pAN_WvUgOEdD',#1,'road river bridge - pier','The pier, providing foundational support for the road river bridge.','pier',#328,$,$,.PARTIAL.,.LATERAL.,.PIER.); +#327=IFCRELAGGREGATES('1vHgOE1c57I9FU416nd2Up',#1,'road river bridge - substructure container',$,#320,(#326,#386,#434)); +#328=IFCLOCALPLACEMENT(#321,#329); +#329=IFCAXIS2PLACEMENT3D(#330,#331,#332); +#330=IFCCARTESIANPOINT((4845.5,0.,0.)); +#331=IFCDIRECTION((0.,0.,-1.)); +#332=IFCDIRECTION((-6.903125459153066E-18,1.,0.)); +#333=IFCCOLUMNTYPE('1DE$4DmrX4WexgbyUxd1z5',#1,'road river bridge pierstem','A sturdy pierstem, providing vertical support for the road river bridge.',$,$,$,'1885215','pierstem',.PIERSTEM.); +#334=IFCRELDEFINESBYTYPE('10l0RhU$TDYxDR3JrVxZja',#1,$,$,(#335,#392,#440),#333); +#335=IFCCOLUMN('0Gl168Rv1ErxU_Zx$i1I5m',#1,'road river bridge pierstem','A sturdy pierstem, providing vertical support for the road river bridge.','pierstem',#342,#354,'454425.1027893.955984.1885152.955018.1885214',$); +#336=IFCRELASSOCIATESMATERIAL('1Brr3A8xPFggADdPE5hrti',#1,$,$,(#335,#392,#440,#502,#536,#564,#597,#621,#632,#640,#648,#707,#739,#765,#791,#813,#824,#832,#840),#337); +#337=IFCMATERIAL('stone_granite_masonry',$,$); +#338=IFCQUANTITYVOLUME('NetVolume',$,$,4.526915656682752,$); +#339=IFCELEMENTQUANTITY('1R2Q61uELEsAMjl8plS7uX',#1,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#338)); +#340=IFCRELDEFINESBYPROPERTIES('0RvWbGtoz918ieW2uMP4Iq',#1,$,$,(#335),#339); +#341=IFCRELCONTAINEDINSPATIALSTRUCTURE('06io2wSif7q8HKvpJbngxE',#1,$,$,(#335,#357,#370),#326); +#342=IFCLOCALPLACEMENT(#328,#343); +#343=IFCAXIS2PLACEMENT3D(#344,#345,#346); +#344=IFCCARTESIANPOINT((0.,0.,0.)); +#345=IFCDIRECTION((0.,0.,1.)); +#346=IFCDIRECTION((1.,-6.903125459153066E-18,0.)); +#347=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#348)); +#348=IFCTRIANGULATEDFACESET(#349,((4.718447854656914E-15,-1.,0.),(4.718447854656914E-15,-1.,0.),(4.718447854656914E-15,-1.,0.),(4.718447854656914E-15,-1.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-1.,-0.,-0.),(-1.,-0.,-0.),(-1.,-0.,-0.),(-1.,-0.,-0.),(-0.,-0.,-1.),(-0.,-0.,-1.),(-0.,-0.,-1.),(-0.,-0.,-1.),(-4.718447854656914E-15,1.,0.),(-4.718447854656914E-15,1.,0.),(-4.718447854656914E-15,1.,0.),(-4.718447854656914E-15,1.,0.)),$,((3,2,1),(4,1,2),(7,6,5),(8,5,6),(11,10,9),(12,9,10),(15,14,13),(16,13,14),(19,18,17),(20,17,18),(23,22,21),(24,21,22)),$); +#349=IFCCARTESIANPOINTLIST3D(((1800.,-275.,756.),(-1800.,-275.,3042.321),(1800.,-275.,3042.321),(-1800.,-275.,756.),(1800.,-275.,756.),(1800.,275.,3042.321),(1800.,275.,756.),(1800.,-275.,3042.321),(-1800.,-275.,3042.321),(1800.,275.,3042.321),(1800.,-275.,3042.321),(-1800.,275.,3042.321),(-1800.,-275.,3042.321),(-1800.,275.,756.),(-1800.,275.,3042.321),(-1800.,-275.,756.),(-1800.,275.,756.),(1800.,-275.,756.),(1800.,275.,756.),(-1800.,-275.,756.),(-1800.,275.,756.),(1800.,275.,3042.321),(-1800.,275.,3042.321),(1800.,275.,756.)),$); +#350=IFCSTYLEDITEM(#348,(#353),$); +#351=IFCSURFACESTYLERENDERING(#352,0.,$,$,$,$,$,$,.NOTDEFINED.); +#352=IFCCOLOURRGB($,0.403921568627451,0.403921568627451,0.403921568627451); +#353=IFCSURFACESTYLE('stone_granite_masonry',.BOTH.,(#351)); +#354=IFCPRODUCTDEFINITIONSHAPE($,$,(#347)); +#355=IFCFOOTINGTYPE('3tQseBOkr1XunGDWZI5tM6',#1,'foundation - bridge road','A solid foundation, providing support for the bridge rail.',$,$,$,'1886525',$,.PAD_FOOTING.); +#356=IFCRELDEFINESBYTYPE('2DwJIvQ6XEkAW4JFf_R6fX',#1,$,$,(#357,#407,#452),#355); +#357=IFCFOOTING('1iUk9ABeL9eBJ7Sv9b$q0d',#1,'foundation - bridge road','A solid foundation, providing support for the bridge rail.',$,#358,#367,'454425.1027893.955984.1885152.955018.1886522',$); +#358=IFCLOCALPLACEMENT(#328,#359); +#359=IFCAXIS2PLACEMENT3D(#360,#361,#362); +#360=IFCCARTESIANPOINT((0.,0.,3042.321)); +#361=IFCDIRECTION((0.,0.,1.)); +#362=IFCDIRECTION((1.,-6.903125459153066E-18,0.)); +#363=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#364)); +#364=IFCTRIANGULATEDFACESET(#365,((6.734731042375859E-17,-1.,-1.551705822936801E-17),(6.734731042375859E-17,-1.,-1.551705822936801E-17),(6.734731042375859E-17,-1.,-1.551705822936801E-17),(6.734731042375859E-17,-1.,-1.551705822936801E-17),(1.,2.321506128457627E-16,4.196027683515185E-16),(1.,2.321506128457627E-16,4.196027683515185E-16),(1.,2.321506128457627E-16,4.196027683515185E-16),(1.,2.321506128457627E-16,4.196027683515185E-16),(4.1960276835151796E-16,1.5517058229368017E-17,-1.),(4.1960276835151796E-16,1.5517058229368017E-17,-1.),(4.1960276835151796E-16,1.5517058229368017E-17,-1.),(4.1960276835151796E-16,1.5517058229368017E-17,-1.),(-6.734731042375859E-17,1.,1.551705822936801E-17),(-6.734731042375859E-17,1.,1.551705822936801E-17),(-6.734731042375859E-17,1.,1.551705822936801E-17),(-6.734731042375859E-17,1.,1.551705822936801E-17),(-1.,-2.321506128457627E-16,-4.196027683515185E-16),(-1.,-2.321506128457627E-16,-4.196027683515185E-16),(-1.,-2.321506128457627E-16,-4.196027683515185E-16),(-1.,-2.321506128457627E-16,-4.196027683515185E-16),(-4.1960276835151796E-16,-1.5517058229368017E-17,1.),(-4.1960276835151796E-16,-1.5517058229368017E-17,1.),(-4.1960276835151796E-16,-1.5517058229368017E-17,1.),(-4.1960276835151796E-16,-1.5517058229368017E-17,1.)),$,((3,2,1),(4,1,2),(7,6,5),(8,5,6),(11,10,9),(12,9,10),(15,14,13),(16,13,14),(19,18,17),(20,17,18),(23,22,21),(24,21,22)),$); +#365=IFCCARTESIANPOINTLIST3D(((2500.,-1050.,0.),(-2500.,-1050.,700.),(2500.,-1050.,700.),(-2500.,-1050.,0.),(2500.,-1050.,0.),(2500.,1050.,700.),(2500.,1050.,0.),(2500.,-1050.,700.),(2500.,1050.,0.),(-2500.,-1050.,0.),(2500.,-1050.,0.),(-2500.,1050.,0.),(-2500.,1050.,700.),(2500.,1050.,0.),(2500.,1050.,700.),(-2500.,1050.,0.),(-2500.,1050.,700.),(-2500.,-1050.,0.),(-2500.,1050.,0.),(-2500.,-1050.,700.),(-2500.,-1050.,700.),(2500.,1050.,700.),(2500.,-1050.,700.),(-2500.,1050.,700.)),$); +#366=IFCSTYLEDITEM(#364,(#78),$); +#367=IFCPRODUCTDEFINITIONSHAPE($,$,(#363)); +#368=IFCBEAMTYPE('1H0RSmZeTEfRAuBh9yekfv',#1,'bridge road - cross girder','A robust girder, ensuring stability and support for the bridge road.',$,$,$,'937730','piercap',.PIERCAP.); +#369=IFCRELDEFINESBYTYPE('0yU_ZHMgD6hBZvtH5vsZBL',#1,$,$,(#370,#418,#460),#368); +#370=IFCBEAM('3hqwHdFaf66Oki_1cxKAnF',#1,'bridge road - cross girder','A robust girder, ensuring stability and support for the bridge road.','piercap',#376,#385,'454425.1027893.955984.1885152.955018.1886593',$); +#371=IFCQUANTITYVOLUME('NetVolume',$,$,0.4800000000000015,$); +#372=IFCQUANTITYLENGTH('Length',$,$,4000.,$); +#373=IFCQUANTITYAREA('CrossSectionArea',$,$,0.12000000000000036,$); +#374=IFCELEMENTQUANTITY('29$so5TNj79ftTfTakuGY0',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#371,#372,#373)); +#375=IFCRELDEFINESBYPROPERTIES('2Mr6gRnJjABvzgrO_QPhHa',#1,$,$,(#370),#374); +#376=IFCLOCALPLACEMENT(#328,#377); +#377=IFCAXIS2PLACEMENT3D(#378,#379,#380); +#378=IFCCARTESIANPOINT((-2000.,150.,756.)); +#379=IFCDIRECTION((1.,1.0879117724101504E-15,0.)); +#380=IFCDIRECTION((-1.1577631331722305E-15,1.,0.)); +#381=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#382)); +#382=IFCTRIANGULATEDFACESET(#383,((-2.331468351712829E-15,-0.,-1.),(-2.331468351712829E-15,-0.,-1.),(-2.331468351712829E-15,-0.,-1.),(-2.331468351712829E-15,-0.,-1.),(2.331468351712829E-15,0.,1.),(2.331468351712829E-15,0.,1.),(2.331468351712829E-15,0.,1.),(2.331468351712829E-15,0.,1.),(1.,0.,-2.498001805406601E-15),(1.,0.,-2.498001805406601E-15),(1.,0.,-2.498001805406601E-15),(1.,0.,-2.498001805406601E-15),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(-1.,0.,3.2196467714129512E-15),(-1.,0.,3.2196467714129512E-15),(-1.,0.,3.2196467714129512E-15),(-1.,0.,3.2196467714129512E-15),(-0.,-1.,-0.),(-0.,-1.,-0.),(-0.,-1.,-0.),(-0.,-1.,-0.)),$,((3,2,1),(4,1,2),(7,6,5),(8,5,6),(11,10,9),(12,9,10),(15,14,13),(16,13,14),(19,18,17),(20,17,18),(23,22,21),(24,21,22)),$); +#383=IFCCARTESIANPOINTLIST3D(((-300.,0.,0.),(0.,-400.,0.),(0.,0.,0.),(-300.,-400.,0.),(-300.,-400.,4000.),(0.,0.,4000.),(0.,-400.,4000.),(-300.,0.,4000.),(0.,-400.,0.),(0.,0.,4000.),(0.,0.,0.),(0.,-400.,4000.),(-300.,0.,0.),(0.,0.,4000.),(-300.,0.,4000.),(0.,0.,0.),(-300.,-400.,4000.),(-300.,0.,0.),(-300.,0.,4000.),(-300.,-400.,0.),(0.,-400.,0.),(-300.,-400.,4000.),(0.,-400.,4000.),(-300.,-400.,0.)),$); +#384=IFCSTYLEDITEM(#382,(#172),$); +#385=IFCPRODUCTDEFINITIONSHAPE($,$,(#381)); +#386=IFCBRIDGEPART('0qDQIJzHH719PVQZWdQqW2',#1,'road river bridge - pier','The pier, providing foundational support for the road river bridge.','pier',#387,$,$,.PARTIAL.,.LATERAL.,.PIER.); +#387=IFCLOCALPLACEMENT(#321,#388); +#388=IFCAXIS2PLACEMENT3D(#389,#390,#391); +#389=IFCCARTESIANPOINT((0.,0.,0.)); +#390=IFCDIRECTION((0.,0.,1.)); +#391=IFCDIRECTION((-3.57342305517796E-15,-1.,0.)); +#392=IFCCOLUMN('3ul67tVf5Dl82Y_LatCAFo',#1,'road river bridge pierstem','A sturdy pierstem, providing vertical support for the road river bridge.','pierstem',#397,#406,'454425.1027893.955984.1885152.955014.1885214',$); +#393=IFCQUANTITYVOLUME('NetVolume',$,$,4.526915656682752,$); +#394=IFCELEMENTQUANTITY('2JUsTWZtrCl8tgZQc73OPg',#1,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#393)); +#395=IFCRELDEFINESBYPROPERTIES('3raYM2Wr1B_fdLI_LyYMEF',#1,$,$,(#392),#394); +#396=IFCRELCONTAINEDINSPATIALSTRUCTURE('02WJG6WTPDDfDMHoifrqhb',#1,$,$,(#392,#407,#418),#386); +#397=IFCLOCALPLACEMENT(#387,#398); +#398=IFCAXIS2PLACEMENT3D(#399,#400,#401); +#399=IFCCARTESIANPOINT((0.,0.,0.)); +#400=IFCDIRECTION((0.,0.,1.)); +#401=IFCDIRECTION((1.,-2.070937637746334E-17,0.)); +#402=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#403)); +#403=IFCTRIANGULATEDFACESET(#404,((-4.718447854656914E-15,1.,0.),(-4.718447854656914E-15,1.,0.),(-4.718447854656914E-15,1.,0.),(-4.718447854656914E-15,1.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(4.718447854656914E-15,-1.,0.),(4.718447854656914E-15,-1.,0.),(4.718447854656914E-15,-1.,0.),(4.718447854656914E-15,-1.,0.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#404=IFCCARTESIANPOINTLIST3D(((-1800.,275.,-756.),(1800.,275.,-3042.321),(-1800.,275.,-3042.321),(1800.,275.,-756.),(-1800.,275.,-756.),(-1800.,-275.,-3042.321),(-1800.,-275.,-756.),(-1800.,275.,-3042.321),(1800.,275.,-3042.321),(-1800.,-275.,-3042.321),(-1800.,275.,-3042.321),(1800.,-275.,-3042.321),(1800.,275.,-3042.321),(1800.,-275.,-756.),(1800.,-275.,-3042.321),(1800.,275.,-756.),(1800.,-275.,-756.),(-1800.,275.,-756.),(-1800.,-275.,-756.),(1800.,275.,-756.),(1800.,-275.,-756.),(-1800.,-275.,-3042.321),(1800.,-275.,-3042.321),(-1800.,-275.,-756.)),$); +#405=IFCSTYLEDITEM(#403,(#353),$); +#406=IFCPRODUCTDEFINITIONSHAPE($,$,(#402)); +#407=IFCFOOTING('3kDaIrka18GwgJ2ayJZMBO',#1,'foundation - bridge road','A solid foundation, providing support for the bridge rail.',$,#408,#417,'454425.1027893.955984.1885152.955014.1886522',$); +#408=IFCLOCALPLACEMENT(#387,#409); +#409=IFCAXIS2PLACEMENT3D(#410,#411,#412); +#410=IFCCARTESIANPOINT((0.,0.,-3042.321)); +#411=IFCDIRECTION((0.,0.,1.)); +#412=IFCDIRECTION((1.,-2.070937637746334E-17,0.)); +#413=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#414)); +#414=IFCTRIANGULATEDFACESET(#415,((-6.734731042375859E-17,1.,1.551705822936801E-17),(-6.734731042375859E-17,1.,1.551705822936801E-17),(-6.734731042375859E-17,1.,1.551705822936801E-17),(-6.734731042375859E-17,1.,1.551705822936801E-17),(-1.,-2.321506128457627E-16,-4.196027683515185E-16),(-1.,-2.321506128457627E-16,-4.196027683515185E-16),(-1.,-2.321506128457627E-16,-4.196027683515185E-16),(-1.,-2.321506128457627E-16,-4.196027683515185E-16),(-4.1960276835151796E-16,-1.5517058229368017E-17,1.),(-4.1960276835151796E-16,-1.5517058229368017E-17,1.),(-4.1960276835151796E-16,-1.5517058229368017E-17,1.),(-4.1960276835151796E-16,-1.5517058229368017E-17,1.),(6.734731042375859E-17,-1.,-1.551705822936801E-17),(6.734731042375859E-17,-1.,-1.551705822936801E-17),(6.734731042375859E-17,-1.,-1.551705822936801E-17),(6.734731042375859E-17,-1.,-1.551705822936801E-17),(1.,2.321506128457627E-16,4.196027683515185E-16),(1.,2.321506128457627E-16,4.196027683515185E-16),(1.,2.321506128457627E-16,4.196027683515185E-16),(1.,2.321506128457627E-16,4.196027683515185E-16),(4.1960276835151796E-16,1.5517058229368017E-17,-1.),(4.1960276835151796E-16,1.5517058229368017E-17,-1.),(4.1960276835151796E-16,1.5517058229368017E-17,-1.),(4.1960276835151796E-16,1.5517058229368017E-17,-1.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#415=IFCCARTESIANPOINTLIST3D(((-2500.,1050.,0.),(2500.,1050.,-700.),(-2500.,1050.,-700.),(2500.,1050.,0.),(-2500.,1050.,0.),(-2500.,-1050.,-700.),(-2500.,-1050.,0.),(-2500.,1050.,-700.),(-2500.,-1050.,0.),(2500.,1050.,0.),(-2500.,1050.,0.),(2500.,-1050.,0.),(2500.,-1050.,-700.),(-2500.,-1050.,0.),(-2500.,-1050.,-700.),(2500.,-1050.,0.),(2500.,-1050.,-700.),(2500.,1050.,0.),(2500.,-1050.,0.),(2500.,1050.,-700.),(2500.,1050.,-700.),(-2500.,-1050.,-700.),(-2500.,1050.,-700.),(2500.,-1050.,-700.)),$); +#416=IFCSTYLEDITEM(#414,(#78),$); +#417=IFCPRODUCTDEFINITIONSHAPE($,$,(#413)); +#418=IFCBEAM('1glXn_b3PFhflp9CKhrvzD',#1,'bridge road - cross girder','A robust girder, ensuring stability and support for the bridge road.','piercap',#424,#433,'454425.1027893.955984.1885152.955014.1886593',$); +#419=IFCQUANTITYVOLUME('NetVolume',$,$,0.4800000000000015,$); +#420=IFCQUANTITYLENGTH('Length',$,$,4000.,$); +#421=IFCQUANTITYAREA('CrossSectionArea',$,$,0.12000000000000036,$); +#422=IFCELEMENTQUANTITY('1S9se_JKP2fBpAMJdyRqcK',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#419,#420,#421)); +#423=IFCRELDEFINESBYPROPERTIES('0SgOoMIb554Pm7UrH5qxd$',#1,$,$,(#418),#422); +#424=IFCLOCALPLACEMENT(#387,#425); +#425=IFCAXIS2PLACEMENT3D(#426,#427,#428); +#426=IFCCARTESIANPOINT((2000.,-150.,-756.)); +#427=IFCDIRECTION((1.,1.0741055214918417E-15,0.)); +#428=IFCDIRECTION((-1.0828583338430297E-15,1.,0.)); +#429=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#430)); +#430=IFCTRIANGULATEDFACESET(#431,((2.331468351712829E-15,0.,1.),(2.331468351712829E-15,0.,1.),(2.331468351712829E-15,0.,1.),(2.331468351712829E-15,0.,1.),(-2.331468351712829E-15,0.,-1.),(-2.331468351712829E-15,0.,-1.),(-2.331468351712829E-15,0.,-1.),(-2.331468351712829E-15,0.,-1.),(-1.,0.,2.498001805406601E-15),(-1.,0.,2.498001805406601E-15),(-1.,0.,2.498001805406601E-15),(-1.,0.,2.498001805406601E-15),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(1.,0.,-3.2196467714129512E-15),(1.,0.,-3.2196467714129512E-15),(1.,0.,-3.2196467714129512E-15),(1.,0.,-3.2196467714129512E-15),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#431=IFCCARTESIANPOINTLIST3D(((300.,0.,0.),(0.,400.,0.),(0.,0.,0.),(300.,400.,0.),(300.,400.,-4000.),(0.,0.,-4000.),(0.,400.,-4000.),(300.,0.,-4000.),(0.,400.,0.),(0.,0.,-4000.),(0.,0.,0.),(0.,400.,-4000.),(300.,0.,0.),(0.,0.,-4000.),(300.,0.,-4000.),(0.,0.,0.),(300.,400.,-4000.),(300.,0.,0.),(300.,0.,-4000.),(300.,400.,0.),(0.,400.,0.),(300.,400.,-4000.),(0.,400.,-4000.),(300.,400.,0.)),$); +#432=IFCSTYLEDITEM(#430,(#172),$); +#433=IFCPRODUCTDEFINITIONSHAPE($,$,(#429)); +#434=IFCBRIDGEPART('0vFQAzqYzD2P8vJwFIDXrV',#1,'road river bridge - pier','The pier, providing foundational support for the road river bridge.','pier',#435,$,$,.PARTIAL.,.LATERAL.,.PIER.); +#435=IFCLOCALPLACEMENT(#321,#436); +#436=IFCAXIS2PLACEMENT3D(#437,#438,#439); +#437=IFCCARTESIANPOINT((-4795.5,0.,0.)); +#438=IFCDIRECTION((0.,0.,-1.)); +#439=IFCDIRECTION((6.903125459153066E-18,-1.,0.)); +#440=IFCCOLUMN('1BTWAuNPH8_BiqEs5C5kK5',#1,'road river bridge pierstem','A sturdy pierstem, providing vertical support for the road river bridge.','pierstem',#445,#451,'454425.1027893.955984.1885152.955022.1885214',$); +#441=IFCQUANTITYVOLUME('NetVolume',$,$,4.526915656682752,$); +#442=IFCELEMENTQUANTITY('3E0uNgvmvCDBGowiaODeNK',#1,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#441)); +#443=IFCRELDEFINESBYPROPERTIES('1gTUdnrP1FCOHBSgDUTi7Y',#1,$,$,(#440),#442); +#444=IFCRELCONTAINEDINSPATIALSTRUCTURE('3$kqSJJAz6Awco3JqyRScD',#1,$,$,(#440,#452,#460),#434); +#445=IFCLOCALPLACEMENT(#435,#446); +#446=IFCAXIS2PLACEMENT3D(#447,#448,#449); +#447=IFCCARTESIANPOINT((0.,0.,0.)); +#448=IFCDIRECTION((0.,0.,1.)); +#449=IFCDIRECTION((1.,-6.903125459153066E-18,0.)); +#450=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#348)); +#451=IFCPRODUCTDEFINITIONSHAPE($,$,(#450)); +#452=IFCFOOTING('0NMvtFx717oPAWTAMXwXAy',#1,'foundation - bridge road','A solid foundation, providing support for the bridge rail.',$,#453,#459,'454425.1027893.955984.1885152.955022.1886522',$); +#453=IFCLOCALPLACEMENT(#435,#454); +#454=IFCAXIS2PLACEMENT3D(#455,#456,#457); +#455=IFCCARTESIANPOINT((0.,0.,3042.321)); +#456=IFCDIRECTION((0.,0.,1.)); +#457=IFCDIRECTION((1.,-6.903125459153066E-18,0.)); +#458=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#364)); +#459=IFCPRODUCTDEFINITIONSHAPE($,$,(#458)); +#460=IFCBEAM('0sH1yiI49B6w$h$tWL2i3T',#1,'bridge road - cross girder','A robust girder, ensuring stability and support for the bridge road.','piercap',#466,#472,'454425.1027893.955984.1885152.955022.1886593',$); +#461=IFCQUANTITYVOLUME('NetVolume',$,$,0.4800000000000015,$); +#462=IFCQUANTITYLENGTH('Length',$,$,4000.,$); +#463=IFCQUANTITYAREA('CrossSectionArea',$,$,0.12000000000000036,$); +#464=IFCELEMENTQUANTITY('3lppSusNb6R9qRdLtbh3B5',#1,'Qto_BeamBaseQuantities',$,'BaseQuantities',(#461,#462,#463)); +#465=IFCRELDEFINESBYPROPERTIES('3AWj6d$jP3_fO5IPZOx4XL',#1,$,$,(#460),#464); +#466=IFCLOCALPLACEMENT(#435,#467); +#467=IFCAXIS2PLACEMENT3D(#468,#469,#470); +#468=IFCCARTESIANPOINT((-2000.,150.,756.)); +#469=IFCDIRECTION((1.,1.0879117724101504E-15,0.)); +#470=IFCDIRECTION((-1.1577631331722305E-15,1.,0.)); +#471=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#382)); +#472=IFCPRODUCTDEFINITIONSHAPE($,$,(#471)); +#473=IFCSITE('2Wad9UE39Fl81buLr2dp_x',#1,'rail river bridge - site','The site of the rail river bridge, facilitating train crossings.',$,#474,$,$,.PARTIAL.,$,$,0.,$,$); +#474=IFCLOCALPLACEMENT(#23,#475); +#475=IFCAXIS2PLACEMENT3D(#476,#477,#478); +#476=IFCCARTESIANPOINT((17320.508,50000.,0.)); +#477=IFCDIRECTION((0.,0.,1.)); +#478=IFCDIRECTION((0.8660254037844387,-0.4999999999999999,0.)); +#479=IFCBRIDGE('2kjWGt90HF_gBQxs$Lsfkw',#1,'rail bridge','A strong rail bridge, supporting trains as they cross over.','arched',#481,$,$,.ELEMENT.,.ARCHED.); +#480=IFCRELAGGREGATES('1h5xDl98LBvem18BkPSzAl',#1,'rail river bridge - site container',$,#473,(#479)); +#481=IFCLOCALPLACEMENT(#474,#482); +#482=IFCAXIS2PLACEMENT3D(#483,#484,#485); +#483=IFCCARTESIANPOINT((0.,0.,0.)); +#484=IFCDIRECTION((0.,0.,1.)); +#485=IFCDIRECTION((5.104890078825659E-16,1.,0.)); +#486=IFCBRIDGEPART('1NcWEJCZP2QhD3Z7Ptly6p',#1,'rail bridge - substructure','The substructure, providing essential support for the rail bridge.','substructure',#488,$,$,.COMPLEX.,.LATERAL.,.SUBSTRUCTURE.); +#487=IFCRELAGGREGATES('0R9$51j9b1_RdcONDP$0KC',#1,'rail bridge container',$,#479,(#486,#556)); +#488=IFCLOCALPLACEMENT(#481,#489); +#489=IFCAXIS2PLACEMENT3D(#490,#491,#492); +#490=IFCCARTESIANPOINT((0.,0.,0.)); +#491=IFCDIRECTION((0.,0.,1.)); +#492=IFCDIRECTION((1.08886468012454E-17,-1.,0.)); +#493=IFCBRIDGEPART('2qHgQrSEbBmAN2Nh3C6_X0',#1,'rail bridge - pier','A sturdy pier, providing foundational support for the rail bridge.','pier',#495,$,$,.PARTIAL.,.LATERAL.,.PIER.); +#494=IFCRELAGGREGATES('2XtEJy$Tb6TfJRxL2Rxc_$',#1,'rail bridge - substructure container',$,#486,(#493,#530)); +#495=IFCLOCALPLACEMENT(#488,#496); +#496=IFCAXIS2PLACEMENT3D(#497,#498,#499); +#497=IFCCARTESIANPOINT((5000.,-2200.,-490.)); +#498=IFCDIRECTION((0.,0.,1.)); +#499=IFCDIRECTION((1.,1.08886468012454E-17,0.)); +#500=IFCCOLUMNTYPE('3FkcCe7I9AGxWIM7liu2ha',#1,'rail bridge - pierstem','A pierstem, providing vertical support for the bridge rail.',$,$,$,'1886322','pierstem',.PIERSTEM.); +#501=IFCRELDEFINESBYTYPE('3XZjyYKyj1JARm9CVcIxkS',#1,$,$,(#502,#536,#707,#739),#500); +#502=IFCCOLUMN('13HNHx2iHDah6c_2Ir0QFv',#1,'rail bridge - pierstem','A pierstem, providing vertical support for the bridge rail.','pierstem',#507,#516,'454425.1027894.955995.1884272.1884264.1886323',$); +#503=IFCQUANTITYVOLUME('NetVolume',$,$,24.95028116652672,$); +#504=IFCELEMENTQUANTITY('0_cr5YnQbBuP0vtFQjVNNZ',#1,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#503)); +#505=IFCRELDEFINESBYPROPERTIES('1dbez3fvLDihBN7QrinE4i',#1,$,$,(#502),#504); +#506=IFCRELCONTAINEDINSPATIALSTRUCTURE('1ddjQ8urLASuOwmYEbSUE4',#1,$,$,(#502,#519),#493); +#507=IFCLOCALPLACEMENT(#495,#508); +#508=IFCAXIS2PLACEMENT3D(#509,#510,#511); +#509=IFCCARTESIANPOINT((0.,0.,0.)); +#510=IFCDIRECTION((0.,0.,1.)); +#511=IFCDIRECTION((1.,1.08886468012454E-17,0.)); +#512=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#513)); +#513=IFCTRIANGULATEDFACESET(#514,((-1.4438228390484296E-15,1.3667182588961932E-16,1.),(-1.4438228390484296E-15,1.3667182588961932E-16,1.),(-1.4438228390484296E-15,1.3667182588961932E-16,1.),(-1.4438228390484296E-15,1.3667182588961932E-16,1.),(-3.850194237500629E-15,1.,-4.9210247107397555E-15),(-3.850194237500629E-15,1.,-4.9210247107397555E-15),(-3.850194237500629E-15,1.,-4.9210247107397555E-15),(-3.850194237500629E-15,1.,-4.9210247107397555E-15),(-1.,1.5095181649265177E-15,1.9943536951002968E-14),(-1.,1.5095181649265177E-15,1.9943536951002968E-14),(-1.,1.5095181649265177E-15,1.9943536951002968E-14),(-1.,1.5095181649265177E-15,1.9943536951002968E-14),(2.5819881442508925E-15,-8.638541612123049E-16,-1.),(2.5819881442508925E-15,-8.638541612123049E-16,-1.),(2.5819881442508925E-15,-8.638541612123049E-16,-1.),(2.5819881442508925E-15,-8.638541612123049E-16,-1.),(-1.1550582712518771E-14,-1.,1.8655943773594968E-15),(-1.1550582712518771E-14,-1.,1.8655943773594968E-15),(-1.1550582712518771E-14,-1.,1.8655943773594968E-15),(-1.1550582712518771E-14,-1.,1.8655943773594968E-15),(1.,5.540398041441336E-15,-1.9209668689354544E-14),(1.,5.540398041441336E-15,-1.9209668689354544E-14),(1.,5.540398041441336E-15,-1.9209668689354544E-14),(1.,5.540398041441336E-15,-1.9209668689354544E-14)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#514=IFCCARTESIANPOINTLIST3D(((750.,0.,3780.346),(-750.,4400.,3780.346),(-750.,0.,3780.346),(750.,4400.,3780.346),(-750.,4400.,3780.346),(750.,4400.,0.),(-750.,4400.,0.),(750.,4400.,3780.346),(-750.,0.,3780.346),(-750.,4400.,0.),(-750.,0.,0.),(-750.,4400.,3780.346),(-750.,4400.,0.),(750.,0.,0.),(-750.,0.,0.),(750.,4400.,0.),(750.,0.,0.),(-750.,0.,3780.346),(-750.,0.,0.),(750.,0.,3780.346),(750.,0.,0.),(750.,4400.,3780.346),(750.,0.,3780.346),(750.,4400.,0.)),$); +#515=IFCSTYLEDITEM(#513,(#353),$); +#516=IFCPRODUCTDEFINITIONSHAPE($,$,(#512)); +#517=IFCFOOTINGTYPE('2bi0SjBfD1l8UbYzsIWvYf',#1,'foundation - bridge rail','A solid foundation, providing support for the bridge rail.',$,$,$,'1886394',$,.PAD_FOOTING.); +#518=IFCRELDEFINESBYTYPE('0xDqBiNF5E7B6w8XABgUTx',#1,$,$,(#519,#548,#722,#751),#517); +#519=IFCFOOTING('3QqyCHEVDF$gkEh307F1yY',#1,'foundation - bridge rail','A solid foundation, providing support for the bridge rail.',$,#520,#529,'454425.1027894.955995.1884272.1884264.1886393',$); +#520=IFCLOCALPLACEMENT(#495,#521); +#521=IFCAXIS2PLACEMENT3D(#522,#523,#524); +#522=IFCCARTESIANPOINT((0.,2200.,0.)); +#523=IFCDIRECTION((4.3511982658088996E-16,9.315505887349468E-16,1.)); +#524=IFCDIRECTION((-3.99068153285841E-15,-1.,9.315505887349485E-16)); +#525=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#526)); +#526=IFCTRIANGULATEDFACESET(#527,((-6.73473104237594E-17,1.,1.5517058229368014E-17),(-6.73473104237594E-17,1.,1.5517058229368014E-17),(-6.73473104237594E-17,1.,1.5517058229368014E-17),(-6.73473104237594E-17,1.,1.5517058229368014E-17),(-1.,-2.321506128457626E-16,-4.196027683515184E-16),(-1.,-2.321506128457626E-16,-4.196027683515184E-16),(-1.,-2.321506128457626E-16,-4.196027683515184E-16),(-1.,-2.321506128457626E-16,-4.196027683515184E-16),(-4.196027683515182E-16,-1.5517058229368014E-17,1.),(-4.196027683515182E-16,-1.5517058229368014E-17,1.),(-4.196027683515182E-16,-1.5517058229368014E-17,1.),(-4.196027683515182E-16,-1.5517058229368014E-17,1.),(6.73473104237594E-17,-1.,-1.5517058229368014E-17),(6.73473104237594E-17,-1.,-1.5517058229368014E-17),(6.73473104237594E-17,-1.,-1.5517058229368014E-17),(6.73473104237594E-17,-1.,-1.5517058229368014E-17),(1.,2.321506128457626E-16,4.196027683515184E-16),(1.,2.321506128457626E-16,4.196027683515184E-16),(1.,2.321506128457626E-16,4.196027683515184E-16),(1.,2.321506128457626E-16,4.196027683515184E-16),(4.196027683515182E-16,1.5517058229368014E-17,-1.),(4.196027683515182E-16,1.5517058229368014E-17,-1.),(4.196027683515182E-16,1.5517058229368014E-17,-1.),(4.196027683515182E-16,1.5517058229368014E-17,-1.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#527=IFCCARTESIANPOINTLIST3D(((-3200.,1750.,0.),(3200.,1750.,-1000.),(-3200.,1750.,-1000.),(3200.,1750.,0.),(-3200.,1750.,0.),(-3200.,-1750.,-1000.),(-3200.,-1750.,0.),(-3200.,1750.,-1000.),(-3200.,-1750.,0.),(3200.,1750.,0.),(-3200.,1750.,0.),(3200.,-1750.,0.),(3200.,-1750.,-1000.),(-3200.,-1750.,0.),(-3200.,-1750.,-1000.),(3200.,-1750.,0.),(3200.,-1750.,-1000.),(3200.,1750.,0.),(3200.,-1750.,0.),(3200.,1750.,-1000.),(3200.,1750.,-1000.),(-3200.,-1750.,-1000.),(-3200.,1750.,-1000.),(3200.,-1750.,-1000.)),$); +#528=IFCSTYLEDITEM(#526,(#78),$); +#529=IFCPRODUCTDEFINITIONSHAPE($,$,(#525)); +#530=IFCBRIDGEPART('2hJMDFMXH0q8k_DMRtOb0x',#1,'rail bridge - pier','A sturdy pier, providing foundational support for the rail bridge.','pier',#531,$,$,.PARTIAL.,.LATERAL.,.PIER.); +#531=IFCLOCALPLACEMENT(#488,#532); +#532=IFCAXIS2PLACEMENT3D(#533,#534,#535); +#533=IFCCARTESIANPOINT((-5000.,-2200.,-490.)); +#534=IFCDIRECTION((0.,0.,1.)); +#535=IFCDIRECTION((1.,1.08886468012454E-17,0.)); +#536=IFCCOLUMN('1Ov2FEORP589f6FJ7Vsjbf',#1,'rail bridge - pierstem','A pierstem, providing vertical support for the bridge rail.','pierstem',#541,#547,'454425.1027894.955995.1884272.1884267.1886323',$); +#537=IFCQUANTITYVOLUME('NetVolume',$,$,24.95028116652672,$); +#538=IFCELEMENTQUANTITY('2CgAi4qXT5RgMbeCtRvWbn',#1,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#537)); +#539=IFCRELDEFINESBYPROPERTIES('1PhHoZdvT9AuBxMkkfM9Wn',#1,$,$,(#536),#538); +#540=IFCRELCONTAINEDINSPATIALSTRUCTURE('36OSOcZjf0CP6BHJCQK2Yr',#1,$,$,(#536,#548),#530); +#541=IFCLOCALPLACEMENT(#531,#542); +#542=IFCAXIS2PLACEMENT3D(#543,#544,#545); +#543=IFCCARTESIANPOINT((0.,0.,0.)); +#544=IFCDIRECTION((0.,0.,1.)); +#545=IFCDIRECTION((1.,1.08886468012454E-17,0.)); +#546=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#513)); +#547=IFCPRODUCTDEFINITIONSHAPE($,$,(#546)); +#548=IFCFOOTING('3N1IPEdwr8ovT_ZOobkqBX',#1,'foundation - bridge rail','A solid foundation, providing support for the bridge rail.',$,#549,#555,'454425.1027894.955995.1884272.1884267.1886393',$); +#549=IFCLOCALPLACEMENT(#531,#550); +#550=IFCAXIS2PLACEMENT3D(#551,#552,#553); +#551=IFCCARTESIANPOINT((0.,2200.,0.)); +#552=IFCDIRECTION((4.3511982658088996E-16,9.315505887349468E-16,1.)); +#553=IFCDIRECTION((-3.99068153285841E-15,-1.,9.315505887349485E-16)); +#554=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#526)); +#555=IFCPRODUCTDEFINITIONSHAPE($,$,(#554)); +#556=IFCBRIDGEPART('0NGju11I55eP2T$y1Bu15n',#1,'railbridge - superstructure','The superstructure, forming the main body of the rail bridge.','superstructure',#557,$,$,.ELEMENT.,.LATERAL.,.SUPERSTRUCTURE.); +#557=IFCLOCALPLACEMENT(#481,#558); +#558=IFCAXIS2PLACEMENT3D(#559,#560,#561); +#559=IFCCARTESIANPOINT((0.,0.,0.)); +#560=IFCDIRECTION((0.,0.,1.)); +#561=IFCDIRECTION((1.08886468012454E-17,-1.,0.)); +#562=IFCWALLTYPE('22Ao8V1NP2Z9PFZjmYIbHl',#1,'rail bridge - spandrel wall','A spandrel wall, providing structural support for the rail bridge.',$,$,$,'1998464','solidwall',.SOLIDWALL.); +#563=IFCRELDEFINESBYTYPE('38jaAmgcLFGehGz1VVj0j1',#1,$,$,(#564,#597,#765,#791),#562); +#564=IFCWALL('064CKbgdv2$uFEsgE5j3ba',#1,'rail bridge - spandrel wall','A spandrel wall, providing structural support for the rail bridge.','solidwall',#566,#575,'454425.1027894.955995.1884275.1998465',$); +#565=IFCRELCONTAINEDINSPATIALSTRUCTURE('0f5Ds$XcLFF96JQtI9O6xC',#1,$,$,(#564,#578,#597,#605,#621,#632,#640,#648,#656,#672),#556); +#566=IFCLOCALPLACEMENT(#557,#567); +#567=IFCAXIS2PLACEMENT3D(#568,#569,#570); +#568=IFCCARTESIANPOINT((-10000.,-2200.,3290.346)); +#569=IFCDIRECTION((0.,0.,1.)); +#570=IFCDIRECTION((1.,1.08886468012454E-17,0.)); +#571=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#572)); +#572=IFCTRIANGULATEDFACESET(#573,((-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(-0.9472992235199069,-8.837473813445069E-13,-0.3203500914914517),(-0.9862029092609431,-4.565306166790649E-13,-0.16554099723407595),(-0.9862029092609431,-4.565306166790649E-13,-0.16554099723407595),(-0.9472992235199171,-8.837473813444249E-13,-0.32035009149142196),(3.6095570976563183E-14,-2.7592143574660236E-12,-1.),(3.6095570976563183E-14,-2.7592143574660236E-12,-1.),(3.6095570976563183E-14,-2.7592143574660236E-12,-1.),(3.6095570976563183E-14,-2.7592143574660236E-12,-1.),(0.9862029092609518,-4.570163991337451E-13,-0.16554099723402418),(0.9472992235199178,-8.841567620337126E-13,-0.3203500914914197),(0.9862029092609518,-4.570163991337451E-13,-0.16554099723402418),(0.9472992235199273,-8.841567620336338E-13,-0.32035009149139126),(0.9472992235199273,-8.841567620336338E-13,-0.32035009149139126),(0.8079266005471405,-1.626212006710722E-12,-0.589283130700635),(0.9472992235199178,-8.841567620337126E-13,-0.3203500914914197),(0.8079266005471563,-1.6262120067106622E-12,-0.5892831307006133),(0.8079266005471563,-1.6262120067106622E-12,-0.5892831307006133),(0.620243319380759,-2.1645343373895867E-12,-0.7844094751872505),(0.8079266005471405,-1.626212006710722E-12,-0.589283130700635),(0.6202433193807736,-2.164534337389555E-12,-0.784409475187239),(0.4149964350585969,-2.5104914778997537E-12,-0.909823037127911),(0.620243319380759,-2.1645343373895867E-12,-0.7844094751872505),(0.6202433193807736,-2.164534337389555E-12,-0.784409475187239),(0.41499643505858896,-2.510491477899763E-12,-0.9098230371279145),(0.4149964350585969,-2.5104914778997537E-12,-0.909823037127911),(0.2069973104401112,-2.6995289614261125E-12,-0.9783415116770628),(0.41499643505858896,-2.510491477899763E-12,-0.9098230371279145),(0.2069973104401184,-2.6995289614261072E-12,-0.9783415116770612),(0.10271076250084926,-2.7446637351337455E-12,-0.9947112642704387),(0.2069973104401112,-2.6995289614261125E-12,-0.9783415116770628),(0.2069973104401184,-2.6995289614261072E-12,-0.9783415116770612),(0.10271076250084926,-2.7446637351337455E-12,-0.9947112642704387),(1.,-2.1115595812378585E-16,3.0108309204017E-14),(1.,-2.1115595812378585E-16,3.0108309204017E-14),(1.,-2.1115595812378585E-16,3.0108309204017E-14),(1.,-2.1115595812378585E-16,3.0108309204017E-14),(-1.313878783549651E-14,2.7592143574660228E-12,1.),(-1.313878783549651E-14,2.7592143574660228E-12,1.),(-1.313878783549651E-14,2.7592143574660228E-12,1.),(-1.313878783549651E-14,2.7592143574660228E-12,1.),(-1.,2.1115595812378585E-16,-2.5090257670012707E-14),(-1.,2.1115595812378585E-16,-2.5090257670012707E-14),(-1.,2.1115595812378585E-16,-2.5090257670012707E-14),(-1.,2.1115595812378585E-16,-2.5090257670012707E-14),(-0.10271076250082654,-2.744591148838705E-12,-0.9947112642704409),(-0.20699731044009634,-2.699400664921432E-12,-0.978341511677066),(-0.10271076250082654,-2.744591148838705E-12,-0.9947112642704409),(-0.20699731044010578,-2.6994006649214262E-12,-0.978341511677064),(-0.20699731044010578,-2.6994006649214262E-12,-0.978341511677064),(-0.41499643505855466,-2.5103397758999647E-12,-0.9098230371279302),(-0.20699731044009634,-2.699400664921432E-12,-0.978341511677066),(-0.41499643505856776,-2.5103397758999485E-12,-0.9098230371279242),(-0.41499643505856776,-2.5103397758999485E-12,-0.9098230371279242),(-0.6202433193807148,-2.1642345725036717E-12,-0.7844094751872855),(-0.41499643505855466,-2.5103397758999647E-12,-0.9098230371279302),(-0.6202433193807305,-2.164234572503637E-12,-0.7844094751872731),(-0.6202433193807148,-2.1642345725036717E-12,-0.7844094751872855),(-0.8079266005471326,-1.6258086337798539E-12,-0.5892831307006458),(-0.8079266005471168,-1.6258086337799133E-12,-0.5892831307006672),(-0.6202433193807305,-2.164234572503637E-12,-0.7844094751872731),(-0.8079266005471168,-1.6258086337799133E-12,-0.5892831307006672),(-0.9472992235199391,-8.837473813444392E-13,-0.32035009149135657),(-0.9472992235199298,-8.837473813445167E-13,-0.32035009149138466),(-0.8079266005471326,-1.6258086337798539E-12,-0.5892831307006458),(-0.9472992235199298,-8.837473813445167E-13,-0.32035009149138466),(-0.9862029092609697,-4.565306166790648E-13,-0.16554099723391769),(-0.9862029092609697,-4.565306166790648E-13,-0.16554099723391769),(-0.9472992235199391,-8.837473813444392E-13,-0.32035009149135657),(5.053379936723676E-14,-2.759214357466023E-12,-1.),(5.053379936723676E-14,-2.759214357466023E-12,-1.),(5.053379936723676E-14,-2.759214357466023E-12,-1.),(5.053379936723676E-14,-2.759214357466023E-12,-1.),(0.9862029092609593,-4.570719102849764E-13,-0.16554099723397883),(0.947299223519916,-8.841848757692245E-13,-0.3203500914914249),(0.9862029092609593,-4.570719102849764E-13,-0.16554099723397883),(0.9472992235199255,-8.841848757691471E-13,-0.3203500914913969),(0.9472992235199255,-8.841848757691471E-13,-0.3203500914913969),(0.8079266005471272,-1.626183959719012E-12,-0.5892831307006532),(0.947299223519916,-8.841848757692245E-13,-0.3203500914914249),(0.8079266005471418,-1.626183959718955E-12,-0.5892831307006328),(0.8079266005471418,-1.626183959718955E-12,-0.5892831307006328),(0.6202433193807623,-2.1645203464041856E-12,-0.7844094751872479),(0.8079266005471272,-1.626183959719012E-12,-0.5892831307006532),(0.6202433193807745,-2.1645203464041586E-12,-0.7844094751872384),(0.4149964350585986,-2.5105054460711E-12,-0.90982303712791),(0.6202433193807623,-2.1645203464041856E-12,-0.7844094751872479),(0.6202433193807745,-2.1645203464041586E-12,-0.7844094751872384),(0.41499643505859307,-2.510505446071106E-12,-0.9098230371279126),(0.4149964350585986,-2.5105054460711E-12,-0.90982303712791),(0.2069973104401141,-2.6995254725396924E-12,-0.9783415116770623),(0.41499643505859307,-2.510505446071106E-12,-0.9098230371279126),(0.20699731044012187,-2.6995254725396875E-12,-0.9783415116770606),(8.979548187779264E-15,-2.7592132528079225E-12,-1.),(0.2069973104401141,-2.6995254725396924E-12,-0.9783415116770623),(0.20699731044012187,-2.6995254725396875E-12,-0.9783415116770606),(1.3136252986870424E-14,-2.759213252807923E-12,-1.),(8.979548187779264E-15,-2.7592132528079225E-12,-1.),(-0.2069973104400882,-2.6994111315806955E-12,-0.9783415116770676),(1.3136252986870424E-14,-2.759213252807923E-12,-1.),(-0.20699731044010045,-2.699411131580689E-12,-0.9783415116770652),(-0.20699731044010045,-2.699411131580689E-12,-0.9783415116770652),(-0.41499643505855266,-2.5103397758999655E-12,-0.9098230371279312),(-0.2069973104400882,-2.6994111315806955E-12,-0.9783415116770676),(-0.4149964350585647,-2.51033977589995E-12,-0.9098230371279257),(-0.4149964350585647,-2.51033977589995E-12,-0.9098230371279257),(-0.620243319380716,-2.164248563489071E-12,-0.7844094751872847),(-0.41499643505855266,-2.5103397758999655E-12,-0.9098230371279312),(-0.6202433193807323,-2.164248563489035E-12,-0.7844094751872717),(-0.620243319380716,-2.164248563489071E-12,-0.7844094751872847),(-0.8079266005471378,-1.6258366807715576E-12,-0.5892831307006386),(-0.8079266005471227,-1.6258366807716147E-12,-0.5892831307006593),(-0.6202433193807323,-2.164248563489035E-12,-0.7844094751872717),(-0.8079266005471227,-1.6258366807716147E-12,-0.5892831307006593),(-0.9472992235199171,-8.837473813444249E-13,-0.32035009149142196),(-0.9472992235199069,-8.837473813445069E-13,-0.3203500914914517),(-0.8079266005471378,-1.6258366807715576E-12,-0.5892831307006386)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(5,6,7),(7,6,8),(7,8,9),(9,8,10),(9,10,11),(11,10,12),(11,12,13),(13,12,14),(15,16,17),(16,15,18),(16,18,19),(19,18,20),(19,20,21),(21,20,22),(21,22,23),(23,22,24),(23,24,25),(25,24,26),(25,26,27),(27,26,13),(27,13,28),(28,13,14),(28,14,29),(30,31,32),(31,30,33),(33,30,34),(33,34,35),(35,34,36),(35,36,37),(37,36,38),(37,38,39),(39,38,40),(39,40,41),(41,40,42),(41,42,43),(43,42,44),(43,44,45),(45,44,46),(47,48,49),(48,47,50),(50,47,51),(50,51,52),(52,51,53),(52,53,54),(54,53,55),(54,55,56),(56,55,57),(56,57,58),(58,57,43),(58,43,45),(59,60,61),(60,59,62),(63,64,65),(64,63,66),(67,68,69),(68,67,70),(71,72,73),(72,71,74),(75,76,77),(76,75,78),(79,80,81),(80,79,82),(83,84,85),(84,83,86),(87,88,89),(88,87,90),(91,92,93),(92,91,94),(95,96,97),(96,95,98),(99,100,101),(100,99,102),(103,104,105),(104,103,106),(107,108,109),(108,107,110),(111,112,113),(112,111,114),(115,116,117),(116,115,118),(119,120,121),(120,119,122),(123,124,125),(124,123,126),(127,128,129),(128,127,130),(131,132,133),(132,131,134),(135,136,137),(136,135,138),(139,140,141),(140,139,142),(143,144,145),(144,143,146),(147,148,149),(148,147,150),(151,152,153),(152,151,154),(155,156,157),(156,155,158),(159,160,161),(160,159,162),(163,164,165),(164,163,166),(167,168,169),(168,167,170),(171,172,173),(172,171,174)),$); +#573=IFCCARTESIANPOINTLIST3D(((15750.,0.,0.),(14105.185,0.,862.73),(14250.,0.,0.),(15894.815,0.,862.73),(13680.608,0.,1666.667),(16319.392,0.,1666.667),(13005.204,0.,2357.023),(16994.796,0.,2357.023),(12125.,0.,2886.751),(17875.,0.,2886.751),(11099.981,0.,3219.753),(18900.019,0.,3219.753),(10000.,0.,3333.333),(20000.,0.,3333.333),(5750.,0.,0.),(4105.185,0.,862.73),(4250.,0.,0.),(5894.815,0.,862.73),(3680.608,0.,1666.667),(6319.392,0.,1666.667),(3005.204,0.,2357.023),(6994.796,0.,2357.023),(2125.,0.,2886.751),(7875.,0.,2886.751),(1099.981,0.,3219.753),(8900.019,0.,3219.753),(0.,0.,3333.333),(0.,0.,4484.236),(20000.,0.,4484.236),(4105.185,450.,862.73),(5750.,450.,0.),(4250.,450.,0.),(5894.815,450.,862.73),(3680.608,450.,1666.667),(6319.392,450.,1666.667),(3005.204,450.,2357.023),(6994.796,450.,2357.023),(2125.,450.,2886.751),(7875.,450.,2886.751),(1099.981,450.,3219.753),(8900.019,450.,3219.753),(0.,450.,3333.333),(10000.,450.,3333.333),(0.,450.,4484.236),(20000.,450.,3333.333),(20000.,450.,4484.236),(14105.185,450.,862.73),(15750.,450.,0.),(14250.,450.,0.),(15894.815,450.,862.73),(13680.608,450.,1666.667),(16319.392,450.,1666.667),(13005.204,450.,2357.023),(16994.796,450.,2357.023),(12125.,450.,2886.751),(17875.,450.,2886.751),(11099.981,450.,3219.753),(18900.019,450.,3219.753),(14105.185,0.,862.73),(14250.,450.,0.),(14250.,0.,0.),(14105.185,450.,862.73),(14250.,450.,0.),(15750.,0.,0.),(14250.,0.,0.),(15750.,450.,0.),(15750.,450.,0.),(15894.815,0.,862.73),(15750.,0.,0.),(15894.815,450.,862.73),(15894.815,450.,862.73),(16319.392,0.,1666.667),(15894.815,0.,862.73),(16319.392,450.,1666.667),(16319.392,450.,1666.667),(16994.796,0.,2357.023),(16319.392,0.,1666.667),(16994.796,450.,2357.023),(17875.,450.,2886.751),(16994.796,0.,2357.023),(16994.796,450.,2357.023),(17875.,0.,2886.751),(17875.,450.,2886.751),(18900.019,0.,3219.753),(17875.,0.,2886.751),(18900.019,450.,3219.753),(20000.,450.,3333.333),(18900.019,0.,3219.753),(18900.019,450.,3219.753),(20000.,0.,3333.333),(20000.,450.,3333.333),(20000.,0.,4484.236),(20000.,0.,3333.333),(20000.,450.,4484.236),(20000.,0.,4484.236),(0.,450.,4484.236),(0.,0.,4484.236),(20000.,450.,4484.236),(0.,0.,4484.236),(0.,450.,3333.333),(0.,0.,3333.333),(0.,450.,4484.236),(0.,450.,3333.333),(1099.981,0.,3219.753),(0.,0.,3333.333),(1099.981,450.,3219.753),(1099.981,450.,3219.753),(2125.,0.,2886.751),(1099.981,0.,3219.753),(2125.,450.,2886.751),(2125.,450.,2886.751),(3005.204,0.,2357.023),(2125.,0.,2886.751),(3005.204,450.,2357.023),(3005.204,0.,2357.023),(3680.608,450.,1666.667),(3680.608,0.,1666.667),(3005.204,450.,2357.023),(3680.608,0.,1666.667),(4105.185,450.,862.73),(4105.185,0.,862.73),(3680.608,450.,1666.667),(4105.185,0.,862.73),(4250.,450.,0.),(4250.,0.,0.),(4105.185,450.,862.73),(4250.,450.,0.),(5750.,0.,0.),(4250.,0.,0.),(5750.,450.,0.),(5750.,450.,0.),(5894.815,0.,862.73),(5750.,0.,0.),(5894.815,450.,862.73),(5894.815,450.,862.73),(6319.392,0.,1666.667),(5894.815,0.,862.73),(6319.392,450.,1666.667),(6319.392,450.,1666.667),(6994.796,0.,2357.023),(6319.392,0.,1666.667),(6994.796,450.,2357.023),(7875.,450.,2886.751),(6994.796,0.,2357.023),(6994.796,450.,2357.023),(7875.,0.,2886.751),(7875.,450.,2886.751),(8900.019,0.,3219.753),(7875.,0.,2886.751),(8900.019,450.,3219.753),(10000.,450.,3333.333),(8900.019,0.,3219.753),(8900.019,450.,3219.753),(10000.,0.,3333.333),(10000.,450.,3333.333),(11099.981,0.,3219.753),(10000.,0.,3333.333),(11099.981,450.,3219.753),(11099.981,450.,3219.753),(12125.,0.,2886.751),(11099.981,0.,3219.753),(12125.,450.,2886.751),(12125.,450.,2886.751),(13005.204,0.,2357.023),(12125.,0.,2886.751),(13005.204,450.,2357.023),(13005.204,0.,2357.023),(13680.608,450.,1666.667),(13680.608,0.,1666.667),(13005.204,450.,2357.023),(13680.608,0.,1666.667),(14105.185,450.,862.73),(14105.185,0.,862.73),(13680.608,450.,1666.667)),$); +#574=IFCSTYLEDITEM(#572,(#353),$); +#575=IFCPRODUCTDEFINITIONSHAPE($,$,(#571)); +#576=IFCSIGNTYPE('1RPeXhyNXEwgJCKDNmyjqQ',#1,'road rail bridge - name sign','Ye Olde Brygge\X\27s Timeless Plaque: A Gleaming Tribute to Bygone Eras',$,$,$,'2019575','pictoral',.PICTORAL.); +#577=IFCRELDEFINESBYTYPE('2$OOllrNz6jv1MsBMYHrLp',#1,$,$,(#578,#605,#777,#799),#576); +#578=IFCSIGN('3f_1FIPqT5BhsBpy$X1b_A',#1,'road rail bridge - name sign','Ye Olde Brygge\X\27s Timeless Plaque: A Gleaming Tribute to Bygone Eras','pictoral',#581,#593,'454425.1027894.955995.1884275.1998465.2028197',$); +#579=IFCRELASSOCIATESMATERIAL('1_FU2vzwD62wYuiy5DLREQ',#1,$,$,(#578,#605,#777,#799),#580); +#580=IFCMATERIAL('metal_copper_generic',$,$); +#581=IFCLOCALPLACEMENT(#557,#582); +#582=IFCAXIS2PLACEMENT3D(#583,#584,#585); +#583=IFCCARTESIANPOINT((0.,-2200.,7024.582)); +#584=IFCDIRECTION((-7.543109064100877E-16,-1.,0.)); +#585=IFCDIRECTION((1.,-7.662674704363643E-16,0.)); +#586=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#587,#594)); +#587=IFCTRIANGULATEDFACESET(#588,((-1.,2.477093445363965E-53,7.444901768338738E-16),(-1.,2.477093445363965E-53,7.444901768338738E-16),(-1.,2.477093445363965E-53,7.444901768338738E-16),(-1.,2.477093445363965E-53,7.444901768338738E-16),(7.136739233221675E-16,2.757701622613239E-12,1.),(7.136739233221675E-16,2.757701622613239E-12,1.),(7.136739233221675E-16,2.757701622613239E-12,1.),(7.136739233221675E-16,2.757701622613239E-12,1.),(-7.136739233221675E-16,-2.757701622613239E-12,-1.),(-7.136739233221675E-16,-2.757701622613239E-12,-1.),(-7.136739233221675E-16,-2.757701622613239E-12,-1.),(-7.136739233221675E-16,-2.757701622613239E-12,-1.),(1.968099736362298E-27,-1.,2.757701622613241E-12),(1.968099736362298E-27,-1.,2.757701622613241E-12),(1.968099736362298E-27,-1.,2.757701622613241E-12),(1.968099736362298E-27,-1.,2.757701622613241E-12),(-1.968099736362298E-27,1.,-2.757701622613241E-12),(-1.968099736362298E-27,1.,-2.757701622613241E-12),(-1.968099736362298E-27,1.,-2.757701622613241E-12),(-1.968099736362298E-27,1.,-2.757701622613241E-12),(1.,-2.477093445363965E-53,-7.444901768338738E-16),(1.,-2.477093445363965E-53,-7.444901768338738E-16),(1.,-2.477093445363965E-53,-7.444901768338738E-16),(1.,-2.477093445363965E-53,-7.444901768338738E-16)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#588=IFCCARTESIANPOINTLIST3D(((-800.,0.,30.),(-800.,400.,0.),(-800.,0.,0.),(-800.,400.,30.),(800.,0.,30.),(-800.,400.,30.),(-800.,0.,30.),(800.,400.,30.),(800.,400.,0.),(-800.,0.,0.),(-800.,400.,0.),(800.,0.,0.),(800.,0.,30.),(-800.,0.,0.),(800.,0.,0.),(-800.,0.,30.),(-800.,400.,0.),(800.,400.,30.),(800.,400.,0.),(-800.,400.,30.),(800.,400.,0.),(800.,0.,30.),(800.,0.,0.),(800.,400.,30.)),$); +#589=IFCSTYLEDITEM(#587,(#592),$); +#590=IFCSURFACESTYLERENDERING(#591,0.,$,$,$,$,$,$,.NOTDEFINED.); +#591=IFCCOLOURRGB($,0.6705882352941176,0.4627450980392157,0.3803921568627451); +#592=IFCSURFACESTYLE('metal_copper_generic',.BOTH.,(#590)); +#593=IFCPRODUCTDEFINITIONSHAPE($,$,(#586)); +#594=IFCTRIANGULATEDFACESET(#595,((6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(0.985262099127433,-0.17105144262181593,4.71527732416997E-13),(0.998558022065677,0.05368311250554526,-1.4850720843004146E-13),(0.9985580220656759,0.05368311250556591,-1.485072084300984E-13),(0.9852620991274318,-0.17105144262182376,4.715277324170187E-13),(0.9985580220656759,0.05368311250556591,-1.485072084300984E-13),(0.9942362468634307,0.1072114052837634,-2.9617470535543247E-13),(0.9942362468634307,0.1072114052837634,-2.9617470535543247E-13),(0.998558022065677,0.05368311250554526,-1.4850720843004146E-13),(0.8507772826193545,0.5255264173938614,-1.4503592844054615E-12),(0.7331764133481149,0.6800384892857126,-1.876644254704572E-12),(0.7331764133484892,0.6800384892853091,-1.8766442547034584E-12),(0.8507772826193545,0.5255264173938614,-1.4503592844054615E-12),(0.7331764133481149,0.6800384892857126,-1.876644254704572E-12),(0.5879319010498577,0.8089104275059756,-2.23217233358834E-12),(0.7331764133484892,0.6800384892853091,-1.8766442547034584E-12),(0.5879319010498577,0.8089104275059756,-2.23217233358834E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-0.5954279130339794,0.8034087380530537,-2.2165466659879193E-12),(-0.7353424654424056,0.6776956975789981,-1.869672051025805E-12),(-0.5954279130339794,0.8034087380530537,-2.2165466659879193E-12),(-0.735342465442188,0.6776956975792341,-1.869672051026456E-12),(-0.735342465442188,0.6776956975792341,-1.869672051026456E-12),(-0.9279729502401773,0.37264755952849266,-1.0278706913282681E-12),(-0.7353424654424056,0.6776956975789981,-1.869672051025805E-12),(-0.9279729502400409,0.3726475595288325,-1.0278706913292062E-12),(-0.9279729502400409,0.3726475595288325,-1.0278706913292062E-12),(-0.9919380594528788,0.1267236608090892,-3.4921606417627257E-13),(-0.9279729502401773,0.37264755952849266,-1.0278706913282681E-12),(-0.9919380594528859,0.1267236608090344,-3.492160641761215E-13),(-0.9919380594528859,0.1267236608090344,-3.492160641761215E-13),(-0.9997278626286515,0.02332810930933754,-6.394341483278317E-14),(-0.9919380594528788,0.1267236608090892,-3.4921606417627257E-13),(-0.9997278626286514,0.023328109309340726,-6.394341483279197E-14),(-0.9997278626286514,0.023328109309340726,-6.394341483279197E-14),(-1.,1.0761972206014587E-42,4.1142326944632687E-16),(-0.9997278626286515,0.02332810930933754,-6.394341483278317E-14),(-1.,1.0761972206014587E-42,4.1142326944632687E-16),(-0.9325271362086447,-0.3610999033986356,9.968350464387257E-13),(-0.9262080086179281,-0.3770128973550005,1.0406747143623813E-12),(-0.9325271362086447,-0.3610999033986356,9.968350464387257E-13),(-0.9262080086179306,-0.3770128973549942,1.040674714362364E-12),(-0.9262080086179306,-0.3770128973549942,1.040674714362364E-12),(-0.8723365420137933,-0.48890587792275286,1.3492952465202004E-12),(-0.9262080086179281,-0.3770128973550005,1.0406747143623813E-12),(-0.8723365420138,-0.4889058779227409,1.3492952465201677E-12),(-0.8723365420138,-0.4889058779227409,1.3492952465201677E-12),(-0.7301883777656379,-0.6832458803212693,1.8854517653211956E-12),(-0.8723365420137933,-0.48890587792275286,1.3492952465202004E-12),(-0.7301883777657013,-0.6832458803212016,1.8854517653210086E-12),(-0.7301883777656379,-0.6832458803212693,1.8854517653211956E-12),(-0.6321911971634419,-0.7748124226088882,2.138081943364309E-12),(-0.6321911971634419,-0.7748124226088882,2.138081943364309E-12),(-0.7301883777657013,-0.6832458803212016,1.8854517653210086E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.6156006345831445,-0.7880582838222246,2.1742467078996238E-12),(0.6156006345831445,-0.7880582838222246,2.1742467078996238E-12),(0.6156006345831445,-0.7880582838222246,2.1742467078996238E-12),(0.6156006345831445,-0.7880582838222246,2.1742467078996238E-12),(0.976255309916327,-0.21662310555473188,5.972221733387265E-13),(0.9986377588414403,-0.052178794698089184,1.4361981147505059E-13),(0.9986377588414309,-0.05217879469827007,1.4361981147554955E-13),(0.976255309916327,-0.21662310555473188,5.972221733387265E-13),(0.9986377588414309,-0.05217879469827007,1.4361981147554955E-13),(0.9788258497336634,0.20469478716658146,-5.651950773076892E-13),(0.9788258497336585,0.20469478716660458,-5.651950773077531E-13),(0.9986377588414403,-0.052178794698089184,1.4361981147505059E-13),(0.9788258497336585,0.20469478716660458,-5.651950773077531E-13),(0.9450084045283365,0.327046044725828,-9.029304534422437E-13),(0.9450084045283349,0.32704604472583243,-9.029304534422562E-13),(0.9788258497336634,0.20469478716658146,-5.651950773076892E-13),(0.9450084045283349,0.32704604472583243,-9.029304534422562E-13),(0.9330496485399467,0.3597476245362603,-9.931158112431357E-13),(0.9330496485399467,0.3597476245362603,-9.931158112431357E-13),(0.9450084045283365,0.327046044725828,-9.029304534422437E-13),(-0.9414820933211209,0.3370630029470462,-9.29568230161731E-13),(-0.9606480611335328,0.27776843348441216,-7.660204801262298E-13),(-0.9414820933211209,0.3370630029470462,-9.29568230161731E-13),(-0.9606480611335284,0.2777684334844275,-7.660204801262721E-13),(-0.9606480611335284,0.2777684334844275,-7.660204801262721E-13),(-0.9760836593293772,0.2173952391157003,-5.994981344606017E-13),(-0.9606480611335328,0.27776843348441216,-7.660204801262298E-13),(-0.9760836593293772,0.2173952391157003,-5.994981344606017E-13),(-0.9792141269630011,-0.20282922263837555,5.599633528228735E-13),(-0.9792141269630011,-0.20282922263837555,5.599633528228735E-13),(-0.9792141269630011,-0.20282922263837555,5.599633528228735E-13),(-0.9792141269630011,-0.20282922263837555,5.599633528228735E-13),(-0.6124868691938967,-0.7904807619828953,2.181324680023932E-12),(-0.6124868691938967,-0.7904807619828953,2.181324680023932E-12),(-0.6124868691938967,-0.7904807619828953,2.181324680023932E-12),(-0.6124868691938967,-0.7904807619828953,2.181324680023932E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.6823833044151715,-0.7309945457084011,2.0167600461923738E-12),(0.7673233100207236,-0.641260429076082,1.7691944555345247E-12),(0.6823833044151715,-0.7309945457084011,2.0167600461923738E-12),(0.7673233100207456,-0.6412604290760554,1.7691944555344512E-12),(0.7673233100207236,-0.641260429076082,1.7691944555345247E-12),(0.8868360880342053,-0.46208414056336883,1.2747348909197956E-12),(0.8868360880342097,-0.46208414056336056,1.2747348909197728E-12),(0.7673233100207456,-0.6412604290760554,1.7691944555344512E-12),(0.8868360880342097,-0.46208414056336056,1.2747348909197728E-12),(0.9337699395388032,-0.3578738604783814,9.870435485462228E-13),(0.9337699395388004,-0.3578738604783885,9.870435485462426E-13),(0.8868360880342053,-0.46208414056336883,1.2747348909197956E-12),(0.9337699395388004,-0.3578738604783885,9.870435485462426E-13),(0.9852620991274318,-0.17105144262182376,4.715277324170187E-13),(0.985262099127433,-0.17105144262181593,4.71527732416997E-13),(0.9337699395388032,-0.3578738604783814,9.870435485462228E-13),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.2000740071317116,0.9797807875592683,-2.7033442538469695E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.20007400713202153,0.979780787559205,-2.703344253846795E-12),(-0.2000740071317116,0.9797807875592683,-2.7033442538469695E-12),(-0.3920573365553579,0.9199407833404925,-2.538155166689907E-12),(-0.3920573365553579,0.9199407833404925,-2.538155166689907E-12),(-0.20007400713202153,0.979780787559205,-2.703344253846795E-12),(-0.9271481171496583,0.3746950344825023,-1.0335964550318161E-12),(-0.9613689058329664,0.2752631956828324,-7.591827543187968E-13),(-0.9271481171496583,0.3746950344825023,-1.0335964550318161E-12),(-0.9613689058329608,0.2752631956828517,-7.591827543188501E-13),(-0.9613689058329608,0.2752631956828517,-7.591827543188501E-13),(-0.9849591146664003,0.17278756447030838,-4.763741982680236E-13),(-0.9613689058329664,0.2752631956828324,-7.591827543187968E-13),(-0.9849591146664003,0.17278756447030838,-4.763741982680236E-13),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.9850568535010431,-0.17222948461464052,4.75586536429681E-13),(-0.9627290187837146,-0.2704678102690707,7.466890493836941E-13),(-0.9850568535010431,-0.17222948461464052,4.75586536429681E-13),(-0.9627290187837202,-0.2704678102690514,7.466890493836411E-13),(-0.9627290187837202,-0.2704678102690514,7.466890493836411E-13),(-0.8103422277040965,-0.5859568874922134,1.6172109628329405E-12),(-0.9627290187837146,-0.2704678102690707,7.466890493836941E-13),(-0.81034222770443,-0.5859568874917521,1.6172109628316678E-12),(-0.8103422277040965,-0.5859568874922134,1.6172109628329405E-12),(-0.4221218672867629,-0.9065390941147197,2.5015667525525367E-12),(-0.42212186728669643,-0.9065390941147506,2.5015667525526224E-12),(-0.81034222770443,-0.5859568874917521,1.6172109628316678E-12),(-0.4221218672867629,-0.9065390941147197,2.5015667525525367E-12),(-0.08899635085429566,-0.9960319520651028,2.7482965185655893E-12),(-0.42212186728669643,-0.9065390941147506,2.5015667525526224E-12),(-0.08899635085414909,-0.996031952065116,2.7482965185656253E-12),(-0.08899635085429566,-0.9960319520651028,2.7482965185655893E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.08899635085414909,-0.996031952065116,2.7482965185656253E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-0.5879319010498562,0.808910427505977,-2.231756892673258E-12),(-0.7331764133483791,0.6800384892854279,-1.876101555783007E-12),(-0.7331764133482979,0.6800384892855154,-1.876101555783248E-12),(-0.5879319010498562,0.808910427505977,-2.231756892673258E-12),(-0.7331764133483791,0.6800384892854279,-1.876101555783007E-12),(-0.8507772826193563,0.5255264173938589,-1.4497097893691408E-12),(-0.7331764133482979,0.6800384892855154,-1.876101555783248E-12),(-0.8507772826193563,0.5255264173938589,-1.4497097893691408E-12),(-0.9942362468634307,0.1072114052837634,-2.954631444673134E-13),(-0.9985580220656771,0.053683112505544146,-1.4773889682815593E-13),(-0.9942362468634307,0.1072114052837634,-2.954631444673134E-13),(-0.9985580220656753,0.05368311250557564,-1.4773889682824282E-13),(-0.9985580220656753,0.05368311250557564,-1.4773889682824282E-13),(-0.9997372811223787,-0.022920923498716154,6.365533597809882E-14),(-0.9985580220656771,0.053683112505544146,-1.4773889682815593E-13),(-0.9997372811223788,-0.022920923498712532,6.365533597808881E-14),(-0.9997372811223788,-0.022920923498712532,6.365533597808881E-14),(-0.9919210150229099,-0.12685700593944485,3.503464635007452E-13),(-0.9997372811223787,-0.022920923498716154,6.365533597809882E-14),(-0.9919210150229022,-0.12685700593950433,3.503464635009093E-13),(-0.9919210150229022,-0.12685700593950433,3.503464635009093E-13),(-0.9257138949175167,-0.3782245163347309,1.0438546173319617E-12),(-0.9919210150229099,-0.12685700593944485,3.503464635007452E-13),(-0.9257138949175452,-0.37822451633466125,1.043854617331769E-12),(-0.9257138949175452,-0.37822451633466125,1.043854617331769E-12),(-0.7298956734503326,-0.6835585606796871,1.886341428447511E-12),(-0.9257138949175167,-0.3782245163347309,1.0438546173319617E-12),(-0.7298956734504373,-0.6835585606795754,1.886341428447203E-12),(-0.7298956734504373,-0.6835585606795754,1.886341428447203E-12),(-0.5913596447695504,-0.806407943002815,2.225289029143192E-12),(-0.7298956734503326,-0.6835585606796871,1.886341428447511E-12),(-0.5913596447695504,-0.806407943002815,2.225289029143192E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.08899635085428241,0.9960319520651041,-2.748229753447669E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.0889963508542811,0.9960319520651042,-2.74822975344767E-12),(-0.08899635085428241,0.9960319520651041,-2.748229753447669E-12),(-0.42212186728667306,0.9065390941147616,-2.5011671600030054E-12),(-0.4221218672863801,0.906539094114898,-2.501167160003382E-12),(-0.0889963508542811,0.9960319520651042,-2.74822975344767E-12),(-0.42212186728667306,0.9065390941147616,-2.5011671600030054E-12),(-0.8086796863922657,0.5882492369876112,-1.622849074531907E-12),(-0.4221218672863801,0.906539094114898,-2.501167160003382E-12),(-0.8086796863923503,0.5882492369874949,-1.6228490745315863E-12),(-0.8086796863923503,0.5882492369874949,-1.6228490745315863E-12),(-0.9603664303895992,0.2787405951431169,-7.687933628487173E-13),(-0.8086796863922657,0.5882492369876112,-1.622849074531907E-12),(-0.9603664303895765,0.2787405951431955,-7.687933628489345E-13),(-0.9603664303895765,0.2787405951431955,-7.687933628489345E-13),(-0.9830031215351365,0.18358884239565862,-5.061837311642844E-13),(-0.9603664303895992,0.2787405951431169,-7.687933628487173E-13),(-0.9830031215351365,0.18358884239565862,-5.061837311642844E-13),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.9832650394637072,-0.18218085016936988,5.031200265060156E-13),(-0.9604389766296841,-0.2784905243819351,7.687867504830852E-13),(-0.9832650394637072,-0.18218085016936988,5.031200265060156E-13),(-0.960438976629688,-0.27849052438192173,7.687867504830484E-13),(-0.960438976629688,-0.27849052438192173,7.687867504830484E-13),(-0.8061306092176587,-0.5917376453145149,1.6330710017801811E-12),(-0.9604389766296841,-0.2784905243819351,7.687867504830852E-13),(-0.8061306092175909,-0.5917376453146074,1.6330710017804364E-12),(-0.8061306092175909,-0.5917376453146074,1.6330710017804364E-12),(-0.4173761927595037,-0.9087337969491296,2.5076075499623587E-12),(-0.8061306092176587,-0.5917376453145149,1.6330710017801811E-12),(-0.41737619275942134,-0.9087337969491672,2.507607549962462E-12),(-0.4173761927595037,-0.9087337969491296,2.5076075499623587E-12),(-0.08763790369519599,-0.9961523968931217,2.748625932168071E-12),(-0.08763790369509215,-0.996152396893131,2.7486259321680966E-12),(-0.41737619275942134,-0.9087337969491672,2.507607549962462E-12),(-0.08763790369519599,-0.9961523968931217,2.748625932168071E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.08763790369509215,-0.996152396893131,2.7486259321680966E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(-1.3916449267378772E-27,1.,-2.75921435746603E-12),(-0.08899635085415497,0.9960319520651153,-2.7482227869102442E-12),(-1.3916449267378772E-27,1.,-2.75921435746603E-12),(-0.08899635085419569,0.9960319520651116,-2.748222786910234E-12),(-0.08899635085419569,0.9960319520651116,-2.748222786910234E-12),(-0.42212186728709555,0.9065390941145648,-2.5011025798022356E-12),(-0.08899635085415497,0.9960319520651153,-2.7482227869102442E-12),(-0.4221218672864139,0.9065390941148823,-2.5011025798031125E-12),(-0.42212186728709555,0.9065390941145648,-2.5011025798022356E-12),(-0.8086796863924873,0.5882492369873068,-1.6227918032537588E-12),(-0.8086796863927596,0.5882492369869324,-1.6227918032527256E-12),(-0.4221218672864139,0.9065390941148823,-2.5011025798031125E-12),(-0.8086796863924873,0.5882492369873068,-1.6227918032537588E-12),(-0.9603664303895686,0.2787405951432227,-7.687933628490044E-13),(-0.8086796863927596,0.5882492369869324,-1.6227918032527256E-12),(-0.960366430389606,0.2787405951430938,-7.687933628486487E-13),(-0.960366430389606,0.2787405951430938,-7.687933628486487E-13),(-0.9830031215351371,0.18358884239565457,-5.061837311642844E-13),(-0.9603664303895686,0.2787405951432227,-7.687933628490044E-13),(-0.9830031215351371,0.18358884239565457,-5.061837311642844E-13),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.9829162037139715,-0.18405362391573407,5.08227044450065E-13),(-0.95898232668401,-0.28346586585993566,7.825735705405153E-13),(-0.9829162037139715,-0.18405362391573407,5.08227044450065E-13),(-0.9589823266840098,-0.2834658658599363,7.825735705405173E-13),(-0.9589823266840098,-0.2834658658599363,7.825735705405173E-13),(-0.9250216907185366,-0.3799142952038266,1.048737801376467E-12),(-0.95898232668401,-0.28346586585993566,7.825735705405153E-13),(-0.9250216907185366,-0.3799142952038266,1.048737801376467E-12),(-0.3977066570345246,-0.9175126238643386,2.5317616710476344E-12),(-0.2030854206185728,-0.9791610245164875,2.701790561530167E-12),(-0.2030854206185041,-0.9791610245165019,2.7017905615302065E-12),(-0.3977066570345246,-0.9175126238643386,2.5317616710476344E-12),(-0.2030854206185041,-0.9791610245165019,2.7017905615302065E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(-0.2030854206185728,-0.9791610245164875,2.701790561530167E-12),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(-0.014456163263559814,0.9998955042121639,-2.758913570057428E-12),(0.27679625006370606,0.9609286320797555,-2.6515058511206996E-12),(-0.014456163263579333,0.9998955042121637,-2.758913570057428E-12),(0.27679625006369585,0.9609286320797585,-2.6515058511207073E-12),(0.27679625006369585,0.9609286320797585,-2.6515058511207073E-12),(0.5363224181349205,0.8440131893554221,-2.329002535542633E-12),(0.27679625006370606,0.9609286320797555,-2.6515058511206996E-12),(0.5363224181348801,0.8440131893554479,-2.3290025355427038E-12),(0.5363224181348801,0.8440131893554479,-2.3290025355427038E-12),(0.733298382119058,0.6799069662693362,-1.8762566805495527E-12),(0.5363224181349205,0.8440131893554221,-2.329002535542633E-12),(0.7332983821190461,0.6799069662693491,-1.8762566805495875E-12),(0.733298382119058,0.6799069662693362,-1.8762566805495527E-12),(0.8575262393066201,0.514440228695857,-1.419789593181195E-12),(0.857526239306608,0.5144402286958769,-1.4197895931812496E-12),(0.7332983821190461,0.6799069662693491,-1.8762566805495875E-12),(0.857526239306608,0.5144402286958769,-1.4197895931812496E-12),(0.9319963445918343,0.3624676725826169,-1.0006018537122344E-12),(0.931996344591825,0.36246767258264073,-1.0006018537123E-12),(0.8575262393066201,0.514440228695857,-1.419789593181195E-12),(0.931996344591825,0.36246767258264073,-1.0006018537123E-12),(0.9747870892284454,0.22313702219384135,-6.16126218977002E-13),(0.9747870892284406,0.2231370221938623,-6.161262189770596E-13),(0.9319963445918343,0.3624676725826169,-1.0006018537122344E-12),(0.9747870892284406,0.2231370221938623,-6.161262189770596E-13),(0.9947035144805423,0.1027857883175373,-2.840074719306968E-13),(0.9947035144805428,0.10278578831753322,-2.8400747193068563E-13),(0.9747870892284454,0.22313702219384135,-6.16126218977002E-13),(0.9947035144805428,0.10278578831753322,-2.8400747193068563E-13),(0.9999845618336788,0.005556626162130686,-1.5802014488365747E-14),(0.9999845618336788,0.0055566261621360835,-1.5802014488380625E-14),(0.9947035144805423,0.1027857883175373,-2.840074719306968E-13),(0.9999845618336788,0.0055566261621360835,-1.5802014488380625E-14),(0.9971625390869557,-0.07527862008336487,2.0730066949910837E-13),(0.9971625390869561,-0.07527862008336199,2.0730066949910041E-13),(0.9999845618336788,0.005556626162130686,-1.5802014488365747E-14),(0.9971625390869561,-0.07527862008336199,2.0730066949910041E-13),(0.9879040014647004,-0.15506670787126914,4.2756065035441273E-13),(0.9879040014647001,-0.15506670787127033,4.27560650354416E-13),(0.9971625390869557,-0.07527862008336487,2.0730066949910837E-13),(0.9879040014647001,-0.15506670787127033,4.27560650354416E-13),(0.9710252517045587,-0.23897690380473685,6.589792360724082E-13),(0.9710252517045607,-0.23897690380472913,6.589792360723868E-13),(0.9879040014647004,-0.15506670787126914,4.2756065035441273E-13),(0.9710252517045607,-0.23897690380472913,6.589792360723868E-13),(0.945969042642219,-0.3242569511399312,8.942192822415853E-13),(0.9459690426422245,-0.3242569511399157,8.942192822415427E-13),(0.9710252517045587,-0.23897690380473685,6.589792360724082E-13),(0.9459690426422245,-0.3242569511399157,8.942192822415427E-13),(0.9104691640560181,-0.413576959347515,1.140734455843455E-12),(0.9104691640560099,-0.4135769593475325,1.1407344558435036E-12),(0.945969042642219,-0.3242569511399312,8.942192822415853E-13),(0.9104691640560099,-0.4135769593475325,1.1407344558435036E-12),(0.8578749092656005,-0.5138585798179668,1.4174621392624583E-12),(0.857874909265601,-0.5138585798179662,1.4174621392624566E-12),(0.9104691640560181,-0.413576959347515,1.140734455843455E-12),(0.857874909265601,-0.5138585798179662,1.4174621392624566E-12),(0.7803315071929187,-0.6253660838916899,1.7252051440579914E-12),(0.7803315071929522,-0.6253660838916482,1.725205144057876E-12),(0.8578749092656005,-0.5138585798179668,1.4174621392624583E-12),(0.7803315071929522,-0.6253660838916482,1.725205144057876E-12),(0.6712274376019151,-0.7412514600392821,2.045005483633996E-12),(0.6712274376019304,-0.7412514600392681,2.0450054836339567E-12),(0.7803315071929187,-0.6253660838916899,1.7252051440579914E-12),(0.6712274376019151,-0.7412514600392821,2.045005483633996E-12),(0.5282915656620174,-0.849063025723282,2.342515820422033E-12),(0.6712274376019304,-0.7412514600392681,2.0450054836339567E-12),(0.5282915656620125,-0.8490630257232848,2.342515820422042E-12),(0.5282915656620125,-0.8490630257232848,2.342515820422042E-12),(0.3581517206154302,-0.9336634002788194,2.5760018892144855E-12),(0.5282915656620174,-0.849063025723282,2.342515820422033E-12),(0.35815172061539774,-0.9336634002788318,2.576001889214519E-12),(0.35815172061539774,-0.9336634002788318,2.576001889214519E-12),(0.1767304590050244,-0.9842592874135726,2.715692583512418E-12),(0.3581517206154302,-0.9336634002788194,2.5760018892144855E-12),(0.17673045900501705,-0.9842592874135739,2.715692583512422E-12),(0.17673045900501705,-0.9842592874135739,2.715692583512422E-12),(-0.0251642147515661,-0.9996833310083435,2.7583532312109314E-12),(0.1767304590050244,-0.9842592874135726,2.715692583512418E-12),(-0.025164214751625218,-0.9996833310083421,2.758353231210928E-12),(-0.025164214751625218,-0.9996833310083421,2.758353231210928E-12),(-0.2780805413802268,-0.9605577611500935,2.6504810743325445E-12),(-0.0251642147515661,-0.9996833310083435,2.7583532312109314E-12),(-0.27808054138025573,-0.9605577611500851,2.6504810743325206E-12),(-0.2780805413802268,-0.9605577611500935,2.6504810743325445E-12),(-0.5377928463665644,-0.8430770156972309,2.32641732212843E-12),(-0.537792846366609,-0.8430770156972025,2.326417322128352E-12),(-0.27808054138025573,-0.9605577611500851,2.6504810743325206E-12),(-0.537792846366609,-0.8430770156972025,2.326417322128352E-12),(-0.7340598172506593,-0.6790848140681169,1.8739911562588936E-12),(-0.7340598172506781,-0.6790848140680964,1.8739911562588367E-12),(-0.5377928463665644,-0.8430770156972309,2.32641732212843E-12),(-0.7340598172506593,-0.6790848140681169,1.8739911562588936E-12),(-0.8575399153398935,-0.5144174312742992,1.419687813743317E-12),(-0.7340598172506781,-0.6790848140680964,1.8739911562588367E-12),(-0.857539915339897,-0.5144174312742934,1.4196878137433009E-12),(-0.857539915339897,-0.5144174312742934,1.4196878137433009E-12),(-0.931215481170937,-0.3644691038038482,1.0061277054928546E-12),(-0.8575399153398935,-0.5144174312742992,1.419687813743317E-12),(-0.9312154811709294,-0.3644691038038677,1.0061277054929084E-12),(-0.9312154811709294,-0.3644691038038677,1.0061277054929084E-12),(-0.9739593803592153,-0.2267225736672322,6.260598829740977E-13),(-0.931215481170937,-0.3644691038038482,1.0061277054928546E-12),(-0.9739593803592121,-0.226722573667246,6.260598829741359E-13),(-0.9739593803592121,-0.226722573667246,6.260598829741359E-13),(-0.9944387604173459,-0.1053164364171732,2.9102994282543537E-13),(-0.9739593803592153,-0.2267225736672322,6.260598829740977E-13),(-0.9944387604173455,-0.1053164364171778,2.9102994282544804E-13),(-0.9944387604173455,-0.1053164364171778,2.9102994282544804E-13),(-0.9999739448500035,-0.007218699406564805,2.0357812483362814E-14),(-0.9944387604173459,-0.1053164364171732,2.9102994282543537E-13),(-0.9999739448500035,-0.0072186994065604505,2.0357812483350807E-14),(-0.9999739448500035,-0.0072186994065604505,2.0357812483350807E-14),(-0.9974002311185112,0.07206093924409046,-1.984851031109732E-13),(-0.9999739448500035,-0.007218699406564805,2.0357812483362814E-14),(-0.9974002311185115,0.07206093924408563,-1.9848510311095984E-13),(-0.9974002311185115,0.07206093924408563,-1.9848510311095984E-13),(-0.9886899396079466,0.14997400880831005,-4.1343924076031503E-13),(-0.9974002311185112,0.07206093924409046,-1.984851031109732E-13),(-0.988689939607947,0.14997400880830744,-4.1343924076030787E-13),(-0.988689939607947,0.14997400880830744,-4.1343924076030787E-13),(-0.9722499433165867,0.23394453983988225,-6.450473128690703E-13),(-0.9886899396079466,0.14997400880831005,-4.1343924076031503E-13),(-0.9722499433165831,0.2339445398398972,-6.450473128691116E-13),(-0.9722499433165831,0.2339445398398972,-6.450473128691116E-13),(-0.9453117550981346,0.3261681861759126,-8.994823126530137E-13),(-0.9722499433165867,0.23394453983988225,-6.450473128690703E-13),(-0.9453117550981349,0.3261681861759111,-8.994823126530094E-13),(-0.9453117550981349,0.3261681861759111,-8.994823126530094E-13),(-0.9018682894200392,0.43201109770302487,-1.1915533380526445E-12),(-0.9453117550981346,0.3261681861759126,-8.994823126530137E-13),(-0.9018682894200535,0.43201109770299495,-1.1915533380525623E-12),(-0.9018682894200535,0.43201109770299495,-1.1915533380525623E-12),(-0.833512034958152,0.5525013009757722,-1.5241037840899676E-12),(-0.9018682894200392,0.43201109770302487,-1.1915533380526445E-12),(-0.8335120349581778,0.552501300975733,-1.5241037840898596E-12),(-0.8335120349581778,0.552501300975733,-1.5241037840898596E-12),(-0.7321423707587941,0.6811516343221183,-1.8791894461587957E-12),(-0.833512034958152,0.5525013009757722,-1.5241037840899676E-12),(-0.7321423707587662,0.6811516343221482,-1.879189446158878E-12),(-0.7321423707587941,0.6811516343221183,-1.8791894461587957E-12),(-0.5698568764936295,0.821743962748084,-2.2671737177471476E-12),(-0.5698568764936801,0.821743962748049,-2.2671737177470506E-12),(-0.7321423707587662,0.6811516343221482,-1.879189446158878E-12),(-0.5698568764936801,0.821743962748049,-2.2671737177470506E-12),(-0.31616386392644025,0.9487045963560542,-2.6175634068948803E-12),(-0.3161638639263722,0.9487045963560767,-2.617563406894943E-12),(-0.5698568764936295,0.821743962748084,-2.2671737177471476E-12),(-0.3161638639263722,0.9487045963560767,-2.617563406894943E-12),(-0.014456163263559814,0.9998955042121639,-2.758913570057428E-12),(-0.014456163263579333,0.9998955042121637,-2.758913570057428E-12),(-0.31616386392644025,0.9487045963560542,-2.6175634068948803E-12),(-0.00524671748567734,-0.9999862358830873,2.7591812434517643E-12),(0.3192597602410029,-0.9476672440740248,2.6146894142176435E-12),(-0.005246717485740676,-0.9999862358830871,2.7591812434517647E-12),(0.3192597602410923,-0.9476672440739948,2.6146894142175607E-12),(0.3192597602410923,-0.9476672440739948,2.6146894142175607E-12),(0.5970633609256601,-0.8021940806563927,2.2131431756573063E-12),(0.3192597602410029,-0.9476672440740248,2.6146894142176435E-12),(0.5970633609257284,-0.8021940806563418,2.213143175657166E-12),(0.5970633609256601,-0.8021940806563927,2.2131431756573063E-12),(0.784978946319045,-0.6195224401390493,1.7091127741120202E-12),(0.7849789463190372,-0.6195224401390591,1.709112774112047E-12),(0.5970633609257284,-0.8021940806563418,2.213143175657166E-12),(0.7849789463190372,-0.6195224401390591,1.709112774112047E-12),(0.8892699765686355,-0.4573826721396634,1.2616774704546493E-12),(0.8892699765686456,-0.4573826721396435,1.2616774704545944E-12),(0.784978946319045,-0.6195224401390493,1.7091127741120202E-12),(0.8892699765686456,-0.4573826721396435,1.2616774704545944E-12),(0.9460355692139014,-0.32406280530497433,8.937179025160682E-13),(0.946035569213902,-0.32406280530497267,8.937179025160637E-13),(0.8892699765686355,-0.4573826721396634,1.2616774704546493E-12),(0.946035569213902,-0.32406280530497267,8.937179025160637E-13),(0.9789776170751959,-0.20396770642866788,5.62407053909749E-13),(0.9789776170751897,-0.203967706428698,5.62407053909832E-13),(0.9460355692139014,-0.32406280530497433,8.937179025160682E-13),(0.9789776170751897,-0.203967706428698,5.62407053909832E-13),(0.9953832851063591,-0.09597976729953482,2.6438474876604973E-13),(0.9953832851063574,-0.09597976729955267,2.6438474876609896E-13),(0.9789776170751959,-0.20396770642866788,5.62407053909749E-13),(0.9953832851063574,-0.09597976729955267,2.6438474876609896E-13),(1.,-6.809851204870716E-16,-4.6739125793773355E-16),(1.,6.456092700724749E-16,-4.673912579413858E-16),(0.9953832851063591,-0.09597976729953482,2.6438474876604973E-13),(1.,6.456092700724749E-16,-4.673912579413858E-16),(0.9953832851063579,0.09597976729954764,-2.652361791800541E-13),(0.9953832851063568,0.09597976729955954,-2.652361791800868E-13),(1.,-6.809851204870716E-16,-4.6739125793773355E-16),(0.9953832851063568,0.09597976729955954,-2.652361791800868E-13),(0.9789776170751958,0.2039677064286687,-5.63174665064024E-13),(0.9789776170751952,0.2039677064286717,-5.631746650640323E-13),(0.9953832851063579,0.09597976729954764,-2.652361791800541E-13),(0.9789776170751952,0.2039677064286717,-5.631746650640323E-13),(0.9460355692139023,0.3240628053049716,-8.945678016010668E-13),(0.9460355692139127,0.3240628053049414,-8.945678016009835E-13),(0.9789776170751958,0.2039677064286687,-5.63174665064024E-13),(0.9460355692139127,0.3240628053049414,-8.945678016009835E-13),(0.8891109963042101,0.4576916388256785,-1.2632285193042758E-12),(0.8891109963042216,0.45769163882565594,-1.2632285193042139E-12),(0.9460355692139023,0.3240628053049716,-8.945678016010668E-13),(0.8891109963042216,0.45769163882565594,-1.2632285193042139E-12),(0.7841350649780976,0.6205902028487036,-1.7126323007416575E-12),(0.7841350649780632,0.620590202848747,-1.712632300741777E-12),(0.8891109963042101,0.4576916388256785,-1.2632285193042758E-12),(0.7841350649780632,0.620590202848747,-1.712632300741777E-12),(0.5952527509857988,0.8035385257993787,-2.2173998736993907E-12),(0.5952527509858431,0.803538525799346,-2.2173998736993002E-12),(0.7841350649780976,0.6205902028487036,-1.7126323007416575E-12),(0.5952527509857988,0.8035385257993787,-2.2173998736993907E-12),(0.31752911065173084,0.9482485243272045,-2.616561737071326E-12),(0.5952527509858431,0.803538525799346,-2.2173998736993002E-12),(0.3175291106516115,0.9482485243272446,-2.616561737071436E-12),(0.3175291106516115,0.9482485243272446,-2.616561737071436E-12),(-1.4062582279334826E-14,1.,-2.759214319657624E-12),(0.31752911065173084,0.9482485243272045,-2.616561737071326E-12),(1.4796126647609003E-14,1.,-2.7592143196576233E-12),(-1.4062582279334826E-14,1.,-2.759214319657624E-12),(-0.31752911065161005,0.9482485243272449,-2.6162798948431874E-12),(-0.3175291106516717,0.9482485243272244,-2.6162798948431297E-12),(1.4796126647609003E-14,1.,-2.7592143196576233E-12),(-0.3175291106516717,0.9482485243272244,-2.6162798948431297E-12),(-0.5952527509858166,0.8035385257993655,-2.2167973223436654E-12),(-0.5952527509858214,0.8035385257993619,-2.2167973223436558E-12),(-0.31752911065161005,0.9482485243272449,-2.6162798948431874E-12),(-0.5952527509858166,0.8035385257993655,-2.2167973223436654E-12),(-0.7841350649781007,0.6205902028486996,-1.7119818018193999E-12),(-0.5952527509858214,0.8035385257993619,-2.2167973223436558E-12),(-0.7841350649780671,0.6205902028487421,-1.711981801819517E-12),(-0.7841350649780671,0.6205902028487421,-1.711981801819517E-12),(-0.8886633336049228,0.45856022451384276,-1.2649836555973923E-12),(-0.7841350649781007,0.6205902028486996,-1.7119818018193999E-12),(-0.8886633336049196,0.4585602245138488,-1.2649836555974088E-12),(-0.8886633336049196,0.4585602245138488,-1.2649836555974088E-12),(-0.945101558421973,0.3267767498895206,-9.012853251752299E-13),(-0.8886633336049228,0.45856022451384276,-1.2649836555973923E-12),(-0.9451015584219759,0.3267767498895119,-9.012853251752059E-13),(-0.9451015584219759,0.3267767498895119,-9.012853251752059E-13),(-0.9782446517648234,0.20745457645836518,-5.720066311455479E-13),(-0.945101558421973,0.3267767498895206,-9.012853251752299E-13),(-0.9782446517648219,0.20745457645837223,-5.720066311455675E-13),(-0.9782446517648219,0.20745457645837223,-5.720066311455675E-13),(-0.9951552549714545,0.09831591174728375,-2.708461658554428E-13),(-0.9782446517648234,0.20745457645836518,-5.720066311455479E-13),(-0.9951552549714534,0.09831591174729404,-2.708461658554713E-13),(-0.9951552549714534,0.09831591174729404,-2.708461658554713E-13),(-0.9999987530813137,0.0015791883415384133,-3.866893150817484E-15),(-0.9951552549714545,0.09831591174728375,-2.708461658554428E-13),(-0.9999987530813137,0.0015791883415576208,-3.8668931508704885E-15),(-0.9999987530813137,0.0015791883415576208,-3.8668931508704885E-15),(-0.9956491772094714,-0.09318109208472852,2.57552700469096E-13),(-0.9999987530813137,0.0015791883415384133,-3.866893150817484E-15),(-0.995649177209472,-0.09318109208472375,2.5755270046908294E-13),(-0.995649177209472,-0.09318109208472375,2.5755270046908294E-13),(-0.979613746822012,-0.20089028607013112,5.546612049869286E-13),(-0.9956491772094714,-0.09318109208472852,2.57552700469096E-13),(-0.9796137468220057,-0.20089028607016185,5.546612049870135E-13),(-0.9796137468220057,-0.20089028607016185,5.546612049870135E-13),(-0.9457986610955139,-0.32475358761672435,8.964032785534942E-13),(-0.979613746822012,-0.20089028607013112,5.546612049869286E-13),(-0.9457986610955131,-0.3247535876167265,8.964032785535001E-13),(-0.9457986610955131,-0.3247535876167265,8.964032785535001E-13),(-0.886378063178809,-0.4629621249253372,1.2777463029826751E-12),(-0.9457986610955139,-0.32475358761672435,8.964032785534942E-13),(-0.8863780631788213,-0.46296212492531336,1.2777463029826097E-12),(-0.8863780631788213,-0.46296212492531336,1.2777463029826097E-12),(-0.7799875144674657,-0.6257950761030843,1.7270167154009765E-12),(-0.886378063178809,-0.4629621249253372,1.2777463029826751E-12),(-0.7799875144674742,-0.6257950761030738,1.7270167154009478E-12),(-0.7799875144674657,-0.6257950761030843,1.7270167154009765E-12),(-0.5937787941947201,-0.8046283263499144,2.2203916269796114E-12),(-0.5937787941946711,-0.8046283263499506,2.2203916269797115E-12),(-0.7799875144674742,-0.6257950761030738,1.7270167154009478E-12),(-0.5937787941946711,-0.8046283263499506,2.2203916269797115E-12),(-0.32385581082486675,-0.946106449505006,2.610650061862073E-12),(-0.3238558108247651,-0.9461064495050407,2.6106500618621686E-12),(-0.5937787941947201,-0.8046283263499144,2.2203916269796114E-12),(-0.32385581082486675,-0.946106449505006,2.610650061862073E-12),(-0.005246717485740676,-0.9999862358830871,2.7591812434517647E-12),(-0.3238558108247651,-0.9461064495050407,2.6106500618621686E-12),(-0.00524671748567734,-0.9999862358830873,2.7591812434517643E-12),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.20007400713152554,0.9797807875593062,-2.703358418023369E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.2000740071318276,0.9797807875592445,-2.7033584180231982E-12),(-0.2000740071318276,0.9797807875592445,-2.7033584180231982E-12),(-0.3920573365553536,0.9199407833404945,-2.5381829222655227E-12),(-0.20007400713152554,0.9797807875593062,-2.703358418023369E-12),(-0.3920573365553536,0.9199407833404945,-2.5381829222655227E-12),(-0.9250216907185411,0.3799142952038155,-1.0479738917793719E-12),(-0.958982326684027,0.2834658658598776,-7.818043168169454E-13),(-0.9250216907185411,0.3799142952038155,-1.0479738917793719E-12),(-0.9589823266839906,0.28346586586000105,-7.818043168172861E-13),(-0.9589823266839906,0.28346586586000105,-7.818043168172861E-13),(-0.9829162037139707,0.1840536239157382,-5.074604896282593E-13),(-0.958982326684027,0.2834658658598776,-7.818043168169454E-13),(-0.9829162037139707,0.1840536239157382,-5.074604896282593E-13),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.9826489702535564,-0.18547506910532588,5.120573077800171E-13),(-0.9589087450177696,-0.28371467838031655,7.831483386945349E-13),(-0.9826489702535564,-0.18547506910532588,5.120573077800171E-13),(-0.9589087450177659,-0.2837146783803287,7.831483386945686E-13),(-0.9589087450177659,-0.2837146783803287,7.831483386945686E-13),(-0.8038585012002755,-0.5948205696241908,1.6415185368452048E-12),(-0.9589087450177696,-0.28371467838031655,7.831483386945349E-13),(-0.8038585012004971,-0.5948205696238913,1.6415185368443792E-12),(-0.8038585012002755,-0.5948205696241908,1.6415185368452048E-12),(-0.41828292848593496,-0.9083167904080769,2.5063886181764343E-12),(-0.41828292848583415,-0.9083167904081234,2.5063886181765623E-12),(-0.8038585012004971,-0.5948205696238913,1.6415185368443792E-12),(-0.41828292848593496,-0.9083167904080769,2.5063886181764343E-12),(-0.08869355101094169,-0.9960589611107715,2.748382215157448E-12),(-0.41828292848583415,-0.9083167904081234,2.5063886181765623E-12),(-0.0886935510107961,-0.9960589611107846,2.7483822151574846E-12),(-0.08869355101094169,-0.9960589611107715,2.748382215157448E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(-0.0886935510107961,-0.9960589611107846,2.7483822151574846E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-0.5954279130339786,0.8034087380530542,-2.2166021771391506E-12),(-0.7353424654422699,0.6776956975791453,-1.8697285618496772E-12),(-0.7353424654422305,0.677695697579188,-1.869728561849795E-12),(-0.5954279130339786,0.8034087380530542,-2.2166021771391506E-12),(-0.7353424654422699,0.6776956975791453,-1.8697285618496772E-12),(-0.9279729502400419,0.37264755952883005,-1.0278988743707327E-12),(-0.7353424654422305,0.677695697579188,-1.869728561849795E-12),(-0.9279729502400574,0.3726475595287912,-1.0278988743706253E-12),(-0.9279729502400574,0.3726475595287912,-1.0278988743706253E-12),(-0.9919380594528869,0.12672366080902564,-3.4921606417610127E-13),(-0.9279729502400419,0.37264755952883005,-1.0278988743707327E-12),(-0.9919380594528845,0.12672366080904562,-3.492160641761563E-13),(-0.9919380594528845,0.12672366080904562,-3.492160641761563E-13),(-0.9997278626286517,0.023328109309328875,-6.39434148327632E-14),(-0.9919380594528869,0.12672366080902564,-3.4921606417610127E-13),(-0.9997278626286515,0.02332810930933333,-6.39434148327755E-14),(-0.9997278626286515,0.02332810930933333,-6.39434148327755E-14),(-0.9997372811223786,-0.022920923498727593,6.37108617170267E-14),(-0.9997278626286517,0.023328109309328875,-6.39434148327632E-14),(-0.9997372811223789,-0.02292092349871012,6.371086171697846E-14),(-0.9997372811223789,-0.02292092349871012,6.371086171697846E-14),(-0.9919210150229036,-0.126857005939494,3.5040215885905077E-13),(-0.9997372811223786,-0.022920923498727593,6.37108617170267E-14),(-0.9919210150229122,-0.1268570059394265,3.5040215885886463E-13),(-0.9919210150229122,-0.1268570059394265,3.5040215885886463E-13),(-0.9257138949175249,-0.3782245163347107,1.0438546173318985E-12),(-0.9919210150229036,-0.126857005939494,3.5040215885905077E-13),(-0.9257138949175149,-0.37822451633473525,1.0438546173319661E-12),(-0.9257138949175149,-0.37822451633473525,1.0438546173319661E-12),(-0.7298956734503226,-0.6835585606796979,1.8863414284475335E-12),(-0.9257138949175249,-0.3782245163347107,1.0438546173318985E-12),(-0.7298956734502887,-0.683558560679734,1.8863414284476333E-12),(-0.7298956734502887,-0.683558560679734,1.8863414284476333E-12),(-0.5913596447695504,-0.806407943002815,2.225289029143192E-12),(-0.7298956734503226,-0.6835585606796979,1.8863414284475335E-12),(-0.5913596447695504,-0.806407943002815,2.225289029143192E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.5913596447695503,-0.806407943002815,2.224873431613054E-12),(0.7298956734503305,-0.6835585606796896,1.8858562446021595E-12),(0.5913596447695503,-0.806407943002815,2.224873431613054E-12),(0.7298956734502947,-0.6835585606797276,1.8858562446022645E-12),(0.7298956734503305,-0.6835585606796896,1.8858562446021595E-12),(0.9257138949175322,-0.3782245163346927,1.0432763709070634E-12),(0.9257138949175273,-0.37822451633470505,1.0432763709070975E-12),(0.7298956734502947,-0.6835585606797276,1.8858562446022645E-12),(0.9257138949175273,-0.37822451633470505,1.0432763709070975E-12),(0.9919210150229029,-0.12685700593949967,3.496606455925826E-13),(0.9919210150229099,-0.12685700593944577,3.4966064559243396E-13),(0.9257138949175322,-0.3782245163346927,1.0432763709070634E-12),(0.9919210150229099,-0.12685700593944577,3.4966064559243396E-13),(0.9997372811223789,-0.02292092349871007,6.28600600851392E-14),(0.9997372811223788,-0.022920923498714267,6.28600600851508E-14),(0.9919210150229029,-0.12685700593949967,3.496606455925826E-13),(0.9997372811223788,-0.022920923498714267,6.28600600851508E-14),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.9997372811223789,-0.02292092349871007,6.28600600851392E-14),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(-0.9985580220656759,0.05368311250556468,-1.4773889682821573E-13),(-0.9985580220656763,-0.05368311250555678,1.4850720843007615E-13),(-0.998558022065675,0.053683112505583275,-1.4773889682826703E-13),(-0.9985580220656761,-0.053683112505562805,1.485072084300928E-13),(-0.9985580220656761,-0.053683112505562805,1.485072084300928E-13),(-0.994236246863431,-0.10721140528376126,2.961747053554324E-13),(-0.9985580220656763,-0.05368311250555678,1.4850720843007615E-13),(-0.994236246863431,-0.10721140528376126,2.961747053554324E-13),(-0.8507772826193606,-0.5255264173938519,1.4502482621029994E-12),(-0.7331764133483574,-0.6800384892854513,1.8766159658271214E-12),(-0.8507772826193606,-0.5255264173938519,1.4502482621029994E-12),(-0.7331764133483957,-0.68003848928541,1.876615965827007E-12),(-0.7331764133483957,-0.68003848928541,1.876615965827007E-12),(-0.5879319010498539,-0.8089104275059785,2.2322278447395716E-12),(-0.7331764133483574,-0.6800384892854513,1.8766159658271214E-12),(-0.5879319010498539,-0.8089104275059785,2.2322278447395716E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(0.06586923201172727,0.9978282639182884,-2.7532474650302433E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(0.06586923201174097,0.9978282639182874,-2.75324746503024E-12),(0.06586923201174097,0.9978282639182874,-2.75324746503024E-12),(0.263632973177927,0.9646230639236067,-2.6616417866635812E-12),(0.06586923201172727,0.9978282639182884,-2.7532474650302433E-12),(0.2636329731778287,0.9646230639236335,-2.661641786663656E-12),(0.2636329731778287,0.9646230639236335,-2.661641786663656E-12),(0.49417230671295753,0.8693639808952259,-2.3988925059285463E-12),(0.263632973177927,0.9646230639236067,-2.6616417866635812E-12),(0.4941723067129389,0.8693639808952366,-2.398892505928576E-12),(0.4941723067129389,0.8693639808952366,-2.398892505928576E-12),(0.6822341669074508,0.7311337370851496,-2.017547340867987E-12),(0.49417230671295753,0.8693639808952259,-2.3988925059285463E-12),(0.6822341669074939,0.7311337370851094,-2.017547340867876E-12),(0.6822341669074508,0.7311337370851496,-2.017547340867987E-12),(0.8170818871976416,0.5765216297881116,-1.5908970219763464E-12),(0.8170818871976462,0.5765216297881052,-1.5908970219763286E-12),(0.6822341669074939,0.7311337370851094,-2.017547340867876E-12),(0.8170818871976462,0.5765216297881052,-1.5908970219763286E-12),(0.8956698069729665,0.4447196834827634,-1.2273676985787037E-12),(0.8956698069729655,0.44471968348276514,-1.2273676985787086E-12),(0.8170818871976416,0.5765216297881116,-1.5908970219763464E-12),(0.8956698069729655,0.44471968348276514,-1.2273676985787086E-12),(0.9418989444488495,0.3358963805195631,-9.27312370472369E-13),(0.9418989444488515,0.3358963805195581,-9.273123704723552E-13),(0.8956698069729665,0.4447196834827634,-1.2273676985787037E-12),(0.9418989444488515,0.3358963805195581,-9.273123704723552E-13),(0.9719072033706481,0.23536437291197262,-6.499063325926539E-13),(0.9719072033706505,0.23536437291196238,-6.499063325926257E-13),(0.9418989444488495,0.3358963805195631,-9.27312370472369E-13),(0.9719072033706505,0.23536437291196238,-6.499063325926257E-13),(0.9926609702408182,0.12093055098095641,-3.3408185446675434E-13),(0.9926609702408176,0.12093055098096049,-3.3408185446676565E-13),(0.9719072033706481,0.23536437291197262,-6.499063325926539E-13),(0.9926609702408176,0.12093055098096049,-3.3408185446676565E-13),(0.9999176960541967,0.01282969670987237,-3.5864735916440954E-14),(0.9999176960541967,0.012829696709878595,-3.58647359164581E-14),(0.9926609702408182,0.12093055098095641,-3.3408185446675434E-13),(0.9999176960541967,0.012829696709878595,-3.58647359164581E-14),(0.9977259706298166,-0.06740094606747517,1.8552401578649333E-13),(0.9977259706298175,-0.06740094606746039,1.855240157864525E-13),(0.9999176960541967,0.01282969670987237,-3.5864735916440954E-14),(0.9977259706298175,-0.06740094606746039,1.855240157864525E-13),(0.9902871124897815,-0.13903753031700058,3.832434360905474E-13),(0.9902871124897834,-0.13903753031698807,3.8324343609051297E-13),(0.9977259706298166,-0.06740094606747517,1.8552401578649333E-13),(0.9902871124897834,-0.13903753031698807,3.8324343609051297E-13),(0.9766392563350035,-0.21488546480721185,5.925558337634198E-13),(0.9766392563350028,-0.21488546480721518,5.925558337634289E-13),(0.9902871124897815,-0.13903753031700058,3.832434360905474E-13),(0.9766392563350028,-0.21488546480721518,5.925558337634289E-13),(0.9561925728578822,-0.2927383876628142,8.073364377161725E-13),(0.9561925728578783,-0.29273838766282684,8.073364377162074E-13),(0.9766392563350035,-0.21488546480721185,5.925558337634198E-13),(0.9561925728578783,-0.29273838766282684,8.073364377162074E-13),(0.9254680870270006,-0.37882557977858955,1.0449027954112128E-12),(0.925468087026997,-0.3788255797785977,1.0449027954112353E-12),(0.9561925728578822,-0.2927383876628142,8.073364377161725E-13),(0.925468087026997,-0.3788255797785977,1.0449027954112353E-12),(0.8749146921521967,-0.4842770709585855,1.3360175773233522E-12),(0.8749146921522147,-0.48427707095855294,1.3360175773232626E-12),(0.9254680870270006,-0.37882557977858955,1.0449027954112128E-12),(0.8749146921522147,-0.48427707095855294,1.3360175773232626E-12),(0.7908353863491634,-0.6120289141028956,1.6884880357549364E-12),(0.7908353863492028,-0.6120289141028447,1.6884880357547958E-12),(0.8749146921521967,-0.4842770709585855,1.3360175773233522E-12),(0.7908353863492028,-0.6120289141028447,1.6884880357547958E-12),(0.6577139687329255,-0.7532677713360533,2.078176675000421E-12),(0.6577139687329436,-0.7532677713360374,2.0781766750003773E-12),(0.7908353863491634,-0.6120289141028956,1.6884880357549364E-12),(0.6577139687329255,-0.7532677713360533,2.078176675000421E-12),(0.48381045391931804,-0.8751728084660673,2.4146264250809055E-12),(0.6577139687329436,-0.7532677713360374,2.0781766750003773E-12),(0.4838104539193804,-0.8751728084660326,2.41462642508081E-12),(0.4838104539193804,-0.8751728084660326,2.41462642508081E-12),(0.2649833353970481,-0.9642529916789763,2.6604926394086866E-12),(0.48381045391931804,-0.8751728084660673,2.4146264250809055E-12),(0.2649833353970643,-0.9642529916789718,2.660492639408674E-12),(0.2649833353970643,-0.9642529916789718,2.660492639408674E-12),(0.06820622469696763,-0.9976712439038158,2.7527666090038006E-12),(0.2649833353970481,-0.9642529916789763,2.6604926394086866E-12),(0.06820622469692827,-0.9976712439038183,2.752766609003807E-12),(0.06820622469696763,-0.9976712439038158,2.7527666090038006E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(0.06820622469692827,-0.9976712439038183,2.752766609003807E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-0.5879319010498562,0.808910427505977,-2.231756892673258E-12),(-0.733176413348437,0.6800384892853654,-1.8760732669061027E-12),(-0.7331764133484753,0.6800384892853241,-1.876073266905989E-12),(-0.5879319010498562,0.808910427505977,-2.231756892673258E-12),(-0.733176413348437,0.6800384892853654,-1.8760732669061027E-12),(-0.8507772826193595,0.5255264173938533,-1.4496542782179093E-12),(-0.7331764133484753,0.6800384892853241,-1.876073266905989E-12),(-0.8507772826193595,0.5255264173938533,-1.4496542782179093E-12),(-0.9942362468634309,0.10721140528376114,-2.954631444673134E-13),(-0.998558022065675,0.053683112505583275,-1.4773889682826703E-13),(-0.9942362468634309,0.10721140528376114,-2.954631444673134E-13),(-0.9985580220656759,0.05368311250556468,-1.4773889682821573E-13),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.07695947056770676,0.9970342220254721,-2.7510071541547703E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.07695947056770781,0.9970342220254721,-2.75100715415477E-12),(-0.07695947056770676,0.9970342220254721,-2.7510071541547703E-12),(-0.30631458433137615,0.9519303416878234,-2.62647623360099E-12),(-0.30631458433150416,0.9519303416877822,-2.626476233600876E-12),(-0.07695947056770781,0.9970342220254721,-2.75100715415477E-12),(-0.30631458433150416,0.9519303416877822,-2.626476233600876E-12),(-0.5625785556331593,0.82674383501887,-2.2809582387429675E-12),(-0.562578555633162,0.8267438350188683,-2.2809582387429627E-12),(-0.30631458433137615,0.9519303416878234,-2.62647623360099E-12),(-0.562578555633162,0.8267438350188683,-2.2809582387429627E-12),(-0.7436990877465491,0.668514522568471,-1.844270051685634E-12),(-0.7436990877464649,0.6685145225685648,-1.8442700516858933E-12),(-0.5625785556331593,0.82674383501887,-2.2809582387429675E-12),(-0.7436990877465491,0.668514522568471,-1.844270051685634E-12),(-0.8582582522446105,0.5132180554637833,-1.4157582836837134E-12),(-0.7436990877464649,0.6685145225685648,-1.8442700516858933E-12),(-0.8582582522446274,0.5132180554637547,-1.4157582836836343E-12),(-0.8582582522446274,0.5132180554637547,-1.4157582836836343E-12),(-0.9228983961102781,0.38504356955684405,-1.0620410950688668E-12),(-0.8582582522446105,0.5132180554637833,-1.4157582836837134E-12),(-0.9228983961102676,0.3850435695568695,-1.0620410950689373E-12),(-0.9228983961102676,0.3850435695568695,-1.0620410950689373E-12),(-0.9598249214871282,0.28059957250899115,-7.738730058438499E-13),(-0.9228983961102781,0.38504356955684405,-1.0620410950688668E-12),(-0.9598249214871242,0.2805995725090049,-7.738730058438879E-13),(-0.9598249214871242,0.2805995725090049,-7.738730058438879E-13),(-0.9825437042969424,0.1860319035715187,-5.129891542351457E-13),(-0.9598249214871282,0.28059957250899115,-7.738730058438499E-13),(-0.9825437042969416,0.1860319035715228,-5.12989154235157E-13),(-0.9825437042969416,0.1860319035715228,-5.12989154235157E-13),(-0.9959333498749684,0.09009307746338742,-2.4817472504783793E-13),(-0.9825437042969424,0.1860319035715187,-5.129891542351457E-13),(-0.9959333498749663,0.09009307746340965,-2.481747250478993E-13),(-0.9959333498749663,0.09009307746340965,-2.481747250478993E-13),(-0.9999913518233414,0.004158879479668722,-1.0976369048869976E-14),(-0.9959333498749684,0.09009307746338742,-2.4817472504783793E-13),(-0.9999913518233414,0.004158879479666015,-1.0976369048862508E-14),(-0.9999913518233414,0.004158879479666015,-1.0976369048862508E-14),(-0.997280073697995,-0.07370518709644311,2.0388218282374932E-13),(-0.9999913518233414,0.004158879479668722,-1.0976369048869976E-14),(-0.997280073697995,-0.07370518709644483,2.03882182823754E-13),(-0.997280073697995,-0.07370518709644483,2.03882182823754E-13),(-0.9867686117938449,-0.16213484134647987,4.477923368184413E-13),(-0.997280073697995,-0.07370518709644311,2.0388218282374932E-13),(-0.9867686117938491,-0.16213484134645495,4.477923368183725E-13),(-0.9867686117938491,-0.16213484134645495,4.477923368183725E-13),(-0.9628292628321741,-0.27011073772446054,7.457460703961605E-13),(-0.9867686117938449,-0.16213484134647987,4.477923368184413E-13),(-0.9628292628321742,-0.27011073772446004,7.457460703961591E-13),(-0.9628292628321742,-0.27011073772446004,7.457460703961591E-13),(-0.9101427787757594,-0.41429472871657325,1.1435622607326853E-12),(-0.9628292628321741,-0.27011073772446054,7.457460703961605E-13),(-0.9101427787757602,-0.41429472871657164,1.143562260732681E-12),(-0.9101427787757602,-0.41429472871657164,1.143562260732681E-12),(-0.7869835626918031,-0.6169739638371438,1.702667207252749E-12),(-0.9101427787757594,-0.41429472871657325,1.1435622607326853E-12),(-0.7869835626917596,-0.6169739638371989,1.7026672072529014E-12),(-0.7869835626918031,-0.6169739638371438,1.702667207252749E-12),(-0.5449321183150417,-0.8384801646006192,2.3137586812146654E-12),(-0.5449321183150388,-0.8384801646006211,2.313758681214671E-12),(-0.7869835626917596,-0.6169739638371989,1.7026672072529014E-12),(-0.5449321183150388,-0.8384801646006211,2.313758681214671E-12),(-0.2462961614420766,-0.969194614542868,2.674311001613972E-12),(-0.2462961614421064,-0.9691946145428606,2.6743110016139513E-12),(-0.5449321183150417,-0.8384801646006192,2.3137586812146654E-12),(-0.2462961614420766,-0.969194614542868,2.674311001613972E-12),(-0.052770847905882004,-0.9986066480908758,2.7553883636971003E-12),(-0.2462961614421064,-0.9691946145428606,2.6743110016139513E-12),(-0.052770847905862624,-0.998606648090877,2.7553883636971035E-12),(-0.052770847905862624,-0.998606648090877,2.7553883636971035E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.052770847905882004,-0.9986066480908758,2.7553883636971003E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.2000740071318171,0.9797807875592468,-2.7033584180232083E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.20007400713174248,0.9797807875592619,-2.7033584180232503E-12),(-0.2000740071318171,0.9797807875592468,-2.7033584180232083E-12),(-0.39205733655535946,0.9199407833404918,-2.5381829222655227E-12),(-0.39205733655535946,0.9199407833404918,-2.5381829222655227E-12),(-0.20007400713174248,0.9797807875592619,-2.7033584180232503E-12),(-0.9271481171496561,0.37469503448250796,-1.033596455031816E-12),(-0.9613689058329938,0.2752631956827362,-7.592106642044564E-13),(-0.9271481171496561,0.37469503448250796,-1.033596455031816E-12),(-0.9613689058329786,0.2752631956827898,-7.592106642046042E-13),(-0.9613689058329786,0.2752631956827898,-7.592106642046042E-13),(-0.9849591146664011,0.17278756447030438,-4.764297094192548E-13),(-0.9613689058329938,0.2752631956827362,-7.592106642044564E-13),(-0.9849591146664011,0.17278756447030438,-4.764297094192548E-13),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.9850568535010445,-0.17222948461463247,4.75586536429681E-13),(-0.9627290187837241,-0.27046781026903727,7.466890493836132E-13),(-0.9850568535010445,-0.17222948461463247,4.75586536429681E-13),(-0.9627290187837233,-0.27046781026904027,7.466890493836216E-13),(-0.9627290187837233,-0.27046781026904027,7.466890493836216E-13),(-0.8103422277042358,-0.5859568874920208,1.6171249937826915E-12),(-0.9627290187837241,-0.27046781026903727,7.466890493836132E-13),(-0.8103422277044423,-0.585956887491735,1.6171249937819033E-12),(-0.8103422277042358,-0.5859568874920208,1.6171249937826915E-12),(-0.4221218672865516,-0.906539094114818,2.50148782119697E-12),(-0.4221218672861896,-0.9065390941149867,2.501487821197436E-12),(-0.8103422277044423,-0.585956887491735,1.6171249937819033E-12),(-0.4221218672861896,-0.9065390941149867,2.501487821197436E-12),(-0.08899635085405261,-0.9960319520651245,2.748303485103108E-12),(-0.08899635085414637,-0.9960319520651162,2.7483034851030853E-12),(-0.4221218672865516,-0.906539094114818,2.50148782119697E-12),(-0.08899635085405261,-0.9960319520651245,2.748303485103108E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.08899635085414637,-0.9960319520651162,2.7483034851030853E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-0.5879319010498687,0.8089104275059679,-2.2317013815220266E-12),(-0.733176413348336,0.6800384892854743,-1.876101555783126E-12),(-0.5879319010498687,0.8089104275059679,-2.2317013815220266E-12),(-0.7331764133483463,0.6800384892854633,-1.8761015557830953E-12),(-0.7331764133483463,0.6800384892854633,-1.8761015557830953E-12),(-0.8507772826193465,0.5255264173938747,-1.449765300520372E-12),(-0.733176413348336,0.6800384892854743,-1.876101555783126E-12),(-0.8507772826193465,0.5255264173938747,-1.449765300520372E-12),(-0.9942362468634309,0.10721140528376114,-2.954631444673134E-13),(-0.9985580220656761,0.053683112505562354,-1.4773889682820934E-13),(-0.9942362468634309,0.10721140528376114,-2.954631444673134E-13),(-0.9985580220656766,0.053683112505555165,-1.4773889682818943E-13),(-0.9985580220656766,0.053683112505555165,-1.4773889682818943E-13),(-0.9997372811223788,-0.02292092349871471,6.371086171699115E-14),(-0.9985580220656761,0.053683112505562354,-1.4773889682820934E-13),(-0.9997372811223786,-0.022920923498724106,6.371086171701709E-14),(-0.9997372811223786,-0.022920923498724106,6.371086171701709E-14),(-0.9919210150229094,-0.1268570059394494,3.5043000653799517E-13),(-0.9997372811223788,-0.02292092349871471,6.371086171699115E-14),(-0.9919210150229099,-0.1268570059394451,3.5043000653798336E-13),(-0.9919210150229099,-0.1268570059394451,3.5043000653798336E-13),(-0.9257138949175181,-0.3782245163347276,1.0438546173319148E-12),(-0.9919210150229094,-0.1268570059394494,3.5043000653799517E-13),(-0.9257138949175855,-0.3782245163345627,1.04385461733146E-12),(-0.9257138949175855,-0.3782245163345627,1.04385461733146E-12),(-0.7298956734503029,-0.683558560679719,1.886313188784831E-12),(-0.9257138949175181,-0.3782245163347276,1.0438546173319148E-12),(-0.7298956734503936,-0.6835585606796221,1.8863131887845627E-12),(-0.7298956734503936,-0.6835585606796221,1.8863131887845627E-12),(-0.5913596447695699,-0.8064079430028006,2.225289029143192E-12),(-0.7298956734503029,-0.683558560679719,1.886313188784831E-12),(-0.5913596447695699,-0.8064079430028006,2.225289029143192E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.3916449267378772E-27,1.,-2.75921435746603E-12),(-0.08899635085414427,0.9960319520651163,-2.7482297534477035E-12),(-1.3916449267378772E-27,1.,-2.75921435746603E-12),(-0.08899635085419928,0.9960319520651114,-2.74822975344769E-12),(-0.08899635085419928,0.9960319520651114,-2.74822975344769E-12),(-0.4221218672868138,0.9065390941146961,-2.5011097553803986E-12),(-0.08899635085414427,0.9960319520651163,-2.7482297534477035E-12),(-0.4221218672866891,0.9065390941147541,-2.501109755380559E-12),(-0.4221218672868138,0.9065390941146961,-2.5011097553803986E-12),(-0.8086796863924085,0.588249236987415,-1.6227345319767924E-12),(-0.808679686392537,0.5882492369872383,-1.6227345319763046E-12),(-0.4221218672866891,0.9065390941147541,-2.501109755380559E-12),(-0.8086796863924085,0.588249236987415,-1.6227345319767924E-12),(-0.9603664303895799,0.2787405951431839,-7.687096959316442E-13),(-0.808679686392537,0.5882492369872383,-1.6227345319763046E-12),(-0.9603664303895835,0.278740595143172,-7.687096959316114E-13),(-0.9603664303895835,0.278740595143172,-7.687096959316114E-13),(-0.9830031215351334,0.18358884239567472,-5.061282200130532E-13),(-0.9603664303895799,0.2787405951431839,-7.687096959316442E-13),(-0.9830031215351334,0.18358884239567472,-5.061282200130532E-13),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.9832650394637042,-0.18218085016938587,5.031200265060155E-13),(-0.9604389766296882,-0.2784905243819212,7.688146426827738E-13),(-0.9832650394637042,-0.18218085016938587,5.031200265060155E-13),(-0.9604389766296882,-0.2784905243819212,7.688146426827739E-13),(-0.9604389766296882,-0.2784905243819212,7.688146426827739E-13),(-0.8061306092177407,-0.5917376453144032,1.6330710017798837E-12),(-0.9604389766296882,-0.2784905243819212,7.688146426827738E-13),(-0.8061306092175927,-0.5917376453146046,1.6330710017804398E-12),(-0.8061306092175927,-0.5917376453146046,1.6330710017804398E-12),(-0.4173761927597634,-0.9087337969490104,2.5075788664575126E-12),(-0.8061306092177407,-0.5917376453144032,1.6330710017798837E-12),(-0.41737619275943805,-0.9087337969491598,2.507578866457925E-12),(-0.41737619275943805,-0.9087337969491598,2.507578866457925E-12),(-0.08763790369520921,-0.9961523968931206,2.748625932168068E-12),(-0.4173761927597634,-0.9087337969490104,2.5075788664575126E-12),(-0.08763790369517203,-0.996152396893124,2.7486259321680772E-12),(-0.08763790369520921,-0.9961523968931206,2.748625932168068E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.08763790369517203,-0.996152396893124,2.7486259321680772E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.08899635085417187,0.996031952065114,-2.7482227869102406E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.08899635085428886,0.9960319520651035,-2.7482227869102115E-12),(-0.08899635085428886,0.9960319520651035,-2.7482227869102115E-12),(-0.42212186728673556,0.9065390941147324,-2.5011025798026985E-12),(-0.08899635085417187,0.996031952065114,-2.7482227869102406E-12),(-0.422121867286376,0.9065390941149,-2.501102579803161E-12),(-0.42212186728673556,0.9065390941147324,-2.5011025798026985E-12),(-0.8086796863921236,0.5882492369878067,-1.6227345319778382E-12),(-0.8086796863926938,0.588249236987023,-1.6227345319756754E-12),(-0.422121867286376,0.9065390941149,-2.501102579803161E-12),(-0.8086796863921236,0.5882492369878067,-1.6227345319778382E-12),(-0.9603664303895966,0.27874059514312616,-7.687375849038904E-13),(-0.8086796863926938,0.588249236987023,-1.6227345319756754E-12),(-0.9603664303895936,0.27874059514313654,-7.687375849039188E-13),(-0.9603664303895936,0.27874059514313654,-7.687375849039188E-13),(-0.9830031215351365,0.18358884239565862,-5.061837311642844E-13),(-0.9603664303895966,0.27874059514312616,-7.687375849038904E-13),(-0.9830031215351365,0.18358884239565862,-5.061837311642844E-13),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.9829162037139709,-0.18405362391573804,5.082270444500651E-13),(-0.9589823266839971,-0.28346586585997885,7.825177676624483E-13),(-0.9829162037139709,-0.18405362391573804,5.082270444500651E-13),(-0.9589823266839956,-0.28346586585998396,7.825177676624625E-13),(-0.9589823266839956,-0.28346586585998396,7.825177676624625E-13),(-0.9250216907185411,-0.37991429520381537,1.0486267790740046E-12),(-0.9589823266839971,-0.28346586585997885,7.825177676624483E-13),(-0.9250216907185411,-0.37991429520381537,1.0486267790740046E-12),(-0.3977066570345201,-0.9175126238643406,2.53178942662325E-12),(-0.20308542061863122,-0.9791610245164756,2.701804734671688E-12),(-0.3977066570345201,-0.9175126238643406,2.53178942662325E-12),(-0.20308542061867702,-0.979161024516466,2.7018047346716614E-12),(-0.20308542061863122,-0.9791610245164756,2.701804734671688E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.20308542061867702,-0.979161024516466,2.7018047346716614E-12),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(0.7352884309046378,0.6777543237617859,-1.8703540162539927E-12),(0.8219126130549742,0.5696136028055725,-1.5721139731419911E-12),(0.821912613054971,0.5696136028055769,-1.5721139731420034E-12),(0.7352884309046378,0.6777543237617859,-1.8703540162539927E-12),(0.821912613054971,0.5696136028055769,-1.5721139731420034E-12),(0.9379792061057557,0.346691518375077,-9.570384557562764E-13),(0.9379792061057433,0.3466915183751111,-9.570384557563703E-13),(0.8219126130549742,0.5696136028055725,-1.5721139731419911E-12),(0.9379792061057433,0.3466915183751111,-9.570384557563703E-13),(0.98805711892142,0.15408805842343212,-4.2553422846020073E-13),(0.9880571189214249,0.1540880584234002,-4.255342284601127E-13),(0.9379792061057557,0.346691518375077,-9.570384557562764E-13),(0.9880571189214249,0.1540880584234002,-4.255342284601127E-13),(0.9999397421523021,0.010977798704106548,-3.068830297708762E-14),(0.9999397421523019,0.010977798704114701,-3.0688302977110124E-14),(0.98805711892142,0.15408805842343212,-4.2553422846020073E-13),(0.9999397421523019,0.010977798704114701,-3.0688302977110124E-14),(0.9948858286649289,-0.10100588062928689,2.7830621585204017E-13),(0.9948858286649307,-0.10100588062926949,2.7830621585199215E-13),(0.9999397421523021,0.010977798704106548,-3.068830297708762E-14),(0.9948858286649307,-0.10100588062926949,2.7830621585199215E-13),(0.9754732549000814,-0.22011798875748678,6.069106961049155E-13),(0.9754732549000839,-0.2201179887574754,6.069106961048842E-13),(0.9948858286649289,-0.10100588062928689,2.7830621585204017E-13),(0.9754732549000839,-0.2201179887574754,6.069106961048842E-13),(0.9331889358875146,-0.35938615713063893,9.912246633246045E-13),(0.9331889358875224,-0.3593861571306189,9.912246633245494E-13),(0.9754732549000814,-0.22011798875748678,6.069106961049155E-13),(0.9331889358875224,-0.3593861571306189,9.912246633245494E-13),(0.8533260584412695,-0.5213776347189119,1.4383212507122726E-12),(0.8533260584412645,-0.5213776347189202,1.438321250712296E-12),(0.9331889358875146,-0.35938615713063893,9.912246633246045E-13),(0.8533260584412645,-0.5213776347189202,1.438321250712296E-12),(0.7046792499668372,-0.7095260070400352,1.9575270187972177E-12),(0.7046792499668799,-0.7095260070399926,1.9575270187971006E-12),(0.8533260584412695,-0.5213776347189119,1.4383212507122726E-12),(0.7046792499668372,-0.7095260070400352,1.9575270187972177E-12),(0.4630903413360676,-0.886311082950701,2.4453463455481085E-12),(0.7046792499668799,-0.7095260070399926,1.9575270187971006E-12),(0.46309034133616744,-0.8863110829506489,2.4453463455479647E-12),(0.46309034133616744,-0.8863110829506489,2.4453463455479647E-12),(0.2013167399119471,-0.9795261968070204,2.7026366889420836E-12),(0.4630903413360676,-0.886311082950701,2.4453463455481085E-12),(0.20131673991202356,-0.9795261968070046,2.70263668894204E-12),(0.20131673991202356,-0.9795261968070046,2.70263668894204E-12),(0.042762985070644535,-0.9990852451657206,2.756681139096409E-12),(0.2013167399119471,-0.9795261968070204,2.7026366889420836E-12),(0.042762985070641045,-0.9990852451657207,2.756681139096409E-12),(0.042762985070641045,-0.9990852451657207,2.756681139096409E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(0.042762985070644535,-0.9990852451657206,2.756681139096409E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-0.595427913033985,0.8034087380530494,-2.21660217713915E-12),(-0.7353424654422723,0.6776956975791425,-1.869700306437924E-12),(-0.7353424654423133,0.6776956975790981,-1.8697003064378015E-12),(-0.595427913033985,0.8034087380530494,-2.21660217713915E-12),(-0.7353424654422723,0.6776956975791425,-1.869700306437924E-12),(-0.9279729502400484,0.37264755952881395,-1.0279270574122293E-12),(-0.7353424654423133,0.6776956975790981,-1.8697003064378015E-12),(-0.9279729502401372,0.3726475595285929,-1.027927057411619E-12),(-0.9279729502401372,0.3726475595285929,-1.027927057411619E-12),(-0.9919380594528827,0.12672366080905942,-3.492717552502344E-13),(-0.9279729502400484,0.37264755952881395,-1.0279270574122293E-12),(-0.9919380594528856,0.12672366080903733,-3.492717552501734E-13),(-0.9919380594528856,0.12672366080903733,-3.492717552501734E-13),(-0.9997278626286517,0.023328109309328403,-6.394341483276192E-14),(-0.9919380594528827,0.12672366080905942,-3.492717552502344E-13),(-0.9997278626286514,0.02332810930933379,-6.394341483277679E-14),(-0.9997278626286514,0.02332810930933379,-6.394341483277679E-14),(-0.9997372811223786,-0.022920923498728103,6.37108617170281E-14),(-0.9997278626286517,0.023328109309328403,-6.394341483276192E-14),(-0.9997372811223787,-0.02292092349871658,6.37108617169963E-14),(-0.9997372811223787,-0.02292092349871658,6.37108617169963E-14),(-0.9919210150229141,-0.12685700593941254,3.5051354957517073E-13),(-0.9997372811223786,-0.022920923498728103,6.37108617170281E-14),(-0.9919210150229048,-0.12685700593948449,3.5051354957536904E-13),(-0.9919210150229048,-0.12685700593948449,3.5051354957536904E-13),(-0.9257138949175897,-0.37822451633455206,1.0439392410419761E-12),(-0.9919210150229141,-0.12685700593941254,3.5051354957517073E-13),(-0.9257138949175633,-0.37822451633461657,1.0439392410421542E-12),(-0.9257138949175633,-0.37822451633461657,1.0439392410421542E-12),(-0.7298956734501726,-0.6835585606798581,1.8863414284479673E-12),(-0.9257138949175897,-0.37822451633455206,1.0439392410419761E-12),(-0.7298956734503792,-0.6835585606796375,1.8863414284473586E-12),(-0.7298956734501726,-0.6835585606798581,1.8863414284479673E-12),(-0.5913596447695569,-0.8064079430028104,2.2253445402944234E-12),(-0.5913596447695569,-0.8064079430028104,2.2253445402944234E-12),(-0.7298956734503792,-0.6835585606796375,1.8863414284473586E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(0.07795967280676987,0.9969565133022913,-2.7508631993262994E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(0.0779596728067663,0.9969565133022915,-2.7508631993263007E-12),(0.0779596728067663,0.9969565133022915,-2.7508631993263007E-12),(0.3381974116969212,0.941075188665339,-2.5968111279100185E-12),(0.07795967280676987,0.9969565133022913,-2.7508631993262994E-12),(0.33819741169716644,0.941075188665251,-2.5968111279097758E-12),(0.33819741169716644,0.941075188665251,-2.5968111279097758E-12),(0.6202213981854017,0.7844268080789599,-2.1646621692768886E-12),(0.3381974116969212,0.941075188665339,-2.5968111279100185E-12),(0.6202213981854618,0.7844268080789125,-2.1646621692767574E-12),(0.6202213981854017,0.7844268080789599,-2.1646621692768886E-12),(0.7950566191211774,0.6065352194156605,-1.6737665769092586E-12),(0.7950566191211507,0.6065352194156954,-1.6737665769093545E-12),(0.6202213981854618,0.7844268080789125,-2.1646621692767574E-12),(0.7950566191211507,0.6065352194156954,-1.6737665769093545E-12),(0.9071364246607834,0.4208366750339744,-1.1615084702741692E-12),(0.9071364246607594,0.4208366750340265,-1.161508470274313E-12),(0.7950566191211774,0.6065352194156605,-1.6737665769092586E-12),(0.9071364246607594,0.4208366750340265,-1.161508470274313E-12),(0.9665120711748039,0.2566211532071962,-7.084841109127764E-13),(0.9665120711748055,0.2566211532071893,-7.084841109127575E-13),(0.9071364246607834,0.4208366750339744,-1.1615084702741692E-12),(0.9665120711748055,0.2566211532071893,-7.084841109127575E-13),(0.9924147561708995,0.12293474583800233,-3.3955327210066266E-13),(0.9924147561708991,0.12293474583800494,-3.3955327210066983E-13),(0.9665120711748039,0.2566211532071962,-7.084841109127764E-13),(0.9924147561708991,0.12293474583800494,-3.3955327210066983E-13),(0.9999871034548478,-0.005078673447265599,1.3661385852108431E-14),(0.9999871034548478,-0.005078673447250061,1.3661385852065547E-14),(0.9924147561708995,0.12293474583800233,-3.3955327210066266E-13),(0.9999871034548478,-0.005078673447250061,1.3661385852065547E-14),(0.9883938693820078,-0.15191299802209973,4.1885939741352957E-13),(0.9883938693820004,-0.15191299802214897,4.1885939741366553E-13),(0.9999871034548478,-0.005078673447265599,1.3661385852108431E-14),(0.9883938693820004,-0.15191299802214897,4.1885939741366553E-13),(0.9438486732585091,-0.330378089449274,9.11287281327324E-13),(0.9438486732585176,-0.3303780894492497,9.11287281327257E-13),(0.9883938693820078,-0.15191299802209973,4.1885939741352957E-13),(0.9438486732585176,-0.3303780894492497,9.11287281327257E-13),(0.8505249238695585,-0.5259347429830835,1.450877685816834E-12),(0.8505249238695977,-0.5259347429830199,1.4508776858166586E-12),(0.9438486732585091,-0.330378089449274,9.11287281327324E-13),(0.8505249238695977,-0.5259347429830199,1.4508776858166586E-12),(0.7840634204835989,-0.6206807171642756,1.712334569936467E-12),(0.7840634204835989,-0.6206807171642756,1.712334569936467E-12),(0.8505249238695585,-0.5259347429830835,1.450877685816834E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.04985214699043371,0.9987566087092712,-2.755764323976844E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.049852146990459034,0.99875660870927,-2.75576432397684E-12),(-0.04985214699043371,0.9987566087092712,-2.755764323976844E-12),(-0.3426350518029755,0.9394685845072056,-2.5920297639261136E-12),(-0.3426350518029833,0.9394685845072027,-2.5920297639261055E-12),(-0.049852146990459034,0.99875660870927,-2.75576432397684E-12),(-0.3426350518029833,0.9394685845072027,-2.5920297639261055E-12),(-0.7067512124899926,0.7074621711751982,-1.9518411394093935E-12),(-0.7067512124899773,0.7074621711752135,-1.9518411394094363E-12),(-0.3426350518029755,0.9394685845072056,-2.5920297639261136E-12),(-0.7067512124899926,0.7074621711751982,-1.9518411394093935E-12),(-0.8848347895576633,0.4659049207600689,-1.2852694316056072E-12),(-0.7067512124899773,0.7074621711752135,-1.9518411394094363E-12),(-0.8848347895576638,0.4659049207600675,-1.285269431605604E-12),(-0.8848347895576638,0.4659049207600675,-1.285269431605604E-12),(-0.9613660408982533,0.275273201397481,-7.59178139484826E-13),(-0.8848347895576633,0.4659049207600689,-1.2852694316056072E-12),(-0.9613660408982357,0.2752732013975421,-7.591781394849944E-13),(-0.9613660408982357,0.2752732013975421,-7.591781394849944E-13),(-0.9926019629217055,0.1214139333189455,-3.3466501669974826E-13),(-0.9613660408982533,0.275273201397481,-7.59178139484826E-13),(-0.9926019629217047,0.12141393331895169,-3.3466501669976533E-13),(-0.9926019629217047,0.12141393331895169,-3.3466501669976533E-13),(-0.9999995995077935,-0.0008949772360086741,2.9138267184128344E-15),(-0.9926019629217055,0.1214139333189455,-3.3466501669974826E-13),(-0.9999995995077935,-0.0008949772360261391,2.913826718461044E-15),(-0.9999995995077935,-0.0008949772360261391,2.913826718461044E-15),(-0.9922297490278524,-0.12441915103441756,3.436970037441808E-13),(-0.9999995995077935,-0.0008949772360086741,2.9138267184128344E-15),(-0.9922297490278514,-0.12441915103442437,3.4369700374419965E-13),(-0.9922297490278514,-0.12441915103442437,3.4369700374419965E-13),(-0.9603398875491048,-0.27883202897474474,7.697171944061923E-13),(-0.9922297490278524,-0.12441915103441756,3.436970037441808E-13),(-0.9603398875491099,-0.27883202897472714,7.697171944061437E-13),(-0.9603398875491099,-0.27883202897472714,7.697171944061437E-13),(-0.8853076919779574,-0.46500568870139897,1.2833857044007075E-12),(-0.9603398875491048,-0.27883202897474474,7.697171944061923E-13),(-0.8853076919779543,-0.4650056887014046,1.2833857044007232E-12),(-0.8853076919779543,-0.4650056887014046,1.2833857044007232E-12),(-0.704783932815139,-0.7094220239361236,1.957674876759784E-12),(-0.8853076919779574,-0.46500568870139897,1.2833857044007075E-12),(-0.7047839328151853,-0.7094220239360776,1.9576748767596568E-12),(-0.704783932815139,-0.7094220239361236,1.957674876759784E-12),(-0.33822776909854463,-0.9410642784691285,2.596732346378742E-12),(-0.3382277690983622,-0.9410642784691942,2.5967323463789237E-12),(-0.7047839328151853,-0.7094220239360776,1.9576748767596568E-12),(-0.3382277690983622,-0.9410642784691942,2.5967323463789237E-12),(-0.05052755331290806,-0.9987226673888058,2.755714367979377E-12),(-0.05052755331288892,-0.9987226673888068,2.7557143679793804E-12),(-0.33822776909854463,-0.9410642784691285,2.596732346378742E-12),(-0.05052755331290806,-0.9987226673888058,2.755714367979377E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.05052755331288892,-0.9987226673888068,2.7557143679793804E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.05375002304573731,0.9985544226643749,-2.755199965187611E-12),(-0.05375002304574733,0.9985544226643743,-2.755199965187609E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.05375002304573731,0.9985544226643749,-2.755199965187611E-12),(-0.2918442784092462,0.9564658473567085,-2.638952097911522E-12),(-0.05375002304574733,0.9985544226643743,-2.755199965187609E-12),(-0.29184427840934085,0.9564658473566796,-2.6389520979114426E-12),(-0.29184427840934085,0.9564658473566796,-2.6389520979114426E-12),(-0.5877775740479075,0.8090225728904954,-2.232067297156347E-12),(-0.2918442784092462,0.9564658473567085,-2.638952097911522E-12),(-0.587777574047825,0.8090225728905553,-2.2320672971565124E-12),(-0.5877775740479075,0.8090225728904954,-2.232067297156347E-12),(-0.7805286589002669,0.6251199985885518,-1.724613928529711E-12),(-0.7805286589003659,0.625119998588428,-1.7246139285293691E-12),(-0.587777574047825,0.8090225728905553,-2.2320672971565124E-12),(-0.7805286589002669,0.6251199985885518,-1.724613928529711E-12),(-0.9023997685575124,0.4308998232853526,-1.188528878161046E-12),(-0.7805286589003659,0.625119998588428,-1.7246139285293691E-12),(-0.9023997685575618,0.43089982328524934,-1.188528878160761E-12),(-0.9023997685575618,0.43089982328524934,-1.188528878160761E-12),(-0.9670946829224584,0.25441673345735294,-7.015316443065614E-13),(-0.9023997685575124,0.4308998232853526,-1.188528878161046E-12),(-0.9670946829224693,0.25441673345731197,-7.015316443064483E-13),(-0.9670946829224693,0.25441673345731197,-7.015316443064483E-13),(-0.9936360937840041,0.11263797374627353,-3.1035879458838073E-13),(-0.9670946829224584,0.25441673345735294,-7.015316443065614E-13),(-0.9936360937840051,0.11263797374626335,-3.1035879458835266E-13),(-0.9936360937840051,0.11263797374626335,-3.1035879458835266E-13),(-0.9999995871945382,-0.0009086312527777197,2.9966374181165325E-15),(-0.9936360937840041,0.11263797374627353,-3.1035879458838073E-13),(-0.9999995871945381,-0.0009086312527694737,2.996637418093785E-15),(-0.9999995871945381,-0.0009086312527694737,2.996637418093785E-15),(-0.99317464071528,-0.11663675681394133,3.2224054353385283E-13),(-0.9999995871945382,-0.0009086312527777197,2.9966374181165325E-15),(-0.9931746407152823,-0.11663675681392226,3.222405435338003E-13),(-0.9931746407152823,-0.11663675681392226,3.222405435338003E-13),(-0.96479536518439,-0.2630017173303625,7.260772653255473E-13),(-0.99317464071528,-0.11663675681394133,3.2224054353385283E-13),(-0.9647953651843933,-0.26300171733034977,7.260772653255122E-13),(-0.9647953651843933,-0.26300171733034977,7.260772653255122E-13),(-0.8962309242385645,-0.4435877933831011,1.224302040066406E-12),(-0.96479536518439,-0.2630017173303625,7.260772653255473E-13),(-0.8962309242385652,-0.44358779338309956,1.2243020400664015E-12),(-0.8962309242385652,-0.44358779338309956,1.2243020400664015E-12),(-0.7748453025522771,-0.6321508974229733,1.7445254379221901E-12),(-0.8962309242385645,-0.4435877933831011,1.224302040066406E-12),(-0.7748453025522536,-0.6321508974230019,1.7445254379222695E-12),(-0.7748453025522771,-0.6321508974229733,1.7445254379221901E-12),(-0.5881877933364363,-0.8087243781227408,2.231719226924686E-12),(-0.5881877933364911,-0.8087243781227009,2.2317192269245763E-12),(-0.7748453025522536,-0.6321508974230019,1.7445254379222695E-12),(-0.5881877933364363,-0.8087243781227408,2.231719226924686E-12),(-0.29652269794400343,-0.9550258057267402,2.6352567544518174E-12),(-0.5881877933364911,-0.8087243781227009,2.2317192269245763E-12),(-0.29652269794398023,-0.9550258057267476,2.635256754451837E-12),(-0.29652269794400343,-0.9550258057267402,2.6352567544518174E-12),(-0.0574288306867889,-0.9983496027975112,2.754683501021641E-12),(-0.05742883068676343,-0.9983496027975126,2.7546835010216453E-12),(-0.29652269794398023,-0.9550258057267476,2.635256754451837E-12),(-0.0574288306867889,-0.9983496027975112,2.754683501021641E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.05742883068676343,-0.9983496027975126,2.7546835010216453E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.9997278626286515,0.023328109309331817,-6.479422361940873E-14),(0.9997278626286512,0.02332810930934801,-6.479422361945344E-14),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.9997278626286512,0.02332810930934801,-6.479422361945344E-14),(0.991938059452877,0.12672366080910277,-3.5004106128086124E-13),(0.9919380594528837,0.12672366080905156,-3.5004106128072E-13),(0.9997278626286515,0.023328109309331817,-6.479422361940873E-14),(0.9919380594528837,0.12672366080905156,-3.5004106128072E-13),(0.9279729502401031,0.37264755952867756,-1.0285331177180143E-12),(0.9279729502400951,0.37264755952869744,-1.0285331177180692E-12),(0.991938059452877,0.12672366080910277,-3.5004106128086124E-13),(0.9279729502400951,0.37264755952869744,-1.0285331177180692E-12),(0.7353424654422644,0.6776956975791512,-1.8701859911330546E-12),(0.7353424654422448,0.6776956975791724,-1.8701859911331124E-12),(0.9279729502401031,0.37264755952867756,-1.0285331177180143E-12),(0.7353424654422644,0.6776956975791512,-1.8701859911330546E-12),(0.595427913033985,0.8034087380530494,-2.217017960550181E-12),(0.7353424654422448,0.6776956975791724,-1.8701859911331124E-12),(0.595427913033985,0.8034087380530494,-2.217017960550181E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-0.5879319010498562,0.808910427505977,-2.231756892673258E-12),(-0.7331764133481705,0.6800384892856528,-1.8761298446604045E-12),(-0.5879319010498562,0.808910427505977,-2.231756892673258E-12),(-0.7331764133483907,0.6800384892854153,-1.876129844659749E-12),(-0.7331764133483907,0.6800384892854153,-1.876129844659749E-12),(-0.8507772826193727,0.5255264173938323,-1.449765300520372E-12),(-0.7331764133481705,0.6800384892856528,-1.8761298446604045E-12),(-0.8507772826193727,0.5255264173938323,-1.449765300520372E-12),(-0.99423624686343,0.1072114052837702,-2.9546314446731345E-13),(-0.9985580220656779,0.05368311250552981,-1.4773889682810696E-13),(-0.99423624686343,0.1072114052837702,-2.9546314446731345E-13),(-0.9985580220656758,0.053683112505570306,-1.4773889682821866E-13),(-0.9985580220656758,0.053683112505570306,-1.4773889682821866E-13),(-0.9997372811223786,-0.02292092349872701,6.368309884760026E-14),(-0.9985580220656779,0.05368311250552981,-1.4773889682810696E-13),(-0.9997372811223788,-0.022920923498716324,6.368309884757076E-14),(-0.9997372811223788,-0.022920923498716324,6.368309884757076E-14),(-0.9919210150229154,-0.12685700593940086,3.504021588587995E-13),(-0.9997372811223786,-0.02292092349872701,6.368309884760026E-14),(-0.9919210150229056,-0.1268570059394785,3.5040215885901367E-13),(-0.9919210150229056,-0.1268570059394785,3.5040215885901367E-13),(-0.9257138949176099,-0.37822451633450277,1.0438546173312945E-12),(-0.9919210150229154,-0.12685700593940086,3.504021588587995E-13),(-0.9257138949176389,-0.37822451633443177,1.0438546173310988E-12),(-0.9257138949176389,-0.37822451633443177,1.0438546173310988E-12),(-0.7298956734501646,-0.6835585606798666,1.8863414284479907E-12),(-0.9257138949176099,-0.37822451633450277,1.0438546173312945E-12),(-0.7298956734503238,-0.6835585606796967,1.886341428447522E-12),(-0.7298956734501646,-0.6835585606798666,1.8863414284479907E-12),(-0.5913596447695569,-0.8064079430028104,2.2253445402944234E-12),(-0.5913596447695569,-0.8064079430028104,2.2253445402944234E-12),(-0.7298956734503238,-0.6835585606796967,1.886341428447522E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(0.03853104078009803,0.9992574037235865,-2.7571767522188998E-12),(0.03853104078008817,0.9992574037235867,-2.7571767522188994E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(0.03853104078009803,0.9992574037235865,-2.7571767522188998E-12),(0.17889663461281746,0.9838678743226695,-2.714772105567515E-12),(0.03853104078008817,0.9992574037235867,-2.7571767522188994E-12),(0.1788966346127877,0.9838678743226749,-2.71477210556753E-12),(0.1788966346127877,0.9838678743226749,-2.71477210556753E-12),(0.41226168019314996,0.9110654790103294,-2.5140006899876172E-12),(0.17889663461281746,0.9838678743226695,-2.714772105567515E-12),(0.4122616801931084,0.9110654790103483,-2.5140006899876693E-12),(0.4122616801931084,0.9110654790103483,-2.5140006899876693E-12),(0.6473041242886012,0.7622318352568116,-2.1034917428195874E-12),(0.41226168019314996,0.9110654790103294,-2.5140006899876172E-12),(0.6473041242885219,0.762231835256879,-2.1034917428197736E-12),(0.6473041242886012,0.7622318352568116,-2.1034917428195874E-12),(0.8137975087381796,0.5811485307316304,-1.603956681791976E-12),(0.8137975087381614,0.5811485307316561,-1.6039566817920465E-12),(0.6473041242885219,0.762231835256879,-2.1034917428197736E-12),(0.8137975087381614,0.5811485307316561,-1.6039566817920465E-12),(0.915097394613651,0.4032328835441227,-1.113073898161999E-12),(0.9150973946136156,0.40323288354420317,-1.1130738981622214E-12),(0.8137975087381796,0.5811485307316304,-1.603956681791976E-12),(0.9150973946136156,0.40323288354420317,-1.1130738981622214E-12),(0.9704191606545896,0.24142628820085493,-6.665490477470661E-13),(0.9704191606545819,0.24142628820088538,-6.665490477471503E-13),(0.915097394613651,0.4032328835441227,-1.113073898161999E-12),(0.9704191606545819,0.24142628820088538,-6.665490477471503E-13),(0.9941110589328176,0.10836605791239319,-2.9944957448306327E-13),(0.9941110589328194,0.10836605791237701,-2.9944957448301864E-13),(0.9704191606545896,0.24142628820085493,-6.665490477470661E-13),(0.9941110589328194,0.10836605791237701,-2.9944957448301864E-13),(0.9999930758042374,0.0037213362628470627,-1.0719819862033106E-14),(0.9999930758042371,0.003721336262856369,-1.0719819862058802E-14),(0.9941110589328176,0.10836605791239319,-2.9944957448306327E-13),(0.9999930758042371,0.003721336262856369,-1.0719819862058802E-14),(0.9958593468083936,-0.09090743299840694,2.5046960644320717E-13),(0.9958593468083943,-0.09090743299839878,2.5046960644318466E-13),(0.9999930758042374,0.0037213362628470627,-1.0719819862033106E-14),(0.9958593468083943,-0.09090743299839878,2.5046960644318466E-13),(0.9797523183883908,-0.2002133727116485,5.520739070538687E-13),(0.9797523183883889,-0.20021337271165757,5.520739070538938E-13),(0.9958593468083936,-0.09090743299840694,2.5046960644320717E-13),(0.9797523183883889,-0.20021337271165757,5.520739070538938E-13),(0.9432066145957844,-0.3322066859392801,9.162928347189161E-13),(0.9432066145957768,-0.3322066859393015,9.162928347189751E-13),(0.9797523183883908,-0.2002133727116485,5.520739070538687E-13),(0.9432066145957768,-0.3322066859393015,9.162928347189751E-13),(0.8746209629424903,-0.48480735471066383,1.3373717027427237E-12),(0.8746209629424875,-0.4848073547106687,1.3373717027427372E-12),(0.9432066145957844,-0.3322066859392801,9.162928347189161E-13),(0.8746209629424875,-0.4848073547106687,1.3373717027427372E-12),(0.7610063543191211,-0.6487444247821481,1.78974727600918E-12),(0.7610063543191804,-0.6487444247820788,1.7897472760089883E-12),(0.8746209629424903,-0.48480735471066383,1.3373717027427237E-12),(0.7610063543191211,-0.6487444247821481,1.78974727600918E-12),(0.5967658568195328,-0.8024154236643566,2.213785510995076E-12),(0.7610063543191804,-0.6487444247820788,1.7897472760089883E-12),(0.5967658568194559,-0.802415423664414,2.213785510995234E-12),(0.5967658568194559,-0.802415423664414,2.213785510995234E-12),(0.3962631411435402,-0.918136984861766,2.533164597632922E-12),(0.5967658568195328,-0.8024154236643566,2.213785510995076E-12),(0.39626314114354494,-0.918136984861764,2.5331645976329164E-12),(0.39626314114354494,-0.918136984861764,2.5331645976329164E-12),(0.28860296260377233,-0.9574488654629686,2.641699704960995E-12),(0.3962631411435402,-0.918136984861766,2.533164597632922E-12),(0.28860296260377233,-0.9574488654629686,2.641699704960995E-12),(0.9529875987463974,0.3030093012360769,-8.364637979552021E-13),(0.9296841404730456,0.3683577051629225,-1.0167958542477066E-12),(0.929684140473054,0.3683577051629012,-1.016795854247648E-12),(0.9529875987463974,0.3030093012360769,-8.364637979552021E-13),(0.929684140473054,0.3683577051629012,-1.016795854247648E-12),(0.9019056800696664,0.43193303214511464,-1.192233599219132E-12),(0.9019056800696664,0.43193303214511464,-1.192233599219132E-12),(0.9296841404730456,0.3683577051629225,-1.0167958542477066E-12),(0.4449825869994341,0.8955392215125428,-2.4711723295073035E-12),(0.4449825869994341,0.8955392215125428,-2.4711723295073035E-12),(0.4449825869994341,0.8955392215125428,-2.4711723295073035E-12),(0.4449825869994341,0.8955392215125428,-2.4711723295073035E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-0.5702090938650629,0.8214995978535741,-2.2664517670740605E-12),(-0.5702090938650629,0.8214995978535741,-2.2664517670740605E-12),(-0.5702090938650629,0.8214995978535741,-2.2664517670740605E-12),(-0.5702090938650629,0.8214995978535741,-2.2664517670740605E-12),(-0.9485728622037648,0.31655888092195017,-8.729466939157381E-13),(-0.9485728622037648,0.31655888092195017,-8.729466939157381E-13),(-0.9485728622037648,0.31655888092195017,-8.729466939157381E-13),(-0.9485728622037648,0.31655888092195017,-8.729466939157381E-13),(-0.9719489691963694,-0.2351918393102002,6.492806291799063E-13),(-0.9628838370128916,-0.26991612849055785,7.452395047204699E-13),(-0.9719489691963694,-0.2351918393102002,6.492806291799063E-13),(-0.9628838370128899,-0.26991612849056373,7.452395047204861E-13),(-0.9628838370128899,-0.26991612849056373,7.452395047204861E-13),(-0.9525785558178582,-0.3042927784157289,8.402385468942559E-13),(-0.9628838370128916,-0.26991612849055785,7.452395047204699E-13),(-0.9525785558178582,-0.3042927784157289,8.402385468942559E-13),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.04792972972070177,0.9988507100707795,-2.756025764075603E-12),(-0.047929729720667946,0.9988507100707813,-2.7560257640756085E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.04792972972070177,0.9988507100707795,-2.756025764075603E-12),(-0.32067781211359414,0.9471883343971453,-2.6133719135144987E-12),(-0.047929729720667946,0.9988507100707813,-2.7560257640756085E-12),(-0.3206778121136747,0.9471883343971181,-2.613371913514424E-12),(-0.32067781211359414,0.9471883343971453,-2.6133719135144987E-12),(-0.6954181980173405,0.718605267073875,-1.982629910864097E-12),(-0.6954181980174248,0.7186052670737935,-1.9826299108638714E-12),(-0.3206778121136747,0.9471883343971181,-2.613371913514424E-12),(-0.6954181980173405,0.718605267073875,-1.982629910864097E-12),(-0.8917373201927142,0.45255336898040766,-1.2484066965685493E-12),(-0.6954181980174248,0.7186052670737935,-1.9826299108638714E-12),(-0.8917373201926669,0.4525533689805009,-1.248406696568807E-12),(-0.8917373201926669,0.4525533689805009,-1.248406696568807E-12),(-0.9658311636130653,0.25917207294350275,-7.146858311811928E-13),(-0.8917373201927142,0.45255336898040766,-1.2484066965685493E-12),(-0.9658311636130642,0.2591720729435068,-7.14685831181204E-13),(-0.9658311636130642,0.2591720729435068,-7.14685831181204E-13),(-0.9937219264957836,0.11187820521222488,-3.0825459191409187E-13),(-0.9658311636130653,0.25917207294350275,-7.146858311811928E-13),(-0.9937219264957871,0.11187820521219373,-3.082545919140059E-13),(-0.9937219264957871,0.11187820521219373,-3.082545919140059E-13),(-0.9999994968635364,0.0010031314340942705,-2.2279878527203613E-15),(-0.9937219264957836,0.11187820521222488,-3.0825459191409187E-13),(-0.9999994968635365,0.001003131434077921,-2.2279878526752373E-15),(-0.9999994968635365,0.001003131434077921,-2.2279878526752373E-15),(-0.9945078930900839,-0.10466160031990049,2.8924191189634317E-13),(-0.9999994968635364,0.0010031314340942705,-2.2279878527203613E-15),(-0.9945078930900895,-0.10466160031984778,2.892419118961978E-13),(-0.9945078930900895,-0.10466160031984778,2.892419118961978E-13),(-0.9720690082233135,-0.23469521352542286,6.480275921417575E-13),(-0.9945078930900839,-0.10466160031990049,2.8924191189634317E-13),(-0.9720690082233349,-0.23469521352533457,6.480275921415136E-13),(-0.9720690082233349,-0.23469521352533457,6.480275921415136E-13),(-0.9183762991966801,-0.39570819182045036,1.0923660964466307E-12),(-0.9720690082233135,-0.23469521352542286,6.480275921417575E-13),(-0.9183762991966443,-0.39570819182053335,1.0923660964468597E-12),(-0.9183762991966443,-0.39570819182053335,1.0923660964468597E-12),(-0.8089731333683899,-0.5878456170527508,1.6224898219391316E-12),(-0.9183762991966801,-0.39570819182045036,1.0923660964466307E-12),(-0.8089731333682966,-0.5878456170528792,1.6224898219394856E-12),(-0.8089731333682966,-0.5878456170528792,1.6224898219394856E-12),(-0.6233369684433754,-0.7819533386154335,2.157957072845043E-12),(-0.8089731333683899,-0.5878456170527508,1.6224898219391316E-12),(-0.6233369684433545,-0.7819533386154499,2.157957072845089E-12),(-0.6233369684433545,-0.7819533386154499,2.157957072845089E-12),(-0.3440068091234996,-0.938967153459943,2.590957694765608E-12),(-0.6233369684433754,-0.7819533386154335,2.157957072845043E-12),(-0.3440068091236449,-0.9389671534598899,2.5909576947654617E-12),(-0.3440068091234996,-0.938967153459943,2.590957694765608E-12),(-0.08618514690951973,-0.9962791378184052,2.7489727156869404E-12),(-0.08618514690949301,-0.9962791378184075,2.7489727156869473E-12),(-0.3440068091236449,-0.9389671534598899,2.5909576947654617E-12),(-0.08618514690951973,-0.9962791378184052,2.7489727156869404E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.08618514690949301,-0.9962791378184075,2.7489727156869473E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(0.9852620991274315,-0.17105144262182526,4.715559031704092E-13),(0.9985580220656768,0.05368311250555174,-1.4850720843004987E-13),(0.998558022065676,0.05368311250556626,-1.4850720843008996E-13),(0.9852620991274349,-0.17105144262180602,4.715559031703564E-13),(0.998558022065676,0.05368311250556626,-1.4850720843008996E-13),(0.99423624686343,0.10721140528377017,-2.961747053554324E-13),(0.99423624686343,0.10721140528377017,-2.961747053554324E-13),(0.9985580220656768,0.05368311250555174,-1.4850720843004987E-13),(0.8507772826193727,0.5255264173938323,-1.4503592844054619E-12),(0.7331764133483752,0.680038489285432,-1.8766725435805766E-12),(0.733176413348323,0.6800384892854883,-1.876672543580732E-12),(0.8507772826193727,0.5255264173938323,-1.4503592844054619E-12),(0.7331764133483752,0.680038489285432,-1.8766725435805766E-12),(0.5879319010498562,0.808910427505977,-2.2322278447395716E-12),(0.733176413348323,0.6800384892854883,-1.876672543580732E-12),(0.5879319010498562,0.808910427505977,-2.2322278447395716E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-0.595427913033985,0.8034087380530494,-2.21660217713915E-12),(-0.7353424654422684,0.6776956975791468,-1.8697003064379364E-12),(-0.7353424654421586,0.6776956975792661,-1.8697003064382656E-12),(-0.595427913033985,0.8034087380530494,-2.21660217713915E-12),(-0.7353424654422684,0.6776956975791468,-1.8697003064379364E-12),(-0.9279729502400907,0.37264755952870854,-1.0279270574119078E-12),(-0.7353424654421586,0.6776956975792661,-1.8697003064382656E-12),(-0.9279729502400598,0.3726475595287856,-1.0279270574121203E-12),(-0.9279729502400598,0.3726475595287856,-1.0279270574121203E-12),(-0.9919380594528908,0.1267236608089965,-3.4927175525005197E-13),(-0.9279729502400907,0.37264755952870854,-1.0279270574119078E-12),(-0.9919380594528778,0.1267236608090967,-3.4927175525032844E-13),(-0.9919380594528778,0.1267236608090967,-3.4927175525032844E-13),(-0.9997278626286514,0.023328109309335664,-6.394341483280306E-14),(-0.9919380594528908,0.1267236608089965,-3.4927175525005197E-13),(-0.9997278626286514,0.02332810930933819,-6.394341483281004E-14),(-0.9997278626286514,0.02332810930933819,-6.394341483281004E-14),(-1.,1.0761972206014587E-42,4.1142326944632687E-16),(-0.9997278626286514,0.023328109309335664,-6.394341483280306E-14),(-1.,1.0761972206014587E-42,4.1142326944632687E-16),(-0.9325271362086448,-0.36109990339863535,9.968350464387257E-13),(-0.9262080086179268,-0.3770128973550035,1.0406747143623864E-12),(-0.9325271362086448,-0.36109990339863535,9.968350464387257E-13),(-0.9262080086179288,-0.3770128973549988,1.0406747143623733E-12),(-0.9262080086179288,-0.3770128973549988,1.0406747143623733E-12),(-0.8723365420137861,-0.48890587792276574,1.3493510778322538E-12),(-0.9262080086179268,-0.3770128973550035,1.0406747143623864E-12),(-0.8723365420137832,-0.4889058779227707,1.3493510778322675E-12),(-0.8723365420137832,-0.4889058779227707,1.3493510778322675E-12),(-0.730188377765645,-0.6832458803212617,1.8855357877405828E-12),(-0.8723365420137861,-0.48890587792276574,1.3493510778322538E-12),(-0.7301883777656969,-0.6832458803212061,1.8855357877404293E-12),(-0.730188377765645,-0.6832458803212617,1.8855357877405828E-12),(-0.6321911971634502,-0.7748124226088813,2.13813745451554E-12),(-0.6321911971634502,-0.7748124226088813,2.13813745451554E-12),(-0.7301883777656969,-0.6832458803212061,1.8855357877404293E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.6156006345831259,-0.7880582838222391,2.1743022190508546E-12),(0.6156006345831259,-0.7880582838222391,2.1743022190508546E-12),(0.6156006345831259,-0.7880582838222391,2.1743022190508546E-12),(0.6156006345831259,-0.7880582838222391,2.1743022190508546E-12),(0.9762553099163308,-0.21662310555471492,5.972776844899577E-13),(0.998637758841438,-0.05217879469813509,1.435916683275457E-13),(0.9986377588414385,-0.05217879469812458,1.435916683275167E-13),(0.9762553099163308,-0.21662310555471492,5.972776844899577E-13),(0.9986377588414385,-0.05217879469812458,1.435916683275167E-13),(0.9788258497336725,0.2046947871665374,-5.652229512825092E-13),(0.9788258497336696,0.20469478716655154,-5.652229512825481E-13),(0.998637758841438,-0.05217879469813509,1.435916683275457E-13),(0.9788258497336696,0.20469478716655154,-5.652229512825481E-13),(0.9450084045283325,0.32704604472583926,-9.029026810309435E-13),(0.9450084045283398,0.3270460447258185,-9.029026810308864E-13),(0.9788258497336725,0.2046947871665374,-5.652229512825092E-13),(0.9450084045283398,0.3270460447258185,-9.029026810308864E-13),(0.9330496485399467,0.35974762453626014,-9.931158112431357E-13),(0.9330496485399467,0.35974762453626014,-9.931158112431357E-13),(0.9450084045283325,0.32704604472583926,-9.029026810309435E-13),(-0.941482093321121,0.337063002947046,-9.295127190105E-13),(-0.9606480611335358,0.2777684334844022,-7.659926705557824E-13),(-0.941482093321121,0.337063002947046,-9.295127190105E-13),(-0.9606480611335216,0.27776843348445074,-7.659926705559165E-13),(-0.9606480611335216,0.27776843348445074,-7.659926705559165E-13),(-0.9760836593293745,0.21739523911571243,-5.994981344606017E-13),(-0.9606480611335358,0.2777684334844022,-7.659926705557824E-13),(-0.9760836593293745,0.21739523911571243,-5.994981344606017E-13),(-0.9792141269629987,-0.20282922263838726,5.599633528228735E-13),(-0.9792141269629987,-0.20282922263838726,5.599633528228735E-13),(-0.9792141269629987,-0.20282922263838726,5.599633528228735E-13),(-0.9792141269629987,-0.20282922263838726,5.599633528228735E-13),(-0.6124868691939013,-0.7904807619828917,2.181324680023932E-12),(-0.6124868691939013,-0.7904807619828917,2.181324680023932E-12),(-0.6124868691939013,-0.7904807619828917,2.181324680023932E-12),(-0.6124868691939013,-0.7904807619828917,2.181324680023932E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.6823833044151579,-0.7309945457084136,2.0167600461923733E-12),(0.7673233100206696,-0.6412604290761466,1.769194455534705E-12),(0.6823833044151579,-0.7309945457084136,2.0167600461923733E-12),(0.7673233100207348,-0.6412604290760684,1.7691944555344894E-12),(0.7673233100206696,-0.6412604290761466,1.769194455534705E-12),(0.8868360880342167,-0.46208414056334723,1.2746791432036245E-12),(0.8868360880342115,-0.46208414056335717,1.2746791432036517E-12),(0.7673233100207348,-0.6412604290760684,1.7691944555344894E-12),(0.8868360880342115,-0.46208414056335717,1.2746791432036517E-12),(0.9337699395388017,-0.357873860478385,9.87015786131856E-13),(0.9337699395388007,-0.35787386047838804,9.870157861318644E-13),(0.8868360880342167,-0.46208414056334723,1.2746791432036245E-12),(0.9337699395388007,-0.35787386047838804,9.870157861318644E-13),(0.9852620991274349,-0.17105144262180602,4.715559031703564E-13),(0.9852620991274315,-0.17105144262182526,4.715559031704092E-13),(0.9337699395388017,-0.357873860478385,9.87015786131856E-13),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(0.9536861696258785,-0.30080340733495736,8.294258345358459E-13),(0.9536861696258785,-0.30080340733495736,8.294258345358459E-13),(0.9536861696258785,-0.30080340733495736,8.294258345358459E-13),(0.9536861696258785,-0.30080340733495736,8.294258345358459E-13),(-0.7700417988451072,-0.637993438862338,1.760609264217814E-12),(-0.7700417988451072,-0.637993438862338,1.760609264217814E-12),(-0.7700417988451072,-0.637993438862338,1.760609264217814E-12),(-0.7700417988451072,-0.637993438862338,1.760609264217814E-12),(-0.994302470776474,0.10659548117907769,-2.937422972662452E-13),(-0.994302470776474,0.10659548117907769,-2.937422972662452E-13),(-0.994302470776474,0.10659548117907769,-2.937422972662452E-13),(-0.994302470776474,0.10659548117907769,-2.937422972662452E-13),(-0.9408175538277588,-0.3389134556336651,9.35661947178218E-13),(-0.8797598194001595,-0.4754184053746753,1.3122091016346648E-12),(-0.9408175538277588,-0.3389134556336651,9.35661947178218E-13),(-0.8797598194001869,-0.4754184053746244,1.3122091016345244E-12),(-0.8797598194001869,-0.4754184053746244,1.3122091016345244E-12),(-0.7490764788486548,-0.6624835309920549,1.8281795118193945E-12),(-0.8797598194001595,-0.4754184053746753,1.3122091016346648E-12),(-0.7490764788486778,-0.662483530992029,1.8281795118193226E-12),(-0.7490764788486548,-0.6624835309920549,1.8281795118193945E-12),(-0.6277478308059733,-0.7784167655686735,2.1479985436359298E-12),(-0.627747830805981,-0.7784167655686675,2.1479985436359128E-12),(-0.7490764788486778,-0.662483530992029,1.8281795118193226E-12),(-0.6277478308059733,-0.7784167655686735,2.1479985436359298E-12),(-0.46242915451716676,-0.8866562338654922,2.4466623288691027E-12),(-0.627747830805981,-0.7784167655686675,2.1479985436359128E-12),(-0.46242915451719535,-0.8866562338654773,2.446662328869061E-12),(-0.46242915451716676,-0.8866562338654922,2.4466623288691027E-12),(-0.24619523010030198,-0.9692202580816496,2.6744076527820624E-12),(-0.24619523010030075,-0.9692202580816499,2.6744076527820632E-12),(-0.46242915451719535,-0.8866562338654773,2.446662328869061E-12),(-0.24619523010030198,-0.9692202580816496,2.6744076527820624E-12),(0.011075954373022131,-0.9999386597360495,2.7590417820752693E-12),(-0.24619523010030075,-0.9692202580816499,2.6744076527820632E-12),(0.011075954373007011,-0.9999386597360496,2.7590417820752697E-12),(0.011075954373007011,-0.9999386597360496,2.7590417820752697E-12),(0.2972861557679521,-0.9547884276575168,2.634315770400085E-12),(0.011075954373022131,-0.9999386597360495,2.7590417820752693E-12),(0.297286155767862,-0.9547884276575449,2.634315770400163E-12),(0.2972861557679521,-0.9547884276575168,2.634315770400085E-12),(0.561148807251126,-0.8277149365093267,2.283580491239195E-12),(0.5611488072510545,-0.8277149365093752,2.283580491239329E-12),(0.297286155767862,-0.9547884276575449,2.634315770400163E-12),(0.561148807251126,-0.8277149365093267,2.283580491239195E-12),(0.7489939741665259,-0.6625768081228272,1.8278583885617535E-12),(0.5611488072510545,-0.8277149365093752,2.283580491239329E-12),(0.7489939741665402,-0.662576808122811,1.8278583885617095E-12),(0.7489939741665259,-0.6625768081228272,1.8278583885617535E-12),(0.8635495158077536,-0.5042640516120444,1.3909626904891406E-12),(0.8635495158077525,-0.504264051612046,1.3909626904891453E-12),(0.7489939741665402,-0.662576808122811,1.8278583885617095E-12),(0.8635495158077525,-0.504264051612046,1.3909626904891453E-12),(0.9334175416532469,-0.3587919911787459,9.895135403910937E-13),(0.9334175416532348,-0.35879199117877725,9.895135403911801E-13),(0.8635495158077536,-0.5042640516120444,1.3909626904891406E-12),(0.9334175416532348,-0.35879199117877725,9.895135403911801E-13),(0.9749062702748591,-0.22261573210077432,6.137883517990939E-13),(0.9749062702748557,-0.22261573210078942,6.137883517991355E-13),(0.9334175416532469,-0.3587919911787459,9.895135403910937E-13),(0.9749062702748557,-0.22261573210078942,6.137883517991355E-13),(0.9946566839741976,-0.10323798247473451,2.843789113546265E-13),(0.9946566839741967,-0.10323798247474139,2.8437891135464563E-13),(0.9749062702748591,-0.22261573210077432,6.137883517990939E-13),(0.9946566839741967,-0.10323798247474139,2.8437891135464563E-13),(0.9999996706240923,-0.0008116352057429887,1.7277170015914673E-15),(0.9999996706240923,-0.0008116352057321721,1.7277170015616162E-15),(0.9946566839741976,-0.10323798247473451,2.843789113546265E-13),(0.9999996706240923,-0.0008116352057321721,1.7277170015616162E-15),(0.9950173309235021,0.09970211212341507,-2.755278734150081E-13),(0.9950173309235023,0.09970211212341232,-2.7552787341500055E-13),(0.9999996706240923,-0.0008116352057429887,1.7277170015914673E-15),(0.9950173309235023,0.09970211212341232,-2.7552787341500055E-13),(0.9766138235826096,0.21500102229374585,-5.936608412428169E-13),(0.9766138235826148,0.21500102229372128,-5.936608412427493E-13),(0.9950173309235021,0.09970211212341507,-2.755278734150081E-13),(0.9766138235826148,0.21500102229372128,-5.936608412427493E-13),(0.937885089864574,0.3469460450988313,-9.576937221057367E-13),(0.9378850898645771,0.34694604509882304,-9.576937221057135E-13),(0.9766138235826096,0.21500102229374585,-5.936608412428169E-13),(0.9378850898645771,0.34694604509882304,-9.576937221057135E-13),(0.8712497287927936,0.49084000456206056,-1.3546184982200671E-12),(0.8712497287927797,0.49084000456208515,-1.3546184982201348E-12),(0.937885089864574,0.3469460450988313,-9.576937221057367E-13),(0.8712497287927797,0.49084000456208515,-1.3546184982201348E-12),(0.7558037417969684,0.6547982161595295,-1.8070298155953023E-12),(0.7558037417969727,0.6547982161595242,-1.8070298155952872E-12),(0.8712497287927936,0.49084000456206056,-1.3546184982200671E-12),(0.7558037417969684,0.6547982161595295,-1.8070298155953023E-12),(0.5617419259877943,0.8273125217156595,-2.283044923834128E-12),(0.7558037417969727,0.6547982161595242,-1.8070298155952872E-12),(0.5617419259877701,0.827312521715676,-2.2830449238341733E-12),(0.5617419259877701,0.827312521715676,-2.2830449238341733E-12),(0.2939671248254605,0.9558155311156291,-2.6374723229951188E-12),(0.5617419259877943,0.8273125217156595,-2.283044923834128E-12),(0.29396712482545856,0.9558155311156297,-2.63747232299512E-12),(0.29396712482545856,0.9558155311156297,-2.63747232299512E-12),(-0.0026952674504493114,0.9999963677600887,-2.7592105167716392E-12),(0.2939671248254605,0.9558155311156291,-2.6374723229951188E-12),(-0.002695267450479361,0.9999963677600887,-2.7592105167716392E-12),(-0.002695267450479361,0.9999963677600887,-2.7592105167716392E-12),(-0.29261441016141265,0.9562305197837437,-2.6383389583147634E-12),(-0.0026952674504493114,0.9999963677600887,-2.7592105167716392E-12),(-0.2926144101613252,0.9562305197837704,-2.6383389583148365E-12),(-0.29261441016141265,0.9562305197837437,-2.6383389583147634E-12),(-0.540836690000105,0.8411276209646967,-2.320630779865737E-12),(-0.5408366900001452,0.8411276209646708,-2.3206307798656646E-12),(-0.2926144101613252,0.9562305197837704,-2.6383389583148365E-12),(-0.5408366900001452,0.8411276209646708,-2.3206307798656646E-12),(-0.7259710978950736,0.6877252104009433,-1.897286100555979E-12),(-0.7259710978950948,0.6877252104009208,-1.8972861005559175E-12),(-0.540836690000105,0.8411276209646967,-2.320630779865737E-12),(-0.7259710978950736,0.6877252104009433,-1.897286100555979E-12),(-0.7993217090953573,0.6009033244781372,-1.6577112485460892E-12),(-0.7259710978950948,0.6877252104009208,-1.8972861005559175E-12),(-0.7993217090953573,0.6009033244781372,-1.6577112485460892E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(0.08869355101080909,-0.9960589611107835,2.7483015328776396E-12),(0.08869355101079085,-0.9960589611107851,2.748301532877644E-12),(1.3916449267378772E-27,-1.,2.75921435746603E-12),(0.08869355101080909,-0.9960589611107835,2.7483015328776396E-12),(0.41828292848581394,-0.9083167904081326,2.5060038986509547E-12),(0.08869355101079085,-0.9960589611107851,2.748301532877644E-12),(0.41828292848587695,-0.9083167904081038,2.5060038986508747E-12),(0.41828292848587695,-0.9083167904081038,2.5060038986508747E-12),(0.8055283032698622,-0.5925572990278468,1.6346363338727327E-12),(0.41828292848581394,-0.9083167904081326,2.5060038986509547E-12),(0.8055283032698332,-0.5925572990278863,1.6346363338728414E-12),(0.8055283032698622,-0.5925572990278468,1.6346363338727327E-12),(0.9613077859588501,-0.27547657006521226,7.597338204957124E-13),(0.9613077859588718,-0.27547657006513676,7.597338204955043E-13),(0.8055283032698332,-0.5925572990278863,1.6346363338728414E-12),(0.9613077859588718,-0.27547657006513676,7.597338204955043E-13),(0.9847230941359341,-0.1741276195075113,4.800379396412254E-13),(0.9847230941359341,-0.1741276195075113,4.800379396412254E-13),(0.9613077859588501,-0.27547657006521226,7.597338204957124E-13),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(0.9850106999604984,0.17249324903696736,-4.762526691900688E-13),(0.9614949837727648,0.2748224812125294,-7.586557100139404E-13),(0.9614949837727732,0.27482248121249986,-7.586557100138589E-13),(0.9850106999604984,0.17249324903696736,-4.762526691900688E-13),(0.9614949837727732,0.27482248121249986,-7.586557100138589E-13),(0.9273794962553974,0.374121998718447,-1.0326951325351984E-12),(0.9273794962553974,0.374121998718447,-1.0326951325351984E-12),(0.9614949837727648,0.2748224812125294,-7.586557100139404E-13),(0.39266811686769704,0.9196802433430745,-2.5377567602740978E-12),(0.20039929722542205,0.9797143061482553,-2.7033243694099287E-12),(0.39266811686769704,0.9196802433430745,-2.5377567602740978E-12),(0.20039929722539643,0.9797143061482605,-2.7033243694099436E-12),(0.20039929722539643,0.9797143061482605,-2.7033243694099436E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(0.20039929722542205,0.9797143061482553,-2.7033243694099287E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.5672614750584218,-0.8235377458954407,2.2720307051117746E-12),(0.721404410811145,-0.6925140258956672,1.9105134607119454E-12),(0.5672614750584218,-0.8235377458954407,2.2720307051117746E-12),(0.7214044108113933,-0.6925140258954086,1.9105134607112313E-12),(0.721404410811145,-0.6925140258956672,1.9105134607119454E-12),(0.8460222407894991,-0.5331476044113067,1.4708041354669517E-12),(0.8460222407894991,-0.5331476044113067,1.4708041354669517E-12),(0.7214044108113933,-0.6925140258954086,1.9105134607112313E-12),(0.9941612242434783,-0.10790486648297534,2.973505253230838E-13),(0.9985392391497387,-0.05403136013706415,1.486867468055101E-13),(0.99853923914974,-0.05403136013704104,1.4868674680544636E-13),(0.9941612242434783,-0.10790486648297534,2.973505253230838E-13),(0.99853923914974,-0.05403136013704104,1.4868674680544636E-13),(0.9985392391497393,0.05403136013705141,-1.4945507114318591E-13),(0.9985392391497397,0.05403136013704345,-1.4945507114316393E-13),(0.9985392391497387,-0.05403136013706415,1.486867468055101E-13),(0.9985392391497397,0.05403136013704345,-1.4945507114316393E-13),(0.9941612242434782,0.10790486648297547,-2.980620827833876E-13),(0.9941612242434782,0.10790486648297547,-2.980620827833876E-13),(0.9985392391497393,0.05403136013705141,-1.4945507114318591E-13),(0.8460222407894984,0.5331476044113075,-1.4713979020921752E-12),(0.7214044108112283,0.6925140258955804,-1.9111131304071913E-12),(0.7214044108113113,0.6925140258954939,-1.9111131304069522E-12),(0.8460222407894984,0.5331476044113075,-1.4713979020921752E-12),(0.7214044108112283,0.6925140258955804,-1.9111131304071913E-12),(0.5672614750584242,0.8235377458954392,-2.272611735040072E-12),(0.7214044108113113,0.6925140258954939,-1.9111131304069522E-12),(0.5672614750584242,0.8235377458954392,-2.272611735040072E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.8194722387884859,-0.5731188793391707,1.5810498883526226E-12),(0.7574045442264165,-0.6529459061707751,1.8013416841422215E-12),(0.7574045442264307,-0.6529459061707585,1.8013416841421757E-12),(0.8194722387884859,-0.5731188793391707,1.5810498883526226E-12),(0.7574045442264165,-0.6529459061707751,1.8013416841422215E-12),(0.5831639704137638,-0.8123544691889466,2.2412272490244105E-12),(0.7574045442264307,-0.6529459061707585,1.8013416841421757E-12),(0.5831639704137175,-0.8123544691889798,2.241227249024503E-12),(0.5831639704137175,-0.8123544691889798,2.241227249024503E-12),(0.319740020362656,-0.9475053136412948,2.61423089747425E-12),(0.5831639704137638,-0.8123544691889466,2.2412272490244105E-12),(0.31974002036271576,-0.9475053136412745,2.6142308974741943E-12),(0.31974002036271576,-0.9475053136412745,2.6142308974741943E-12),(0.012699053705120386,-0.9999193637663962,2.7589901299097574E-12),(0.319740020362656,-0.9475053136412948,2.61423089747425E-12),(0.012699053705104888,-0.9999193637663965,2.758990129909759E-12),(0.012699053705120386,-0.9999193637663962,2.7589901299097574E-12),(-0.28156556039752495,-0.9595419924099351,2.6476783428068177E-12),(-0.2815655603974115,-0.9595419924099683,2.647678342806909E-12),(0.012699053705104888,-0.9999193637663965,2.758990129909759E-12),(-0.28156556039752495,-0.9595419924099351,2.6476783428068177E-12),(-0.5404333018571978,-0.8413868588489645,2.3217812285410303E-12),(-0.2815655603974115,-0.9595419924099683,2.647678342806909E-12),(-0.5404333018571181,-0.8413868588490157,2.3217812285411712E-12),(-0.5404333018571978,-0.8413868588489645,2.3217812285410303E-12),(-0.7333107949378586,-0.6798935784573981,1.8763312847068133E-12),(-0.7333107949378528,-0.6798935784574043,1.8763312847068307E-12),(-0.5404333018571181,-0.8413868588490157,2.3217812285411712E-12),(-0.7333107949378586,-0.6798935784573981,1.8763312847068133E-12),(-0.8571009343246482,-0.515148510994466,1.4218323199602532E-12),(-0.7333107949378528,-0.6798935784574043,1.8763312847068307E-12),(-0.8571009343246427,-0.5151485109944751,1.4218323199602783E-12),(-0.8571009343246427,-0.5151485109944751,1.4218323199602783E-12),(-0.9309474157192562,-0.3651532680473211,1.008022902930729E-12),(-0.8571009343246482,-0.515148510994466,1.4218323199602532E-12),(-0.9309474157192436,-0.3651532680473528,1.0080229029308167E-12),(-0.9309474157192436,-0.3651532680473528,1.0080229029308167E-12),(-0.9717468331379525,-0.23602561786035078,6.517097814638533E-13),(-0.9309474157192562,-0.3651532680473211,1.008022902930729E-12),(-0.9717468331379511,-0.23602561786035722,6.517097814638708E-13),(-0.9717468331379511,-0.23602561786035722,6.517097814638708E-13),(-0.9931098274040339,-0.11718733171094137,3.238175059725131E-13),(-0.9717468331379525,-0.23602561786035078,6.517097814638533E-13),(-0.9931098274040338,-0.11718733171094244,3.2381750597251615E-13),(-0.9931098274040338,-0.11718733171094244,3.2381750597251615E-13),(-0.9999579620805333,-0.00916919144456243,2.5837962400480872E-14),(-0.9931098274040339,-0.11718733171094137,3.238175059725131E-13),(-0.9999579620805331,-0.009169191444566667,2.583796240049256E-14),(-0.9999579620805331,-0.009169191444566667,2.583796240049256E-14),(-0.9967023029360896,0.08114505112386927,-2.2349605982541502E-13),(-0.9999579620805333,-0.00916919144456243,2.5837962400480872E-14),(-0.9967023029360891,0.08114505112387724,-2.2349605982543708E-13),(-0.9967023029360891,0.08114505112387724,-2.2349605982543708E-13),(-0.9857538147747108,0.16819457974948346,-4.637583125086628E-13),(-0.9967023029360896,0.08114505112386927,-2.2349605982541502E-13),(-0.9857538147747129,0.16819457974947147,-4.637583125086297E-13),(-0.9857538147747129,0.16819457974947147,-4.637583125086297E-13),(-0.9654101412336251,0.26073599521982443,-7.190186417948056E-13),(-0.9857538147747108,0.16819457974948346,-4.637583125086628E-13),(-0.9654101412336296,0.26073599521980817,-7.190186417947607E-13),(-0.9654101412336296,0.26073599521980817,-7.190186417947607E-13),(-0.933824740070632,0.35773084132070126,-9.866588702787646E-13),(-0.9654101412336251,0.26073599521982443,-7.190186417948056E-13),(-0.933824740070634,0.35773084132069594,-9.8665887027875E-13),(-0.933824740070634,0.35773084132069594,-9.8665887027875E-13),(-0.887595750904099,0.46062325492422607,-1.2707417486767577E-12),(-0.933824740070632,0.35773084132070126,-9.866588702787646E-13),(-0.8875957509041004,0.4606232549242235,-1.2707417486767508E-12),(-0.8875957509041004,0.4606232549242235,-1.2707417486767508E-12),(-0.819804938826555,0.5726428749889311,-1.579885754785426E-12),(-0.887595750904099,0.46062325492422607,-1.2707417486767577E-12),(-0.8198049388265484,0.5726428749889407,-1.5798857547854525E-12),(-0.8198049388265484,0.5726428749889407,-1.5798857547854525E-12),(-0.7226711292766403,0.6911920419897971,-1.906910084753374E-12),(-0.819804938826555,0.5726428749889311,-1.579885754785426E-12),(-0.7226711292765957,0.6911920419898439,-1.9069100847535035E-12),(-0.7226711292766403,0.6911920419897971,-1.906910084753374E-12),(-0.5715761942912735,0.8205489955630344,-2.2638415637319654E-12),(-0.5715761942912672,0.8205489955630387,-2.263841563731977E-12),(-0.7226711292765957,0.6911920419898439,-1.9069100847535035E-12),(-0.5715761942912735,0.8205489955630344,-2.2638415637319654E-12),(-0.32253970058654546,0.9465559368286386,-2.611603647120277E-12),(-0.5715761942912672,0.8205489955630387,-2.263841563731977E-12),(-0.322539700586544,0.9465559368286391,-2.611603647120278E-12),(-0.32253970058654546,0.9465559368286386,-2.611603647120277E-12),(-0.020372124653145425,0.9997924667335301,-2.758632314083925E-12),(-0.020372124653092766,0.9997924667335312,-2.758632314083928E-12),(-0.322539700586544,0.9465559368286391,-2.611603647120278E-12),(-0.020372124653145425,0.9997924667335301,-2.758632314083925E-12),(0.2554134767478531,0.9668319170856814,-2.6677939307232644E-12),(-0.020372124653092766,0.9997924667335312,-2.758632314083928E-12),(0.255413476747907,0.9668319170856672,-2.667793930723225E-12),(0.255413476747907,0.9668319170856672,-2.667793930723225E-12),(0.4905585459951927,0.8714082355309034,-2.404572918055649E-12),(0.2554134767478531,0.9668319170856814,-2.6677939307232644E-12),(0.4905585459951779,0.871408235530912,-2.4045729180556723E-12),(0.4905585459951779,0.871408235530912,-2.4045729180556723E-12),(0.6462378453519254,0.7631360607617104,-2.105859975454947E-12),(0.4905585459951927,0.8714082355309034,-2.404572918055649E-12),(0.6462378453519061,0.7631360607617268,-2.1058599754549922E-12),(0.6462378453519061,0.7631360607617268,-2.1058599754549922E-12),(0.6427392629565353,0.7660850082426167,-2.1140077845625348E-12),(0.6462378453519254,0.7631360607617104,-2.105859975454947E-12),(0.6427392629565662,0.7660850082425905,-2.114007784562462E-12),(0.6427392629565662,0.7660850082425905,-2.114007784562462E-12),(0.5846038255640312,0.8113189059401364,-2.238833595705505E-12),(0.6427392629565353,0.7660850082426167,-2.1140077845625348E-12),(0.5846038255640312,0.8113189059401364,-2.238833595705505E-12),(-0.8601478920980522,0.5100447075691282,-1.4070770111499853E-12),(-0.8601478920980522,0.5100447075691282,-1.4070770111499853E-12),(-0.8601478920980522,0.5100447075691282,-1.4070770111499853E-12),(-0.8601478920980522,0.5100447075691282,-1.4070770111499853E-12),(0.8094388435365366,0.587204188144324,-1.6206665519976049E-12),(0.8094388435365366,0.587204188144324,-1.6206665519976049E-12),(0.8094388435365366,0.587204188144324,-1.6206665519976049E-12),(0.8094388435365366,0.587204188144324,-1.6206665519976049E-12),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(0.9536861696258785,-0.30080340733495736,8.294258345358459E-13),(0.9536861696258785,-0.30080340733495736,8.294258345358459E-13),(0.9536861696258785,-0.30080340733495736,8.294258345358459E-13),(0.9536861696258785,-0.30080340733495736,8.294258345358459E-13),(-0.7700417988451362,-0.637993438862303,1.7605537530665826E-12),(-0.7700417988451362,-0.637993438862303,1.7605537530665826E-12),(-0.7700417988451362,-0.637993438862303,1.7605537530665826E-12),(-0.7700417988451362,-0.637993438862303,1.7605537530665826E-12),(-0.994302470776474,0.10659548117907769,-2.937422972662452E-13),(-0.994302470776474,0.10659548117907769,-2.937422972662452E-13),(-0.994302470776474,0.10659548117907769,-2.937422972662452E-13),(-0.994302470776474,0.10659548117907769,-2.937422972662452E-13),(-0.9408175538277588,-0.3389134556336651,9.35661947178218E-13),(-0.8797598194001714,-0.4754184053746528,1.312181032219781E-12),(-0.9408175538277588,-0.3389134556336651,9.35661947178218E-13),(-0.879759819400133,-0.4754184053747243,1.3121810322199783E-12),(-0.879759819400133,-0.4754184053747243,1.3121810322199783E-12),(-0.749076478848647,-0.6624835309920637,1.8281516693802228E-12),(-0.8797598194001714,-0.4754184053746528,1.312181032219781E-12),(-0.7490764788486562,-0.6624835309920533,1.828151669380194E-12),(-0.749076478848647,-0.6624835309920637,1.8281516693802228E-12),(-0.6277478308059853,-0.778416765568664,2.1479985436359124E-12),(-0.6277478308059492,-0.7784167655686929,2.1479985436359924E-12),(-0.7490764788486562,-0.6624835309920533,1.828151669380194E-12),(-0.6277478308059492,-0.7784167655686929,2.1479985436359924E-12),(-0.4624291545171812,-0.8866562338654846,2.4466623288690906E-12),(-0.4624291545172643,-0.8866562338654415,2.4466623288689714E-12),(-0.6277478308059853,-0.778416765568664,2.1479985436359124E-12),(-0.4624291545171812,-0.8866562338654846,2.4466623288690906E-12),(-0.24619523010037211,-0.9692202580816319,2.674407652782013E-12),(-0.4624291545172643,-0.8866562338654415,2.4466623288689714E-12),(-0.24619523010034386,-0.9692202580816389,2.6744076527820325E-12),(-0.24619523010034386,-0.9692202580816389,2.6744076527820325E-12),(0.01107595437305499,-0.9999386597360491,2.7590347777683196E-12),(-0.24619523010037211,-0.9692202580816319,2.674407652782013E-12),(0.011075954373096102,-0.9999386597360487,2.7590347777683176E-12),(0.01107595437305499,-0.9999386597360491,2.7590347777683196E-12),(0.2972861557678207,-0.9547884276575576,2.6343087484050015E-12),(0.29728615576798795,-0.9547884276575057,2.634308748404858E-12),(0.011075954373096102,-0.9999386597360487,2.7590347777683176E-12),(0.2972861557678207,-0.9547884276575576,2.6343087484050015E-12),(0.5611488072510459,-0.827714936509381,2.2835804912393396E-12),(0.29728615576798795,-0.9547884276575057,2.634308748404858E-12),(0.5611488072509849,-0.8277149365094224,2.283580491239454E-12),(0.5611488072509849,-0.8277149365094224,2.283580491239454E-12),(0.7489939741665427,-0.6625768081228081,1.8278583885617014E-12),(0.5611488072510459,-0.827714936509381,2.2835804912393396E-12),(0.7489939741665567,-0.6625768081227924,1.8278583885616578E-12),(0.7489939741665427,-0.6625768081228081,1.8278583885617014E-12),(0.8635495158077704,-0.5042640516120156,1.390962690489061E-12),(0.8635495158077658,-0.5042640516120236,1.3909626904890837E-12),(0.7489939741665567,-0.6625768081227924,1.8278583885616578E-12),(0.8635495158077658,-0.5042640516120236,1.3909626904890837E-12),(0.9334175416532352,-0.3587919911787764,9.895135403911781E-13),(0.9334175416532393,-0.35879199117876553,9.895135403911476E-13),(0.8635495158077704,-0.5042640516120156,1.390962690489061E-12),(0.9334175416532393,-0.35879199117876553,9.895135403911476E-13),(0.9749062702748574,-0.22261573210078114,6.137883517991128E-13),(0.9749062702748587,-0.2226157321007757,6.137883517990978E-13),(0.9334175416532352,-0.3587919911787764,9.895135403911781E-13),(0.9749062702748587,-0.2226157321007757,6.137883517990978E-13),(0.9946566839741974,-0.1032379824747367,2.8437891135463266E-13),(0.994656683974197,-0.10323798247473809,2.843789113546365E-13),(0.9749062702748574,-0.22261573210078114,6.137883517991128E-13),(0.994656683974197,-0.10323798247473809,2.843789113546365E-13),(0.9999996706240923,-0.0008116352057429552,1.727717001576062E-15),(0.9999996706240923,-0.0008116352057480784,1.7277170015901905E-15),(0.9946566839741974,-0.1032379824747367,2.8437891135463266E-13),(0.9999996706240923,-0.0008116352057480784,1.7277170015901905E-15),(0.9950173309235023,0.0997021121234135,-2.755278734150191E-13),(0.9950173309235034,0.09970211212340233,-2.7552787341498823E-13),(0.9999996706240923,-0.0008116352057429552,1.727717001576062E-15),(0.9950173309235034,0.09970211212340233,-2.7552787341498823E-13),(0.9766138235826098,0.21500102229374435,-5.937164644360774E-13),(0.9766138235826136,0.21500102229372747,-5.937164644360307E-13),(0.9950173309235023,0.0997021121234135,-2.755278734150191E-13),(0.9766138235826136,0.21500102229372747,-5.937164644360307E-13),(0.9378850898645635,0.34694604509885946,-9.57749386164382E-13),(0.9378850898645755,0.3469460450988267,-9.577493861642918E-13),(0.9766138235826098,0.21500102229374435,-5.937164644360774E-13),(0.9378850898645755,0.3469460450988267,-9.577493861642918E-13),(0.8712497287927936,0.4908400045620606,-1.354618498220052E-12),(0.8712497287927745,0.49084000456209437,-1.354618498220145E-12),(0.9378850898645635,0.34694604509885946,-9.57749386164382E-13),(0.8712497287927745,0.49084000456209437,-1.354618498220145E-12),(0.7558037417969746,0.6547982161595223,-1.8070298155952668E-12),(0.7558037417969822,0.6547982161595134,-1.8070298155952421E-12),(0.8712497287927936,0.4908400045620606,-1.354618498220052E-12),(0.7558037417969746,0.6547982161595223,-1.8070298155952668E-12),(0.5617419259878125,0.8273125217156473,-2.283044923834094E-12),(0.7558037417969822,0.6547982161595134,-1.8070298155952421E-12),(0.561741925987752,0.8273125217156883,-2.2830449238342076E-12),(0.561741925987752,0.8273125217156883,-2.2830449238342076E-12),(0.2939671248254605,0.9558155311156291,-2.6374723229951188E-12),(0.5617419259878125,0.8273125217156473,-2.283044923834094E-12),(0.29396712482545856,0.9558155311156297,-2.63747232299512E-12),(0.29396712482545856,0.9558155311156297,-2.63747232299512E-12),(-0.0026952674505166725,0.9999963677600887,-2.7592105167716397E-12),(0.2939671248254605,0.9558155311156291,-2.6374723229951188E-12),(-0.0026952674504120006,0.9999963677600888,-2.75921051677164E-12),(-0.0026952674504120006,0.9999963677600888,-2.75921051677164E-12),(-0.292614410161427,0.9562305197837393,-2.6383389583147505E-12),(-0.0026952674505166725,0.9999963677600887,-2.7592105167716397E-12),(-0.2926144101613879,0.9562305197837514,-2.6383389583147844E-12),(-0.292614410161427,0.9562305197837393,-2.6383389583147505E-12),(-0.5408366900001068,0.8411276209646955,-2.3206027978906107E-12),(-0.5408366900001649,0.8411276209646582,-2.320602797890508E-12),(-0.2926144101613879,0.9562305197837514,-2.6383389583147844E-12),(-0.5408366900001649,0.8411276209646582,-2.320602797890508E-12),(-0.7259710978950984,0.6877252104009172,-1.8972861005559127E-12),(-0.7259710978950613,0.6877252104009562,-1.89728610055602E-12),(-0.5408366900001068,0.8411276209646955,-2.3206027978906107E-12),(-0.7259710978950984,0.6877252104009172,-1.8972861005559127E-12),(-0.7993217090953496,0.6009033244781473,-1.6577667596973205E-12),(-0.7259710978950613,0.6877252104009562,-1.89728610055602E-12),(-0.7993217090953496,0.6009033244781473,-1.6577667596973205E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(0.08869355101086294,-0.9960589611107787,2.748301532877623E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(0.0886935510107716,-0.9960589611107867,2.7483015328776453E-12),(0.0886935510107716,-0.9960589611107867,2.7483015328776453E-12),(0.4182829284859116,-0.9083167904080877,2.506061248925733E-12),(0.08869355101086294,-0.9960589611107787,2.748301532877623E-12),(0.41828292848561627,-0.9083167904082237,2.506061248926108E-12),(0.41828292848561627,-0.9083167904082237,2.506061248926108E-12),(0.8055283032698752,-0.592557299027829,1.6346936419198529E-12),(0.4182829284859116,-0.9083167904080877,2.506061248925733E-12),(0.8055283032697909,-0.592557299027944,1.6346936419201701E-12),(0.8055283032698752,-0.592557299027829,1.6346936419198529E-12),(0.9613077859588944,-0.2754765700650575,7.597338204952404E-13),(0.9613077859588679,-0.27547657006515003,7.597338204954958E-13),(0.8055283032697909,-0.592557299027944,1.6346936419201701E-12),(0.9613077859588679,-0.27547657006515003,7.597338204954958E-13),(0.9847230941359283,-0.1741276195075437,4.800379396412254E-13),(0.9847230941359283,-0.1741276195075437,4.800379396412254E-13),(0.9613077859588944,-0.2754765700650575,7.597338204952404E-13),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(0.9850106999604984,0.17249324903696736,-4.762526691900688E-13),(0.961494983772804,0.27482248121239206,-7.586557100134991E-13),(0.9614949837727872,0.2748224812124512,-7.586557100136623E-13),(0.9850106999604984,0.17249324903696736,-4.762526691900688E-13),(0.9614949837727872,0.2748224812124512,-7.586557100136623E-13),(0.9273794962553793,0.37412199871849183,-1.0326951325351982E-12),(0.9273794962553793,0.37412199871849183,-1.0326951325351982E-12),(0.961494983772804,0.27482248121239206,-7.586557100134991E-13),(0.39266811686769704,0.9196802433430745,-2.5377567602740978E-12),(0.20039929722533367,0.9797143061482733,-2.703324369409979E-12),(0.39266811686769704,0.9196802433430745,-2.5377567602740978E-12),(0.20039929722545546,0.9797143061482484,-2.70332436940991E-12),(0.20039929722545546,0.9797143061482484,-2.70332436940991E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(0.20039929722533367,0.9797143061482733,-2.703324369409979E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.5672614750584477,-0.8235377458954231,2.272030705111775E-12),(0.7214044108111475,-0.6925140258956646,1.9105417961330917E-12),(0.5672614750584477,-0.8235377458954231,2.272030705111775E-12),(0.7214044108112989,-0.6925140258955068,1.9105417961326563E-12),(0.7214044108111475,-0.6925140258956646,1.9105417961330917E-12),(0.8460222407894723,-0.533147604411349,1.4708596466181826E-12),(0.8460222407894723,-0.533147604411349,1.4708596466181826E-12),(0.7214044108112989,-0.6925140258955068,1.9105417961326563E-12),(0.9941612242434783,-0.10790486648297534,2.973505253230838E-13),(0.9985392391497385,-0.05403136013706897,1.4868674680552338E-13),(0.9985392391497395,-0.05403136013705052,1.4868674680547246E-13),(0.9941612242434783,-0.10790486648297534,2.973505253230838E-13),(0.9985392391497395,-0.05403136013705052,1.4868674680547246E-13),(0.9985392391497385,0.05403136013706627,-1.494550711432269E-13),(0.9985392391497392,0.05403136013705363,-1.4945507114319202E-13),(0.9985392391497385,-0.05403136013706897,1.4868674680552338E-13),(0.9985392391497392,0.05403136013705363,-1.4945507114319202E-13),(0.9941612242434782,0.10790486648297547,-2.980620827833876E-13),(0.9941612242434782,0.10790486648297547,-2.980620827833876E-13),(0.9985392391497385,0.05403136013706627,-1.494550711432269E-13),(0.8460222407894717,0.5331476044113498,-1.4712868797897129E-12),(0.7214044108113186,0.6925140258954865,-1.9109997887221433E-12),(0.7214044108112997,0.692514025895506,-1.910999788722197E-12),(0.8460222407894717,0.5331476044113498,-1.4712868797897129E-12),(0.7214044108113186,0.6925140258954865,-1.9109997887221433E-12),(0.5672614750584499,0.8235377458954214,-2.272500712737609E-12),(0.7214044108112997,0.692514025895506,-1.910999788722197E-12),(0.5672614750584499,0.8235377458954214,-2.272500712737609E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(0.8194722387884859,-0.5731188793391707,1.5810498883526226E-12),(0.7574045442264342,-0.6529459061707545,1.8013695823438973E-12),(0.7574045442264348,-0.6529459061707537,1.8013695823438946E-12),(0.8194722387884859,-0.5731188793391707,1.5810498883526226E-12),(0.7574045442264342,-0.6529459061707545,1.8013695823438973E-12),(0.5831639704137161,-0.8123544691889808,2.2412692678207284E-12),(0.7574045442264348,-0.6529459061707537,1.8013695823438946E-12),(0.5831639704137412,-0.8123544691889626,2.241269267820678E-12),(0.5831639704137412,-0.8123544691889626,2.241269267820678E-12),(0.31974002036267996,-0.9475053136412869,2.6142449584904734E-12),(0.5831639704137161,-0.8123544691889808,2.2412692678207284E-12),(0.319740020362648,-0.9475053136412975,2.6142449584905033E-12),(0.319740020362648,-0.9475053136412975,2.6142449584905033E-12),(0.012699053705094221,-0.9999193637663966,2.7589866204537582E-12),(0.31974002036267996,-0.9475053136412869,2.6142449584904734E-12),(0.012699053705109462,-0.9999193637663963,2.758986620453758E-12),(0.012699053705094221,-0.9999193637663966,2.7589866204537582E-12),(-0.2815655603975037,-0.9595419924099412,2.6476748355431836E-12),(-0.28156556039743486,-0.9595419924099615,2.6476748355432398E-12),(0.012699053705109462,-0.9999193637663963,2.758986620453758E-12),(-0.28156556039743486,-0.9595419924099615,2.6476748355432398E-12),(-0.5404333018571531,-0.8413868588489932,2.3217812285410913E-12),(-0.5404333018571273,-0.8413868588490098,2.321781228541137E-12),(-0.2815655603975037,-0.9595419924099412,2.6476748355431836E-12),(-0.5404333018571273,-0.8413868588490098,2.321781228541137E-12),(-0.7333107949378317,-0.679893578457427,1.876303348809737E-12),(-0.7333107949378401,-0.679893578457418,1.8763033488097133E-12),(-0.5404333018571531,-0.8413868588489932,2.3217812285410913E-12),(-0.7333107949378317,-0.679893578457427,1.876303348809737E-12),(-0.85710093432464,-0.5151485109944793,1.4218044445585983E-12),(-0.7333107949378401,-0.679893578457418,1.8763033488097133E-12),(-0.8571009343246485,-0.5151485109944651,1.4218044445585592E-12),(-0.8571009343246485,-0.5151485109944651,1.4218044445585592E-12),(-0.9309474157192527,-0.3651532680473299,1.0079394037893446E-12),(-0.85710093432464,-0.5151485109944793,1.4218044445585983E-12),(-0.930947415719251,-0.36515326804733417,1.0079394037893565E-12),(-0.930947415719251,-0.36515326804733417,1.0079394037893565E-12),(-0.9717468331379574,-0.23602561786033077,6.516263601143863E-13),(-0.9309474157192527,-0.3651532680473299,1.0079394037893446E-12),(-0.9717468331379546,-0.2360256178603423,6.51626360114418E-13),(-0.9717468331379546,-0.2360256178603423,6.51626360114418E-13),(-0.9931098274040329,-0.11718733171094986,3.2378970049221816E-13),(-0.9717468331379574,-0.23602561786033077,6.516263601143863E-13),(-0.9931098274040345,-0.11718733171093665,3.237897004921817E-13),(-0.9931098274040345,-0.11718733171093665,3.237897004921817E-13),(-0.9999579620805331,-0.009169191444583457,2.5810174329305112E-14),(-0.9931098274040329,-0.11718733171094986,3.2378970049221816E-13),(-0.999957962080533,-0.009169191444587095,2.5810174329315156E-14),(-0.999957962080533,-0.009169191444587095,2.5810174329315156E-14),(-0.9967023029360895,0.08114505112387324,-2.2349605982544233E-13),(-0.9999579620805331,-0.009169191444583457,2.5810174329305112E-14),(-0.99670230293609,0.08114505112386672,-2.2349605982542423E-13),(-0.99670230293609,0.08114505112386672,-2.2349605982542423E-13),(-0.9857538147747091,0.1681945797494925,-4.637583125086542E-13),(-0.9967023029360895,0.08114505112387324,-2.2349605982544233E-13),(-0.9857538147747111,0.16819457974948096,-4.637583125086222E-13),(-0.9857538147747111,0.16819457974948096,-4.637583125086222E-13),(-0.9654101412336203,0.2607359952198415,-7.190186417948188E-13),(-0.9857538147747091,0.1681945797494925,-4.637583125086542E-13),(-0.965410141233624,0.2607359952198281,-7.190186417947818E-13),(-0.965410141233624,0.2607359952198281,-7.190186417947818E-13),(-0.933824740070633,0.35773084132069843,-9.86658870278793E-13),(-0.9654101412336203,0.2607359952198415,-7.190186417948188E-13),(-0.9338247400706331,0.35773084132069827,-9.866588702787927E-13),(-0.9338247400706331,0.35773084132069827,-9.866588702787927E-13),(-0.8875957509041146,0.46062325492419615,-1.2707417486767114E-12),(-0.933824740070633,0.35773084132069843,-9.86658870278793E-13),(-0.8875957509041126,0.4606232549242002,-1.2707417486767224E-12),(-0.8875957509041126,0.4606232549242002,-1.2707417486767224E-12),(-0.8198049388265566,0.5726428749889289,-1.5798857547854198E-12),(-0.8875957509041146,0.46062325492419615,-1.2707417486767114E-12),(-0.8198049388265604,0.5726428749889235,-1.579885754785405E-12),(-0.8198049388265604,0.5726428749889235,-1.579885754785405E-12),(-0.7226711292766191,0.6911920419898193,-1.9069100847534236E-12),(-0.8198049388265566,0.5726428749889289,-1.5798857547854198E-12),(-0.72267112927662,0.6911920419898184,-1.9069100847534215E-12),(-0.7226711292766191,0.6911920419898193,-1.9069100847534236E-12),(-0.5715761942912859,0.8205489955630256,-2.263841563731924E-12),(-0.5715761942912485,0.8205489955630516,-2.2638415637319953E-12),(-0.72267112927662,0.6911920419898184,-1.9069100847534215E-12),(-0.5715761942912485,0.8205489955630516,-2.2638415637319953E-12),(-0.32253970058651305,0.9465559368286496,-2.6116036471203024E-12),(-0.3225397005865269,0.9465559368286449,-2.61160364712029E-12),(-0.5715761942912859,0.8205489955630256,-2.263841563731924E-12),(-0.32253970058651305,0.9465559368286496,-2.6116036471203024E-12),(-0.020372124653166207,0.9997924667335297,-2.7586323140839245E-12),(-0.3225397005865269,0.9465559368286449,-2.61160364712029E-12),(-0.020372124653076713,0.9997924667335314,-2.7586323140839294E-12),(-0.020372124653076713,0.9997924667335314,-2.7586323140839294E-12),(0.2554134767478519,0.9668319170856817,-2.6677939307232644E-12),(-0.020372124653166207,0.9997924667335297,-2.7586323140839245E-12),(0.2554134767478819,0.966831917085674,-2.667793930723243E-12),(0.2554134767478819,0.966831917085674,-2.667793930723243E-12),(0.4905585459952012,0.8714082355308989,-2.4045729180556356E-12),(0.2554134767478519,0.9668319170856817,-2.6677939307232644E-12),(0.4905585459951662,0.8714082355309185,-2.4045729180556897E-12),(0.4905585459951662,0.8714082355309185,-2.4045729180556897E-12),(0.6462378453519138,0.7631360607617204,-2.105859975454982E-12),(0.4905585459952012,0.8714082355308989,-2.4045729180556356E-12),(0.6462378453519321,0.7631360607617048,-2.105859975454939E-12),(0.6462378453519321,0.7631360607617048,-2.105859975454939E-12),(0.6427392629565304,0.7660850082426206,-2.114035615641559E-12),(0.6462378453519138,0.7631360607617204,-2.105859975454982E-12),(0.6427392629565538,0.7660850082426012,-2.114035615641506E-12),(0.6427392629565538,0.7660850082426012,-2.114035615641506E-12),(0.5846038255640064,0.8113189059401544,-2.2388891068567362E-12),(0.6427392629565304,0.7660850082426206,-2.114035615641559E-12),(0.5846038255640064,0.8113189059401544,-2.2388891068567362E-12),(-0.8601478920980623,0.5100447075691115,-1.407188033452448E-12),(-0.8601478920980623,0.5100447075691115,-1.407188033452448E-12),(-0.8601478920980623,0.5100447075691115,-1.407188033452448E-12),(-0.8601478920980623,0.5100447075691115,-1.407188033452448E-12),(0.8094388435365366,0.587204188144324,-1.6206665519976049E-12),(0.8094388435365366,0.587204188144324,-1.6206665519976049E-12),(0.8094388435365366,0.587204188144324,-1.6206665519976049E-12),(0.8094388435365366,0.587204188144324,-1.6206665519976049E-12),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.20007400713178178,0.9797807875592539,-2.7033584180232285E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.20007400713178408,0.9797807875592535,-2.7033584180232265E-12),(-0.20007400713178178,0.9797807875592539,-2.7033584180232285E-12),(-0.39205733655535946,0.9199407833404918,-2.5381829222655227E-12),(-0.39205733655535946,0.9199407833404918,-2.5381829222655227E-12),(-0.20007400713178408,0.9797807875592535,-2.7033584180232265E-12),(-0.9271481171496652,0.3746950344824856,-1.0335964550318161E-12),(-0.9613689058329687,0.2752631956828236,-7.592106642047286E-13),(-0.9271481171496652,0.3746950344824856,-1.0335964550318161E-12),(-0.9613689058329603,0.27526319568285385,-7.592106642048122E-13),(-0.9613689058329603,0.27526319568285385,-7.592106642048122E-13),(-0.9849591146664011,0.17278756447030438,-4.764297094192548E-13),(-0.9613689058329687,0.2752631956828236,-7.592106642047286E-13),(-0.9849591146664011,0.17278756447030438,-4.764297094192548E-13),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.9850568535010445,-0.17222948461463247,4.75586536429681E-13),(-0.9627290187837485,-0.27046781026895017,7.466890493834043E-13),(-0.9850568535010445,-0.17222948461463247,4.75586536429681E-13),(-0.9627290187837382,-0.27046781026898703,7.466890493835058E-13),(-0.9627290187837382,-0.27046781026898703,7.466890493835058E-13),(-0.8103422277042297,-0.5859568874920293,1.6171249937827063E-12),(-0.9627290187837485,-0.27046781026895017,7.466890493834043E-13),(-0.8103422277044079,-0.5859568874917825,1.6171249937820251E-12),(-0.8103422277042297,-0.5859568874920293,1.6171249937827063E-12),(-0.4221218672866538,-0.9065390941147706,2.5014806456189974E-12),(-0.4221218672864479,-0.9065390941148664,2.5014806456192615E-12),(-0.8103422277044079,-0.5859568874917825,1.6171249937820251E-12),(-0.4221218672866538,-0.9065390941147706,2.5014806456189974E-12),(-0.08899635085419966,-0.9960319520651113,2.7482965185656148E-12),(-0.4221218672864479,-0.9065390941148664,2.5014806456192615E-12),(-0.0889963508542073,-0.9960319520651107,2.748296518565613E-12),(-0.0889963508542073,-0.9960319520651107,2.748296518565613E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.08899635085419966,-0.9960319520651113,2.7482965185656148E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-0.5879319010498562,0.808910427505977,-2.231756892673258E-12),(-0.7331764133481863,0.6800384892856356,-1.8761298446602966E-12),(-0.5879319010498562,0.808910427505977,-2.231756892673258E-12),(-0.7331764133483408,0.6800384892854691,-1.8761298446598374E-12),(-0.7331764133483408,0.6800384892854691,-1.8761298446598374E-12),(-0.8507772826193465,0.5255264173938747,-1.449765300520372E-12),(-0.7331764133481863,0.6800384892856356,-1.8761298446602966E-12),(-0.8507772826193465,0.5255264173938747,-1.449765300520372E-12),(-0.994236246863432,0.10721140528375207,-2.9557416676977597E-13),(-0.9985580220656773,0.053683112505539504,-1.4779448814083628E-13),(-0.994236246863432,0.10721140528375207,-2.9557416676977597E-13),(-0.9985580220656758,0.05368311250556889,-1.4779448814091739E-13),(-0.9985580220656758,0.05368311250556889,-1.4779448814091739E-13),(-0.9997372811223786,-0.02292092349872179,6.371086171698986E-14),(-0.9985580220656773,0.053683112505539504,-1.4779448814083628E-13),(-0.9997372811223787,-0.022920923498718163,6.371086171697985E-14),(-0.9997372811223787,-0.022920923498718163,6.371086171697985E-14),(-0.9919210150229111,-0.12685700593943586,3.5043000653799684E-13),(-0.9997372811223786,-0.02292092349872179,6.371086171698986E-14),(-0.9919210150229133,-0.1268570059394175,3.504300065379463E-13),(-0.9919210150229133,-0.1268570059394175,3.504300065379463E-13),(-0.9257138949175407,-0.3782245163346722,1.0438828252353874E-12),(-0.9919210150229111,-0.12685700593943586,3.5043000653799684E-13),(-0.9257138949176085,-0.37822451633450616,1.0438828252349294E-12),(-0.9257138949176085,-0.37822451633450616,1.0438828252349294E-12),(-0.7298956734501633,-0.6835585606798681,1.8863696681107947E-12),(-0.9257138949175407,-0.3782245163346722,1.0438828252353874E-12),(-0.7298956734503311,-0.6835585606796888,1.8863696681103E-12),(-0.7298956734501633,-0.6835585606798681,1.8863696681107947E-12),(-0.5913596447695312,-0.8064079430028291,2.2253445402944234E-12),(-0.5913596447695312,-0.8064079430028291,2.2253445402944234E-12),(-0.7298956734503311,-0.6835585606796888,1.8863696681103E-12),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(1.,-1.0761972206014587E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.9832650394637132,-0.1821808501693379,5.029534930523218E-13),(-0.9604389766296769,-0.2784905243819602,7.68703073883952E-13),(-0.9832650394637132,-0.1821808501693379,5.029534930523218E-13),(-0.9604389766296851,-0.27849052438193206,7.687030738838744E-13),(-0.9604389766296851,-0.27849052438193206,7.687030738838744E-13),(-0.8061306092176251,-0.5917376453145607,1.633042341175724E-12),(-0.9604389766296769,-0.2784905243819602,7.68703073883952E-13),(-0.8061306092174902,-0.5917376453147444,1.6330423411762306E-12),(-0.8061306092176251,-0.5917376453145607,1.633042341175724E-12),(-0.41737619275955723,-0.9087337969491049,2.5075716955816452E-12),(-0.41737619275961013,-0.9087337969490807,2.5075716955815774E-12),(-0.8061306092174902,-0.5917376453147444,1.6330423411762306E-12),(-0.41737619275955723,-0.9087337969491049,2.5075716955816452E-12),(-0.08763790369520662,-0.996152396893121,2.748618966472933E-12),(-0.41737619275961013,-0.9087337969490807,2.5075716955815774E-12),(-0.08763790369522421,-0.9961523968931193,2.748618966472928E-12),(-0.08763790369520662,-0.996152396893121,2.748618966472933E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.08763790369522421,-0.9961523968931193,2.748618966472928E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.0889963508542541,0.9960319520651065,-2.7482227869102188E-12),(-0.08899635085416185,0.9960319520651149,-2.7482227869102414E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-0.0889963508542541,0.9960319520651065,-2.7482227869102188E-12),(-0.4221218672866591,0.9065390941147681,-2.5011025798027962E-12),(-0.08899635085416185,0.9960319520651149,-2.7482227869102414E-12),(-0.4221218672868171,0.9065390941146945,-2.5011025798025927E-12),(-0.4221218672866591,0.9065390941147681,-2.5011025798027962E-12),(-0.8086796863923623,0.5882492369874786,-1.6227918032541926E-12),(-0.8086796863925253,0.5882492369872546,-1.6227918032535746E-12),(-0.4221218672868171,0.9065390941146945,-2.5011025798025927E-12),(-0.8086796863923623,0.5882492369874786,-1.6227918032541926E-12),(-0.9603664303895912,0.27874059514314464,-7.68765473876372E-13),(-0.8086796863925253,0.5882492369872546,-1.6227918032535746E-12),(-0.9603664303895675,0.2787405951432266,-7.687654738765981E-13),(-0.9603664303895675,0.2787405951432266,-7.687654738765981E-13),(-0.9830031215351425,0.18358884239562637,-5.061282200130533E-13),(-0.9603664303895912,0.27874059514314464,-7.68765473876372E-13),(-0.9830031215351425,0.18358884239562637,-5.061282200130533E-13),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(1.,-1.076197220601459E-42,-4.1142326944632687E-16),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.9829162037139709,-0.18405362391573804,5.082270444500651E-13),(-0.9589823266839851,-0.28346586586001943,7.825177676625602E-13),(-0.9829162037139709,-0.18405362391573804,5.082270444500651E-13),(-0.958982326683998,-0.28346586585997635,7.825177676624415E-13),(-0.958982326683998,-0.28346586585997635,7.825177676624415E-13),(-0.9250216907185411,-0.37991429520381537,1.0486267790740046E-12),(-0.9589823266839851,-0.28346586586001943,7.825177676625602E-13),(-0.9250216907185411,-0.37991429520381537,1.0486267790740046E-12),(-0.3977066570345201,-0.9175126238643406,2.53178942662325E-12),(-0.2030854206184859,-0.9791610245165054,2.7018047346717705E-12),(-0.20308542061864626,-0.9791610245164724,2.7018047346716792E-12),(-0.3977066570345201,-0.9175126238643406,2.53178942662325E-12),(-0.2030854206184859,-0.9791610245165054,2.7018047346717705E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(-0.20308542061864626,-0.9791610245164724,2.7018047346716792E-12),(9.87748143264719E-28,-1.,2.7592143574660292E-12),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-1.,1.076197220601459E-42,4.1142326944632687E-16),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-9.87748143264719E-28,1.,-2.7592143574660292E-12),(-1.3916449267378772E-27,1.,-2.75921435746603E-12),(-0.0889963508541417,0.9960319520651166,-2.748222786910245E-12),(-1.3916449267378772E-27,1.,-2.75921435746603E-12),(-0.08899635085414814,0.9960319520651161,-2.7482227869102426E-12),(-0.9603664303895796,0.2787405951431852,-7.687654738764872E-13),(-0.9830031215351425,0.18358884239562637,-5.061282200130533E-13),(-0.960366430389585,0.2787405951431661,-7.68765473876434E-13),(-0.9830031215351425,0.18358884239562637,-5.061282200130533E-13),(-0.08899635085414814,0.9960319520651161,-2.7482227869102426E-12),(-0.4221218672867729,0.9065390941147151,-2.5011025798026476E-12),(-0.0889963508541417,0.9960319520651166,-2.748222786910245E-12),(-0.4221218672867538,0.906539094114724,-2.5011025798026722E-12),(-0.4221218672867729,0.9065390941147151,-2.5011025798026476E-12),(-0.8086796863926498,0.5882492369870835,-1.622791803253106E-12),(-0.8086796863925306,0.5882492369872474,-1.6227918032535578E-12),(-0.4221218672867538,0.906539094114724,-2.5011025798026722E-12),(-0.8086796863926498,0.5882492369870835,-1.622791803253106E-12),(-0.960366430389585,0.2787405951431661,-7.68765473876434E-13),(-0.8086796863925306,0.5882492369872474,-1.6227918032535578E-12),(-0.9603664303895796,0.2787405951431852,-7.687654738764872E-13),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(2.8945509067095924E-15,-2.753816448777958E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(7.557487610135251E-15,-2.762882014836081E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(1.3441669640648582E-14,-2.7681850473853533E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(6.185937062280206E-16,-2.7588738478177244E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(1.1332245893860788E-14,-2.7463497837929584E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(2.8552679884047363E-16,-2.75749174968622E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.000777542147955E-15,-2.7643353439559525E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(9.666911356923053E-15,-2.7461948200471406E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.164932724450115E-14,-2.7571002251900776E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(3.2276178140971394E-15,-2.768257652314093E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(2.4210832979512604E-14,-2.7527431704243738E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(1.7843278820844355E-15,-2.7562066450224008E-12,-1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.),(6.581627720909097E-16,2.759214357466027E-12,1.)),$,((1,2,3),(2,1,4),(3,2,5),(3,5,6),(7,8,9),(8,7,10),(8,10,6),(8,6,11),(11,6,5),(8,11,12),(8,12,13),(14,15,16),(15,14,17),(17,14,18),(18,14,19),(19,14,20),(20,14,21),(20,21,22),(22,21,4),(22,4,1),(21,14,23),(23,14,24),(25,26,27),(26,25,22),(26,22,28),(28,22,1),(29,30,31),(30,29,32),(32,29,33),(32,33,25),(32,25,34),(34,25,27),(32,34,35),(36,37,38),(37,36,39),(40,41,42),(41,40,43),(44,45,46),(45,44,47),(48,49,50),(49,48,51),(52,53,54),(53,52,55),(56,57,58),(57,56,59),(60,61,62),(61,60,63),(64,65,66),(65,64,67),(68,69,70),(69,68,71),(72,73,74),(73,72,75),(76,77,78),(77,76,79),(80,81,82),(81,80,83),(84,85,86),(85,84,87),(88,89,90),(89,88,91),(92,93,94),(93,92,95),(96,97,98),(97,96,99),(100,101,102),(101,100,103),(104,105,106),(105,104,107),(108,109,110),(109,108,111),(112,113,114),(113,112,115),(116,117,118),(117,116,119),(120,121,122),(121,120,123),(124,125,126),(125,124,127),(128,129,130),(129,128,131),(132,133,134),(133,132,135),(136,137,138),(137,136,139),(140,141,142),(141,140,143),(144,145,146),(145,144,147),(148,149,150),(149,148,151),(152,153,154),(153,152,155),(156,157,158),(157,156,159),(160,161,162),(161,160,163),(164,165,166),(165,164,167),(168,169,170),(169,168,171),(172,173,174),(173,172,175),(176,177,178),(177,176,179),(180,181,182),(181,180,183),(184,185,186),(185,184,187),(188,189,190),(189,188,191),(192,193,194),(193,192,195),(196,197,198),(197,196,199),(200,201,202),(201,200,203),(204,205,206),(205,204,207),(208,209,210),(209,208,211),(212,213,214),(213,212,215),(216,217,218),(217,216,219),(220,221,222),(221,220,223),(224,225,226),(225,224,227),(228,229,230),(229,228,231),(232,233,234),(233,232,235),(236,237,238),(237,236,239),(240,241,242),(241,240,243),(244,245,246),(245,244,247),(248,249,250),(249,248,251),(252,253,254),(253,252,255),(256,257,258),(257,256,259),(260,261,262),(261,260,263),(264,265,266),(265,264,267),(268,269,270),(269,268,271),(272,273,274),(273,272,275),(276,277,278),(277,276,279),(280,281,282),(281,280,283),(284,285,286),(285,284,287),(288,289,290),(289,288,291),(292,293,294),(293,292,295),(296,297,298),(297,296,299),(300,301,302),(301,300,303),(304,305,306),(305,304,307),(308,309,310),(309,308,311),(312,313,314),(313,312,315),(316,317,318),(317,316,319),(320,321,322),(321,320,323),(324,325,326),(325,324,327),(328,329,330),(329,328,331),(332,333,334),(333,332,335),(336,337,338),(337,336,339),(340,341,342),(341,340,343),(344,345,346),(345,344,347),(348,349,350),(349,348,351),(352,353,354),(353,352,355),(356,357,358),(357,356,359),(360,361,362),(361,360,363),(364,365,366),(365,364,367),(368,369,370),(369,368,371),(372,373,374),(373,372,375),(373,375,376),(376,375,377),(377,375,378),(377,378,379),(379,378,380),(380,378,381),(380,381,382),(382,381,383),(382,383,384),(384,383,385),(384,385,386),(386,385,387),(387,385,388),(387,388,389),(387,389,390),(390,389,391),(390,391,392),(392,391,393),(392,393,394),(394,393,395),(394,395,396),(396,395,397),(396,397,398),(398,397,399),(398,399,400),(400,399,401),(402,403,404),(403,402,405),(405,402,406),(405,406,407),(407,406,372),(407,372,408),(408,372,409),(409,372,374),(409,374,410),(409,410,411),(411,410,412),(411,412,413),(411,413,414),(414,413,415),(414,415,416),(414,416,417),(417,416,418),(417,418,419),(419,418,420),(419,420,421),(421,420,422),(421,422,423),(421,423,424),(424,423,425),(424,425,426),(426,425,427),(426,427,428),(428,427,429),(428,429,430),(430,429,431),(430,431,432),(430,432,433),(433,432,434),(433,434,401),(433,401,399),(433,399,435),(433,435,436),(436,435,437),(436,437,438),(436,438,439),(439,438,440),(439,440,441),(442,443,444),(443,442,445),(446,447,448),(447,446,449),(450,451,452),(451,450,453),(454,455,456),(455,454,457),(458,459,460),(459,458,461),(462,463,464),(463,462,465),(466,467,468),(467,466,469),(470,471,472),(471,470,473),(474,475,476),(475,474,477),(478,479,480),(479,478,481),(482,483,484),(483,482,485),(486,487,488),(487,486,489),(490,491,492),(491,490,493),(494,495,496),(495,494,497),(498,499,500),(499,498,501),(502,503,504),(503,502,505),(506,507,508),(507,506,509),(510,511,512),(511,510,513),(514,515,516),(515,514,517),(518,519,520),(519,518,521),(522,523,524),(523,522,525),(526,527,528),(527,526,529),(530,531,532),(531,530,533),(534,535,536),(535,534,537),(538,539,540),(539,538,541),(542,543,544),(543,542,545),(546,547,548),(547,546,549),(550,551,552),(551,550,553),(554,555,556),(555,554,557),(558,559,560),(559,558,561),(562,563,564),(563,562,565),(566,567,568),(567,566,569),(570,571,572),(571,570,573),(574,575,576),(575,574,577),(578,579,580),(579,578,581),(582,583,584),(583,582,585),(586,587,588),(587,586,589),(590,591,592),(591,590,593),(594,595,596),(595,594,597),(598,599,600),(599,598,601),(602,603,604),(603,602,605),(606,607,608),(607,606,609),(610,611,612),(611,610,613),(614,615,616),(615,614,617),(618,619,620),(619,618,621),(622,623,624),(623,622,625),(626,627,628),(627,626,629),(630,631,632),(631,630,633),(634,635,636),(635,634,637),(638,639,640),(639,638,641),(642,643,644),(643,642,645),(646,647,648),(647,646,649),(650,651,652),(651,650,653),(654,655,656),(655,654,657),(658,659,660),(659,658,661),(662,663,664),(663,662,665),(666,667,668),(667,666,669),(670,671,672),(671,670,673),(674,675,676),(675,674,677),(678,679,680),(679,678,681),(682,683,684),(683,682,685),(686,687,688),(687,686,689),(690,691,692),(691,690,693),(694,695,696),(695,694,697),(698,699,700),(699,698,701),(702,703,704),(703,702,705),(706,707,708),(707,706,709),(710,711,712),(711,710,713),(714,715,716),(715,714,717),(718,719,720),(719,718,721),(722,723,724),(723,722,725),(725,722,726),(726,722,727),(727,722,728),(728,722,729),(728,729,730),(730,729,731),(729,722,732),(732,722,733),(732,733,734),(734,733,735),(734,735,736),(736,735,737),(736,737,738),(736,738,739),(739,738,740),(739,740,741),(742,743,744),(743,742,745),(745,742,746),(745,746,747),(745,747,730),(745,730,748),(748,730,749),(749,730,731),(745,748,750),(745,750,751),(752,753,754),(753,752,755),(756,757,758),(757,756,759),(760,761,762),(761,760,763),(764,765,766),(765,764,767),(768,769,770),(769,768,771),(772,773,774),(773,772,775),(776,777,778),(777,776,779),(780,781,782),(781,780,783),(784,785,786),(785,784,787),(788,789,790),(789,788,791),(792,793,794),(793,792,795),(796,797,798),(797,796,799),(800,801,802),(801,800,803),(804,805,806),(805,804,807),(808,809,810),(809,808,811),(812,813,814),(813,812,815),(816,817,818),(817,816,819),(820,821,822),(821,820,823),(824,825,826),(825,824,827),(828,829,830),(829,828,831),(832,833,834),(833,832,835),(836,837,838),(837,836,839),(840,841,842),(841,840,843),(844,845,846),(845,844,847),(848,849,850),(849,848,851),(852,853,854),(853,852,855),(856,857,858),(857,856,859),(860,861,862),(861,860,863),(864,865,866),(865,864,867),(868,869,870),(869,868,871),(872,873,874),(873,872,875),(873,875,876),(876,875,877),(877,875,878),(878,875,879),(879,875,880),(880,875,881),(880,881,882),(882,881,883),(882,883,884),(884,883,885),(884,885,886),(886,885,887),(887,885,888),(887,888,889),(889,888,890),(889,890,891),(891,890,892),(892,890,893),(892,893,894),(895,896,897),(896,895,898),(896,898,899),(896,899,900),(896,900,901),(901,900,877),(901,877,878),(896,901,902),(896,902,903),(896,903,904),(904,903,905),(904,905,906),(906,905,907),(906,907,908),(908,907,909),(908,909,910),(910,909,911),(910,911,912),(912,911,913),(912,913,914),(912,914,915),(915,914,894),(915,894,893),(915,893,916),(915,916,917),(917,916,918),(917,918,919),(919,918,920),(919,920,921),(919,921,922),(923,924,925),(924,923,926),(927,928,929),(928,927,930),(931,932,933),(932,931,934),(935,936,937),(936,935,938),(939,940,941),(940,939,942),(943,944,945),(944,943,946),(947,948,949),(948,947,950),(951,952,953),(952,951,954),(955,956,957),(956,955,958),(959,960,961),(960,959,962),(963,964,965),(964,963,966),(967,968,969),(968,967,970),(971,972,973),(972,971,974),(975,976,977),(976,975,978),(979,980,981),(980,979,982),(983,984,985),(984,983,986),(987,988,989),(988,987,990),(991,992,993),(992,991,994),(995,996,997),(996,995,998),(999,1000,1001),(1000,999,1002),(1003,1004,1005),(1004,1003,1006),(1007,1008,1009),(1008,1007,1010),(1011,1012,1013),(1012,1011,1014),(1015,1016,1017),(1016,1015,1018),(1019,1020,1021),(1020,1019,1022),(1023,1024,1025),(1024,1023,1026),(1027,1028,1029),(1028,1027,1030),(1031,1032,1033),(1032,1031,1034),(1035,1036,1037),(1036,1035,1038),(1039,1040,1041),(1040,1039,1042),(1043,1044,1045),(1044,1043,1046),(1047,1048,1049),(1048,1047,1050),(1051,1052,1053),(1052,1051,1054),(1055,1056,1057),(1056,1055,1058),(1059,1060,1061),(1060,1059,1062),(1063,1064,1065),(1064,1063,1066),(1067,1068,1069),(1068,1067,1070),(1071,1072,1073),(1072,1071,1074),(1075,1076,1077),(1076,1075,1078),(1079,1080,1081),(1080,1079,1082),(1083,1084,1085),(1084,1083,1086),(1087,1088,1089),(1088,1087,1090),(1091,1092,1093),(1092,1091,1094),(1095,1096,1097),(1096,1095,1098),(1099,1100,1101),(1100,1099,1102),(1103,1104,1105),(1104,1103,1106),(1107,1108,1109),(1108,1107,1110),(1111,1112,1113),(1112,1111,1114),(1115,1116,1117),(1116,1115,1118),(1119,1120,1121),(1120,1119,1122),(1123,1124,1125),(1124,1123,1126),(1127,1128,1129),(1128,1127,1130),(1130,1127,1131),(1131,1127,1132),(1132,1127,1133),(1132,1133,1134),(1133,1127,1135),(1135,1127,1136),(1136,1127,1137),(1136,1137,1138),(1136,1138,1139),(1139,1138,1140),(1139,1140,1141),(1141,1140,1142),(1141,1142,1143),(1143,1142,1144),(1145,1146,1133),(1146,1145,1147),(1147,1145,1148),(1147,1148,1149),(1147,1149,1150),(1150,1149,1151),(1151,1149,1152),(1151,1152,1153),(1153,1152,1154),(1153,1154,1155),(1155,1154,1156),(1155,1156,1157),(1158,1159,1160),(1159,1158,1161),(1159,1161,1162),(1159,1162,1163),(1159,1163,1134),(1159,1134,1164),(1164,1134,1133),(1164,1133,1146),(1159,1164,1165),(1159,1165,1166),(1159,1166,1167),(1167,1166,1168),(1168,1166,1169),(1168,1169,1170),(1170,1169,1171),(1170,1171,1172),(1172,1171,1173),(1172,1173,1174),(1172,1174,1175),(1176,1177,1178),(1177,1176,1179),(1180,1181,1182),(1181,1180,1183),(1184,1185,1186),(1185,1184,1187),(1188,1189,1190),(1189,1188,1191),(1192,1193,1194),(1193,1192,1195),(1196,1197,1198),(1197,1196,1199),(1200,1201,1202),(1201,1200,1203),(1204,1205,1206),(1205,1204,1207),(1208,1209,1210),(1209,1208,1211),(1212,1213,1214),(1213,1212,1215),(1216,1217,1218),(1217,1216,1219),(1220,1221,1222),(1221,1220,1223),(1224,1225,1226),(1225,1224,1227),(1228,1229,1230),(1229,1228,1231),(1232,1233,1234),(1233,1232,1235),(1236,1237,1238),(1237,1236,1239),(1240,1241,1242),(1241,1240,1243),(1244,1245,1246),(1245,1244,1247),(1248,1249,1250),(1249,1248,1251),(1252,1253,1254),(1253,1252,1255),(1256,1257,1258),(1257,1256,1259),(1260,1261,1262),(1261,1260,1263),(1264,1265,1266),(1265,1264,1267),(1268,1269,1270),(1269,1268,1271),(1272,1273,1274),(1273,1272,1275),(1276,1277,1278),(1277,1276,1279),(1280,1281,1282),(1281,1280,1283),(1284,1285,1286),(1285,1284,1287),(1288,1289,1290),(1289,1288,1291),(1292,1293,1294),(1293,1292,1295),(1296,1297,1298),(1297,1296,1299),(1300,1301,1302),(1301,1300,1303),(1304,1305,1306),(1305,1304,1307),(1308,1309,1310),(1309,1308,1311),(1312,1313,1314),(1313,1312,1315),(1316,1317,1318),(1317,1316,1319),(1320,1321,1322),(1321,1320,1323),(1324,1325,1326),(1325,1324,1327),(1328,1329,1330),(1329,1328,1331),(1332,1333,1334),(1333,1332,1335),(1336,1337,1338),(1337,1336,1339),(1340,1341,1342),(1341,1340,1343),(1344,1345,1346),(1345,1344,1347),(1348,1349,1350),(1349,1348,1351),(1352,1353,1354),(1353,1352,1355),(1356,1357,1358),(1357,1356,1359),(1360,1361,1362),(1361,1360,1363),(1364,1365,1366),(1365,1364,1367),(1368,1369,1370),(1369,1368,1371),(1372,1373,1374),(1373,1372,1375),(1375,1372,1376),(1376,1372,1377),(1377,1372,1378),(1378,1372,1379),(1378,1379,1380),(1380,1379,1381),(1379,1372,1382),(1382,1372,1383),(1383,1372,1384),(1383,1384,1385),(1383,1385,1386),(1386,1385,1387),(1387,1385,1388),(1387,1388,1389),(1389,1388,1390),(1390,1388,1391),(1390,1391,1392),(1392,1391,1393),(1393,1391,1394),(1394,1391,1395),(1395,1391,1396),(1395,1396,1397),(1395,1397,1398),(1398,1397,1399),(1398,1399,1400),(1401,1402,1381),(1402,1401,1403),(1403,1401,1404),(1404,1401,1405),(1404,1405,1406),(1406,1405,1407),(1406,1407,1408),(1406,1408,1409),(1409,1408,1410),(1409,1410,1411),(1411,1410,1394),(1394,1410,1412),(1394,1412,1413),(1394,1413,1393),(1411,1414,1409),(1414,1411,1415),(1414,1415,1416),(1416,1415,1417),(1417,1415,1418),(1418,1415,1419),(1419,1415,1420),(1419,1420,1421),(1421,1420,1422),(1421,1422,1423),(1423,1422,1424),(1425,1426,1427),(1426,1425,1428),(1428,1425,1429),(1428,1429,1430),(1428,1430,1380),(1428,1380,1431),(1431,1380,1381),(1431,1381,1402),(1428,1431,1432),(1428,1432,1433),(1428,1433,1434),(1434,1433,1435),(1434,1435,1436),(1436,1435,1437),(1436,1437,1438),(1436,1438,1418),(1418,1438,1439),(1418,1439,1417),(1440,1441,1442),(1441,1440,1443),(1444,1445,1446),(1445,1444,1447),(1448,1449,1450),(1449,1448,1451),(1452,1453,1454),(1453,1452,1455),(1456,1457,1458),(1457,1456,1459),(1460,1461,1462),(1461,1460,1463),(1464,1465,1466),(1465,1464,1467),(1468,1469,1470),(1469,1468,1471),(1472,1473,1474),(1473,1472,1475),(1476,1477,1478),(1477,1476,1479),(1480,1481,1482),(1481,1480,1483),(1484,1485,1486),(1485,1484,1487),(1488,1489,1490),(1489,1488,1491),(1492,1493,1494),(1493,1492,1495),(1496,1497,1498),(1497,1496,1499),(1500,1501,1502),(1501,1500,1503),(1504,1505,1506),(1505,1504,1507),(1508,1509,1510),(1509,1508,1511),(1512,1513,1514),(1513,1512,1515),(1516,1517,1518),(1517,1516,1519),(1520,1521,1522),(1521,1520,1523),(1524,1525,1526),(1525,1524,1527),(1528,1529,1530),(1529,1528,1531),(1532,1533,1534),(1533,1532,1535),(1536,1537,1538),(1537,1536,1539),(1540,1541,1542),(1541,1540,1543),(1544,1545,1546),(1545,1544,1547),(1548,1549,1550),(1549,1548,1551),(1552,1553,1554),(1553,1552,1555),(1556,1557,1558),(1557,1556,1559),(1560,1561,1562),(1561,1560,1563),(1564,1565,1566),(1565,1564,1567),(1568,1569,1570),(1569,1568,1571),(1572,1573,1574),(1573,1572,1575),(1576,1577,1578),(1577,1576,1579),(1580,1581,1582),(1581,1580,1583),(1584,1585,1586),(1585,1584,1587),(1588,1589,1590),(1589,1588,1591),(1592,1593,1594),(1593,1592,1595),(1596,1597,1598),(1597,1596,1599),(1600,1601,1602),(1601,1600,1603),(1604,1605,1606),(1605,1604,1607),(1608,1609,1610),(1609,1608,1611),(1612,1613,1614),(1613,1612,1615),(1616,1617,1618),(1617,1616,1619),(1620,1621,1622),(1621,1620,1623),(1624,1625,1626),(1625,1624,1627),(1628,1629,1630),(1629,1628,1631),(1632,1633,1634),(1633,1632,1635),(1636,1637,1638),(1637,1636,1639),(1640,1641,1642),(1641,1640,1643),(1644,1645,1646),(1645,1644,1647),(1648,1649,1650),(1649,1648,1651),(1652,1653,1654),(1653,1652,1655),(1656,1657,1658),(1657,1656,1659),(1660,1661,1662),(1661,1660,1663),(1664,1665,1666),(1665,1664,1667),(1668,1669,1670),(1669,1668,1671),(1672,1673,1674),(1673,1672,1675),(1676,1677,1678),(1677,1676,1679),(1680,1681,1682),(1681,1680,1683),(1684,1685,1686),(1685,1684,1687),(1688,1689,1690),(1689,1688,1691),(1692,1693,1694),(1693,1692,1695),(1696,1697,1698),(1697,1696,1699),(1700,1701,1702),(1701,1700,1703),(1704,1705,1706),(1705,1704,1707),(1708,1709,1710),(1709,1708,1711),(1712,1713,1714),(1713,1712,1715),(1715,1712,1716),(1716,1712,1717),(1717,1712,1718),(1717,1718,1719),(1717,1719,1720),(1720,1719,1721),(1720,1721,1722),(1718,1712,1723),(1723,1712,1724),(1725,1726,1727),(1726,1725,1728),(1726,1728,1729),(1729,1728,1730),(1729,1730,1731),(1730,1728,1732),(1722,1733,1734),(1733,1722,1721),(1734,1733,1735),(1734,1735,1736),(1734,1736,1737),(1737,1736,1731),(1731,1736,1729),(1737,1738,1734),(1738,1737,1739),(1738,1739,1740),(1740,1739,1741),(1740,1741,1742),(1742,1741,1743),(1742,1743,1744),(1744,1743,1745),(1745,1743,1746),(1747,1748,1749),(1748,1747,1750),(1748,1750,1751),(1748,1751,1752),(1748,1752,1720),(1748,1720,1753),(1753,1720,1722),(1748,1753,1754),(1748,1754,1755),(1748,1755,1756),(1756,1755,1757),(1757,1755,1758),(1757,1758,1759),(1757,1759,1760),(1760,1759,1761),(1760,1761,1762),(1760,1762,1763),(1763,1762,1764),(1763,1764,1746),(1763,1746,1743),(1763,1743,1765),(1763,1765,1766),(1766,1765,1767),(1766,1767,1768),(1768,1767,1769),(1768,1769,1770),(1770,1769,1771),(1770,1771,1772),(1773,1774,1775),(1774,1773,1776),(1777,1778,1779),(1778,1777,1780),(1781,1782,1783),(1782,1781,1784),(1785,1786,1787),(1786,1785,1788),(1789,1790,1791),(1790,1789,1792),(1793,1794,1795),(1794,1793,1796),(1797,1798,1799),(1798,1797,1800),(1801,1802,1803),(1802,1801,1804),(1805,1806,1807),(1806,1805,1808),(1809,1810,1811),(1810,1809,1812),(1813,1814,1815),(1814,1813,1816),(1817,1818,1819),(1818,1817,1820),(1821,1822,1823),(1822,1821,1824),(1825,1826,1827),(1826,1825,1828),(1829,1830,1831),(1830,1829,1832),(1833,1834,1835),(1834,1833,1836),(1837,1838,1839),(1838,1837,1840),(1841,1842,1843),(1842,1841,1844),(1845,1846,1847),(1846,1845,1848),(1849,1850,1851),(1850,1849,1852),(1853,1854,1855),(1854,1853,1856),(1857,1858,1859),(1858,1857,1860),(1861,1862,1863),(1862,1861,1864),(1865,1866,1867),(1866,1865,1868),(1869,1870,1871),(1870,1869,1872),(1873,1874,1875),(1874,1873,1876),(1877,1878,1879),(1878,1877,1880),(1881,1882,1883),(1882,1881,1884),(1885,1886,1887),(1886,1885,1888),(1889,1890,1891),(1890,1889,1892),(1893,1894,1895),(1894,1893,1896),(1897,1898,1899),(1898,1897,1900),(1901,1902,1903),(1902,1901,1904),(1905,1906,1907),(1906,1905,1908),(1909,1910,1911),(1910,1909,1912),(1913,1914,1915),(1914,1913,1916),(1917,1918,1919),(1918,1917,1920),(1921,1922,1923),(1922,1921,1924),(1925,1926,1927),(1926,1925,1928),(1929,1930,1931),(1930,1929,1932),(1933,1934,1935),(1934,1933,1936),(1937,1938,1939),(1938,1937,1940),(1941,1942,1943),(1942,1941,1944),(1945,1946,1947),(1946,1945,1948),(1949,1950,1951),(1950,1949,1952),(1953,1954,1955),(1954,1953,1956),(1957,1958,1959),(1958,1957,1960),(1961,1962,1963),(1962,1961,1964),(1965,1966,1967),(1966,1965,1968),(1969,1970,1971),(1970,1969,1972),(1973,1974,1975),(1974,1973,1976),(1977,1978,1979),(1978,1977,1980),(1981,1982,1983),(1982,1981,1984),(1985,1986,1987),(1986,1985,1988),(1989,1990,1991),(1990,1989,1992),(1993,1994,1995),(1994,1993,1996),(1997,1998,1999),(1998,1997,2000),(2001,2002,2003),(2002,2001,2004),(2005,2006,2007),(2006,2005,2008),(2009,2010,2011),(2010,2009,2012),(2013,2014,2015),(2014,2013,2016),(2017,2018,2019),(2018,2017,2020),(2018,2020,2021),(2021,2020,2022),(2023,2024,2025),(2024,2023,2026),(2026,2023,2027),(2026,2027,2017),(2026,2017,2028),(2028,2017,2019),(2026,2028,2029),(2030,2031,2032),(2031,2030,2033),(2033,2030,2034),(2034,2030,2035),(2035,2030,2036),(2036,2030,2037),(2036,2037,2020),(2020,2037,2038),(2020,2038,2022),(2022,2038,2039),(2037,2030,2040),(2040,2030,2041),(2039,2042,2022),(2042,2039,2043),(2042,2043,2044),(2045,2046,2047),(2046,2045,2048),(2046,2048,2044),(2046,2044,2049),(2049,2044,2043),(2046,2049,2050),(2046,2050,2051),(2052,2053,2054),(2053,2052,2055),(2056,2057,2058),(2057,2056,2059),(2060,2061,2062),(2061,2060,2063),(2064,2065,2066),(2065,2064,2067),(2068,2069,2070),(2069,2068,2071),(2072,2073,2074),(2073,2072,2075),(2076,2077,2078),(2077,2076,2079),(2080,2081,2082),(2081,2080,2083),(2084,2085,2086),(2085,2084,2087),(2088,2089,2090),(2089,2088,2091),(2092,2093,2094),(2093,2092,2095),(2096,2097,2098),(2097,2096,2099),(2100,2101,2102),(2101,2100,2103),(2104,2105,2106),(2105,2104,2107),(2108,2109,2110),(2109,2108,2111),(2112,2113,2114),(2113,2112,2115),(2116,2117,2118),(2117,2116,2119),(2120,2121,2122),(2121,2120,2123),(2124,2125,2126),(2125,2124,2127),(2128,2129,2130),(2129,2128,2131),(2132,2133,2134),(2133,2132,2135),(2136,2137,2138),(2137,2136,2139),(2140,2141,2142),(2141,2140,2143),(2144,2145,2146),(2145,2144,2147),(2148,2149,2150),(2149,2148,2151),(2152,2153,2154),(2153,2152,2155),(2156,2157,2158),(2157,2156,2159),(2160,2161,2162),(2161,2160,2163),(2164,2165,2166),(2165,2164,2167),(2168,2169,2170),(2169,2168,2171),(2172,2173,2174),(2173,2172,2175),(2176,2177,2178),(2177,2176,2179),(2180,2181,2182),(2181,2180,2183),(2184,2185,2186),(2185,2184,2187),(2188,2189,2190),(2189,2188,2191),(2192,2193,2194),(2193,2192,2195),(2193,2195,2196),(2196,2195,2197),(2197,2195,2198),(2197,2198,2199),(2199,2198,2200),(2200,2198,2201),(2200,2201,2202),(2202,2201,2203),(2202,2203,2204),(2204,2203,2205),(2204,2205,2206),(2206,2205,2207),(2206,2207,2208),(2208,2207,2209),(2209,2207,2210),(2209,2210,2211),(2211,2210,2212),(2211,2212,2213),(2213,2212,2214),(2212,2215,2216),(2215,2212,2217),(2217,2212,2218),(2217,2218,2219),(2219,2218,2220),(2221,2222,2223),(2222,2221,2224),(2224,2221,2225),(2224,2225,2226),(2226,2225,2227),(2227,2225,2228),(2227,2228,2229),(2229,2228,2230),(2229,2230,2231),(2229,2231,2232),(2232,2231,2214),(2232,2214,2233),(2233,2214,2212),(2233,2212,2216),(2232,2233,2234),(2232,2234,2235),(2236,2237,2238),(2239,2240,2241),(2240,2239,2242),(2242,2239,2243),(2242,2243,2244),(2244,2243,2192),(2244,2192,2245),(2245,2192,2246),(2246,2192,2194),(2246,2194,2247),(2246,2247,2248),(2246,2248,2249),(2249,2248,2250),(2249,2250,2251),(2251,2250,2252),(2251,2252,2253),(2253,2252,2254),(2253,2254,2255),(2253,2255,2256),(2256,2255,2257),(2256,2257,2258),(2258,2257,2259),(2258,2259,2260),(2260,2259,2261),(2260,2261,2262),(2260,2262,2263),(2263,2262,2264),(2263,2264,2265),(2265,2264,2266),(2265,2266,2267),(2265,2267,2268),(2268,2267,2237),(2268,2237,2236),(2268,2236,2269),(2269,2236,2270),(2269,2270,2271),(2272,2273,2274),(2273,2272,2275),(2276,2277,2278),(2277,2276,2279),(2280,2281,2282),(2281,2280,2283),(2284,2285,2286),(2285,2284,2287),(2288,2289,2290),(2289,2288,2291),(2292,2293,2294),(2293,2292,2295),(2296,2297,2298),(2297,2296,2299),(2300,2301,2302),(2301,2300,2303),(2304,2305,2306),(2305,2304,2307),(2308,2309,2310),(2309,2308,2311),(2312,2313,2314),(2313,2312,2315),(2316,2317,2318),(2317,2316,2319),(2320,2321,2322),(2321,2320,2323),(2324,2325,2326),(2325,2324,2327),(2328,2329,2330),(2329,2328,2331),(2332,2333,2334),(2333,2332,2335),(2336,2337,2338),(2337,2336,2339),(2340,2341,2342),(2341,2340,2343),(2344,2345,2346),(2345,2344,2347),(2348,2349,2350),(2349,2348,2351),(2352,2353,2354),(2353,2352,2355),(2356,2357,2358),(2357,2356,2359),(2360,2361,2362),(2361,2360,2363),(2364,2365,2366),(2365,2364,2367),(2368,2369,2370),(2369,2368,2371),(2372,2373,2374),(2373,2372,2375),(2376,2377,2378),(2377,2376,2379),(2380,2381,2382),(2381,2380,2383),(2384,2385,2386),(2385,2384,2387),(2388,2389,2390),(2389,2388,2391),(2392,2393,2394),(2393,2392,2395),(2396,2397,2398),(2397,2396,2399),(2400,2401,2402),(2401,2400,2403),(2404,2405,2406),(2405,2404,2407),(2408,2409,2410),(2409,2408,2411),(2412,2413,2414),(2413,2412,2415),(2416,2417,2418),(2417,2416,2419),(2420,2421,2422),(2421,2420,2423),(2424,2425,2426),(2425,2424,2427),(2428,2429,2430),(2429,2428,2431),(2432,2433,2434),(2433,2432,2435),(2436,2437,2438),(2437,2436,2439),(2440,2441,2442),(2441,2440,2443),(2444,2445,2446),(2445,2444,2447),(2448,2449,2450),(2449,2448,2451),(2452,2453,2454),(2453,2452,2455),(2456,2457,2458),(2457,2456,2459),(2460,2461,2462),(2461,2460,2463),(2464,2465,2466),(2465,2464,2467),(2468,2469,2470),(2469,2468,2471),(2472,2473,2474),(2473,2472,2475),(2476,2477,2478),(2477,2476,2479),(2480,2481,2482),(2481,2480,2483),(2484,2485,2486),(2485,2484,2487),(2488,2489,2490),(2489,2488,2491),(2492,2493,2494),(2493,2492,2495),(2496,2497,2498),(2497,2496,2499),(2500,2501,2502),(2501,2500,2503),(2504,2505,2506),(2505,2504,2507),(2508,2509,2510),(2509,2508,2511),(2512,2513,2514),(2513,2512,2515),(2516,2517,2518),(2517,2516,2519),(2520,2521,2522),(2521,2520,2523),(2524,2525,2526),(2525,2524,2527),(2528,2529,2530),(2529,2528,2531),(2532,2533,2534),(2533,2532,2535),(2536,2537,2538),(2537,2536,2539),(2540,2541,2542),(2541,2540,2543),(2544,2545,2546),(2545,2544,2547),(2548,2549,2550),(2549,2548,2551),(2552,2553,2554),(2553,2552,2555),(2556,2557,2558),(2557,2556,2559),(2560,2561,2562),(2561,2560,2563),(2564,2565,2566),(2565,2564,2567),(2568,2569,2570),(2569,2568,2571),(2572,2573,2574),(2573,2572,2575),(2576,2577,2578),(2577,2576,2579),(2580,2581,2582),(2581,2580,2583),(2584,2585,2586),(2585,2584,2587),(2588,2589,2590),(2589,2588,2591),(2592,2593,2594),(2593,2592,2595),(2593,2595,2596),(2596,2595,2597),(2597,2595,2598),(2597,2598,2599),(2599,2598,2600),(2600,2598,2601),(2600,2601,2602),(2602,2601,2603),(2602,2603,2604),(2604,2603,2605),(2604,2605,2606),(2606,2605,2607),(2606,2607,2608),(2608,2607,2609),(2609,2607,2610),(2609,2610,2611),(2611,2610,2612),(2611,2612,2613),(2613,2612,2614),(2612,2615,2616),(2615,2612,2617),(2615,2617,2618),(2618,2617,2619),(2620,2621,2622),(2621,2620,2623),(2623,2620,2624),(2624,2620,2625),(2624,2625,2626),(2626,2625,2627),(2626,2627,2628),(2628,2627,2629),(2628,2629,2630),(2628,2630,2631),(2631,2630,2614),(2631,2614,2632),(2632,2614,2612),(2632,2612,2633),(2633,2612,2616),(2631,2632,2634),(2631,2634,2635),(2636,2637,2638),(2639,2640,2641),(2640,2639,2642),(2642,2639,2643),(2642,2643,2644),(2644,2643,2592),(2644,2592,2645),(2645,2592,2646),(2646,2592,2594),(2646,2594,2647),(2646,2647,2648),(2646,2648,2649),(2649,2648,2650),(2649,2650,2651),(2651,2650,2652),(2651,2652,2653),(2653,2652,2654),(2653,2654,2655),(2653,2655,2656),(2656,2655,2657),(2656,2657,2658),(2658,2657,2659),(2658,2659,2660),(2660,2659,2661),(2660,2661,2662),(2660,2662,2663),(2663,2662,2664),(2663,2664,2665),(2665,2664,2666),(2665,2666,2667),(2665,2667,2668),(2668,2667,2637),(2668,2637,2636),(2668,2636,2669),(2669,2636,2670),(2669,2670,2671),(2672,2673,2674),(2673,2672,2675),(2676,2677,2678),(2677,2676,2679),(2680,2681,2682),(2681,2680,2683),(2684,2685,2686),(2685,2684,2687),(2688,2689,2690),(2689,2688,2691),(2692,2693,2694),(2693,2692,2695),(2696,2697,2698),(2697,2696,2699),(2700,2701,2702),(2701,2700,2703),(2704,2705,2706),(2705,2704,2707),(2708,2709,2710),(2709,2708,2711),(2712,2713,2714),(2713,2712,2715),(2716,2717,2718),(2717,2716,2719),(2720,2721,2722),(2721,2720,2723),(2724,2725,2726),(2725,2724,2727),(2728,2729,2730),(2729,2728,2731),(2732,2733,2734),(2733,2732,2735),(2736,2737,2738),(2737,2736,2739),(2740,2741,2742),(2741,2740,2743),(2744,2745,2746),(2745,2744,2747),(2748,2749,2750),(2749,2748,2751),(2752,2753,2754),(2753,2752,2755),(2756,2757,2758),(2757,2756,2759),(2760,2761,2762),(2761,2760,2763),(2764,2765,2766),(2765,2764,2767),(2768,2769,2770),(2769,2768,2771),(2772,2773,2774),(2773,2772,2775),(2776,2777,2778),(2777,2776,2779),(2780,2781,2782),(2781,2780,2783),(2784,2785,2786),(2785,2784,2787),(2788,2789,2790),(2789,2788,2791),(2792,2793,2794),(2793,2792,2795),(2796,2797,2798),(2797,2796,2799),(2800,2801,2802),(2801,2800,2803),(2804,2805,2806),(2805,2804,2807),(2808,2809,2810),(2809,2808,2811),(2812,2813,2814),(2813,2812,2815),(2816,2817,2818),(2817,2816,2819),(2820,2821,2822),(2821,2820,2823),(2824,2825,2826),(2825,2824,2827),(2828,2829,2830),(2829,2828,2831),(2832,2833,2834),(2833,2832,2835),(2836,2837,2838),(2837,2836,2839),(2840,2841,2842),(2841,2840,2843),(2844,2845,2846),(2845,2844,2847),(2848,2849,2850),(2849,2848,2851),(2852,2853,2854),(2853,2852,2855),(2856,2857,2858),(2857,2856,2859),(2860,2861,2862),(2861,2860,2863),(2864,2865,2866),(2865,2864,2867),(2868,2869,2870),(2869,2868,2871),(2872,2873,2874),(2873,2872,2875),(2876,2877,2878),(2877,2876,2879),(2880,2881,2882),(2881,2880,2883),(2884,2885,2886),(2885,2884,2887),(2888,2889,2890),(2889,2888,2891),(2892,2893,2894),(2893,2892,2895),(2896,2897,2898),(2897,2896,2899),(2900,2901,2902),(2901,2900,2903),(2904,2905,2906),(2905,2904,2907),(2908,2909,2910),(2909,2908,2911),(2912,2913,2914),(2913,2912,2915),(2916,2917,2918),(2917,2916,2919),(2920,2921,2922),(2921,2920,2923),(2924,2925,2926),(2925,2924,2927),(2928,2929,2930),(2929,2928,2931),(2932,2933,2934),(2933,2932,2935),(2936,2937,2938),(2937,2936,2939),(2940,2941,2942),(2941,2940,2943),(2944,2945,2946),(2945,2944,2947),(2948,2949,2950),(2949,2948,2951),(2952,2953,2954),(2953,2952,2955),(2956,2957,2958),(2957,2956,2959),(2960,2961,2962),(2961,2960,2963),(2964,2965,2966),(2965,2964,2967),(2968,2969,2970),(2969,2968,2971),(2972,2973,2974),(2973,2972,2975),(2976,2977,2978),(2977,2976,2979),(2980,2981,2982),(2981,2980,2983),(2984,2985,2986),(2985,2984,2987),(2988,2989,2990),(2989,2988,2991),(2992,2993,2994),(2993,2992,2995),(2996,2997,2998),(2997,2996,2999),(3000,3001,3002),(3001,3000,3003),(3004,3005,3006),(3005,3004,3007),(3008,3009,3010),(3009,3008,3011),(3012,3013,3014),(3013,3012,3015),(3016,3017,3018),(3017,3016,3019),(3020,3021,3022),(3021,3020,3023),(3024,3025,3026),(3025,3024,3027),(3028,3029,3030),(3029,3028,3031),(3032,3033,3034),(3033,3032,3035),(3036,3037,3038),(3037,3036,3039),(3040,3041,3042),(3041,3040,3043),(3044,3045,3046),(3045,3044,3047),(3048,3049,3050),(3049,3048,3051),(3052,3053,3054),(3053,3052,3055),(3056,3057,3058),(3057,3056,3059),(3060,3061,3062),(3061,3060,3063),(3064,3065,3066),(3065,3064,3067),(3068,3069,3070),(3069,3068,3071),(3072,3073,3074),(3073,3072,3075),(3076,3077,3078),(3077,3076,3079),(3080,3081,3082),(3081,3080,3083),(3084,3085,3086),(3085,3084,3087),(3088,3089,3090),(3089,3088,3091),(3092,3093,3094),(3093,3092,3095),(3096,3097,3098),(3097,3096,3099),(3100,3101,3102),(3101,3100,3103),(3104,3105,3106),(3105,3104,3107),(3108,3109,3110),(3109,3108,3111),(3112,3113,3114),(3113,3112,3115),(3116,3117,3118),(3117,3116,3119),(3120,3121,3122),(3121,3120,3123),(3124,3125,3126),(3125,3124,3127),(3128,3129,3130),(3129,3128,3131),(3132,3133,3134),(3133,3132,3135),(3136,3137,3138),(3137,3136,3139),(3140,3141,3142),(3141,3140,3143),(3144,3145,3146),(3145,3144,3147),(3148,3149,3150),(3149,3148,3151),(3152,3153,3154),(3153,3152,3155),(3156,3157,3158),(3157,3156,3159),(3160,3161,3162),(3161,3160,3163),(3163,3160,3164),(3164,3160,3165),(3165,3160,3166),(3165,3166,3167),(3166,3160,3168),(3168,3160,3169),(3169,3160,3170),(3169,3170,3171),(3169,3171,3172),(3172,3171,3173),(3172,3173,3174),(3174,3173,3175),(3174,3175,3176),(3174,3176,3177),(3178,3179,3166),(3179,3178,3180),(3180,3178,3181),(3180,3181,3182),(3180,3182,3183),(3183,3182,3184),(3184,3182,3185),(3184,3185,3186),(3186,3185,3187),(3186,3187,3188),(3188,3187,3189),(3188,3189,3190),(3191,3192,3193),(3192,3191,3194),(3194,3191,3195),(3194,3195,3196),(3194,3196,3167),(3194,3167,3197),(3197,3167,3179),(3179,3167,3166),(3194,3197,3198),(3194,3198,3199),(3194,3199,3200),(3200,3199,3201),(3201,3199,3202),(3201,3202,3203),(3203,3202,3204),(3203,3204,3205),(3203,3205,3206),(3206,3205,3207),(3206,3207,3208),(3209,3210,3211),(3210,3209,3212),(3213,3214,3215),(3214,3213,3216),(3217,3218,3219),(3218,3217,3220),(3221,3222,3223),(3222,3221,3224),(3225,3226,3227),(3226,3225,3228),(3229,3230,3231),(3230,3229,3232),(3233,3234,3235),(3234,3233,3236),(3237,3238,3239),(3238,3237,3240),(3240,3237,3241),(3241,3237,3242),(3242,3237,3243),(3243,3237,3244),(3243,3244,3245),(3245,3244,3246),(3244,3237,3247),(3247,3237,3248),(3247,3248,3249),(3249,3248,3250),(3249,3250,3251),(3251,3250,3252),(3251,3252,3253),(3253,3252,3254),(3253,3254,3255),(3255,3254,3256),(3256,3254,3257),(3246,3258,3259),(3258,3246,3260),(3258,3260,3261),(3261,3260,3262),(3261,3262,3263),(3263,3262,3264),(3263,3264,3265),(3265,3264,3266),(3265,3266,3267),(3267,3266,3268),(3267,3268,3269),(3267,3269,3270),(3271,3272,3273),(3272,3271,3274),(3274,3271,3275),(3274,3275,3245),(3274,3245,3259),(3259,3245,3246),(3274,3259,3276),(3274,3276,3277),(3274,3277,3278),(3278,3277,3279),(3279,3277,3280),(3279,3280,3281),(3281,3280,3282),(3281,3282,3283),(3283,3282,3284),(3284,3282,3285),(3286,3287,3288),(3287,3286,3289),(3287,3289,3290),(3290,3289,3291),(3290,3291,3292),(3292,3291,3293),(3292,3293,3294),(3292,3294,3295),(3295,3294,3296),(3296,3294,3297),(3297,3294,3298),(3297,3298,3299),(3299,3298,3300),(3299,3300,3301),(3301,3300,3302),(3301,3302,3303),(3303,3302,3304),(3304,3302,3305),(3304,3305,3306),(3306,3305,3307),(3306,3307,3308),(3308,3307,3309),(3308,3309,3310),(3310,3309,3311),(3311,3309,3312),(3311,3312,3313),(3313,3312,3314),(3313,3314,3315),(3315,3314,3316),(3316,3314,3317),(3316,3317,3318),(3318,3317,3319),(3319,3317,3320),(3319,3320,3321),(3321,3320,3322),(3319,3323,3318),(3324,3325,3326),(3325,3324,3327),(3327,3324,3328),(3327,3328,3329),(3329,3328,3330),(3329,3330,3331),(3331,3330,3332),(3331,3332,3333),(3333,3332,3334),(3334,3332,3335),(3334,3335,3336),(3336,3335,3337),(3336,3337,3338),(3338,3337,3339),(3339,3337,3340),(3339,3340,3341),(3337,3335,3342),(3342,3335,3343),(3339,3344,3345),(3344,3339,3341),(3345,3344,3346),(3345,3346,3347),(3292,3348,3349),(3348,3292,3295),(3349,3348,3350),(3349,3350,3351),(3349,3351,3352),(3352,3351,3353),(3352,3353,3354),(3352,3354,3355),(3355,3354,3356),(3355,3356,3357),(3357,3356,3358),(3357,3358,3359),(3359,3358,3360),(3359,3360,3361),(3361,3360,3362),(3361,3362,3363),(3361,3363,3364),(3364,3363,3365),(3364,3365,3339),(3339,3365,3338),(3366,3367,3368),(3367,3366,3369),(3367,3369,3370),(3370,3369,3371),(3370,3371,3372),(3372,3371,3373),(3372,3373,3374),(3372,3374,3375),(3375,3374,3376),(3376,3374,3377),(3377,3374,3378),(3377,3378,3379),(3379,3378,3380),(3379,3380,3381),(3381,3380,3382),(3381,3382,3383),(3383,3382,3384),(3384,3382,3385),(3384,3385,3386),(3386,3385,3387),(3386,3387,3388),(3388,3387,3389),(3388,3389,3390),(3390,3389,3391),(3391,3389,3392),(3391,3392,3393),(3393,3392,3394),(3393,3394,3395),(3395,3394,3396),(3396,3394,3397),(3396,3397,3398),(3398,3397,3399),(3399,3397,3400),(3399,3400,3401),(3401,3400,3402),(3399,3403,3398),(3404,3405,3406),(3405,3404,3407),(3405,3407,3408),(3405,3408,3409),(3409,3408,3410),(3409,3410,3411),(3411,3410,3412),(3411,3412,3413),(3413,3412,3414),(3414,3412,3415),(3414,3415,3416),(3416,3415,3417),(3416,3417,3418),(3418,3417,3419),(3419,3417,3420),(3417,3415,3421),(3421,3415,3422),(3419,3423,3424),(3423,3419,3425),(3425,3419,3420),(3424,3423,3426),(3424,3426,3427),(3372,3428,3429),(3428,3372,3375),(3429,3428,3430),(3429,3430,3431),(3429,3431,3432),(3432,3431,3433),(3432,3433,3434),(3432,3434,3435),(3435,3434,3436),(3435,3436,3437),(3437,3436,3438),(3437,3438,3439),(3439,3438,3440),(3439,3440,3441),(3441,3440,3442),(3441,3442,3443),(3441,3443,3444),(3444,3443,3445),(3444,3445,3419),(3419,3445,3418),(3446,3447,3448),(3447,3446,3449),(3449,3446,3450),(3450,3446,3451),(3451,3446,3452),(3451,3452,3453),(3452,3446,3454),(3451,3455,3456),(3455,3451,3453),(3456,3455,3457),(3456,3457,3458),(3456,3458,3459),(3460,3461,3462),(3461,3460,3463),(3463,3460,3464),(3464,3460,3465),(3464,3465,3466),(3465,3460,3467),(3467,3460,3468),(3469,3470,3458),(3470,3469,3466),(3466,3469,3464),(3471,3472,3473),(3472,3471,3474),(3472,3474,3475),(3472,3475,3476),(3472,3476,3459),(3472,3459,3477),(3477,3459,3478),(3478,3459,3458),(3478,3458,3470),(3472,3477,3479),(3472,3479,3480),(3481,3482,3483),(3482,3481,3484),(3484,3481,3485),(3485,3481,3486),(3486,3481,3487),(3487,3481,3488),(3487,3488,3489),(3489,3488,3490),(3488,3481,3491),(3491,3481,3492),(3492,3481,3493),(3492,3493,3494),(3492,3494,3495),(3495,3494,3496),(3496,3494,3497),(3496,3497,3498),(3498,3497,3499),(3499,3497,3500),(3499,3500,3501),(3501,3500,3502),(3502,3500,3503),(3503,3500,3504),(3504,3500,3505),(3504,3505,3506),(3506,3505,3507),(3506,3507,3508),(3508,3507,3509),(3508,3509,3510),(3510,3509,3511),(3512,3513,3514),(3513,3512,3515),(3515,3512,3516),(3515,3516,3517),(3517,3516,3518),(3517,3518,3503),(3503,3518,3519),(3503,3519,3520),(3503,3520,3502),(3490,3521,3522),(3521,3490,3488),(3522,3521,3514),(3522,3514,3523),(3523,3514,3513),(3523,3513,3524),(3523,3524,3525),(3526,3527,3528),(3527,3526,3529),(3527,3529,3525),(3527,3525,3530),(3530,3525,3524),(3527,3530,3531),(3532,3533,3534),(3533,3532,3535),(3535,3532,3536),(3535,3536,3537),(3535,3537,3538),(3538,3537,3539),(3539,3537,3487),(3539,3487,3489),(3535,3538,3540),(3535,3540,3541),(3542,3543,3544),(3543,3542,3545),(3543,3545,3546),(3546,3545,3547),(3547,3545,3548),(3548,3545,3549),(3548,3549,3550),(3549,3545,3551),(3551,3545,3552),(3552,3545,3553),(3552,3553,3554),(3554,3553,3555),(3554,3555,3556),(3556,3555,3557),(3557,3555,3558),(3557,3558,3559),(3559,3558,3560),(3561,3562,3563),(3562,3561,3564),(3564,3561,3565),(3564,3565,3560),(3564,3560,3558),(3564,3558,3566),(3564,3566,3567),(3567,3566,3568),(3567,3568,3569),(3569,3568,3570),(3569,3570,3571),(3550,3572,3573),(3572,3550,3574),(3572,3574,3575),(3575,3574,3576),(3575,3576,3577),(3577,3576,3578),(3577,3578,3579),(3579,3578,3580),(3580,3578,3563),(3580,3563,3581),(3581,3563,3562),(3581,3562,3582),(3581,3582,3583),(3583,3582,3584),(3584,3582,3585),(3586,3587,3588),(3587,3586,3589),(3587,3589,3590),(3587,3590,3591),(3587,3591,3592),(3587,3592,3573),(3573,3592,3548),(3573,3548,3550),(3587,3573,3593),(3587,3593,3594),(3587,3594,3595),(3595,3594,3596),(3596,3594,3597),(3596,3597,3598),(3596,3598,3599),(3599,3598,3600),(3599,3600,3601),(3599,3601,3602),(3602,3601,3603),(3602,3603,3585),(3602,3585,3582),(3602,3582,3604),(3602,3604,3605),(3605,3604,3606),(3606,3604,3607),(3606,3607,3608),(3608,3607,3609),(3610,3611,3612),(3611,3610,3613),(3613,3610,3614),(3614,3610,3615),(3615,3610,3616),(3616,3610,3617),(3617,3610,3618),(3618,3610,3619),(3618,3619,3620),(3620,3619,3621),(3621,3619,3622),(3621,3622,3623),(3621,3623,3624),(3624,3623,3625),(3624,3625,3626),(3626,3625,3627),(3626,3627,3628),(3629,3630,3617),(3630,3629,3631),(3631,3629,3632),(3631,3632,3633),(3633,3632,3634),(3633,3634,3635),(3633,3635,3636),(3636,3635,3637),(3636,3637,3638),(3638,3637,3639),(3638,3639,3640),(3640,3639,3641),(3642,3643,3644),(3643,3642,3645),(3643,3645,3646),(3643,3646,3647),(3643,3647,3648),(3648,3647,3616),(3648,3616,3617),(3648,3617,3630),(3643,3648,3649),(3643,3649,3650),(3643,3650,3651),(3651,3650,3652),(3652,3650,3653),(3652,3653,3654),(3654,3653,3655),(3654,3655,3656),(3656,3655,3657),(3657,3655,3658),(3659,3660,3661),(3660,3659,3662),(3662,3659,3663),(3663,3659,3664),(3664,3659,3665),(3664,3665,3666),(3665,3659,3667),(3667,3659,3668),(3668,3659,3669),(3668,3669,3670),(3670,3669,3671),(3670,3671,3672),(3672,3671,3673),(3672,3673,3674),(3674,3673,3675),(3674,3675,3676),(3676,3675,3677),(3676,3677,3678),(3678,3677,3679),(3679,3677,3680),(3679,3680,3681),(3681,3680,3682),(3682,3680,3683),(3683,3680,3684),(3683,3684,3685),(3685,3684,3686),(3685,3686,3687),(3687,3686,3688),(3688,3686,3689),(3690,3691,3692),(3691,3690,3693),(3691,3693,3694),(3691,3694,3695),(3691,3695,3666),(3666,3695,3664),(3691,3666,3696),(3691,3696,3697),(3691,3697,3698),(3698,3697,3699),(3698,3699,3700),(3700,3699,3701),(3700,3701,3702),(3702,3701,3703),(3702,3703,3704),(3702,3704,3705),(3705,3704,3706),(3705,3706,3707),(3707,3706,3708),(3707,3708,3709),(3707,3709,3682),(3682,3709,3681),(3710,3711,3712),(3711,3710,3713),(3713,3710,3714),(3714,3710,3715),(3715,3710,3716),(3716,3710,3717),(3716,3717,3718),(3716,3718,3719),(3719,3718,3720),(3717,3710,3721),(3721,3710,3722),(3723,3724,3725),(3724,3723,3726),(3726,3723,3727),(3726,3727,3728),(3726,3728,3719),(3726,3719,3729),(3729,3719,3720),(3726,3729,3730),(3726,3730,3731),(3726,3731,3732),(3732,3731,3733),(3733,3731,3734),(3734,3731,3735),(3734,3735,3736),(3736,3735,3737),(3736,3737,3738),(3738,3737,3739),(3740,3741,3742),(3741,3740,3743),(3741,3743,3744),(3744,3743,3745),(3744,3745,3746),(3746,3745,3747),(3746,3747,3748),(3746,3748,3749),(3749,3748,3750),(3750,3748,3751),(3750,3751,3752),(3752,3751,3753),(3753,3751,3754),(3753,3754,3755),(3755,3754,3756),(3756,3754,3757),(3756,3757,3758),(3758,3757,3759),(3758,3759,3760),(3760,3759,3761),(3760,3761,3762),(3762,3761,3763),(3762,3763,3764),(3764,3763,3765),(3765,3763,3766),(3765,3766,3767),(3767,3766,3768),(3767,3768,3769),(3769,3768,3770),(3769,3770,3771),(3771,3770,3772),(3772,3770,3773),(3772,3773,3774),(3774,3773,3775),(3775,3773,3776),(3776,3773,3777),(3777,3773,3778),(3777,3778,3779),(3779,3778,3780),(3780,3778,3781),(3780,3781,3782),(3782,3781,3783),(3746,3784,3785),(3784,3746,3749),(3785,3784,3786),(3785,3786,3787),(3785,3787,3788),(3788,3787,3789),(3788,3789,3790),(3788,3790,3791),(3791,3790,3792),(3791,3792,3793),(3793,3792,3794),(3793,3794,3795),(3795,3794,3796),(3795,3796,3797),(3795,3797,3798),(3798,3797,3799),(3799,3797,3800),(3799,3800,3801),(3801,3800,3802),(3801,3802,3803),(3803,3802,3804),(3803,3804,3805),(3805,3804,3806),(3805,3806,3807),(3807,3806,3808),(3807,3808,3776),(3776,3808,3809),(3776,3809,3775),(3810,3811,3812),(3811,3810,3813),(3813,3810,3814),(3814,3810,3815),(3815,3810,3816),(3816,3810,3817),(3816,3817,3818),(3817,3810,3819),(3819,3810,3820),(3820,3810,3821),(3820,3821,3822),(3820,3822,3823),(3823,3822,3824),(3824,3822,3825),(3824,3825,3826),(3824,3826,3827),(3827,3826,3828),(3828,3826,3829),(3830,3831,3832),(3831,3830,3833),(3833,3830,3834),(3833,3834,3835),(3835,3834,3836),(3835,3836,3837),(3837,3836,3838),(3837,3838,3839),(3839,3838,3840),(3839,3840,3841),(3841,3840,3842),(3843,3844,3845),(3844,3843,3846),(3844,3846,3847),(3844,3847,3818),(3844,3818,3848),(3848,3818,3832),(3832,3818,3817),(3848,3832,3831),(3844,3848,3849),(3844,3849,3850),(3844,3850,3851),(3851,3850,3852),(3852,3850,3853),(3852,3853,3854),(3854,3853,3855),(3854,3855,3856),(3856,3855,3857),(3857,3855,3858),(3859,3860,3861),(3860,3859,3862),(3862,3859,3863),(3863,3859,3864),(3864,3859,3865),(3864,3865,3866),(3865,3859,3867),(3864,3868,3869),(3868,3864,3866),(3869,3868,3870),(3869,3870,3871),(3872,3873,3874),(3873,3872,3875),(3873,3875,3876),(3876,3875,3877),(3876,3877,3878),(3877,3875,3879),(3879,3875,3880),(3881,3882,3871),(3882,3881,3878),(3878,3881,3876),(3883,3884,3885),(3884,3883,3886),(3886,3883,3887),(3886,3887,3888),(3886,3888,3889),(3886,3889,3890),(3890,3889,3869),(3890,3869,3891),(3891,3869,3871),(3891,3871,3882),(3886,3890,3892),(3886,3892,3893),(3894,3895,3896),(3895,3894,3897),(3897,3894,3898),(3898,3894,3899),(3899,3894,3900),(3899,3900,3901),(3901,3900,3902),(3902,3900,3903),(3900,3894,3904),(3904,3894,3905),(3905,3894,3906),(3905,3906,3907),(3905,3907,3908),(3908,3907,3909),(3908,3909,3910),(3910,3909,3911),(3910,3911,3912),(3910,3912,3913),(3903,3914,3902),(3914,3903,3915),(3914,3915,3916),(3916,3915,3917),(3916,3917,3918),(3918,3917,3919),(3918,3919,3920),(3920,3919,3921),(3920,3921,3922),(3922,3921,3923),(3922,3923,3924),(3925,3926,3927),(3926,3925,3928),(3928,3925,3929),(3928,3929,3930),(3928,3930,3901),(3928,3901,3931),(3931,3901,3902),(3928,3931,3932),(3928,3932,3933),(3933,3932,3934),(3933,3934,3935),(3935,3934,3936),(3935,3936,3937),(3935,3937,3938),(3938,3937,3939),(3938,3939,3940),(3940,3939,3941),(3941,3939,3942)),$); +#595=IFCCARTESIANPOINTLIST3D(((-649.364,207.683,50.),(-644.419,188.936,50.),(-626.045,272.817,50.),(-644.419,124.493,50.),(-619.101,259.655,50.),(-623.715,283.277,50.),(-627.494,290.034,50.),(-603.16,294.595,50.),(-627.494,294.595,50.),(-624.66,287.838,50.),(-610.236,281.334,50.),(-606.847,286.592,50.),(-603.16,290.034,50.),(-638.964,105.405,50.),(-662.065,109.966,50.),(-662.065,105.405,50.),(-659.359,111.972,50.),(-657.718,114.611,50.),(-656.887,118.56,50.),(-656.61,124.493,50.),(-643.354,114.611,50.),(-656.61,188.936,50.),(-641.723,111.972,50.),(-638.964,109.966,50.),(-686.02,264.886,50.),(-676.266,278.593,50.),(-676.841,283.615,50.),(-674.542,272.986,50.),(-696.739,287.373,50.),(-700.,294.595,50.),(-700.,290.034,50.),(-673.093,294.595,50.),(-693.948,283.446,50.),(-675.904,287.838,50.),(-673.093,290.034,50.),(-644.419,188.936,30.),(-644.419,124.493,50.),(-644.419,124.493,30.),(-644.419,188.936,50.),(-644.419,124.493,30.),(-643.354,114.611,50.),(-643.354,114.611,30.),(-644.419,124.493,50.),(-643.354,114.611,30.),(-641.723,111.972,50.),(-641.723,111.972,30.),(-643.354,114.611,50.),(-641.723,111.972,50.),(-638.964,109.966,30.),(-641.723,111.972,30.),(-638.964,109.966,50.),(-638.964,109.966,30.),(-638.964,105.405,50.),(-638.964,105.405,30.),(-638.964,109.966,50.),(-638.964,105.405,50.),(-662.065,105.405,30.),(-638.964,105.405,30.),(-662.065,105.405,50.),(-662.065,105.405,50.),(-662.065,109.966,30.),(-662.065,105.405,30.),(-662.065,109.966,50.),(-662.065,109.966,50.),(-659.359,111.972,30.),(-662.065,109.966,30.),(-659.359,111.972,50.),(-659.359,111.972,50.),(-657.718,114.611,30.),(-659.359,111.972,30.),(-657.718,114.611,50.),(-657.718,114.611,50.),(-656.887,118.56,30.),(-657.718,114.611,30.),(-656.887,118.56,50.),(-656.887,118.56,50.),(-656.61,124.493,30.),(-656.887,118.56,30.),(-656.61,124.493,50.),(-656.61,124.493,50.),(-656.61,188.936,30.),(-656.61,124.493,30.),(-656.61,188.936,50.),(-656.61,188.936,50.),(-686.02,264.886,30.),(-656.61,188.936,30.),(-686.02,264.886,50.),(-686.02,264.886,50.),(-693.948,283.446,30.),(-686.02,264.886,30.),(-693.948,283.446,50.),(-693.948,283.446,50.),(-696.739,287.373,30.),(-693.948,283.446,30.),(-696.739,287.373,50.),(-696.739,287.373,30.),(-700.,290.034,50.),(-700.,290.034,30.),(-696.739,287.373,50.),(-700.,290.034,50.),(-700.,294.595,30.),(-700.,290.034,30.),(-700.,294.595,50.),(-700.,294.595,30.),(-673.093,294.595,50.),(-673.093,294.595,30.),(-700.,294.595,50.),(-673.093,294.595,30.),(-673.093,290.034,50.),(-673.093,290.034,30.),(-673.093,294.595,50.),(-673.093,290.034,50.),(-675.904,287.838,30.),(-673.093,290.034,30.),(-675.904,287.838,50.),(-675.904,287.838,30.),(-676.841,283.615,50.),(-676.841,283.615,30.),(-675.904,287.838,50.),(-676.841,283.615,30.),(-676.266,278.593,50.),(-676.266,278.593,30.),(-676.841,283.615,50.),(-676.266,278.593,30.),(-674.542,272.986,50.),(-674.542,272.986,30.),(-676.266,278.593,50.),(-674.542,272.986,30.),(-649.364,207.683,50.),(-649.364,207.683,30.),(-674.542,272.986,50.),(-649.364,207.683,50.),(-626.045,272.817,30.),(-649.364,207.683,30.),(-626.045,272.817,50.),(-626.045,272.817,50.),(-623.715,283.277,30.),(-626.045,272.817,30.),(-623.715,283.277,50.),(-623.715,283.277,50.),(-624.66,287.838,30.),(-623.715,283.277,30.),(-624.66,287.838,50.),(-624.66,287.838,50.),(-627.494,290.034,30.),(-624.66,287.838,30.),(-627.494,290.034,50.),(-627.494,290.034,50.),(-627.494,294.595,30.),(-627.494,290.034,30.),(-627.494,294.595,50.),(-627.494,294.595,50.),(-603.16,294.595,30.),(-627.494,294.595,30.),(-603.16,294.595,50.),(-603.16,294.595,30.),(-603.16,290.034,50.),(-603.16,290.034,30.),(-603.16,294.595,50.),(-603.16,290.034,50.),(-606.847,286.592,30.),(-603.16,290.034,30.),(-606.847,286.592,50.),(-606.847,286.592,30.),(-610.236,281.334,50.),(-610.236,281.334,30.),(-606.847,286.592,50.),(-610.236,281.334,30.),(-619.101,259.655,50.),(-619.101,259.655,30.),(-610.236,281.334,50.),(-619.101,259.655,30.),(-644.419,188.936,50.),(-644.419,188.936,30.),(-619.101,259.655,50.),(-576.137,193.919,30.),(-576.137,123.818,50.),(-576.137,123.818,30.),(-576.137,193.919,50.),(-576.137,123.818,50.),(-517.147,123.818,30.),(-576.137,123.818,30.),(-517.147,123.818,50.),(-517.147,123.818,30.),(-512.075,125.979,50.),(-512.075,125.979,30.),(-517.147,123.818,50.),(-512.075,125.979,50.),(-510.764,129.222,30.),(-512.075,125.979,30.),(-510.764,129.222,50.),(-510.764,129.222,50.),(-509.816,134.628,30.),(-510.764,129.222,30.),(-509.816,134.628,50.),(-509.816,134.628,50.),(-507.429,134.628,30.),(-509.816,134.628,30.),(-507.429,134.628,50.),(-507.429,134.628,30.),(-507.429,94.595,50.),(-507.429,94.595,30.),(-507.429,134.628,50.),(-507.429,94.595,50.),(-509.816,94.595,30.),(-507.429,94.595,30.),(-509.816,94.595,50.),(-509.816,94.595,50.),(-510.753,99.958,30.),(-509.816,94.595,30.),(-510.753,99.958,50.),(-510.753,99.958,50.),(-512.032,103.209,30.),(-510.753,99.958,30.),(-512.032,103.209,50.),(-512.032,103.209,30.),(-514.014,104.856,50.),(-514.014,104.856,30.),(-512.032,103.209,50.),(-514.014,104.856,50.),(-517.061,105.405,30.),(-514.014,104.856,30.),(-517.061,105.405,50.),(-517.061,105.405,30.),(-593.783,105.405,50.),(-593.783,105.405,30.),(-517.061,105.405,50.),(-593.783,105.405,50.),(-593.783,109.966,30.),(-593.783,105.405,30.),(-593.783,109.966,50.),(-593.783,109.966,30.),(-591.023,111.972,50.),(-591.023,111.972,30.),(-593.783,109.966,50.),(-591.023,111.972,50.),(-589.393,114.611,30.),(-591.023,111.972,30.),(-589.393,114.611,50.),(-589.393,114.611,50.),(-588.327,124.493,30.),(-589.393,114.611,30.),(-588.327,124.493,50.),(-588.327,124.493,50.),(-588.327,275.507,30.),(-588.327,124.493,30.),(-588.327,275.507,50.),(-588.327,275.507,50.),(-588.604,281.546,30.),(-588.327,275.507,30.),(-588.604,281.546,50.),(-588.604,281.546,50.),(-589.436,285.473,30.),(-588.604,281.546,30.),(-589.436,285.473,50.),(-589.436,285.473,50.),(-591.077,288.049,30.),(-589.436,285.473,30.),(-591.077,288.049,50.),(-591.077,288.049,50.),(-593.783,290.034,30.),(-591.077,288.049,30.),(-593.783,290.034,50.),(-593.783,290.034,50.),(-593.783,294.595,30.),(-593.783,290.034,30.),(-593.783,294.595,50.),(-593.783,294.595,50.),(-517.658,294.595,30.),(-593.783,294.595,30.),(-517.658,294.595,50.),(-517.658,294.595,30.),(-514.611,295.144,50.),(-514.611,295.144,30.),(-517.658,294.595,50.),(-514.611,295.144,50.),(-512.629,296.791,30.),(-514.611,295.144,30.),(-512.629,296.791,50.),(-512.629,296.791,50.),(-511.329,300.042,30.),(-512.629,296.791,30.),(-511.329,300.042,50.),(-511.329,300.042,50.),(-510.327,305.405,30.),(-511.329,300.042,30.),(-510.327,305.405,50.),(-510.327,305.405,50.),(-508.025,305.405,30.),(-510.327,305.405,30.),(-508.025,305.405,50.),(-508.025,305.405,30.),(-508.025,265.372,50.),(-508.025,265.372,30.),(-508.025,305.405,50.),(-508.025,265.372,50.),(-510.327,265.372,30.),(-508.025,265.372,30.),(-510.327,265.372,50.),(-510.327,265.372,50.),(-511.329,270.778,30.),(-510.327,265.372,30.),(-511.329,270.778,50.),(-511.329,270.778,50.),(-512.629,274.021,30.),(-511.329,270.778,30.),(-512.629,274.021,50.),(-512.629,274.021,50.),(-514.611,275.642,30.),(-512.629,274.021,30.),(-514.611,275.642,50.),(-514.611,275.642,30.),(-517.658,276.182,50.),(-517.658,276.182,30.),(-514.611,275.642,50.),(-517.658,276.182,50.),(-576.137,276.182,30.),(-517.658,276.182,30.),(-576.137,276.182,50.),(-576.137,276.182,30.),(-576.137,212.331,50.),(-576.137,212.331,30.),(-576.137,276.182,50.),(-576.137,212.331,50.),(-538.884,212.331,30.),(-576.137,212.331,30.),(-538.884,212.331,50.),(-538.884,212.331,50.),(-535.837,212.88,30.),(-538.884,212.331,30.),(-535.837,212.88,50.),(-535.837,212.88,30.),(-533.855,214.527,50.),(-533.855,214.527,30.),(-535.837,212.88,50.),(-533.855,214.527,50.),(-532.555,217.779,30.),(-533.855,214.527,30.),(-532.555,217.779,50.),(-532.555,217.779,50.),(-531.553,223.142,30.),(-532.555,217.779,30.),(-531.553,223.142,50.),(-531.553,223.142,50.),(-529.252,223.142,30.),(-531.553,223.142,30.),(-529.252,223.142,50.),(-529.252,223.142,30.),(-529.252,183.108,50.),(-529.252,183.108,30.),(-529.252,223.142,50.),(-529.252,183.108,30.),(-531.553,183.108,50.),(-531.553,183.108,30.),(-529.252,183.108,50.),(-531.553,183.108,50.),(-532.566,188.514,30.),(-531.553,183.108,30.),(-532.566,188.514,50.),(-532.566,188.514,50.),(-533.898,191.757,30.),(-532.566,188.514,30.),(-533.898,191.757,50.),(-533.898,191.757,30.),(-538.884,193.919,50.),(-538.884,193.919,30.),(-533.898,191.757,50.),(-538.884,193.919,30.),(-576.137,193.919,50.),(-576.137,193.919,30.),(-538.884,193.919,50.),(-439.002,142.736,50.),(-434.873,184.734,50.),(-435.566,200.,50.),(-431.73,127.703,50.),(-432.795,170.693,50.),(-429.332,157.876,50.),(-423.322,116.174,50.),(-424.484,146.284,50.),(-417.616,135.198,50.),(-413.7,107.939,50.),(-409.715,127.28,50.),(-402.863,102.998,50.),(-400.78,122.53,50.),(-390.812,101.351,50.),(-390.812,120.946,50.),(-380.843,122.53,50.),(-382.619,102.053,50.),(-375.004,104.16,50.),(-371.908,127.28,50.),(-367.967,107.67,50.),(-364.007,135.198,50.),(-361.508,112.584,50.),(-357.139,146.284,50.),(-355.628,118.903,50.),(-352.291,157.813,50.),(-350.325,126.626,50.),(-348.828,170.439,50.),(-345.6,135.753,50.),(-346.75,184.164,50.),(-346.057,198.986,50.),(-447.314,178.885,50.),(-447.847,214.569,50.),(-448.353,200.,50.),(-446.328,228.378,50.),(-444.197,159.797,50.),(-443.798,241.427,50.),(-440.255,253.716,50.),(-435.518,265.446,50.),(-434.873,215.266,50.),(-429.918,275.465,50.),(-432.795,229.307,50.),(-429.332,242.124,50.),(-423.456,283.773,50.),(-424.484,253.716,50.),(-417.627,264.802,50.),(-416.13,290.372,50.),(-409.758,272.72,50.),(-404.515,296.41,50.),(-400.876,277.47,50.),(-390.982,298.649,50.),(-390.982,279.054,50.),(-380.971,277.344,50.),(-378.856,297.002,50.),(-371.994,272.551,50.),(-367.966,292.061,50.),(-364.05,264.675,50.),(-358.312,283.826,50.),(-357.139,253.716,50.),(-349.893,272.297,50.),(-352.291,242.251,50.),(-348.828,229.307,50.),(-342.621,257.242,50.),(-346.75,214.886,50.),(-341.454,146.284,50.),(-337.426,239.949,50.),(-337.874,158.488,50.),(-335.316,171.284,50.),(-334.309,220.418,50.),(-333.782,184.671,50.),(-333.27,198.649,50.),(-390.982,298.649,50.),(-378.856,297.002,30.),(-390.982,298.649,30.),(-378.856,297.002,50.),(-378.856,297.002,50.),(-367.966,292.061,30.),(-378.856,297.002,30.),(-367.966,292.061,50.),(-367.966,292.061,50.),(-358.312,283.826,30.),(-367.966,292.061,30.),(-358.312,283.826,50.),(-358.312,283.826,30.),(-349.893,272.297,50.),(-349.893,272.297,30.),(-358.312,283.826,50.),(-349.893,272.297,30.),(-342.621,257.242,50.),(-342.621,257.242,30.),(-349.893,272.297,50.),(-342.621,257.242,30.),(-337.426,239.949,50.),(-337.426,239.949,30.),(-342.621,257.242,50.),(-337.426,239.949,30.),(-334.309,220.418,50.),(-334.309,220.418,30.),(-337.426,239.949,50.),(-334.309,220.418,30.),(-333.27,198.649,50.),(-333.27,198.649,30.),(-334.309,220.418,50.),(-333.27,198.649,30.),(-333.782,184.671,50.),(-333.782,184.671,30.),(-333.27,198.649,50.),(-333.782,184.671,30.),(-335.316,171.284,50.),(-335.316,171.284,30.),(-333.782,184.671,50.),(-335.316,171.284,30.),(-337.874,158.488,50.),(-337.874,158.488,30.),(-335.316,171.284,50.),(-337.874,158.488,30.),(-341.454,146.284,50.),(-341.454,146.284,30.),(-337.874,158.488,50.),(-341.454,146.284,30.),(-345.6,135.753,50.),(-345.6,135.753,30.),(-341.454,146.284,50.),(-345.6,135.753,30.),(-350.325,126.626,50.),(-350.325,126.626,30.),(-345.6,135.753,50.),(-350.325,126.626,30.),(-355.628,118.903,50.),(-355.628,118.903,30.),(-350.325,126.626,50.),(-355.628,118.903,30.),(-361.508,112.584,50.),(-361.508,112.584,30.),(-355.628,118.903,50.),(-361.508,112.584,50.),(-367.967,107.67,30.),(-361.508,112.584,30.),(-367.967,107.67,50.),(-367.967,107.67,50.),(-375.004,104.16,30.),(-367.967,107.67,30.),(-375.004,104.16,50.),(-375.004,104.16,50.),(-382.619,102.053,30.),(-375.004,104.16,30.),(-382.619,102.053,50.),(-382.619,102.053,50.),(-390.812,101.351,30.),(-382.619,102.053,30.),(-390.812,101.351,50.),(-390.812,101.351,50.),(-402.863,102.998,30.),(-390.812,101.351,30.),(-402.863,102.998,50.),(-402.863,102.998,30.),(-413.7,107.939,50.),(-413.7,107.939,30.),(-402.863,102.998,50.),(-413.7,107.939,30.),(-423.322,116.174,50.),(-423.322,116.174,30.),(-413.7,107.939,50.),(-423.322,116.174,50.),(-431.73,127.703,30.),(-423.322,116.174,30.),(-431.73,127.703,50.),(-431.73,127.703,50.),(-439.002,142.736,30.),(-431.73,127.703,30.),(-439.002,142.736,50.),(-439.002,142.736,50.),(-444.197,159.797,30.),(-439.002,142.736,30.),(-444.197,159.797,50.),(-444.197,159.797,50.),(-447.314,178.885,30.),(-444.197,159.797,30.),(-447.314,178.885,50.),(-447.314,178.885,50.),(-448.353,200.,30.),(-447.314,178.885,30.),(-448.353,200.,50.),(-448.353,200.,50.),(-447.847,214.569,30.),(-448.353,200.,30.),(-447.847,214.569,50.),(-447.847,214.569,50.),(-446.328,228.378,30.),(-447.847,214.569,30.),(-446.328,228.378,50.),(-446.328,228.378,50.),(-443.798,241.427,30.),(-446.328,228.378,30.),(-443.798,241.427,50.),(-443.798,241.427,50.),(-440.255,253.716,30.),(-443.798,241.427,30.),(-440.255,253.716,50.),(-440.255,253.716,50.),(-435.518,265.446,30.),(-440.255,253.716,30.),(-435.518,265.446,50.),(-435.518,265.446,50.),(-429.918,275.465,30.),(-435.518,265.446,30.),(-429.918,275.465,50.),(-429.918,275.465,50.),(-423.456,283.773,30.),(-429.918,275.465,30.),(-423.456,283.773,50.),(-423.456,283.773,30.),(-416.13,290.372,50.),(-416.13,290.372,30.),(-423.456,283.773,50.),(-416.13,290.372,30.),(-404.515,296.41,50.),(-404.515,296.41,30.),(-416.13,290.372,50.),(-404.515,296.41,30.),(-390.982,298.649,50.),(-390.982,298.649,30.),(-404.515,296.41,50.),(-390.982,279.054,50.),(-400.876,277.47,30.),(-390.982,279.054,30.),(-400.876,277.47,50.),(-400.876,277.47,50.),(-409.758,272.72,30.),(-400.876,277.47,30.),(-409.758,272.72,50.),(-409.758,272.72,30.),(-417.627,264.802,50.),(-417.627,264.802,30.),(-409.758,272.72,50.),(-417.627,264.802,30.),(-424.484,253.716,50.),(-424.484,253.716,30.),(-417.627,264.802,50.),(-424.484,253.716,30.),(-429.332,242.124,50.),(-429.332,242.124,30.),(-424.484,253.716,50.),(-429.332,242.124,30.),(-432.795,229.307,50.),(-432.795,229.307,30.),(-429.332,242.124,50.),(-432.795,229.307,30.),(-434.873,215.266,50.),(-434.873,215.266,30.),(-432.795,229.307,50.),(-434.873,215.266,30.),(-435.566,200.,50.),(-435.566,200.,30.),(-434.873,215.266,50.),(-435.566,200.,30.),(-434.873,184.734,50.),(-434.873,184.734,30.),(-435.566,200.,50.),(-434.873,184.734,30.),(-432.795,170.693,50.),(-432.795,170.693,30.),(-434.873,184.734,50.),(-432.795,170.693,30.),(-429.332,157.876,50.),(-429.332,157.876,30.),(-432.795,170.693,50.),(-429.332,157.876,30.),(-424.484,146.284,50.),(-424.484,146.284,30.),(-429.332,157.876,50.),(-424.484,146.284,30.),(-417.616,135.198,50.),(-417.616,135.198,30.),(-424.484,146.284,50.),(-417.616,135.198,30.),(-409.715,127.28,50.),(-409.715,127.28,30.),(-417.616,135.198,50.),(-409.715,127.28,50.),(-400.78,122.53,30.),(-409.715,127.28,30.),(-400.78,122.53,50.),(-400.78,122.53,50.),(-390.812,120.946,30.),(-400.78,122.53,30.),(-390.812,120.946,50.),(-390.812,120.946,30.),(-380.843,122.53,50.),(-380.843,122.53,30.),(-390.812,120.946,50.),(-380.843,122.53,30.),(-371.908,127.28,50.),(-371.908,127.28,30.),(-380.843,122.53,50.),(-371.908,127.28,50.),(-364.007,135.198,30.),(-371.908,127.28,30.),(-364.007,135.198,50.),(-364.007,135.198,50.),(-357.139,146.284,30.),(-364.007,135.198,30.),(-357.139,146.284,50.),(-357.139,146.284,50.),(-352.291,157.813,30.),(-357.139,146.284,30.),(-352.291,157.813,50.),(-352.291,157.813,50.),(-348.828,170.439,30.),(-352.291,157.813,30.),(-348.828,170.439,50.),(-348.828,170.439,50.),(-346.75,184.164,30.),(-348.828,170.439,30.),(-346.75,184.164,50.),(-346.75,184.164,50.),(-346.057,198.986,30.),(-346.75,184.164,30.),(-346.057,198.986,50.),(-346.057,198.986,50.),(-346.75,214.886,30.),(-346.057,198.986,30.),(-346.75,214.886,50.),(-346.75,214.886,50.),(-348.828,229.307,30.),(-346.75,214.886,30.),(-348.828,229.307,50.),(-348.828,229.307,50.),(-352.291,242.251,30.),(-348.828,229.307,30.),(-352.291,242.251,50.),(-352.291,242.251,50.),(-357.139,253.716,30.),(-352.291,242.251,30.),(-357.139,253.716,50.),(-357.139,253.716,50.),(-364.05,264.675,30.),(-357.139,253.716,30.),(-364.05,264.675,50.),(-364.05,264.675,30.),(-371.994,272.551,50.),(-371.994,272.551,30.),(-364.05,264.675,50.),(-371.994,272.551,30.),(-380.971,277.344,50.),(-380.971,277.344,30.),(-371.994,272.551,50.),(-380.971,277.344,50.),(-390.982,279.054,30.),(-380.971,277.344,30.),(-390.982,279.054,50.),(-239.244,105.405,50.),(-315.113,109.966,50.),(-315.113,105.405,50.),(-312.406,111.972,50.),(-310.765,114.611,50.),(-309.934,118.56,50.),(-309.657,124.493,50.),(-297.467,123.818,50.),(-309.657,275.507,50.),(-297.467,275.507,50.),(-239.244,123.818,50.),(-236.186,104.856,50.),(-234.172,125.979,50.),(-234.172,103.209,50.),(-232.84,129.222,50.),(-232.84,99.958,50.),(-231.827,94.595,50.),(-231.827,134.628,50.),(-229.526,94.595,50.),(-229.526,134.628,50.),(-312.406,288.049,50.),(-315.113,294.595,50.),(-315.113,290.034,50.),(-292.011,294.595,50.),(-310.765,285.473,50.),(-309.934,281.546,50.),(-296.359,285.473,50.),(-297.19,281.546,50.),(-294.718,288.049,50.),(-292.011,290.034,50.),(-297.467,123.818,50.),(-239.244,123.818,30.),(-297.467,123.818,30.),(-239.244,123.818,50.),(-239.244,123.818,50.),(-234.172,125.979,30.),(-239.244,123.818,30.),(-234.172,125.979,50.),(-234.172,125.979,50.),(-232.84,129.222,30.),(-234.172,125.979,30.),(-232.84,129.222,50.),(-232.84,129.222,50.),(-231.827,134.628,30.),(-232.84,129.222,30.),(-231.827,134.628,50.),(-231.827,134.628,50.),(-229.526,134.628,30.),(-231.827,134.628,30.),(-229.526,134.628,50.),(-229.526,134.628,30.),(-229.526,94.595,50.),(-229.526,94.595,30.),(-229.526,134.628,50.),(-229.526,94.595,50.),(-231.827,94.595,30.),(-229.526,94.595,30.),(-231.827,94.595,50.),(-231.827,94.595,50.),(-232.84,99.958,30.),(-231.827,94.595,30.),(-232.84,99.958,50.),(-232.84,99.958,50.),(-234.172,103.209,30.),(-232.84,99.958,30.),(-234.172,103.209,50.),(-234.172,103.209,30.),(-236.186,104.856,50.),(-236.186,104.856,30.),(-234.172,103.209,50.),(-236.186,104.856,50.),(-239.244,105.405,30.),(-236.186,104.856,30.),(-239.244,105.405,50.),(-239.244,105.405,30.),(-315.113,105.405,50.),(-315.113,105.405,30.),(-239.244,105.405,50.),(-315.113,105.405,50.),(-315.113,109.966,30.),(-315.113,105.405,30.),(-315.113,109.966,50.),(-315.113,109.966,30.),(-312.406,111.972,50.),(-312.406,111.972,30.),(-315.113,109.966,50.),(-312.406,111.972,50.),(-310.765,114.611,30.),(-312.406,111.972,30.),(-310.765,114.611,50.),(-310.765,114.611,50.),(-309.934,118.56,30.),(-310.765,114.611,30.),(-309.934,118.56,50.),(-309.934,118.56,50.),(-309.657,124.493,30.),(-309.934,118.56,30.),(-309.657,124.493,50.),(-309.657,124.493,50.),(-309.657,275.507,30.),(-309.657,124.493,30.),(-309.657,275.507,50.),(-309.657,275.507,50.),(-309.934,281.546,30.),(-309.657,275.507,30.),(-309.934,281.546,50.),(-309.934,281.546,50.),(-310.765,285.473,30.),(-309.934,281.546,30.),(-310.765,285.473,50.),(-310.765,285.473,50.),(-312.406,288.049,30.),(-310.765,285.473,30.),(-312.406,288.049,50.),(-312.406,288.049,50.),(-315.113,290.034,30.),(-312.406,288.049,30.),(-315.113,290.034,50.),(-315.113,290.034,50.),(-315.113,294.595,30.),(-315.113,290.034,30.),(-315.113,294.595,50.),(-315.113,294.595,50.),(-292.011,294.595,30.),(-315.113,294.595,30.),(-292.011,294.595,50.),(-292.011,294.595,30.),(-292.011,290.034,50.),(-292.011,290.034,30.),(-292.011,294.595,50.),(-292.011,290.034,50.),(-294.718,288.049,30.),(-292.011,290.034,30.),(-294.718,288.049,50.),(-294.718,288.049,30.),(-296.359,285.473,50.),(-296.359,285.473,30.),(-294.718,288.049,50.),(-296.359,285.473,30.),(-297.19,281.546,50.),(-297.19,281.546,30.),(-296.359,285.473,50.),(-297.19,281.546,30.),(-297.467,275.507,50.),(-297.467,275.507,30.),(-297.19,281.546,50.),(-297.467,275.507,30.),(-297.467,123.818,50.),(-297.467,123.818,30.),(-297.467,275.507,50.),(-217.421,105.405,50.),(-214.661,111.972,50.),(-217.421,109.966,50.),(-169.171,105.405,50.),(-213.031,114.611,50.),(-211.965,124.493,50.),(-199.775,123.818,50.),(-169.853,123.818,50.),(-155.17,126.098,50.),(-152.879,107.644,50.),(-149.538,128.948,50.),(-146.259,110.441,50.),(-145.047,132.939,50.),(-140.656,114.358,50.),(-140.976,138.64,50.),(-137.46,145.777,50.),(-135.784,119.637,50.),(-134.497,154.35,50.),(-131.354,126.52,50.),(-132.089,164.358,50.),(-129.724,181.377,50.),(-127.366,135.008,50.),(-128.935,200.,50.),(-217.421,290.034,50.),(-169.171,294.595,50.),(-217.421,294.595,50.),(-214.661,288.028,50.),(-213.031,285.389,50.),(-211.965,275.507,50.),(-199.775,276.182,50.),(-169.853,276.182,50.),(-158.697,275.,50.),(-152.293,292.356,50.),(-150.119,271.453,50.),(-145.707,289.559,50.),(-143.416,265.076,50.),(-140.358,285.642,50.),(-137.886,255.405,50.),(-134.796,279.054,50.),(-133.97,244.151,50.),(-129.873,270.608,50.),(-131.173,231.166,50.),(-129.494,216.448,50.),(-125.589,260.304,50.),(-123.82,145.101,50.),(-121.945,248.142,50.),(-120.464,157.908,50.),(-117.597,224.789,50.),(-118.066,171.326,50.),(-116.628,185.357,50.),(-116.148,200.,50.),(-211.965,124.493,50.),(-211.965,275.507,30.),(-211.965,124.493,30.),(-211.965,275.507,50.),(-211.965,275.507,50.),(-213.031,285.389,30.),(-211.965,275.507,30.),(-213.031,285.389,50.),(-213.031,285.389,50.),(-214.661,288.028,30.),(-213.031,285.389,30.),(-214.661,288.028,50.),(-214.661,288.028,50.),(-217.421,290.034,30.),(-214.661,288.028,30.),(-217.421,290.034,50.),(-217.421,290.034,50.),(-217.421,294.595,30.),(-217.421,290.034,30.),(-217.421,294.595,50.),(-217.421,294.595,50.),(-169.171,294.595,30.),(-217.421,294.595,30.),(-169.171,294.595,50.),(-169.171,294.595,50.),(-152.293,292.356,30.),(-169.171,294.595,30.),(-152.293,292.356,50.),(-152.293,292.356,50.),(-145.707,289.559,30.),(-152.293,292.356,30.),(-145.707,289.559,50.),(-145.707,289.559,50.),(-140.358,285.642,30.),(-145.707,289.559,30.),(-140.358,285.642,50.),(-140.358,285.642,30.),(-134.796,279.054,50.),(-134.796,279.054,30.),(-140.358,285.642,50.),(-134.796,279.054,30.),(-129.873,270.608,50.),(-129.873,270.608,30.),(-134.796,279.054,50.),(-129.873,270.608,30.),(-125.589,260.304,50.),(-125.589,260.304,30.),(-129.873,270.608,50.),(-125.589,260.304,30.),(-121.945,248.142,50.),(-121.945,248.142,30.),(-125.589,260.304,50.),(-121.945,248.142,30.),(-117.597,224.789,50.),(-117.597,224.789,30.),(-121.945,248.142,50.),(-117.597,224.789,30.),(-116.148,200.,50.),(-116.148,200.,30.),(-117.597,224.789,50.),(-116.148,200.,30.),(-116.628,185.357,50.),(-116.628,185.357,30.),(-116.148,200.,50.),(-116.628,185.357,30.),(-118.066,171.326,50.),(-118.066,171.326,30.),(-116.628,185.357,50.),(-118.066,171.326,30.),(-120.464,157.908,50.),(-120.464,157.908,30.),(-118.066,171.326,50.),(-120.464,157.908,30.),(-123.82,145.101,50.),(-123.82,145.101,30.),(-120.464,157.908,50.),(-123.82,145.101,30.),(-127.366,135.008,50.),(-127.366,135.008,30.),(-123.82,145.101,50.),(-127.366,135.008,30.),(-131.354,126.52,50.),(-131.354,126.52,30.),(-127.366,135.008,50.),(-131.354,126.52,30.),(-135.784,119.637,50.),(-135.784,119.637,30.),(-131.354,126.52,50.),(-135.784,119.637,30.),(-140.656,114.358,50.),(-140.656,114.358,30.),(-135.784,119.637,50.),(-140.656,114.358,50.),(-146.259,110.441,30.),(-140.656,114.358,30.),(-146.259,110.441,50.),(-146.259,110.441,50.),(-152.879,107.644,30.),(-146.259,110.441,30.),(-152.879,107.644,50.),(-152.879,107.644,50.),(-169.171,105.405,30.),(-152.879,107.644,30.),(-169.171,105.405,50.),(-169.171,105.405,30.),(-217.421,105.405,50.),(-217.421,105.405,30.),(-169.171,105.405,50.),(-217.421,105.405,50.),(-217.421,109.966,30.),(-217.421,105.405,30.),(-217.421,109.966,50.),(-217.421,109.966,30.),(-214.661,111.972,50.),(-214.661,111.972,30.),(-217.421,109.966,50.),(-214.661,111.972,50.),(-213.031,114.611,30.),(-214.661,111.972,30.),(-213.031,114.611,50.),(-213.031,114.611,50.),(-211.965,124.493,30.),(-213.031,114.611,30.),(-211.965,124.493,50.),(-199.775,123.818,50.),(-169.853,123.818,30.),(-199.775,123.818,30.),(-169.853,123.818,50.),(-169.853,123.818,30.),(-155.17,126.098,50.),(-155.17,126.098,30.),(-169.853,123.818,50.),(-155.17,126.098,30.),(-149.538,128.948,50.),(-149.538,128.948,30.),(-155.17,126.098,50.),(-149.538,128.948,30.),(-145.047,132.939,50.),(-145.047,132.939,30.),(-149.538,128.948,50.),(-145.047,132.939,50.),(-140.976,138.64,30.),(-145.047,132.939,30.),(-140.976,138.64,50.),(-140.976,138.64,50.),(-137.46,145.777,30.),(-140.976,138.64,30.),(-137.46,145.777,50.),(-137.46,145.777,50.),(-134.497,154.35,30.),(-137.46,145.777,30.),(-134.497,154.35,50.),(-134.497,154.35,50.),(-132.089,164.358,30.),(-134.497,154.35,30.),(-132.089,164.358,50.),(-132.089,164.358,50.),(-129.724,181.377,30.),(-132.089,164.358,30.),(-129.724,181.377,50.),(-129.724,181.377,50.),(-128.935,200.,30.),(-129.724,181.377,30.),(-128.935,200.,50.),(-128.935,200.,50.),(-129.494,216.448,30.),(-128.935,200.,30.),(-129.494,216.448,50.),(-129.494,216.448,50.),(-131.173,231.166,30.),(-129.494,216.448,30.),(-131.173,231.166,50.),(-131.173,231.166,50.),(-133.97,244.151,30.),(-131.173,231.166,30.),(-133.97,244.151,50.),(-133.97,244.151,50.),(-137.886,255.405,30.),(-133.97,244.151,30.),(-137.886,255.405,50.),(-137.886,255.405,50.),(-143.416,265.076,30.),(-137.886,255.405,30.),(-143.416,265.076,50.),(-143.416,265.076,30.),(-150.119,271.453,50.),(-150.119,271.453,30.),(-143.416,265.076,50.),(-150.119,271.453,30.),(-158.697,275.,50.),(-158.697,275.,30.),(-150.119,271.453,50.),(-158.697,275.,50.),(-169.853,276.182,30.),(-158.697,275.,30.),(-169.853,276.182,50.),(-169.853,276.182,50.),(-199.775,276.182,30.),(-169.853,276.182,30.),(-199.775,276.182,50.),(-199.775,276.182,30.),(-199.775,123.818,50.),(-199.775,123.818,30.),(-199.775,276.182,50.),(-21.269,105.405,50.),(-97.991,109.966,50.),(-97.991,105.405,50.),(-95.231,111.972,50.),(-93.6,114.611,50.),(-92.535,124.493,50.),(-80.345,123.818,50.),(-92.535,275.507,50.),(-21.354,123.818,50.),(-16.282,125.979,50.),(-18.221,104.856,50.),(-16.239,103.209,50.),(-14.971,129.222,50.),(-14.961,99.958,50.),(-14.023,134.628,50.),(-14.023,94.595,50.),(-11.636,134.628,50.),(-11.636,94.595,50.),(-80.345,193.919,50.),(-80.345,212.331,50.),(-43.092,212.331,50.),(-43.092,193.919,50.),(-38.105,191.757,50.),(-40.044,212.88,50.),(-38.062,214.527,50.),(-36.773,188.514,50.),(-36.762,217.779,50.),(-35.761,183.108,50.),(-35.761,223.142,50.),(-33.459,183.108,50.),(-33.459,223.142,50.),(-97.991,290.034,50.),(-21.866,294.595,50.),(-97.991,294.595,50.),(-95.284,288.049,50.),(-93.643,285.473,50.),(-92.812,281.546,50.),(-80.345,276.182,50.),(-21.866,276.182,50.),(-18.818,275.642,50.),(-18.818,295.144,50.),(-16.836,296.791,50.),(-16.836,274.021,50.),(-15.536,300.042,50.),(-15.536,270.778,50.),(-14.534,305.405,50.),(-14.534,265.372,50.),(-12.233,265.372,50.),(-12.233,305.405,50.),(-80.345,193.919,30.),(-80.345,123.818,50.),(-80.345,123.818,30.),(-80.345,193.919,50.),(-80.345,123.818,50.),(-21.354,123.818,30.),(-80.345,123.818,30.),(-21.354,123.818,50.),(-21.354,123.818,30.),(-16.282,125.979,50.),(-16.282,125.979,30.),(-21.354,123.818,50.),(-16.282,125.979,50.),(-14.971,129.222,30.),(-16.282,125.979,30.),(-14.971,129.222,50.),(-14.971,129.222,50.),(-14.023,134.628,30.),(-14.971,129.222,30.),(-14.023,134.628,50.),(-14.023,134.628,50.),(-11.636,134.628,30.),(-14.023,134.628,30.),(-11.636,134.628,50.),(-11.636,134.628,30.),(-11.636,94.595,50.),(-11.636,94.595,30.),(-11.636,134.628,50.),(-11.636,94.595,50.),(-14.023,94.595,30.),(-11.636,94.595,30.),(-14.023,94.595,50.),(-14.023,94.595,50.),(-14.961,99.958,30.),(-14.023,94.595,30.),(-14.961,99.958,50.),(-14.961,99.958,50.),(-16.239,103.209,30.),(-14.961,99.958,30.),(-16.239,103.209,50.),(-16.239,103.209,30.),(-18.221,104.856,50.),(-18.221,104.856,30.),(-16.239,103.209,50.),(-18.221,104.856,30.),(-21.269,105.405,50.),(-21.269,105.405,30.),(-18.221,104.856,50.),(-21.269,105.405,50.),(-97.991,105.405,30.),(-21.269,105.405,30.),(-97.991,105.405,50.),(-97.991,105.405,50.),(-97.991,109.966,30.),(-97.991,105.405,30.),(-97.991,109.966,50.),(-97.991,109.966,50.),(-95.231,111.972,30.),(-97.991,109.966,30.),(-95.231,111.972,50.),(-95.231,111.972,50.),(-93.6,114.611,30.),(-95.231,111.972,30.),(-93.6,114.611,50.),(-93.6,114.611,50.),(-92.535,124.493,30.),(-93.6,114.611,30.),(-92.535,124.493,50.),(-92.535,124.493,50.),(-92.535,275.507,30.),(-92.535,124.493,30.),(-92.535,275.507,50.),(-92.535,275.507,50.),(-92.812,281.546,30.),(-92.535,275.507,30.),(-92.812,281.546,50.),(-92.812,281.546,50.),(-93.643,285.473,30.),(-92.812,281.546,30.),(-93.643,285.473,50.),(-93.643,285.473,50.),(-95.284,288.049,30.),(-93.643,285.473,30.),(-95.284,288.049,50.),(-95.284,288.049,50.),(-97.991,290.034,30.),(-95.284,288.049,30.),(-97.991,290.034,50.),(-97.991,290.034,50.),(-97.991,294.595,30.),(-97.991,290.034,30.),(-97.991,294.595,50.),(-97.991,294.595,50.),(-21.866,294.595,30.),(-97.991,294.595,30.),(-21.866,294.595,50.),(-21.866,294.595,50.),(-18.818,295.144,30.),(-21.866,294.595,30.),(-18.818,295.144,50.),(-18.818,295.144,30.),(-16.836,296.791,50.),(-16.836,296.791,30.),(-18.818,295.144,50.),(-16.836,296.791,50.),(-15.536,300.042,30.),(-16.836,296.791,30.),(-15.536,300.042,50.),(-15.536,300.042,50.),(-14.534,305.405,30.),(-15.536,300.042,30.),(-14.534,305.405,50.),(-14.534,305.405,50.),(-12.233,305.405,30.),(-14.534,305.405,30.),(-12.233,305.405,50.),(-12.233,305.405,30.),(-12.233,265.372,50.),(-12.233,265.372,30.),(-12.233,305.405,50.),(-12.233,265.372,50.),(-14.534,265.372,30.),(-12.233,265.372,30.),(-14.534,265.372,50.),(-14.534,265.372,50.),(-15.536,270.778,30.),(-14.534,265.372,30.),(-15.536,270.778,50.),(-15.536,270.778,50.),(-16.836,274.021,30.),(-15.536,270.778,30.),(-16.836,274.021,50.),(-16.836,274.021,50.),(-18.818,275.642,30.),(-16.836,274.021,30.),(-18.818,275.642,50.),(-18.818,275.642,50.),(-21.866,276.182,30.),(-18.818,275.642,30.),(-21.866,276.182,50.),(-21.866,276.182,30.),(-80.345,276.182,50.),(-80.345,276.182,30.),(-21.866,276.182,50.),(-80.345,276.182,30.),(-80.345,212.331,50.),(-80.345,212.331,30.),(-80.345,276.182,50.),(-80.345,212.331,50.),(-43.092,212.331,30.),(-80.345,212.331,30.),(-43.092,212.331,50.),(-43.092,212.331,50.),(-40.044,212.88,30.),(-43.092,212.331,30.),(-40.044,212.88,50.),(-40.044,212.88,30.),(-38.062,214.527,50.),(-38.062,214.527,30.),(-40.044,212.88,50.),(-38.062,214.527,50.),(-36.762,217.779,30.),(-38.062,214.527,30.),(-36.762,217.779,50.),(-36.762,217.779,50.),(-35.761,223.142,30.),(-36.762,217.779,30.),(-35.761,223.142,50.),(-35.761,223.142,50.),(-33.459,223.142,30.),(-35.761,223.142,30.),(-33.459,223.142,50.),(-33.459,223.142,30.),(-33.459,183.108,50.),(-33.459,183.108,30.),(-33.459,223.142,50.),(-33.459,183.108,30.),(-35.761,183.108,50.),(-35.761,183.108,30.),(-33.459,183.108,50.),(-35.761,183.108,50.),(-36.773,188.514,30.),(-35.761,183.108,30.),(-36.773,188.514,50.),(-36.773,188.514,50.),(-38.105,191.757,30.),(-36.773,188.514,30.),(-38.105,191.757,50.),(-38.105,191.757,50.),(-43.092,193.919,30.),(-38.105,191.757,30.),(-43.092,193.919,50.),(-43.092,193.919,30.),(-80.345,193.919,50.),(-80.345,193.919,30.),(-43.092,193.919,50.),(108.817,105.405,50.),(49.741,109.966,50.),(49.741,105.405,50.),(52.448,111.972,50.),(54.089,114.611,50.),(54.92,118.56,50.),(55.197,124.493,50.),(67.387,123.818,50.),(55.197,275.507,50.),(67.387,195.101,50.),(105.407,123.818,50.),(118.705,125.253,50.),(118.173,106.208,50.),(125.44,108.615,50.),(122.755,127.386,50.),(126.378,130.912,50.),(131.301,113.007,50.),(129.399,135.821,50.),(131.556,141.934,50.),(136.437,119.764,50.),(132.851,149.25,50.),(133.283,157.77,50.),(135.515,196.59,50.),(140.763,186.191,50.),(140.166,127.544,50.),(142.83,136.529,50.),(143.912,173.364,50.),(144.429,146.717,50.),(144.961,158.108,50.),(104.299,195.101,50.),(67.387,213.514,50.),(103.617,213.514,50.),(116.276,214.78,50.),(117.469,193.581,50.),(123.565,219.764,50.),(121.615,191.385,50.),(125.269,187.838,50.),(126.436,223.955,50.),(128.775,182.348,50.),(128.168,204.561,50.),(131.279,175.507,50.),(132.782,167.314,50.),(128.487,229.265,50.),(134.135,212.099,50.),(129.718,235.695,50.),(130.128,243.243,50.),(131.151,284.628,50.),(135.574,277.196,50.),(138.397,221.199,50.),(138.951,267.399,50.),(140.955,231.862,50.),(141.093,256.081,50.),(141.807,244.088,50.),(52.448,288.049,50.),(49.741,294.595,50.),(49.741,290.034,50.),(107.027,294.595,50.),(54.089,285.473,50.),(54.92,281.546,50.),(67.387,276.182,50.),(102.594,276.182,50.),(115.083,274.916,50.),(121.519,292.314,50.),(122.542,269.932,50.),(126.697,289.253,50.),(125.861,265.034,50.),(128.232,258.953,50.),(129.654,251.689,50.),(128.168,204.561,30.),(135.515,196.59,50.),(135.515,196.59,30.),(128.168,204.561,50.),(135.515,196.59,30.),(140.763,186.191,50.),(140.763,186.191,30.),(135.515,196.59,50.),(140.763,186.191,30.),(143.912,173.364,50.),(143.912,173.364,30.),(140.763,186.191,50.),(143.912,173.364,30.),(144.961,158.108,50.),(144.961,158.108,30.),(143.912,173.364,50.),(144.961,158.108,30.),(144.429,146.717,50.),(144.429,146.717,30.),(144.961,158.108,50.),(144.429,146.717,30.),(142.83,136.529,50.),(142.83,136.529,30.),(144.429,146.717,50.),(142.83,136.529,30.),(140.166,127.544,50.),(140.166,127.544,30.),(142.83,136.529,50.),(140.166,127.544,30.),(136.437,119.764,50.),(136.437,119.764,30.),(140.166,127.544,50.),(136.437,119.764,30.),(131.301,113.007,50.),(131.301,113.007,30.),(136.437,119.764,50.),(131.301,113.007,50.),(125.44,108.615,30.),(131.301,113.007,30.),(125.44,108.615,50.),(125.44,108.615,50.),(118.173,106.208,30.),(125.44,108.615,30.),(118.173,106.208,50.),(118.173,106.208,50.),(108.817,105.405,30.),(118.173,106.208,30.),(108.817,105.405,50.),(108.817,105.405,50.),(49.741,105.405,30.),(108.817,105.405,30.),(49.741,105.405,50.),(49.741,105.405,50.),(49.741,109.966,30.),(49.741,105.405,30.),(49.741,109.966,50.),(49.741,109.966,30.),(52.448,111.972,50.),(52.448,111.972,30.),(49.741,109.966,50.),(52.448,111.972,50.),(54.089,114.611,30.),(52.448,111.972,30.),(54.089,114.611,50.),(54.089,114.611,50.),(54.92,118.56,30.),(54.089,114.611,30.),(54.92,118.56,50.),(54.92,118.56,50.),(55.197,124.493,30.),(54.92,118.56,30.),(55.197,124.493,50.),(55.197,124.493,50.),(55.197,275.507,30.),(55.197,124.493,30.),(55.197,275.507,50.),(55.197,275.507,50.),(54.92,281.546,30.),(55.197,275.507,30.),(54.92,281.546,50.),(54.92,281.546,50.),(54.089,285.473,30.),(54.92,281.546,30.),(54.089,285.473,50.),(54.089,285.473,50.),(52.448,288.049,30.),(54.089,285.473,30.),(52.448,288.049,50.),(52.448,288.049,30.),(49.741,290.034,50.),(49.741,290.034,30.),(52.448,288.049,50.),(49.741,290.034,50.),(49.741,294.595,30.),(49.741,290.034,30.),(49.741,294.595,50.),(49.741,294.595,50.),(107.027,294.595,30.),(49.741,294.595,30.),(107.027,294.595,50.),(107.027,294.595,50.),(121.519,292.314,30.),(107.027,294.595,30.),(121.519,292.314,50.),(121.519,292.314,50.),(126.697,289.253,30.),(121.519,292.314,30.),(126.697,289.253,50.),(126.697,289.253,30.),(131.151,284.628,50.),(131.151,284.628,30.),(126.697,289.253,50.),(131.151,284.628,30.),(135.574,277.196,50.),(135.574,277.196,30.),(131.151,284.628,50.),(135.574,277.196,30.),(138.951,267.399,50.),(138.951,267.399,30.),(135.574,277.196,50.),(138.951,267.399,30.),(141.093,256.081,50.),(141.093,256.081,30.),(138.951,267.399,50.),(141.093,256.081,30.),(141.807,244.088,50.),(141.807,244.088,30.),(141.093,256.081,50.),(141.807,244.088,30.),(140.955,231.862,50.),(140.955,231.862,30.),(141.807,244.088,50.),(140.955,231.862,30.),(138.397,221.199,50.),(138.397,221.199,30.),(140.955,231.862,50.),(138.397,221.199,30.),(134.135,212.099,50.),(134.135,212.099,30.),(138.397,221.199,50.),(134.135,212.099,30.),(128.168,204.561,50.),(128.168,204.561,30.),(134.135,212.099,50.),(67.387,213.514,50.),(103.617,213.514,30.),(67.387,213.514,30.),(103.617,213.514,50.),(103.617,213.514,30.),(116.276,214.78,50.),(116.276,214.78,30.),(103.617,213.514,50.),(116.276,214.78,30.),(123.565,219.764,50.),(123.565,219.764,30.),(116.276,214.78,50.),(123.565,219.764,50.),(126.436,223.955,30.),(123.565,219.764,30.),(126.436,223.955,50.),(126.436,223.955,50.),(128.487,229.265,30.),(126.436,223.955,30.),(128.487,229.265,50.),(128.487,229.265,50.),(129.718,235.695,30.),(128.487,229.265,30.),(129.718,235.695,50.),(129.718,235.695,50.),(130.128,243.243,30.),(129.718,235.695,30.),(130.128,243.243,50.),(130.128,243.243,50.),(129.654,251.689,30.),(130.128,243.243,30.),(129.654,251.689,50.),(129.654,251.689,50.),(128.232,258.953,30.),(129.654,251.689,30.),(128.232,258.953,50.),(128.232,258.953,50.),(125.861,265.034,30.),(128.232,258.953,30.),(125.861,265.034,50.),(125.861,265.034,50.),(122.542,269.932,30.),(125.861,265.034,30.),(122.542,269.932,50.),(122.542,269.932,30.),(115.083,274.916,50.),(115.083,274.916,30.),(122.542,269.932,50.),(115.083,274.916,30.),(102.594,276.182,50.),(102.594,276.182,30.),(115.083,274.916,50.),(102.594,276.182,50.),(67.387,276.182,30.),(102.594,276.182,30.),(67.387,276.182,50.),(67.387,276.182,30.),(67.387,213.514,50.),(67.387,213.514,30.),(67.387,276.182,50.),(67.387,123.818,30.),(105.407,123.818,50.),(105.407,123.818,30.),(67.387,123.818,50.),(105.407,123.818,50.),(118.705,125.253,30.),(105.407,123.818,30.),(118.705,125.253,50.),(118.705,125.253,50.),(122.755,127.386,30.),(118.705,125.253,30.),(122.755,127.386,50.),(122.755,127.386,30.),(126.378,130.912,50.),(126.378,130.912,30.),(122.755,127.386,50.),(126.378,130.912,50.),(129.399,135.821,30.),(126.378,130.912,30.),(129.399,135.821,50.),(129.399,135.821,50.),(131.556,141.934,30.),(129.399,135.821,30.),(131.556,141.934,50.),(131.556,141.934,50.),(132.851,149.25,30.),(131.556,141.934,30.),(132.851,149.25,50.),(132.851,149.25,50.),(133.283,157.77,30.),(132.851,149.25,30.),(133.283,157.77,50.),(133.283,157.77,50.),(132.782,167.314,30.),(133.283,157.77,30.),(132.782,167.314,50.),(132.782,167.314,50.),(131.279,175.507,30.),(132.782,167.314,30.),(131.279,175.507,50.),(131.279,175.507,50.),(128.775,182.348,30.),(131.279,175.507,30.),(128.775,182.348,50.),(128.775,182.348,50.),(125.269,187.838,30.),(128.775,182.348,30.),(125.269,187.838,50.),(125.269,187.838,30.),(121.615,191.385,50.),(121.615,191.385,30.),(125.269,187.838,50.),(121.615,191.385,50.),(117.469,193.581,30.),(121.615,191.385,30.),(117.469,193.581,50.),(117.469,193.581,30.),(104.299,195.101,50.),(104.299,195.101,30.),(117.469,193.581,50.),(104.299,195.101,50.),(67.387,195.101,30.),(104.299,195.101,30.),(67.387,195.101,50.),(67.387,195.101,30.),(67.387,123.818,50.),(67.387,123.818,30.),(67.387,195.101,50.),(185.794,105.405,50.),(162.693,109.966,50.),(162.693,105.405,50.),(165.452,111.972,50.),(167.083,114.611,50.),(168.148,124.493,50.),(181.447,114.611,50.),(180.616,118.56,50.),(168.148,275.507,50.),(180.339,124.493,50.),(180.339,209.459,50.),(183.088,111.972,50.),(185.794,109.966,50.),(235.647,105.405,50.),(238.142,111.698,50.),(235.647,109.966,50.),(259.277,105.405,50.),(238.973,114.189,50.),(254.886,112.148,50.),(252.372,117.399,50.),(259.277,109.966,50.),(180.339,191.047,50.),(216.653,209.459,50.),(215.05,191.047,50.),(237.011,122.297,50.),(228.417,192.736,50.),(229.824,210.726,50.),(234.704,194.632,50.),(237.283,215.372,50.),(240.181,197.783,50.),(240.229,219.774,50.),(244.849,202.191,50.),(242.334,225.549,50.),(243.597,232.696,50.),(244.018,241.216,50.),(162.693,290.034,50.),(219.381,294.595,50.),(162.693,294.595,50.),(165.399,288.049,50.),(167.04,285.473,50.),(167.871,281.546,50.),(180.339,276.182,50.),(218.017,276.182,50.),(229.888,274.113,50.),(228.13,293.919,50.),(235.109,291.892,50.),(234.305,271.527,50.),(237.709,267.905,50.),(240.81,288.26,50.),(240.469,262.88,50.),(242.44,256.757,50.),(245.722,282.77,50.),(243.623,249.535,50.),(248.706,207.855,50.),(250.049,275.042,50.),(251.727,214.722,50.),(253.139,265.709,50.),(253.885,222.741,50.),(254.993,254.772,50.),(255.179,231.91,50.),(255.611,242.23,50.),(180.339,191.047,30.),(180.339,124.493,50.),(180.339,124.493,30.),(180.339,191.047,50.),(180.339,124.493,30.),(180.616,118.56,50.),(180.616,118.56,30.),(180.339,124.493,50.),(180.616,118.56,30.),(181.447,114.611,50.),(181.447,114.611,30.),(180.616,118.56,50.),(181.447,114.611,30.),(183.088,111.972,50.),(183.088,111.972,30.),(181.447,114.611,50.),(183.088,111.972,50.),(185.794,109.966,30.),(183.088,111.972,30.),(185.794,109.966,50.),(185.794,109.966,30.),(185.794,105.405,50.),(185.794,105.405,30.),(185.794,109.966,50.),(185.794,105.405,50.),(162.693,105.405,30.),(185.794,105.405,30.),(162.693,105.405,50.),(162.693,105.405,50.),(162.693,109.966,30.),(162.693,105.405,30.),(162.693,109.966,50.),(162.693,109.966,50.),(165.452,111.972,30.),(162.693,109.966,30.),(165.452,111.972,50.),(165.452,111.972,50.),(167.083,114.611,30.),(165.452,111.972,30.),(167.083,114.611,50.),(167.083,114.611,50.),(168.148,124.493,30.),(167.083,114.611,30.),(168.148,124.493,50.),(168.148,124.493,50.),(168.148,275.507,30.),(168.148,124.493,30.),(168.148,275.507,50.),(168.148,275.507,50.),(167.871,281.546,30.),(168.148,275.507,30.),(167.871,281.546,50.),(167.871,281.546,50.),(167.04,285.473,30.),(167.871,281.546,30.),(167.04,285.473,50.),(167.04,285.473,50.),(165.399,288.049,30.),(167.04,285.473,30.),(165.399,288.049,50.),(165.399,288.049,30.),(162.693,290.034,50.),(162.693,290.034,30.),(165.399,288.049,50.),(162.693,290.034,50.),(162.693,294.595,30.),(162.693,290.034,30.),(162.693,294.595,50.),(162.693,294.595,30.),(219.381,294.595,50.),(219.381,294.595,30.),(162.693,294.595,50.),(219.381,294.595,50.),(228.13,293.919,30.),(219.381,294.595,30.),(228.13,293.919,50.),(228.13,293.919,50.),(235.109,291.892,30.),(228.13,293.919,30.),(235.109,291.892,50.),(235.109,291.892,50.),(240.81,288.26,30.),(235.109,291.892,30.),(240.81,288.26,50.),(240.81,288.26,30.),(245.722,282.77,50.),(245.722,282.77,30.),(240.81,288.26,50.),(245.722,282.77,30.),(250.049,275.042,50.),(250.049,275.042,30.),(245.722,282.77,50.),(250.049,275.042,30.),(253.139,265.709,50.),(253.139,265.709,30.),(250.049,275.042,50.),(253.139,265.709,30.),(254.993,254.772,50.),(254.993,254.772,30.),(253.139,265.709,50.),(254.993,254.772,30.),(255.611,242.23,50.),(255.611,242.23,30.),(254.993,254.772,50.),(255.611,242.23,30.),(255.179,231.91,50.),(255.179,231.91,30.),(255.611,242.23,50.),(255.179,231.91,30.),(253.885,222.741,50.),(253.885,222.741,30.),(255.179,231.91,50.),(253.885,222.741,30.),(251.727,214.722,50.),(251.727,214.722,30.),(253.885,222.741,50.),(251.727,214.722,30.),(248.706,207.855,50.),(248.706,207.855,30.),(251.727,214.722,50.),(248.706,207.855,30.),(244.849,202.191,50.),(244.849,202.191,30.),(248.706,207.855,50.),(244.849,202.191,50.),(240.181,197.783,30.),(244.849,202.191,30.),(240.181,197.783,50.),(240.181,197.783,50.),(234.704,194.632,30.),(240.181,197.783,30.),(234.704,194.632,50.),(234.704,194.632,50.),(228.417,192.736,30.),(234.704,194.632,30.),(228.417,192.736,50.),(228.417,192.736,30.),(252.372,117.399,50.),(252.372,117.399,30.),(228.417,192.736,50.),(252.372,117.399,30.),(254.886,112.148,50.),(254.886,112.148,30.),(252.372,117.399,50.),(254.886,112.148,50.),(259.277,109.966,30.),(254.886,112.148,30.),(259.277,109.966,50.),(259.277,109.966,30.),(259.277,105.405,50.),(259.277,105.405,30.),(259.277,109.966,50.),(259.277,105.405,50.),(235.647,105.405,30.),(259.277,105.405,30.),(235.647,105.405,50.),(235.647,105.405,50.),(235.647,109.966,30.),(235.647,105.405,30.),(235.647,109.966,50.),(235.647,109.966,50.),(238.142,111.698,30.),(235.647,109.966,30.),(238.142,111.698,50.),(238.142,111.698,50.),(238.973,114.189,30.),(238.142,111.698,30.),(238.973,114.189,50.),(238.973,114.189,50.),(237.011,122.297,30.),(238.973,114.189,30.),(237.011,122.297,50.),(237.011,122.297,50.),(215.05,191.047,30.),(237.011,122.297,30.),(215.05,191.047,50.),(215.05,191.047,50.),(180.339,191.047,30.),(215.05,191.047,30.),(180.339,191.047,50.),(180.339,209.459,30.),(216.653,209.459,50.),(216.653,209.459,30.),(180.339,209.459,50.),(216.653,209.459,50.),(229.824,210.726,30.),(216.653,209.459,30.),(229.824,210.726,50.),(229.824,210.726,30.),(237.283,215.372,50.),(237.283,215.372,30.),(229.824,210.726,50.),(237.283,215.372,50.),(240.229,219.774,30.),(237.283,215.372,30.),(240.229,219.774,50.),(240.229,219.774,50.),(242.334,225.549,30.),(240.229,219.774,30.),(242.334,225.549,50.),(242.334,225.549,50.),(243.597,232.696,30.),(242.334,225.549,30.),(243.597,232.696,50.),(243.597,232.696,50.),(244.018,241.216,30.),(243.597,232.696,30.),(244.018,241.216,50.),(244.018,241.216,50.),(243.623,249.535,30.),(244.018,241.216,30.),(243.623,249.535,50.),(243.623,249.535,50.),(242.44,256.757,30.),(243.623,249.535,30.),(242.44,256.757,50.),(242.44,256.757,50.),(240.469,262.88,30.),(242.44,256.757,30.),(240.469,262.88,50.),(240.469,262.88,50.),(237.709,267.905,30.),(240.469,262.88,30.),(237.709,267.905,50.),(237.709,267.905,50.),(234.305,271.527,30.),(237.709,267.905,30.),(234.305,271.527,50.),(234.305,271.527,50.),(229.888,274.113,30.),(234.305,271.527,30.),(229.888,274.113,50.),(229.888,274.113,30.),(218.017,276.182,50.),(218.017,276.182,30.),(229.888,274.113,50.),(218.017,276.182,50.),(180.339,276.182,30.),(218.017,276.182,30.),(180.339,276.182,50.),(180.339,276.182,30.),(180.339,209.459,50.),(180.339,209.459,30.),(180.339,276.182,50.),(276.923,264.886,50.),(286.676,278.593,50.),(286.101,283.615,50.),(306.333,188.936,50.),(288.4,272.986,50.),(313.579,207.683,50.),(266.203,287.373,50.),(262.942,294.595,50.),(262.942,290.034,50.),(289.849,294.595,50.),(268.995,283.446,50.),(287.038,287.838,50.),(289.849,290.034,50.),(323.979,105.405,50.),(300.877,109.966,50.),(300.877,105.405,50.),(303.583,111.972,50.),(305.224,114.611,50.),(306.056,118.56,50.),(306.333,124.493,50.),(319.588,114.611,50.),(318.523,124.493,50.),(318.523,188.936,50.),(321.219,111.972,50.),(323.979,109.966,50.),(336.897,272.817,50.),(343.841,259.655,50.),(339.227,283.277,50.),(335.448,290.034,50.),(359.782,294.595,50.),(335.448,294.595,50.),(338.282,287.838,50.),(352.707,281.334,50.),(356.095,286.592,50.),(359.782,290.034,50.),(318.523,188.936,30.),(318.523,124.493,50.),(318.523,124.493,30.),(318.523,188.936,50.),(318.523,124.493,30.),(319.588,114.611,50.),(319.588,114.611,30.),(318.523,124.493,50.),(319.588,114.611,30.),(321.219,111.972,50.),(321.219,111.972,30.),(319.588,114.611,50.),(321.219,111.972,50.),(323.979,109.966,30.),(321.219,111.972,30.),(323.979,109.966,50.),(323.979,109.966,30.),(323.979,105.405,50.),(323.979,105.405,30.),(323.979,109.966,50.),(323.979,105.405,50.),(300.877,105.405,30.),(323.979,105.405,30.),(300.877,105.405,50.),(300.877,105.405,50.),(300.877,109.966,30.),(300.877,105.405,30.),(300.877,109.966,50.),(300.877,109.966,30.),(303.583,111.972,50.),(303.583,111.972,30.),(300.877,109.966,50.),(303.583,111.972,50.),(305.224,114.611,30.),(303.583,111.972,30.),(305.224,114.611,50.),(305.224,114.611,50.),(306.056,118.56,30.),(305.224,114.611,30.),(306.056,118.56,50.),(306.056,118.56,50.),(306.333,124.493,30.),(306.056,118.56,30.),(306.333,124.493,50.),(306.333,124.493,50.),(306.333,188.936,30.),(306.333,124.493,30.),(306.333,188.936,50.),(306.333,188.936,50.),(276.923,264.886,30.),(306.333,188.936,30.),(276.923,264.886,50.),(276.923,264.886,50.),(268.995,283.446,30.),(276.923,264.886,30.),(268.995,283.446,50.),(268.995,283.446,50.),(266.203,287.373,30.),(268.995,283.446,30.),(266.203,287.373,50.),(266.203,287.373,30.),(262.942,290.034,50.),(262.942,290.034,30.),(266.203,287.373,50.),(262.942,290.034,50.),(262.942,294.595,30.),(262.942,290.034,30.),(262.942,294.595,50.),(262.942,294.595,50.),(289.849,294.595,30.),(262.942,294.595,30.),(289.849,294.595,50.),(289.849,294.595,30.),(289.849,290.034,50.),(289.849,290.034,30.),(289.849,294.595,50.),(289.849,290.034,50.),(287.038,287.838,30.),(289.849,290.034,30.),(287.038,287.838,50.),(287.038,287.838,30.),(286.101,283.615,50.),(286.101,283.615,30.),(287.038,287.838,50.),(286.101,283.615,30.),(286.676,278.593,50.),(286.676,278.593,30.),(286.101,283.615,50.),(286.676,278.593,30.),(288.4,272.986,50.),(288.4,272.986,30.),(286.676,278.593,50.),(288.4,272.986,30.),(313.579,207.683,50.),(313.579,207.683,30.),(288.4,272.986,50.),(313.579,207.683,50.),(336.897,272.817,30.),(313.579,207.683,30.),(336.897,272.817,50.),(336.897,272.817,50.),(339.227,283.277,30.),(336.897,272.817,30.),(339.227,283.277,50.),(339.227,283.277,50.),(338.282,287.838,30.),(339.227,283.277,30.),(338.282,287.838,50.),(338.282,287.838,30.),(335.448,290.034,50.),(335.448,290.034,30.),(338.282,287.838,50.),(335.448,290.034,50.),(335.448,294.595,30.),(335.448,290.034,30.),(335.448,294.595,50.),(335.448,294.595,30.),(359.782,294.595,50.),(359.782,294.595,30.),(335.448,294.595,50.),(359.782,294.595,30.),(359.782,290.034,50.),(359.782,290.034,30.),(359.782,294.595,50.),(359.782,290.034,50.),(356.095,286.592,30.),(359.782,290.034,30.),(356.095,286.592,50.),(356.095,286.592,30.),(352.707,281.334,50.),(352.707,281.334,30.),(356.095,286.592,50.),(352.707,281.334,30.),(343.841,259.655,50.),(343.841,259.655,30.),(352.707,281.334,50.),(343.841,259.655,30.),(318.523,188.936,50.),(318.523,188.936,30.),(343.841,259.655,50.),(377.079,140.709,50.),(380.406,182.454,50.),(379.644,198.818,50.),(384.149,126.014,50.),(382.692,167.652,50.),(386.501,154.413,50.),(392.081,115.224,50.),(391.835,142.736,50.),(398.324,133.203,50.),(401.057,107.517,50.),(405.772,126.394,50.),(411.076,102.893,50.),(414.18,122.308,50.),(422.138,101.351,50.),(423.546,120.946,50.),(436.379,103.706,50.),(433.2,122.403,50.),(442.386,126.774,50.),(449.715,110.769,50.),(450.655,133.72,50.),(462.145,122.54,50.),(457.56,142.905,50.),(457.56,177.703,50.),(468.215,157.432,50.),(468.215,177.027,50.),(469.306,147.382,50.),(473.671,139.02,50.),(470.943,144.785,50.),(473.671,142.905,50.),(428.746,166.892,50.),(426.445,206.926,50.),(426.445,166.892,50.),(428.746,206.926,50.),(429.695,172.255,50.),(429.693,201.52,50.),(431.001,198.276,50.),(431.005,175.507,50.),(436.064,196.115,50.),(433.019,177.154,50.),(436.077,177.703,50.),(473.671,196.115,50.),(469.306,187.078,50.),(470.943,189.675,50.),(473.671,191.554,50.),(459.989,239.696,50.),(458.881,250.,50.),(458.03,242.061,50.),(368.071,178.421,50.),(367.465,214.981,50.),(366.857,199.493,50.),(369.287,229.688,50.),(371.712,158.108,50.),(372.324,243.613,50.),(376.576,256.757,50.),(381.28,267.325,50.),(380.475,216.058,50.),(382.967,231.63,50.),(386.699,276.394,50.),(387.121,245.534,50.),(392.831,283.963,50.),(392.936,257.77,50.),(399.677,290.034,50.),(399.284,266.786,50.),(406.398,273.226,50.),(410.802,295.988,50.),(414.279,277.09,50.),(422.694,297.973,50.),(422.927,278.378,50.),(432.806,296.706,50.),(430.196,277.46,50.),(437.262,274.704,50.),(442.002,292.905,50.),(444.126,270.112,50.),(451.603,285.853,50.),(450.788,263.682,50.),(456.858,255.617,50.),(462.93,274.831,50.),(465.743,272.804,50.),(471.71,276.858,50.),(469.75,279.561,50.),(471.71,276.858,30.),(459.989,239.696,50.),(459.989,239.696,30.),(471.71,276.858,50.),(459.989,239.696,50.),(458.03,242.061,30.),(459.989,239.696,30.),(458.03,242.061,50.),(458.03,242.061,50.),(458.881,250.,30.),(458.03,242.061,30.),(458.881,250.,50.),(458.881,250.,50.),(456.858,255.617,30.),(458.881,250.,30.),(456.858,255.617,50.),(456.858,255.617,50.),(450.788,263.682,30.),(456.858,255.617,30.),(450.788,263.682,50.),(450.788,263.682,30.),(444.126,270.112,50.),(444.126,270.112,30.),(450.788,263.682,50.),(444.126,270.112,50.),(437.262,274.704,30.),(444.126,270.112,30.),(437.262,274.704,50.),(437.262,274.704,30.),(430.196,277.46,50.),(430.196,277.46,30.),(437.262,274.704,50.),(430.196,277.46,50.),(422.927,278.378,30.),(430.196,277.46,30.),(422.927,278.378,50.),(422.927,278.378,50.),(414.279,277.09,30.),(422.927,278.378,30.),(414.279,277.09,50.),(414.279,277.09,30.),(406.398,273.226,50.),(406.398,273.226,30.),(414.279,277.09,50.),(406.398,273.226,50.),(399.284,266.786,30.),(406.398,273.226,30.),(399.284,266.786,50.),(399.284,266.786,30.),(392.936,257.77,50.),(392.936,257.77,30.),(399.284,266.786,50.),(392.936,257.77,30.),(387.121,245.534,50.),(387.121,245.534,30.),(392.936,257.77,50.),(387.121,245.534,30.),(382.967,231.63,50.),(382.967,231.63,30.),(387.121,245.534,50.),(382.967,231.63,30.),(380.475,216.058,50.),(380.475,216.058,30.),(382.967,231.63,50.),(380.475,216.058,30.),(379.644,198.818,50.),(379.644,198.818,30.),(380.475,216.058,50.),(379.644,198.818,30.),(380.406,182.454,50.),(380.406,182.454,30.),(379.644,198.818,50.),(380.406,182.454,30.),(382.692,167.652,50.),(382.692,167.652,30.),(380.406,182.454,50.),(382.692,167.652,30.),(386.501,154.413,50.),(386.501,154.413,30.),(382.692,167.652,50.),(386.501,154.413,30.),(391.835,142.736,50.),(391.835,142.736,30.),(386.501,154.413,50.),(391.835,142.736,30.),(398.324,133.203,50.),(398.324,133.203,30.),(391.835,142.736,50.),(398.324,133.203,50.),(405.772,126.394,30.),(398.324,133.203,30.),(405.772,126.394,50.),(405.772,126.394,50.),(414.18,122.308,30.),(405.772,126.394,30.),(414.18,122.308,50.),(414.18,122.308,50.),(423.546,120.946,30.),(414.18,122.308,30.),(423.546,120.946,50.),(423.546,120.946,50.),(433.2,122.403,30.),(423.546,120.946,30.),(433.2,122.403,50.),(433.2,122.403,30.),(442.386,126.774,50.),(442.386,126.774,30.),(433.2,122.403,50.),(442.386,126.774,30.),(450.655,133.72,50.),(450.655,133.72,30.),(442.386,126.774,50.),(450.655,133.72,50.),(457.56,142.905,30.),(450.655,133.72,30.),(457.56,142.905,50.),(457.56,142.905,50.),(457.56,177.703,30.),(457.56,142.905,30.),(457.56,177.703,50.),(457.56,177.703,30.),(436.077,177.703,50.),(436.077,177.703,30.),(457.56,177.703,50.),(436.077,177.703,50.),(433.019,177.154,30.),(436.077,177.703,30.),(433.019,177.154,50.),(433.019,177.154,50.),(431.005,175.507,30.),(433.019,177.154,30.),(431.005,175.507,50.),(431.005,175.507,30.),(429.695,172.255,50.),(429.695,172.255,30.),(431.005,175.507,50.),(429.695,172.255,30.),(428.746,166.892,50.),(428.746,166.892,30.),(429.695,172.255,50.),(428.746,166.892,50.),(426.445,166.892,30.),(428.746,166.892,30.),(426.445,166.892,50.),(426.445,166.892,50.),(426.445,206.926,30.),(426.445,166.892,30.),(426.445,206.926,50.),(426.445,206.926,50.),(428.746,206.926,30.),(426.445,206.926,30.),(428.746,206.926,50.),(428.746,206.926,30.),(429.693,201.52,50.),(429.693,201.52,30.),(428.746,206.926,50.),(429.693,201.52,30.),(431.001,198.276,50.),(431.001,198.276,30.),(429.693,201.52,50.),(431.001,198.276,50.),(436.064,196.115,30.),(431.001,198.276,30.),(436.064,196.115,50.),(436.064,196.115,50.),(473.671,196.115,30.),(436.064,196.115,30.),(473.671,196.115,50.),(473.671,196.115,30.),(473.671,191.554,50.),(473.671,191.554,30.),(473.671,196.115,50.),(473.671,191.554,50.),(470.943,189.675,30.),(473.671,191.554,30.),(470.943,189.675,50.),(470.943,189.675,30.),(469.306,187.078,50.),(469.306,187.078,30.),(470.943,189.675,50.),(469.306,187.078,30.),(468.215,177.027,50.),(468.215,177.027,30.),(469.306,187.078,50.),(468.215,177.027,30.),(468.215,157.432,50.),(468.215,157.432,30.),(468.215,177.027,50.),(468.215,157.432,30.),(469.306,147.382,50.),(469.306,147.382,30.),(468.215,157.432,50.),(469.306,147.382,30.),(470.943,144.785,50.),(470.943,144.785,30.),(469.306,147.382,50.),(470.943,144.785,50.),(473.671,142.905,30.),(470.943,144.785,30.),(473.671,142.905,50.),(473.671,142.905,30.),(473.671,139.02,50.),(473.671,139.02,30.),(473.671,142.905,50.),(473.671,139.02,30.),(462.145,122.54,50.),(462.145,122.54,30.),(473.671,139.02,50.),(462.145,122.54,50.),(449.715,110.769,30.),(462.145,122.54,30.),(449.715,110.769,50.),(449.715,110.769,50.),(436.379,103.706,30.),(449.715,110.769,30.),(436.379,103.706,50.),(436.379,103.706,50.),(422.138,101.351,30.),(436.379,103.706,30.),(422.138,101.351,50.),(422.138,101.351,30.),(411.076,102.893,50.),(411.076,102.893,30.),(422.138,101.351,50.),(411.076,102.893,50.),(401.057,107.517,30.),(411.076,102.893,30.),(401.057,107.517,50.),(401.057,107.517,30.),(392.081,115.224,50.),(392.081,115.224,30.),(401.057,107.517,50.),(392.081,115.224,50.),(384.149,126.014,30.),(392.081,115.224,30.),(384.149,126.014,50.),(384.149,126.014,50.),(377.079,140.709,30.),(384.149,126.014,30.),(377.079,140.709,50.),(377.079,140.709,50.),(371.712,158.108,30.),(377.079,140.709,30.),(371.712,158.108,50.),(371.712,158.108,50.),(368.071,178.421,30.),(371.712,158.108,30.),(368.071,178.421,50.),(368.071,178.421,50.),(366.857,199.493,30.),(368.071,178.421,30.),(366.857,199.493,50.),(366.857,199.493,50.),(367.465,214.981,30.),(366.857,199.493,30.),(367.465,214.981,50.),(367.465,214.981,50.),(369.287,229.688,30.),(367.465,214.981,30.),(369.287,229.688,50.),(369.287,229.688,50.),(372.324,243.613,30.),(369.287,229.688,30.),(372.324,243.613,50.),(372.324,243.613,50.),(376.576,256.757,30.),(372.324,243.613,30.),(376.576,256.757,50.),(376.576,256.757,50.),(381.28,267.325,30.),(376.576,256.757,30.),(381.28,267.325,50.),(381.28,267.325,50.),(386.699,276.394,30.),(381.28,267.325,30.),(386.699,276.394,50.),(386.699,276.394,50.),(392.831,283.963,30.),(386.699,276.394,30.),(392.831,283.963,50.),(392.831,283.963,30.),(399.677,290.034,50.),(399.677,290.034,30.),(392.831,283.963,50.),(399.677,290.034,50.),(410.802,295.988,30.),(399.677,290.034,30.),(410.802,295.988,50.),(410.802,295.988,30.),(422.694,297.973,50.),(422.694,297.973,30.),(410.802,295.988,50.),(422.694,297.973,50.),(432.806,296.706,30.),(422.694,297.973,30.),(432.806,296.706,50.),(432.806,296.706,50.),(442.002,292.905,30.),(432.806,296.706,30.),(442.002,292.905,50.),(442.002,292.905,50.),(451.603,285.853,30.),(442.002,292.905,30.),(451.603,285.853,50.),(451.603,285.853,50.),(462.93,274.831,30.),(451.603,285.853,30.),(462.93,274.831,50.),(462.93,274.831,50.),(465.743,272.804,30.),(462.93,274.831,30.),(465.743,272.804,50.),(465.743,272.804,50.),(469.75,279.561,30.),(465.743,272.804,30.),(469.75,279.561,50.),(469.75,279.561,30.),(471.71,276.858,50.),(471.71,276.858,30.),(469.75,279.561,50.),(499.322,140.709,50.),(502.649,182.454,50.),(501.888,198.818,50.),(506.392,126.014,50.),(504.935,167.652,50.),(508.745,154.413,50.),(514.324,115.224,50.),(514.078,142.736,50.),(520.567,133.203,50.),(523.3,107.517,50.),(528.016,126.394,50.),(533.319,102.893,50.),(536.423,122.308,50.),(544.382,101.351,50.),(545.789,120.946,50.),(558.622,103.706,50.),(555.444,122.403,50.),(564.629,126.774,50.),(571.958,110.769,50.),(572.898,133.72,50.),(584.388,122.54,50.),(579.803,142.905,50.),(579.803,177.703,50.),(591.549,147.382,50.),(590.459,157.432,50.),(595.914,139.02,50.),(593.186,144.785,50.),(595.914,142.905,50.),(550.989,166.892,50.),(548.688,206.926,50.),(548.688,166.892,50.),(550.989,206.926,50.),(551.936,201.52,50.),(551.938,172.255,50.),(553.244,198.276,50.),(553.248,175.507,50.),(558.307,196.115,50.),(555.262,177.154,50.),(558.321,177.703,50.),(595.914,196.115,50.),(591.549,187.078,50.),(590.459,177.027,50.),(593.186,189.675,50.),(595.914,191.554,50.),(582.232,239.696,50.),(581.124,250.,50.),(580.273,242.061,50.),(490.314,178.421,50.),(489.708,214.981,50.),(489.101,199.493,50.),(491.53,229.688,50.),(493.956,158.108,50.),(494.567,243.613,50.),(498.819,256.757,50.),(503.523,267.325,50.),(502.718,216.058,50.),(505.211,231.63,50.),(508.942,276.394,50.),(509.364,245.534,50.),(515.074,283.963,50.),(515.179,257.77,50.),(521.92,290.034,50.),(521.527,266.786,50.),(528.641,273.226,50.),(533.045,295.988,50.),(536.522,277.09,50.),(544.937,297.973,50.),(545.17,278.378,50.),(555.049,296.706,50.),(552.439,277.46,50.),(559.505,274.704,50.),(564.245,292.905,50.),(566.369,270.112,50.),(573.846,285.853,50.),(573.031,263.682,50.),(579.101,255.617,50.),(585.173,274.831,50.),(587.986,272.804,50.),(593.954,276.858,50.),(591.993,279.561,50.),(593.954,276.858,30.),(582.232,239.696,50.),(582.232,239.696,30.),(593.954,276.858,50.),(582.232,239.696,50.),(580.273,242.061,30.),(582.232,239.696,30.),(580.273,242.061,50.),(580.273,242.061,50.),(581.124,250.,30.),(580.273,242.061,30.),(581.124,250.,50.),(581.124,250.,50.),(579.101,255.617,30.),(581.124,250.,30.),(579.101,255.617,50.),(579.101,255.617,50.),(573.031,263.682,30.),(579.101,255.617,30.),(573.031,263.682,50.),(573.031,263.682,30.),(566.369,270.112,50.),(566.369,270.112,30.),(573.031,263.682,50.),(566.369,270.112,30.),(559.505,274.704,50.),(559.505,274.704,30.),(566.369,270.112,50.),(559.505,274.704,50.),(552.439,277.46,30.),(559.505,274.704,30.),(552.439,277.46,50.),(552.439,277.46,50.),(545.17,278.378,30.),(552.439,277.46,30.),(545.17,278.378,50.),(545.17,278.378,30.),(536.522,277.09,50.),(536.522,277.09,30.),(545.17,278.378,50.),(536.522,277.09,50.),(528.641,273.226,30.),(536.522,277.09,30.),(528.641,273.226,50.),(528.641,273.226,50.),(521.527,266.786,30.),(528.641,273.226,30.),(521.527,266.786,50.),(521.527,266.786,30.),(515.179,257.77,50.),(515.179,257.77,30.),(521.527,266.786,50.),(515.179,257.77,30.),(509.364,245.534,50.),(509.364,245.534,30.),(515.179,257.77,50.),(509.364,245.534,30.),(505.211,231.63,50.),(505.211,231.63,30.),(509.364,245.534,50.),(505.211,231.63,30.),(502.718,216.058,50.),(502.718,216.058,30.),(505.211,231.63,50.),(502.718,216.058,30.),(501.888,198.818,50.),(501.888,198.818,30.),(502.718,216.058,50.),(501.888,198.818,30.),(502.649,182.454,50.),(502.649,182.454,30.),(501.888,198.818,50.),(502.649,182.454,30.),(504.935,167.652,50.),(504.935,167.652,30.),(502.649,182.454,50.),(504.935,167.652,30.),(508.745,154.413,50.),(508.745,154.413,30.),(504.935,167.652,50.),(508.745,154.413,30.),(514.078,142.736,50.),(514.078,142.736,30.),(508.745,154.413,50.),(514.078,142.736,30.),(520.567,133.203,50.),(520.567,133.203,30.),(514.078,142.736,50.),(520.567,133.203,50.),(528.016,126.394,30.),(520.567,133.203,30.),(528.016,126.394,50.),(528.016,126.394,50.),(536.423,122.308,30.),(528.016,126.394,30.),(536.423,122.308,50.),(536.423,122.308,50.),(545.789,120.946,30.),(536.423,122.308,30.),(545.789,120.946,50.),(545.789,120.946,50.),(555.444,122.403,30.),(545.789,120.946,30.),(555.444,122.403,50.),(555.444,122.403,30.),(564.629,126.774,50.),(564.629,126.774,30.),(555.444,122.403,50.),(564.629,126.774,30.),(572.898,133.72,50.),(572.898,133.72,30.),(564.629,126.774,50.),(572.898,133.72,50.),(579.803,142.905,30.),(572.898,133.72,30.),(579.803,142.905,50.),(579.803,142.905,50.),(579.803,177.703,30.),(579.803,142.905,30.),(579.803,177.703,50.),(579.803,177.703,50.),(558.321,177.703,30.),(579.803,177.703,30.),(558.321,177.703,50.),(558.321,177.703,50.),(555.262,177.154,30.),(558.321,177.703,30.),(555.262,177.154,50.),(555.262,177.154,50.),(553.248,175.507,30.),(555.262,177.154,30.),(553.248,175.507,50.),(553.248,175.507,30.),(551.938,172.255,50.),(551.938,172.255,30.),(553.248,175.507,50.),(551.938,172.255,30.),(550.989,166.892,50.),(550.989,166.892,30.),(551.938,172.255,50.),(550.989,166.892,50.),(548.688,166.892,30.),(550.989,166.892,30.),(548.688,166.892,50.),(548.688,166.892,50.),(548.688,206.926,30.),(548.688,166.892,30.),(548.688,206.926,50.),(548.688,206.926,30.),(550.989,206.926,50.),(550.989,206.926,30.),(548.688,206.926,50.),(550.989,206.926,30.),(551.936,201.52,50.),(551.936,201.52,30.),(550.989,206.926,50.),(551.936,201.52,30.),(553.244,198.276,50.),(553.244,198.276,30.),(551.936,201.52,50.),(553.244,198.276,50.),(558.307,196.115,30.),(553.244,198.276,30.),(558.307,196.115,50.),(558.307,196.115,50.),(595.914,196.115,30.),(558.307,196.115,30.),(595.914,196.115,50.),(595.914,196.115,30.),(595.914,191.554,50.),(595.914,191.554,30.),(595.914,196.115,50.),(595.914,191.554,50.),(593.186,189.675,30.),(595.914,191.554,30.),(593.186,189.675,50.),(593.186,189.675,30.),(591.549,187.078,50.),(591.549,187.078,30.),(593.186,189.675,50.),(591.549,187.078,30.),(590.459,177.027,50.),(590.459,177.027,30.),(591.549,187.078,50.),(590.459,177.027,30.),(590.459,157.432,50.),(590.459,157.432,30.),(590.459,177.027,50.),(590.459,157.432,30.),(591.549,147.382,50.),(591.549,147.382,30.),(590.459,157.432,50.),(591.549,147.382,30.),(593.186,144.785,50.),(593.186,144.785,30.),(591.549,147.382,50.),(593.186,144.785,50.),(595.914,142.905,30.),(593.186,144.785,30.),(595.914,142.905,50.),(595.914,142.905,30.),(595.914,139.02,50.),(595.914,139.02,30.),(595.914,142.905,50.),(595.914,139.02,30.),(584.388,122.54,50.),(584.388,122.54,30.),(595.914,139.02,50.),(584.388,122.54,50.),(571.958,110.769,30.),(584.388,122.54,30.),(571.958,110.769,50.),(571.958,110.769,50.),(558.622,103.706,30.),(571.958,110.769,30.),(558.622,103.706,50.),(558.622,103.706,50.),(544.382,101.351,30.),(558.622,103.706,30.),(544.382,101.351,50.),(544.382,101.351,30.),(533.319,102.893,50.),(533.319,102.893,30.),(544.382,101.351,50.),(533.319,102.893,30.),(523.3,107.517,50.),(523.3,107.517,30.),(533.319,102.893,50.),(523.3,107.517,30.),(514.324,115.224,50.),(514.324,115.224,30.),(523.3,107.517,50.),(514.324,115.224,50.),(506.392,126.014,30.),(514.324,115.224,30.),(506.392,126.014,50.),(506.392,126.014,50.),(499.322,140.709,30.),(506.392,126.014,30.),(499.322,140.709,50.),(499.322,140.709,50.),(493.956,158.108,30.),(499.322,140.709,30.),(493.956,158.108,50.),(493.956,158.108,50.),(490.314,178.421,30.),(493.956,158.108,30.),(490.314,178.421,50.),(490.314,178.421,50.),(489.101,199.493,30.),(490.314,178.421,30.),(489.101,199.493,50.),(489.101,199.493,50.),(489.708,214.981,30.),(489.101,199.493,30.),(489.708,214.981,50.),(489.708,214.981,50.),(491.53,229.688,30.),(489.708,214.981,30.),(491.53,229.688,50.),(491.53,229.688,50.),(494.567,243.613,30.),(491.53,229.688,30.),(494.567,243.613,50.),(494.567,243.613,50.),(498.819,256.757,30.),(494.567,243.613,30.),(498.819,256.757,50.),(498.819,256.757,50.),(503.523,267.325,30.),(498.819,256.757,30.),(503.523,267.325,50.),(503.523,267.325,50.),(508.942,276.394,30.),(503.523,267.325,30.),(508.942,276.394,50.),(508.942,276.394,50.),(515.074,283.963,30.),(508.942,276.394,30.),(515.074,283.963,50.),(515.074,283.963,30.),(521.92,290.034,50.),(521.92,290.034,30.),(515.074,283.963,50.),(521.92,290.034,30.),(533.045,295.988,50.),(533.045,295.988,30.),(521.92,290.034,50.),(533.045,295.988,50.),(544.937,297.973,30.),(533.045,295.988,30.),(544.937,297.973,50.),(544.937,297.973,50.),(555.049,296.706,30.),(544.937,297.973,30.),(555.049,296.706,50.),(555.049,296.706,50.),(564.245,292.905,30.),(555.049,296.706,30.),(564.245,292.905,50.),(564.245,292.905,50.),(573.846,285.853,30.),(564.245,292.905,30.),(573.846,285.853,50.),(573.846,285.853,50.),(585.173,274.831,30.),(573.846,285.853,30.),(585.173,274.831,50.),(585.173,274.831,50.),(587.986,272.804,30.),(585.173,274.831,30.),(587.986,272.804,50.),(587.986,272.804,50.),(591.993,279.561,30.),(587.986,272.804,30.),(591.993,279.561,50.),(591.993,279.561,30.),(593.954,276.858,50.),(593.954,276.858,30.),(591.993,279.561,50.),(631.291,193.919,30.),(631.291,123.818,50.),(631.291,123.818,30.),(631.291,193.919,50.),(631.291,123.818,50.),(690.282,123.818,30.),(631.291,123.818,30.),(690.282,123.818,50.),(690.282,123.818,30.),(695.354,125.979,50.),(695.354,125.979,30.),(690.282,123.818,50.),(695.354,125.979,50.),(696.665,129.222,30.),(695.354,125.979,30.),(696.665,129.222,50.),(696.665,129.222,50.),(697.613,134.628,30.),(696.665,129.222,30.),(697.613,134.628,50.),(697.613,134.628,30.),(700.,134.628,50.),(700.,134.628,30.),(697.613,134.628,50.),(700.,134.628,30.),(700.,94.595,50.),(700.,94.595,30.),(700.,134.628,50.),(700.,94.595,50.),(697.613,94.595,30.),(700.,94.595,30.),(697.613,94.595,50.),(697.613,94.595,50.),(696.675,99.958,30.),(697.613,94.595,30.),(696.675,99.958,50.),(696.675,99.958,50.),(695.397,103.209,30.),(696.675,99.958,30.),(695.397,103.209,50.),(695.397,103.209,30.),(693.415,104.856,50.),(693.415,104.856,30.),(695.397,103.209,50.),(693.415,104.856,50.),(690.367,105.405,30.),(693.415,104.856,30.),(690.367,105.405,50.),(690.367,105.405,50.),(613.645,105.405,30.),(690.367,105.405,30.),(613.645,105.405,50.),(613.645,105.405,50.),(613.645,109.966,30.),(613.645,105.405,30.),(613.645,109.966,50.),(613.645,109.966,50.),(616.405,111.972,30.),(613.645,109.966,30.),(616.405,111.972,50.),(616.405,111.972,50.),(618.036,114.611,30.),(616.405,111.972,30.),(618.036,114.611,50.),(618.036,114.611,50.),(619.101,124.493,30.),(618.036,114.611,30.),(619.101,124.493,50.),(619.101,124.493,50.),(619.101,275.507,30.),(619.101,124.493,30.),(619.101,275.507,50.),(619.101,275.507,50.),(618.824,281.546,30.),(619.101,275.507,30.),(618.824,281.546,50.),(618.824,281.546,50.),(617.993,285.473,30.),(618.824,281.546,30.),(617.993,285.473,50.),(617.993,285.473,50.),(616.352,288.049,30.),(617.993,285.473,30.),(616.352,288.049,50.),(616.352,288.049,30.),(613.645,290.034,50.),(613.645,290.034,30.),(616.352,288.049,50.),(699.403,305.405,30.),(699.403,265.372,50.),(699.403,265.372,30.),(699.403,305.405,50.),(699.403,265.372,50.),(697.102,265.372,30.),(699.403,265.372,30.),(697.102,265.372,50.),(697.102,265.372,50.),(696.1,270.778,30.),(697.102,265.372,30.),(696.1,270.778,50.),(696.1,270.778,50.),(694.8,274.021,30.),(696.1,270.778,30.),(694.8,274.021,50.),(694.8,274.021,30.),(692.818,275.642,50.),(692.818,275.642,30.),(694.8,274.021,50.),(692.818,275.642,50.),(689.77,276.182,30.),(692.818,275.642,30.),(689.77,276.182,50.),(689.77,276.182,30.),(631.291,276.182,50.),(631.291,276.182,30.),(689.77,276.182,50.),(631.291,276.182,30.),(631.291,212.331,50.),(631.291,212.331,30.),(631.291,276.182,50.),(631.291,212.331,30.),(668.544,212.331,50.),(668.544,212.331,30.),(631.291,212.331,50.),(668.544,212.331,50.),(671.592,212.88,30.),(668.544,212.331,30.),(671.592,212.88,50.),(671.592,212.88,30.),(673.574,214.527,50.),(673.574,214.527,30.),(671.592,212.88,50.),(673.574,214.527,50.),(674.874,217.779,30.),(673.574,214.527,30.),(674.874,217.779,50.),(674.874,217.779,50.),(675.875,223.142,30.),(674.874,217.779,30.),(675.875,223.142,50.),(675.875,223.142,30.),(678.177,223.142,50.),(678.177,223.142,30.),(675.875,223.142,50.),(678.177,223.142,30.),(678.177,183.108,50.),(678.177,183.108,30.),(678.177,223.142,50.),(678.177,183.108,50.),(675.875,183.108,30.),(678.177,183.108,30.),(675.875,183.108,50.),(675.875,183.108,50.),(674.863,188.514,30.),(675.875,183.108,30.),(674.863,188.514,50.),(674.863,188.514,50.),(673.531,191.757,30.),(674.863,188.514,30.),(673.531,191.757,50.),(673.531,191.757,30.),(668.544,193.919,50.),(668.544,193.919,30.),(673.531,191.757,50.),(668.544,193.919,50.),(631.291,193.919,30.),(668.544,193.919,30.),(631.291,193.919,50.),(690.367,105.405,50.),(613.645,109.966,50.),(613.645,105.405,50.),(616.405,111.972,50.),(618.036,114.611,50.),(619.101,124.493,50.),(631.291,123.818,50.),(619.101,275.507,50.),(690.282,123.818,50.),(695.354,125.979,50.),(693.415,104.856,50.),(695.397,103.209,50.),(696.665,129.222,50.),(696.675,99.958,50.),(697.613,134.628,50.),(697.613,94.595,50.),(700.,94.595,50.),(700.,134.628,50.),(631.291,193.919,50.),(631.291,212.331,50.),(668.544,212.331,50.),(668.544,193.919,50.),(673.531,191.757,50.),(671.592,212.88,50.),(673.574,214.527,50.),(674.863,188.514,50.),(674.874,217.779,50.),(675.875,183.108,50.),(675.875,223.142,50.),(678.177,183.108,50.),(678.177,223.142,50.),(616.352,288.049,50.),(613.645,294.595,50.),(613.645,290.034,50.),(689.77,294.595,50.),(617.993,285.473,50.),(618.824,281.546,50.),(631.291,276.182,50.),(689.77,276.182,50.),(692.818,275.642,50.),(692.818,295.144,50.),(694.8,296.791,50.),(694.8,274.021,50.),(696.1,300.042,50.),(696.1,270.778,50.),(697.102,265.372,50.),(697.102,305.405,50.),(699.403,265.372,50.),(699.403,305.405,50.),(613.645,290.034,50.),(613.645,294.595,30.),(613.645,290.034,30.),(613.645,294.595,50.),(697.102,305.405,50.),(699.403,305.405,30.),(697.102,305.405,30.),(699.403,305.405,50.),(613.645,294.595,50.),(689.77,294.595,30.),(613.645,294.595,30.),(689.77,294.595,50.),(696.1,300.042,50.),(697.102,305.405,30.),(696.1,300.042,30.),(697.102,305.405,50.),(689.77,294.595,50.),(692.818,295.144,30.),(689.77,294.595,30.),(692.818,295.144,50.),(692.818,295.144,30.),(694.8,296.791,50.),(694.8,296.791,30.),(692.818,295.144,50.),(694.8,296.791,50.),(696.1,300.042,30.),(694.8,296.791,30.),(696.1,300.042,50.),(689.77,294.595,30.),(613.645,290.034,30.),(613.645,294.595,30.),(616.352,288.049,30.),(617.993,285.473,30.),(618.824,281.546,30.),(619.101,275.507,30.),(631.291,276.182,30.),(619.101,124.493,30.),(631.291,212.331,30.),(689.77,276.182,30.),(692.818,295.144,30.),(692.818,275.642,30.),(694.8,296.791,30.),(694.8,274.021,30.),(696.1,300.042,30.),(696.1,270.778,30.),(697.102,305.405,30.),(697.102,265.372,30.),(699.403,265.372,30.),(699.403,305.405,30.),(631.291,193.919,30.),(631.291,123.818,30.),(668.544,212.331,30.),(668.544,193.919,30.),(671.592,212.88,30.),(673.531,191.757,30.),(673.574,214.527,30.),(674.863,188.514,30.),(674.874,217.779,30.),(675.875,183.108,30.),(675.875,223.142,30.),(678.177,223.142,30.),(678.177,183.108,30.),(616.405,111.972,30.),(613.645,105.405,30.),(613.645,109.966,30.),(690.367,105.405,30.),(618.036,114.611,30.),(690.282,123.818,30.),(695.354,125.979,30.),(693.415,104.856,30.),(695.397,103.209,30.),(696.665,129.222,30.),(696.675,99.958,30.),(697.613,134.628,30.),(697.613,94.595,30.),(700.,94.595,30.),(700.,134.628,30.),(489.708,214.981,30.),(490.314,178.421,30.),(489.101,199.493,30.),(491.53,229.688,30.),(493.956,158.108,30.),(494.567,243.613,30.),(499.322,140.709,30.),(498.819,256.757,30.),(503.523,267.325,30.),(501.888,198.818,30.),(502.718,216.058,30.),(505.211,231.63,30.),(508.942,276.394,30.),(509.364,245.534,30.),(515.074,283.963,30.),(515.179,257.77,30.),(521.92,290.034,30.),(521.527,266.786,30.),(528.641,273.226,30.),(533.045,295.988,30.),(536.522,277.09,30.),(544.937,297.973,30.),(545.17,278.378,30.),(555.049,296.706,30.),(552.439,277.46,30.),(559.505,274.704,30.),(564.245,292.905,30.),(566.369,270.112,30.),(573.846,285.853,30.),(573.031,263.682,30.),(579.101,255.617,30.),(585.173,274.831,30.),(581.124,250.,30.),(582.232,239.696,30.),(587.986,272.804,30.),(593.954,276.858,30.),(591.993,279.561,30.),(580.273,242.061,30.),(550.989,206.926,30.),(548.688,166.892,30.),(548.688,206.926,30.),(550.989,166.892,30.),(551.936,201.52,30.),(551.938,172.255,30.),(553.244,198.276,30.),(553.248,175.507,30.),(558.307,196.115,30.),(555.262,177.154,30.),(558.321,177.703,30.),(595.914,196.115,30.),(579.803,177.703,30.),(591.549,187.078,30.),(579.803,142.905,30.),(584.388,122.54,30.),(590.459,177.027,30.),(590.459,157.432,30.),(593.186,189.675,30.),(595.914,191.554,30.),(591.549,147.382,30.),(595.914,139.02,30.),(593.186,144.785,30.),(595.914,142.905,30.),(502.649,182.454,30.),(506.392,126.014,30.),(504.935,167.652,30.),(508.745,154.413,30.),(514.324,115.224,30.),(514.078,142.736,30.),(520.567,133.203,30.),(523.3,107.517,30.),(528.016,126.394,30.),(533.319,102.893,30.),(536.423,122.308,30.),(544.382,101.351,30.),(545.789,120.946,30.),(558.622,103.706,30.),(555.444,122.403,30.),(564.629,126.774,30.),(571.958,110.769,30.),(572.898,133.72,30.),(367.465,214.981,30.),(368.071,178.421,30.),(366.857,199.493,30.),(369.287,229.688,30.),(371.712,158.108,30.),(372.324,243.613,30.),(377.079,140.709,30.),(376.576,256.757,30.),(381.28,267.325,30.),(379.644,198.818,30.),(380.475,216.058,30.),(382.967,231.63,30.),(386.699,276.394,30.),(387.121,245.534,30.),(392.831,283.963,30.),(392.936,257.77,30.),(399.677,290.034,30.),(399.284,266.786,30.),(406.398,273.226,30.),(410.802,295.988,30.),(414.279,277.09,30.),(422.694,297.973,30.),(422.927,278.378,30.),(432.806,296.706,30.),(430.196,277.46,30.),(437.262,274.704,30.),(442.002,292.905,30.),(444.126,270.112,30.),(451.603,285.853,30.),(450.788,263.682,30.),(456.858,255.617,30.),(462.93,274.831,30.),(458.881,250.,30.),(459.989,239.696,30.),(465.743,272.804,30.),(471.71,276.858,30.),(469.75,279.561,30.),(458.03,242.061,30.),(426.445,206.926,30.),(428.746,166.892,30.),(426.445,166.892,30.),(428.746,206.926,30.),(429.693,201.52,30.),(429.695,172.255,30.),(431.001,198.276,30.),(431.005,175.507,30.),(436.064,196.115,30.),(433.019,177.154,30.),(436.077,177.703,30.),(473.671,196.115,30.),(457.56,177.703,30.),(469.306,187.078,30.),(457.56,142.905,30.),(462.145,122.54,30.),(468.215,177.027,30.),(470.943,189.675,30.),(473.671,191.554,30.),(469.306,147.382,30.),(473.671,139.02,30.),(468.215,157.432,30.),(470.943,144.785,30.),(473.671,142.905,30.),(380.406,182.454,30.),(384.149,126.014,30.),(382.692,167.652,30.),(386.501,154.413,30.),(392.081,115.224,30.),(391.835,142.736,30.),(398.324,133.203,30.),(401.057,107.517,30.),(405.772,126.394,30.),(411.076,102.893,30.),(414.18,122.308,30.),(422.138,101.351,30.),(423.546,120.946,30.),(436.379,103.706,30.),(433.2,122.403,30.),(442.386,126.774,30.),(449.715,110.769,30.),(450.655,133.72,30.),(289.849,294.595,30.),(262.942,290.034,30.),(262.942,294.595,30.),(266.203,287.373,30.),(268.995,283.446,30.),(276.923,264.886,30.),(287.038,287.838,30.),(286.101,283.615,30.),(289.849,290.034,30.),(286.676,278.593,30.),(306.333,188.936,30.),(288.4,272.986,30.),(313.579,207.683,30.),(306.333,124.493,30.),(359.782,294.595,30.),(335.448,290.034,30.),(335.448,294.595,30.),(338.282,287.838,30.),(339.227,283.277,30.),(352.707,281.334,30.),(343.841,259.655,30.),(356.095,286.592,30.),(359.782,290.034,30.),(336.897,272.817,30.),(318.523,188.936,30.),(300.877,109.966,30.),(323.979,105.405,30.),(300.877,105.405,30.),(303.583,111.972,30.),(305.224,114.611,30.),(306.056,118.56,30.),(319.588,114.611,30.),(318.523,124.493,30.),(321.219,111.972,30.),(323.979,109.966,30.),(219.381,294.595,30.),(162.693,290.034,30.),(162.693,294.595,30.),(165.399,288.049,30.),(167.04,285.473,30.),(167.871,281.546,30.),(168.148,275.507,30.),(180.339,276.182,30.),(180.339,124.493,30.),(180.339,191.047,30.),(218.017,276.182,30.),(229.888,274.113,30.),(228.13,293.919,30.),(235.109,291.892,30.),(234.305,271.527,30.),(237.709,267.905,30.),(240.81,288.26,30.),(240.469,262.88,30.),(242.44,256.757,30.),(245.722,282.77,30.),(243.623,249.535,30.),(244.018,241.216,30.),(244.849,202.191,30.),(248.706,207.855,30.),(250.049,275.042,30.),(251.727,214.722,30.),(253.139,265.709,30.),(253.885,222.741,30.),(254.993,254.772,30.),(255.179,231.91,30.),(255.611,242.23,30.),(229.824,210.726,30.),(228.417,192.736,30.),(216.653,209.459,30.),(234.704,194.632,30.),(237.283,215.372,30.),(240.181,197.783,30.),(240.229,219.774,30.),(242.334,225.549,30.),(243.597,232.696,30.),(180.339,209.459,30.),(215.05,191.047,30.),(237.011,122.297,30.),(252.372,117.399,30.),(238.973,114.189,30.),(235.647,109.966,30.),(259.277,105.405,30.),(235.647,105.405,30.),(238.142,111.698,30.),(254.886,112.148,30.),(259.277,109.966,30.),(165.452,111.972,30.),(162.693,105.405,30.),(162.693,109.966,30.),(185.794,105.405,30.),(167.083,114.611,30.),(168.148,124.493,30.),(181.447,114.611,30.),(180.616,118.56,30.),(183.088,111.972,30.),(185.794,109.966,30.),(49.741,294.595,30.),(52.448,288.049,30.),(49.741,290.034,30.),(107.027,294.595,30.),(54.089,285.473,30.),(54.92,281.546,30.),(55.197,275.507,30.),(67.387,276.182,30.),(67.387,213.514,30.),(102.594,276.182,30.),(115.083,274.916,30.),(121.519,292.314,30.),(122.542,269.932,30.),(126.697,289.253,30.),(125.861,265.034,30.),(128.232,258.953,30.),(131.151,284.628,30.),(129.654,251.689,30.),(130.128,243.243,30.),(128.487,229.265,30.),(128.168,204.561,30.),(126.436,223.955,30.),(134.135,212.099,30.),(129.718,235.695,30.),(135.574,277.196,30.),(138.397,221.199,30.),(138.951,267.399,30.),(140.955,231.862,30.),(141.093,256.081,30.),(141.807,244.088,30.),(67.387,195.101,30.),(67.387,123.818,30.),(103.617,213.514,30.),(104.299,195.101,30.),(116.276,214.78,30.),(117.469,193.581,30.),(123.565,219.764,30.),(121.615,191.385,30.),(125.269,187.838,30.),(128.775,182.348,30.),(135.515,196.59,30.),(131.279,175.507,30.),(132.782,167.314,30.),(133.283,157.77,30.),(49.741,109.966,30.),(108.817,105.405,30.),(49.741,105.405,30.),(52.448,111.972,30.),(54.089,114.611,30.),(54.92,118.56,30.),(55.197,124.493,30.),(105.407,123.818,30.),(118.705,125.253,30.),(118.173,106.208,30.),(125.44,108.615,30.),(122.755,127.386,30.),(126.378,130.912,30.),(131.301,113.007,30.),(129.399,135.821,30.),(131.556,141.934,30.),(136.437,119.764,30.),(132.851,149.25,30.),(140.763,186.191,30.),(140.166,127.544,30.),(142.83,136.529,30.),(143.912,173.364,30.),(144.429,146.717,30.),(144.961,158.108,30.),(-21.866,294.595,30.),(-97.991,290.034,30.),(-97.991,294.595,30.),(-95.284,288.049,30.),(-93.643,285.473,30.),(-92.812,281.546,30.),(-92.535,275.507,30.),(-80.345,276.182,30.),(-21.866,276.182,30.),(-18.818,295.144,30.),(-18.818,275.642,30.),(-16.836,274.021,30.),(-16.836,296.791,30.),(-15.536,300.042,30.),(-15.536,270.778,30.),(-14.534,305.405,30.),(-14.534,265.372,30.),(-12.233,305.405,30.),(-12.233,265.372,30.),(-80.345,212.331,30.),(-80.345,193.919,30.),(-43.092,193.919,30.),(-43.092,212.331,30.),(-38.105,191.757,30.),(-40.044,212.88,30.),(-38.062,214.527,30.),(-36.773,188.514,30.),(-36.762,217.779,30.),(-35.761,183.108,30.),(-35.761,223.142,30.),(-33.459,183.108,30.),(-33.459,223.142,30.),(-97.991,109.966,30.),(-21.269,105.405,30.),(-97.991,105.405,30.),(-95.231,111.972,30.),(-93.6,114.611,30.),(-92.535,124.493,30.),(-80.345,123.818,30.),(-21.354,123.818,30.),(-16.282,125.979,30.),(-18.221,104.856,30.),(-16.239,103.209,30.),(-14.971,129.222,30.),(-14.961,99.958,30.),(-14.023,134.628,30.),(-14.023,94.595,30.),(-11.636,94.595,30.),(-11.636,134.628,30.),(-169.171,294.595,30.),(-217.421,290.034,30.),(-217.421,294.595,30.),(-214.661,288.028,30.),(-213.031,285.389,30.),(-211.965,275.507,30.),(-199.775,276.182,30.),(-199.775,123.818,30.),(-169.853,276.182,30.),(-158.697,275.,30.),(-152.293,292.356,30.),(-150.119,271.453,30.),(-145.707,289.559,30.),(-143.416,265.076,30.),(-140.358,285.642,30.),(-137.886,255.405,30.),(-134.796,279.054,30.),(-133.97,244.151,30.),(-129.873,270.608,30.),(-131.173,231.166,30.),(-129.494,216.448,30.),(-125.589,260.304,30.),(-128.935,200.,30.),(-127.366,135.008,30.),(-123.82,145.101,30.),(-121.945,248.142,30.),(-120.464,157.908,30.),(-117.597,224.789,30.),(-118.066,171.326,30.),(-116.628,185.357,30.),(-116.148,200.,30.),(-217.421,109.966,30.),(-169.171,105.405,30.),(-217.421,105.405,30.),(-214.661,111.972,30.),(-213.031,114.611,30.),(-211.965,124.493,30.),(-169.853,123.818,30.),(-155.17,126.098,30.),(-152.879,107.644,30.),(-149.538,128.948,30.),(-146.259,110.441,30.),(-145.047,132.939,30.),(-140.656,114.358,30.),(-140.976,138.64,30.),(-137.46,145.777,30.),(-135.784,119.637,30.),(-134.497,154.35,30.),(-131.354,126.52,30.),(-132.089,164.358,30.),(-129.724,181.377,30.),(-292.011,294.595,30.),(-315.113,290.034,30.),(-315.113,294.595,30.),(-312.406,288.049,30.),(-310.765,285.473,30.),(-309.934,281.546,30.),(-309.657,275.507,30.),(-296.359,285.473,30.),(-297.19,281.546,30.),(-309.657,124.493,30.),(-297.467,275.507,30.),(-294.718,288.049,30.),(-292.011,290.034,30.),(-312.406,111.972,30.),(-315.113,105.405,30.),(-315.113,109.966,30.),(-239.244,105.405,30.),(-310.765,114.611,30.),(-309.934,118.56,30.),(-297.467,123.818,30.),(-239.244,123.818,30.),(-234.172,125.979,30.),(-236.186,104.856,30.),(-234.172,103.209,30.),(-232.84,99.958,30.),(-232.84,129.222,30.),(-231.827,94.595,30.),(-231.827,134.628,30.),(-229.526,94.595,30.),(-229.526,134.628,30.),(-447.847,214.569,30.),(-447.314,178.885,30.),(-448.353,200.,30.),(-446.328,228.378,30.),(-444.197,159.797,30.),(-443.798,241.427,30.),(-439.002,142.736,30.),(-440.255,253.716,30.),(-435.518,265.446,30.),(-435.566,200.,30.),(-434.873,215.266,30.),(-429.918,275.465,30.),(-432.795,229.307,30.),(-429.332,242.124,30.),(-423.456,283.773,30.),(-424.484,253.716,30.),(-417.627,264.802,30.),(-416.13,290.372,30.),(-409.758,272.72,30.),(-404.515,296.41,30.),(-400.876,277.47,30.),(-390.982,298.649,30.),(-390.982,279.054,30.),(-378.856,297.002,30.),(-380.971,277.344,30.),(-371.994,272.551,30.),(-367.966,292.061,30.),(-364.05,264.675,30.),(-358.312,283.826,30.),(-357.139,253.716,30.),(-349.893,272.297,30.),(-352.291,242.251,30.),(-348.828,229.307,30.),(-342.621,257.242,30.),(-346.75,214.886,30.),(-346.057,198.986,30.),(-345.6,135.753,30.),(-341.454,146.284,30.),(-337.426,239.949,30.),(-337.874,158.488,30.),(-335.316,171.284,30.),(-334.309,220.418,30.),(-333.782,184.671,30.),(-333.27,198.649,30.),(-434.873,184.734,30.),(-431.73,127.703,30.),(-432.795,170.693,30.),(-429.332,157.876,30.),(-423.322,116.174,30.),(-424.484,146.284,30.),(-417.616,135.198,30.),(-413.7,107.939,30.),(-409.715,127.28,30.),(-402.863,102.998,30.),(-400.78,122.53,30.),(-390.812,101.351,30.),(-390.812,120.946,30.),(-380.843,122.53,30.),(-382.619,102.053,30.),(-375.004,104.16,30.),(-371.908,127.28,30.),(-367.967,107.67,30.),(-364.007,135.198,30.),(-361.508,112.584,30.),(-357.139,146.284,30.),(-355.628,118.903,30.),(-352.291,157.813,30.),(-350.325,126.626,30.),(-348.828,170.439,30.),(-346.75,184.164,30.),(-517.658,294.595,30.),(-593.783,290.034,30.),(-593.783,294.595,30.),(-591.077,288.049,30.),(-589.436,285.473,30.),(-588.604,281.546,30.),(-588.327,275.507,30.),(-576.137,276.182,30.),(-588.327,124.493,30.),(-517.658,276.182,30.),(-514.611,275.642,30.),(-514.611,295.144,30.),(-512.629,296.791,30.),(-512.629,274.021,30.),(-511.329,270.778,30.),(-511.329,300.042,30.),(-510.327,305.405,30.),(-510.327,265.372,30.),(-508.025,265.372,30.),(-508.025,305.405,30.),(-538.884,212.331,30.),(-576.137,193.919,30.),(-576.137,212.331,30.),(-538.884,193.919,30.),(-535.837,212.88,30.),(-533.898,191.757,30.),(-533.855,214.527,30.),(-532.566,188.514,30.),(-532.555,217.779,30.),(-531.553,183.108,30.),(-531.553,223.142,30.),(-529.252,183.108,30.),(-529.252,223.142,30.),(-593.783,109.966,30.),(-517.061,105.405,30.),(-593.783,105.405,30.),(-591.023,111.972,30.),(-589.393,114.611,30.),(-576.137,123.818,30.),(-517.147,123.818,30.),(-512.075,125.979,30.),(-514.014,104.856,30.),(-512.032,103.209,30.),(-510.764,129.222,30.),(-510.753,99.958,30.),(-509.816,134.628,30.),(-509.816,94.595,30.),(-507.429,94.595,30.),(-507.429,134.628,30.),(-673.093,294.595,30.),(-700.,290.034,30.),(-700.,294.595,30.),(-696.739,287.373,30.),(-693.948,283.446,30.),(-686.02,264.886,30.),(-675.904,287.838,30.),(-676.841,283.615,30.),(-673.093,290.034,30.),(-676.266,278.593,30.),(-656.61,188.936,30.),(-674.542,272.986,30.),(-649.364,207.683,30.),(-627.494,294.595,30.),(-624.66,287.838,30.),(-627.494,290.034,30.),(-603.16,294.595,30.),(-623.715,283.277,30.),(-610.236,281.334,30.),(-619.101,259.655,30.),(-606.847,286.592,30.),(-603.16,290.034,30.),(-626.045,272.817,30.),(-644.419,188.936,30.),(-659.359,111.972,30.),(-662.065,105.405,30.),(-662.065,109.966,30.),(-638.964,105.405,30.),(-657.718,114.611,30.),(-656.887,118.56,30.),(-656.61,124.493,30.),(-643.354,114.611,30.),(-644.419,124.493,30.),(-641.723,111.972,30.),(-638.964,109.966,30.),(-517.061,105.405,50.),(-593.783,109.966,50.),(-593.783,105.405,50.),(-591.023,111.972,50.),(-589.393,114.611,50.),(-588.327,124.493,50.),(-576.137,123.818,50.),(-588.327,275.507,50.),(-576.137,212.331,50.),(-576.137,193.919,50.),(-517.147,123.818,50.),(-512.075,125.979,50.),(-514.014,104.856,50.),(-512.032,103.209,50.),(-510.764,129.222,50.),(-510.753,99.958,50.),(-509.816,134.628,50.),(-509.816,94.595,50.),(-507.429,94.595,50.),(-507.429,134.628,50.),(-538.884,212.331,50.),(-538.884,193.919,50.),(-535.837,212.88,50.),(-533.898,191.757,50.),(-533.855,214.527,50.),(-532.566,188.514,50.),(-532.555,217.779,50.),(-531.553,183.108,50.),(-531.553,223.142,50.),(-529.252,183.108,50.),(-529.252,223.142,50.),(-591.077,288.049,50.),(-593.783,294.595,50.),(-593.783,290.034,50.),(-517.658,294.595,50.),(-589.436,285.473,50.),(-588.604,281.546,50.),(-576.137,276.182,50.),(-517.658,276.182,50.),(-514.611,295.144,50.),(-514.611,275.642,50.),(-512.629,296.791,50.),(-512.629,274.021,50.),(-511.329,270.778,50.),(-511.329,300.042,50.),(-510.327,265.372,50.),(-510.327,305.405,50.),(-508.025,305.405,50.),(-508.025,265.372,50.)),$); +#596=IFCSTYLEDITEM(#594,(#592),$); +#597=IFCWALL('3LTGJZ50P17x4My$lMjBSo',#1,'rail bridge - spandrel wall','A spandrel wall, providing structural support for the rail bridge.','solidwall',#598,#604,'454425.1027894.955995.1884275.1998466',$); +#598=IFCLOCALPLACEMENT(#557,#599); +#599=IFCAXIS2PLACEMENT3D(#600,#601,#602); +#600=IFCCARTESIANPOINT((10000.,2200.,3290.346)); +#601=IFCDIRECTION((0.,0.,1.)); +#602=IFCDIRECTION((-1.,-8.990670665013707E-16,0.)); +#603=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#572)); +#604=IFCPRODUCTDEFINITIONSHAPE($,$,(#603)); +#605=IFCSIGN('1U2g5rjcPDBw9NVxla024k',#1,'road rail bridge - name sign','Ye Olde Brygge\X\27s Timeless Plaque: A Gleaming Tribute to Bygone Eras','pictoral',#606,#615,'454425.1027894.955995.1884275.1998466.2028197',$); +#606=IFCLOCALPLACEMENT(#557,#607); +#607=IFCAXIS2PLACEMENT3D(#608,#609,#610); +#608=IFCCARTESIANPOINT((0.,2200.,7024.582)); +#609=IFCDIRECTION((-1.407706387491906E-16,1.,0.)); +#610=IFCDIRECTION((-1.,-1.7742210049501892E-16,0.)); +#611=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#612,#616)); +#612=IFCTRIANGULATEDFACESET(#613,((-1.,2.4770934453639655E-53,7.513933022930267E-16),(-1.,2.4770934453639655E-53,7.513933022930267E-16),(-1.,2.4770934453639655E-53,7.513933022930267E-16),(-1.,2.4770934453639655E-53,7.513933022930267E-16),(7.622819490942721E-16,2.757701622613239E-12,1.),(7.622819490942721E-16,2.757701622613239E-12,1.),(7.622819490942721E-16,2.757701622613239E-12,1.),(7.622819490942721E-16,2.757701622613239E-12,1.),(-7.622819490942721E-16,-2.757701622613239E-12,-1.),(-7.622819490942721E-16,-2.757701622613239E-12,-1.),(-7.622819490942721E-16,-2.757701622613239E-12,-1.),(-7.622819490942721E-16,-2.757701622613239E-12,-1.),(2.1021461679060575E-27,-1.,2.757701622613241E-12),(2.1021461679060575E-27,-1.,2.757701622613241E-12),(2.1021461679060575E-27,-1.,2.757701622613241E-12),(2.1021461679060575E-27,-1.,2.757701622613241E-12),(-2.1021461679060575E-27,1.,-2.757701622613241E-12),(-2.1021461679060575E-27,1.,-2.757701622613241E-12),(-2.1021461679060575E-27,1.,-2.757701622613241E-12),(-2.1021461679060575E-27,1.,-2.757701622613241E-12),(1.,-2.4770934453639655E-53,-7.513933022930267E-16),(1.,-2.4770934453639655E-53,-7.513933022930267E-16),(1.,-2.4770934453639655E-53,-7.513933022930267E-16),(1.,-2.4770934453639655E-53,-7.513933022930267E-16)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#613=IFCCARTESIANPOINTLIST3D(((-800.,0.,30.),(-800.,400.,0.),(-800.,0.,0.),(-800.,400.,30.),(800.,0.,30.),(-800.,400.,30.),(-800.,0.,30.),(800.,400.,30.),(800.,400.,0.),(-800.,0.,0.),(-800.,400.,0.),(800.,0.,0.),(800.,0.,30.),(-800.,0.,0.),(800.,0.,0.),(-800.,0.,30.),(-800.,400.,0.),(800.,400.,30.),(800.,400.,0.),(-800.,400.,30.),(800.,400.,0.),(800.,0.,30.),(800.,0.,0.),(800.,400.,30.)),$); +#614=IFCSTYLEDITEM(#612,(#592),$); +#615=IFCPRODUCTDEFINITIONSHAPE($,$,(#611)); +#616=IFCTRIANGULATEDFACESET(#617,((7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(0.985262099127433,-0.17105144262181596,4.715209310291167E-13),(0.998558022065677,0.05368311250554527,-1.4851410160134605E-13),(0.9985580220656759,0.05368311250556592,-1.4851410160140297E-13),(0.9852620991274318,-0.17105144262182378,4.715209310291384E-13),(0.9985580220656759,0.05368311250556592,-1.4851410160140297E-13),(0.9942362468634307,0.10721140528376343,-2.9618156869298063E-13),(0.9942362468634307,0.10721140528376343,-2.9618156869298063E-13),(0.998558022065677,0.05368311250554527,-1.4851410160134605E-13),(0.8507772826193545,0.5255264173938615,-1.4503651574277816E-12),(0.7331764133481148,0.6800384892857126,-1.876649315913337E-12),(0.7331764133484892,0.6800384892853092,-1.876649315912224E-12),(0.8507772826193545,0.5255264173938615,-1.4503651574277816E-12),(0.7331764133481148,0.6800384892857126,-1.876649315913337E-12),(0.5879319010498577,0.8089104275059759,-2.2321763921560145E-12),(0.7331764133484892,0.6800384892853092,-1.876649315912224E-12),(0.5879319010498577,0.8089104275059759,-2.2321763921560145E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-0.5954279130339792,0.8034087380530537,-2.216542555674334E-12),(-0.7353424654424054,0.6776956975789981,-1.8696669748645103E-12),(-0.5954279130339792,0.8034087380530537,-2.216542555674334E-12),(-0.735342465442188,0.6776956975792342,-1.869666974865162E-12),(-0.735342465442188,0.6776956975792342,-1.869666974865162E-12),(-0.9279729502401773,0.3726475595284927,-1.0278642854145703E-12),(-0.7353424654424054,0.6776956975789981,-1.8696669748645103E-12),(-0.9279729502400409,0.37264755952883255,-1.0278642854155084E-12),(-0.9279729502400409,0.37264755952883255,-1.0278642854155084E-12),(-0.9919380594528788,0.12672366080908923,-3.4920921670340056E-13),(-0.9279729502401773,0.3726475595284927,-1.0278642854145703E-12),(-0.9919380594528859,0.12672366080903444,-3.492092167032495E-13),(-0.9919380594528859,0.12672366080903444,-3.492092167032495E-13),(-0.9997278626286515,0.02332810930933755,-6.393651358592246E-14),(-0.9919380594528788,0.12672366080908923,-3.4920921670340056E-13),(-0.9997278626286514,0.02332810930934073,-6.393651358593125E-14),(-0.9997278626286514,0.02332810930934073,-6.393651358593125E-14),(-1.,1.0761972206014589E-42,4.1832639490547976E-16),(-0.9997278626286515,0.02332810930933755,-6.393651358592246E-14),(-1.,1.0761972206014589E-42,4.1832639490547976E-16),(-0.9325271362086447,-0.3610999033986357,9.968414837905411E-13),(-0.9262080086179281,-0.3770128973550006,1.0406811080924663E-12),(-0.9325271362086447,-0.3610999033986357,9.968414837905411E-13),(-0.9262080086179306,-0.3770128973549943,1.0406811080924489E-12),(-0.9262080086179306,-0.3770128973549943,1.0406811080924489E-12),(-0.8723365420137931,-0.48890587792275286,1.3493012683687924E-12),(-0.9262080086179281,-0.3770128973550006,1.0406811080924663E-12),(-0.8723365420138,-0.488905877922741,1.3493012683687598E-12),(-0.8723365420138,-0.488905877922741,1.3493012683687598E-12),(-0.7301883777656378,-0.6832458803212693,1.885456805903176E-12),(-0.8723365420137931,-0.48890587792275286,1.3493012683687924E-12),(-0.7301883777657012,-0.6832458803212016,1.885456805902989E-12),(-0.7301883777656378,-0.6832458803212693,1.885456805903176E-12),(-0.6321911971634419,-0.7748124226088884,2.1380863074594575E-12),(-0.6321911971634419,-0.7748124226088884,2.1380863074594575E-12),(-0.7301883777657012,-0.6832458803212016,1.885456805902989E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.6156006345831444,-0.7880582838222246,2.174242458331211E-12),(0.6156006345831444,-0.7880582838222246,2.174242458331211E-12),(0.6156006345831444,-0.7880582838222246,2.174242458331211E-12),(0.6156006345831444,-0.7880582838222246,2.174242458331211E-12),(0.976255309916327,-0.21662310555473194,5.97215434125842E-13),(0.9986377588414403,-0.0521787946980892,1.4361291775331307E-13),(0.9986377588414309,-0.05217879469827008,1.4361291775381203E-13),(0.976255309916327,-0.21662310555473194,5.97215434125842E-13),(0.9986377588414309,-0.05217879469827008,1.4361291775381203E-13),(0.9788258497336634,0.20469478716658152,-5.652018342653325E-13),(0.9788258497336585,0.20469478716660464,-5.652018342653965E-13),(0.9986377588414403,-0.0521787946980892,1.4361291775331307E-13),(0.9788258497336585,0.20469478716660464,-5.652018342653965E-13),(0.9450084045283365,0.32704604472582804,-9.029369769538203E-13),(0.9450084045283349,0.3270460447258325,-9.029369769538328E-13),(0.9788258497336634,0.20469478716658152,-5.652018342653325E-13),(0.9450084045283349,0.3270460447258325,-9.029369769538328E-13),(0.9330496485399467,0.35974762453626036,-9.931222522019194E-13),(0.9330496485399467,0.35974762453626036,-9.931222522019194E-13),(0.9450084045283365,0.32704604472582804,-9.029369769538203E-13),(-0.9414820933211209,0.3370630029470463,-9.295617309927235E-13),(-0.9606480611335328,0.2777684334844122,-7.660138486521419E-13),(-0.9414820933211209,0.3370630029470463,-9.295617309927235E-13),(-0.9606480611335284,0.27776843348442753,-7.660138486521842E-13),(-0.9606480611335284,0.27776843348442753,-7.660138486521842E-13),(-0.9760836593293772,0.21739523911570036,-5.994913964326429E-13),(-0.9606480611335328,0.2777684334844122,-7.660138486521419E-13),(-0.9760836593293772,0.21739523911570036,-5.994913964326429E-13),(-0.9792141269630011,-0.2028292226383756,5.599701124608434E-13),(-0.9792141269630011,-0.2028292226383756,5.599701124608434E-13),(-0.9792141269630011,-0.2028292226383756,5.599701124608434E-13),(-0.9792141269630011,-0.2028292226383756,5.599701124608434E-13),(-0.6124868691938966,-0.7904807619828953,2.1813289080976322E-12),(-0.6124868691938966,-0.7904807619828953,2.1813289080976322E-12),(-0.6124868691938966,-0.7904807619828953,2.1813289080976322E-12),(-0.6124868691938966,-0.7904807619828953,2.1813289080976322E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.6823833044151714,-0.7309945457084011,2.016755335614812E-12),(0.7673233100207234,-0.641260429076082,1.7691891586054479E-12),(0.6823833044151714,-0.7309945457084011,2.016755335614812E-12),(0.7673233100207456,-0.6412604290760555,1.7691891586053748E-12),(0.7673233100207234,-0.641260429076082,1.7691891586054479E-12),(0.8868360880342053,-0.46208414056336894,1.2747287689790184E-12),(0.8868360880342097,-0.46208414056336067,1.2747287689789956E-12),(0.7673233100207456,-0.6412604290760555,1.7691891586053748E-12),(0.8868360880342097,-0.46208414056336067,1.2747287689789956E-12),(0.9337699395388032,-0.35787386047838143,9.870371026151805E-13),(0.9337699395388004,-0.35787386047838854,9.870371026152003E-13),(0.8868360880342053,-0.46208414056336894,1.2747287689790184E-12),(0.9337699395388004,-0.35787386047838854,9.870371026152003E-13),(0.9852620991274318,-0.17105144262182378,4.715209310291384E-13),(0.985262099127433,-0.17105144262181596,4.715209310291167E-13),(0.9337699395388032,-0.35787386047838143,9.870371026151805E-13),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.20007400713171156,0.9797807875592683,-2.703342872710997E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.20007400713202148,0.979780787559205,-2.7033428727108226E-12),(-0.20007400713171156,0.9797807875592683,-2.703342872710997E-12),(-0.3920573365553578,0.9199407833404925,-2.5381524602689257E-12),(-0.3920573365553578,0.9199407833404925,-2.5381524602689257E-12),(-0.20007400713202148,0.979780787559205,-2.7033428727108226E-12),(-0.9271481171496583,0.37469503448250235,-1.0335900548120443E-12),(-0.9613689058329662,0.2752631956828324,-7.591761178686273E-13),(-0.9271481171496583,0.37469503448250235,-1.0335900548120443E-12),(-0.9613689058329608,0.27526319568285174,-7.591761178686808E-13),(-0.9613689058329608,0.27526319568285174,-7.591761178686808E-13),(-0.9849591146664003,0.1727875644703084,-4.76367398971683E-13),(-0.9613689058329662,0.2752631956828324,-7.591761178686273E-13),(-0.9849591146664003,0.1727875644703084,-4.76367398971683E-13),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.9850568535010431,-0.17222948461464055,4.755933364007252E-13),(-0.9627290187837146,-0.27046781026907074,7.466956952228941E-13),(-0.9850568535010431,-0.17222948461464055,4.755933364007252E-13),(-0.9627290187837202,-0.2704678102690515,7.466956952228411E-13),(-0.9627290187837202,-0.2704678102690515,7.466956952228411E-13),(-0.8103422277040963,-0.5859568874922134,1.6172165567270032E-12),(-0.9627290187837146,-0.27046781026907074,7.466956952228941E-13),(-0.81034222770443,-0.5859568874917522,1.617216556725731E-12),(-0.8103422277040963,-0.5859568874922134,1.6172165567270032E-12),(-0.42212186728676276,-0.9065390941147197,2.5015696665127457E-12),(-0.4221218672866963,-0.9065390941147506,2.5015696665128313E-12),(-0.81034222770443,-0.5859568874917522,1.617216556725731E-12),(-0.42212186728676276,-0.9065390941147197,2.5015696665127457E-12),(-0.08899635085429565,-0.9960319520651028,2.7482971329185647E-12),(-0.4221218672866963,-0.9065390941147506,2.5015696665128313E-12),(-0.08899635085414907,-0.996031952065116,2.7482971329186007E-12),(-0.08899635085429565,-0.9960319520651028,2.7482971329185647E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.08899635085414907,-0.996031952065116,2.7482971329186007E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-0.587931901049856,0.808910427505977,-2.2317528341055837E-12),(-0.733176413348379,0.6800384892854279,-1.8760964945742417E-12),(-0.7331764133482979,0.6800384892855155,-1.8760964945744832E-12),(-0.587931901049856,0.808910427505977,-2.2317528341055837E-12),(-0.733176413348379,0.6800384892854279,-1.8760964945742417E-12),(-0.850777282619356,0.5255264173938589,-1.449703916346821E-12),(-0.7331764133482979,0.6800384892855155,-1.8760964945744832E-12),(-0.850777282619356,0.5255264173938589,-1.449703916346821E-12),(-0.9942362468634307,0.10721140528376343,-2.9545628112976534E-13),(-0.9985580220656771,0.05368311250554416,-1.477320036568514E-13),(-0.9942362468634307,0.10721140528376343,-2.9545628112976534E-13),(-0.9985580220656753,0.053683112505575656,-1.4773200365693829E-13),(-0.9985580220656753,0.053683112505575656,-1.4773200365693829E-13),(-0.9997372811223787,-0.022920923498716158,6.366223728997661E-14),(-0.9985580220656771,0.05368311250554416,-1.477320036568514E-13),(-0.9997372811223788,-0.022920923498712536,6.36622372899666E-14),(-0.9997372811223788,-0.022920923498712536,6.36622372899666E-14),(-0.9919210150229099,-0.12685700593944488,3.503533108559576E-13),(-0.9997372811223787,-0.022920923498716158,6.366223728997661E-14),(-0.9919210150229022,-0.12685700593950436,3.5035331085612167E-13),(-0.9919210150229022,-0.12685700593950436,3.5035331085612167E-13),(-0.9257138949175167,-0.37822451633473103,1.0438610076511179E-12),(-0.9919210150229099,-0.12685700593944488,3.503533108559576E-13),(-0.9257138949175452,-0.3782245163346613,1.0438610076509252E-12),(-0.9257138949175452,-0.3782245163346613,1.0438610076509252E-12),(-0.7298956734503326,-0.6835585606796872,1.886346467008917E-12),(-0.9257138949175167,-0.37822451633473103,1.0438610076511179E-12),(-0.7298956734504372,-0.6835585606795754,1.886346467008609E-12),(-0.7298956734504372,-0.6835585606795754,1.886346467008609E-12),(-0.5913596447695503,-0.806407943002815,2.2252931113730115E-12),(-0.7298956734503326,-0.6835585606796872,1.886346467008917E-12),(-0.5913596447695503,-0.806407943002815,2.2252931113730115E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.0889963508542824,0.9960319520651041,-2.7482291390946938E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.08899635085428109,0.9960319520651042,-2.7482291390946946E-12),(-0.0889963508542824,0.9960319520651041,-2.7482291390946938E-12),(-0.42212186728667295,0.9065390941147616,-2.5011642460427965E-12),(-0.42212186728638,0.906539094114898,-2.501164246043173E-12),(-0.08899635085428109,0.9960319520651042,-2.7482291390946946E-12),(-0.42212186728667295,0.9065390941147616,-2.5011642460427965E-12),(-0.8086796863922657,0.5882492369876113,-1.622843492114576E-12),(-0.42212186728638,0.906539094114898,-2.501164246043173E-12),(-0.8086796863923503,0.588249236987495,-1.6228434921142554E-12),(-0.8086796863923503,0.588249236987495,-1.6228434921142554E-12),(-0.9603664303895992,0.27874059514311694,-7.687867333187618E-13),(-0.8086796863922657,0.5882492369876113,-1.622843492114576E-12),(-0.9603664303895765,0.27874059514319555,-7.68786733318979E-13),(-0.9603664303895765,0.27874059514319555,-7.68786733318979E-13),(-0.9830031215351365,0.18358884239565865,-5.061769453704099E-13),(-0.9603664303895992,0.27874059514311694,-7.687867333187618E-13),(-0.9830031215351365,0.18358884239565865,-5.061769453704099E-13),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.9832650394637072,-0.1821808501693699,5.031268141079427E-13),(-0.9604389766296841,-0.27849052438193517,7.68793380513837E-13),(-0.9832650394637072,-0.1821808501693699,5.031268141079427E-13),(-0.960438976629688,-0.2784905243819218,7.687933805138001E-13),(-0.960438976629688,-0.2784905243819218,7.687933805138001E-13),(-0.8061306092176587,-0.591737645314515,1.6330765666009135E-12),(-0.9604389766296841,-0.27849052438193517,7.68793380513837E-13),(-0.8061306092175907,-0.5917376453146074,1.6330765666011683E-12),(-0.8061306092175907,-0.5917376453146074,1.6330765666011683E-12),(-0.4173761927595036,-0.9087337969491296,2.5076104311625807E-12),(-0.8061306092176587,-0.591737645314515,1.6330765666009135E-12),(-0.4173761927594212,-0.9087337969491672,2.507610431162684E-12),(-0.4173761927595036,-0.9087337969491296,2.5076104311625807E-12),(-0.08763790369519597,-0.9961523968931217,2.7486265371435156E-12),(-0.08763790369509214,-0.996152396893131,2.748626537143541E-12),(-0.4173761927594212,-0.9087337969491672,2.507610431162684E-12),(-0.08763790369519597,-0.9961523968931217,2.7486265371435156E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.08763790369509214,-0.996152396893131,2.748626537143541E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(-1.5257648893363474E-27,1.,-2.75921435746603E-12),(-0.08899635085415496,0.9960319520651153,-2.748222172557269E-12),(-1.5257648893363474E-27,1.,-2.75921435746603E-12),(-0.08899635085419567,0.9960319520651116,-2.7482221725572587E-12),(-0.08899635085419567,0.9960319520651116,-2.7482221725572587E-12),(-0.42212186728709555,0.906539094114565,-2.501099665842027E-12),(-0.08899635085415496,0.9960319520651153,-2.748222172557269E-12),(-0.42212186728641377,0.9065390941148823,-2.5010996658429036E-12),(-0.42212186728709555,0.906539094114565,-2.501099665842027E-12),(-0.8086796863924871,0.5882492369873068,-1.6227862208364274E-12),(-0.8086796863927596,0.5882492369869325,-1.6227862208353947E-12),(-0.42212186728641377,0.9065390941148823,-2.5010996658429036E-12),(-0.8086796863924871,0.5882492369873068,-1.6227862208364274E-12),(-0.9603664303895686,0.27874059514322275,-7.687867333190488E-13),(-0.8086796863927596,0.5882492369869325,-1.6227862208353947E-12),(-0.960366430389606,0.27874059514309385,-7.687867333186931E-13),(-0.960366430389606,0.27874059514309385,-7.687867333186931E-13),(-0.9830031215351371,0.1835888423956546,-5.061769453704099E-13),(-0.9603664303895686,0.27874059514322275,-7.687867333190488E-13),(-0.9830031215351371,0.1835888423956546,-5.061769453704099E-13),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.9829162037139715,-0.1840536239157341,5.082338296439351E-13),(-0.95898232668401,-0.2834658658599357,7.825801905158297E-13),(-0.9829162037139715,-0.1840536239157341,5.082338296439351E-13),(-0.9589823266840098,-0.28346586585993633,7.825801905158315E-13),(-0.9589823266840098,-0.28346586585993633,7.825801905158315E-13),(-0.9250216907185366,-0.3799142952038267,1.0487441869172509E-12),(-0.95898232668401,-0.2834658658599357,7.825801905158297E-13),(-0.9250216907185366,-0.3799142952038267,1.0487441869172509E-12),(-0.3977066570345245,-0.9175126238643386,2.5317644164665837E-12),(-0.20308542061857274,-0.9791610245164875,2.7017919634543046E-12),(-0.20308542061850404,-0.9791610245165019,2.701791963454344E-12),(-0.3977066570345245,-0.9175126238643386,2.5317644164665837E-12),(-0.20308542061850404,-0.9791610245165019,2.701791963454344E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(-0.20308542061857274,-0.9791610245164875,2.7017919634543046E-12),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(-0.01445616326355981,0.9998955042121639,-2.7589134702647194E-12),(0.276796250063706,0.9609286320797555,-2.6515077618799407E-12),(-0.01445616326357933,0.9998955042121637,-2.7589134702647194E-12),(0.2767962500636958,0.9609286320797585,-2.6515077618799484E-12),(0.2767962500636958,0.9609286320797585,-2.6515077618799484E-12),(0.5363224181349204,0.8440131893554221,-2.3290062378435722E-12),(0.276796250063706,0.9609286320797555,-2.6515077618799407E-12),(0.53632241813488,0.8440131893554479,-2.329006237843643E-12),(0.53632241813488,0.8440131893554479,-2.329006237843643E-12),(0.7332983821190578,0.6799069662693362,-1.8762617426002835E-12),(0.5363224181349204,0.8440131893554221,-2.3290062378435722E-12),(0.733298382119046,0.6799069662693491,-1.8762617426003182E-12),(0.7332983821190578,0.6799069662693362,-1.8762617426002835E-12),(0.8575262393066199,0.514440228695857,-1.4197955127924093E-12),(0.857526239306608,0.514440228695877,-1.4197955127924644E-12),(0.733298382119046,0.6799069662693491,-1.8762617426003182E-12),(0.857526239306608,0.514440228695877,-1.4197955127924644E-12),(0.9319963445918341,0.3624676725826169,-1.0006082873999287E-12),(0.931996344591825,0.3624676725826408,-1.0006082873999945E-12),(0.8575262393066199,0.514440228695857,-1.4197955127924093E-12),(0.931996344591825,0.3624676725826408,-1.0006082873999945E-12),(0.9747870892284454,0.2231370221938414,-6.16132948054575E-13),(0.9747870892284406,0.22313702219386236,-6.161329480546327E-13),(0.9319963445918341,0.3624676725826169,-1.0006082873999287E-12),(0.9747870892284406,0.22313702219386236,-6.161329480546327E-13),(0.9947035144805423,0.10278578831753733,-2.84014338493852E-13),(0.9947035144805428,0.10278578831753325,-2.8401433849384084E-13),(0.9747870892284454,0.2231370221938414,-6.16132948054575E-13),(0.9947035144805428,0.10278578831753325,-2.8401433849384084E-13),(0.9999845618336788,0.005556626162130687,-1.5808917507253305E-14),(0.9999845618336788,0.005556626162136084,-1.5808917507268183E-14),(0.9947035144805423,0.10278578831753733,-2.84014338493852E-13),(0.9999845618336788,0.005556626162136084,-1.5808917507268183E-14),(0.9971625390869557,-0.07527862008336489,2.0729378596099794E-13),(0.9971625390869561,-0.075278620083362,2.0729378596099E-13),(0.9999845618336788,0.005556626162130687,-1.5808917507253305E-14),(0.9971625390869561,-0.075278620083362,2.0729378596099E-13),(0.9879040014647004,-0.15506670787126917,4.275538307291491E-13),(0.9879040014647001,-0.15506670787127036,4.275538307291524E-13),(0.9971625390869557,-0.07527862008336489,2.0729378596099794E-13),(0.9879040014647001,-0.15506670787127036,4.275538307291524E-13),(0.9710252517045587,-0.2389769038047369,6.589725329632717E-13),(0.9710252517045607,-0.2389769038047292,6.589725329632503E-13),(0.9879040014647004,-0.15506670787126917,4.275538307291491E-13),(0.9710252517045607,-0.2389769038047292,6.589725329632503E-13),(0.945969042642219,-0.32425695113993125,8.942127520986036E-13),(0.9459690426422243,-0.3242569511399157,8.942127520985608E-13),(0.9710252517045587,-0.2389769038047369,6.589725329632717E-13),(0.9459690426422243,-0.3242569511399157,8.942127520985608E-13),(0.9104691640560179,-0.413576959347515,1.1407281707605888E-12),(0.9104691640560099,-0.41357695934753264,1.1407281707606376E-12),(0.945969042642219,-0.32425695113993125,8.942127520986036E-13),(0.9104691640560099,-0.41357695934753264,1.1407281707606376E-12),(0.8578749092656005,-0.5138585798179669,1.4174562172443317E-12),(0.857874909265601,-0.5138585798179663,1.41745621724433E-12),(0.9104691640560179,-0.413576959347515,1.1407281707605888E-12),(0.857874909265601,-0.5138585798179663,1.41745621724433E-12),(0.7803315071929187,-0.62536608389169,1.725199757331698E-12),(0.780331507192952,-0.6253660838916482,1.7251997573315823E-12),(0.8578749092656005,-0.5138585798179669,1.4174562172443317E-12),(0.780331507192952,-0.6253660838916482,1.7251997573315823E-12),(0.671227437601915,-0.7412514600392821,2.0450008500667823E-12),(0.6712274376019304,-0.7412514600392682,2.0450008500667435E-12),(0.7803315071929187,-0.62536608389169,1.725199757331698E-12),(0.671227437601915,-0.7412514600392821,2.0450008500667823E-12),(0.5282915656620173,-0.849063025723282,2.3425121735590763E-12),(0.6712274376019304,-0.7412514600392682,2.0450008500667435E-12),(0.5282915656620125,-0.8490630257232851,2.3425121735590856E-12),(0.5282915656620125,-0.8490630257232851,2.3425121735590856E-12),(0.35815172061543016,-0.9336634002788194,2.5759994168482247E-12),(0.5282915656620173,-0.849063025723282,2.3425121735590763E-12),(0.3581517206153977,-0.9336634002788318,2.5759994168482583E-12),(0.3581517206153977,-0.9336634002788318,2.5759994168482583E-12),(0.17673045900502438,-0.9842592874135726,2.715691363519887E-12),(0.35815172061543016,-0.9336634002788194,2.5759994168482247E-12),(0.17673045900501702,-0.9842592874135739,2.715691363519891E-12),(0.17673045900501702,-0.9842592874135739,2.715691363519891E-12),(-0.02516421475156609,-0.9996833310083435,2.7583534049226627E-12),(0.17673045900502438,-0.9842592874135726,2.715691363519887E-12),(-0.02516421475162521,-0.9996833310083421,2.7583534049226595E-12),(-0.02516421475162521,-0.9996833310083421,2.7583534049226595E-12),(-0.27808054138022675,-0.9605577611500935,2.6504829939574092E-12),(-0.02516421475156609,-0.9996833310083435,2.7583534049226627E-12),(-0.2780805413802557,-0.9605577611500851,2.6504829939573854E-12),(-0.27808054138022675,-0.9605577611500935,2.6504829939574092E-12),(-0.5377928463665643,-0.8430770156972309,2.32642103457992E-12),(-0.5377928463666088,-0.8430770156972025,2.326421034579842E-12),(-0.2780805413802557,-0.9605577611500851,2.6504829939573854E-12),(-0.5377928463666088,-0.8430770156972025,2.326421034579842E-12),(-0.7340598172506592,-0.6790848140681169,1.873996223565907E-12),(-0.7340598172506781,-0.6790848140680965,1.8739962235658503E-12),(-0.5377928463665643,-0.8430770156972309,2.32642103457992E-12),(-0.7340598172506592,-0.6790848140681169,1.873996223565907E-12),(-0.8575399153398935,-0.5144174312742993,1.4196937334489394E-12),(-0.7340598172506781,-0.6790848140680965,1.8739962235658503E-12),(-0.857539915339897,-0.5144174312742935,1.4196937334489233E-12),(-0.857539915339897,-0.5144174312742935,1.4196937334489233E-12),(-0.931215481170937,-0.3644691038038483,1.006134133790151E-12),(-0.8575399153398935,-0.5144174312742993,1.4196937334489394E-12),(-0.9312154811709294,-0.36446910380386777,1.0061341337902047E-12),(-0.9312154811709294,-0.36446910380386777,1.0061341337902047E-12),(-0.9739593803592153,-0.22672257366723225,6.260666063378926E-13),(-0.931215481170937,-0.3644691038038483,1.006134133790151E-12),(-0.9739593803592121,-0.22672257366724605,6.260666063379308E-13),(-0.9739593803592121,-0.22672257366724605,6.260666063379308E-13),(-0.9944387604173459,-0.10531643641717323,2.9103680756096E-13),(-0.9739593803592153,-0.22672257366723225,6.260666063378926E-13),(-0.9944387604173455,-0.10531643641717783,2.910368075609727E-13),(-0.9944387604173455,-0.10531643641717783,2.910368075609727E-13),(-0.9999739448500035,-0.007218699406564806,2.036471542896E-14),(-0.9944387604173459,-0.10531643641717323,2.9103680756096E-13),(-0.9999739448500035,-0.007218699406560452,2.0364715428947993E-14),(-0.9999739448500035,-0.007218699406560452,2.0364715428947993E-14),(-0.9974002311185112,0.07206093924409047,-1.9847821793204483E-13),(-0.9999739448500035,-0.007218699406564806,2.036471542896E-14),(-0.9974002311185115,0.07206093924408564,-1.9847821793203148E-13),(-0.9974002311185115,0.07206093924408564,-1.9847821793203148E-13),(-0.9886899396079466,0.14997400880831008,-4.1343241570962185E-13),(-0.9974002311185112,0.07206093924409047,-1.9847821793204483E-13),(-0.988689939607947,0.14997400880830747,-4.134324157096147E-13),(-0.988689939607947,0.14997400880830747,-4.134324157096147E-13),(-0.9722499433165867,0.2339445398398823,-6.450406013057341E-13),(-0.9886899396079466,0.14997400880831008,-4.1343241570962185E-13),(-0.9722499433165831,0.23394453983989724,-6.450406013057754E-13),(-0.9722499433165831,0.23394453983989724,-6.450406013057754E-13),(-0.9453117550981344,0.3261681861759126,-8.994757870473703E-13),(-0.9722499433165867,0.2339445398398823,-6.450406013057341E-13),(-0.9453117550981349,0.32616818617591115,-8.994757870473661E-13),(-0.9453117550981349,0.32616818617591115,-8.994757870473661E-13),(-0.9018682894200392,0.432011097703025,-1.1915471123426952E-12),(-0.9453117550981344,0.3261681861759126,-8.994757870473703E-13),(-0.9018682894200535,0.43201109770299506,-1.191547112342613E-12),(-0.9018682894200535,0.43201109770299506,-1.191547112342613E-12),(-0.8335120349581517,0.5525013009757722,-1.5240980302518186E-12),(-0.9018682894200392,0.432011097703025,-1.1915471123426952E-12),(-0.8335120349581778,0.5525013009757331,-1.524098030251711E-12),(-0.8335120349581778,0.5525013009757331,-1.524098030251711E-12),(-0.732142370758794,0.6811516343221183,-1.879184392088156E-12),(-0.8335120349581517,0.5525013009757722,-1.5240980302518186E-12),(-0.7321423707587661,0.6811516343221482,-1.8791843920882386E-12),(-0.732142370758794,0.6811516343221183,-1.879184392088156E-12),(-0.5698568764936294,0.821743962748084,-2.2671697839536354E-12),(-0.56985687649368,0.821743962748049,-2.2671697839535385E-12),(-0.7321423707587661,0.6811516343221482,-1.8791843920882386E-12),(-0.56985687649368,0.821743962748049,-2.2671697839535385E-12),(-0.3161638639264402,0.9487045963560542,-2.6175612243760618E-12),(-0.31616386392637214,0.9487045963560767,-2.6175612243761244E-12),(-0.5698568764936294,0.821743962748084,-2.2671697839536354E-12),(-0.31616386392637214,0.9487045963560767,-2.6175612243761244E-12),(-0.01445616326355981,0.9998955042121639,-2.7589134702647194E-12),(-0.01445616326357933,0.9998955042121637,-2.7589134702647194E-12),(-0.3161638639264402,0.9487045963560542,-2.6175612243760618E-12),(-0.005246717485677339,-0.9999862358830873,2.7591812796705133E-12),(0.31925976024100283,-0.9476672440740248,2.6146872103274643E-12),(-0.005246717485740675,-0.9999862358830871,2.7591812796705137E-12),(0.31925976024109226,-0.9476672440739948,2.6146872103273815E-12),(0.31925976024109226,-0.9476672440739948,2.6146872103273815E-12),(0.59706336092566,-0.8021940806563927,2.213139054054019E-12),(0.31925976024100283,-0.9476672440740248,2.6146872103274643E-12),(0.5970633609257284,-0.802194080656342,2.213139054053879E-12),(0.59706336092566,-0.8021940806563927,2.213139054054019E-12),(0.784978946319045,-0.6195224401390494,1.7091073553038714E-12),(0.7849789463190372,-0.6195224401390592,1.7091073553038983E-12),(0.5970633609257284,-0.802194080656342,2.213139054053879E-12),(0.7849789463190372,-0.6195224401390592,1.7091073553038983E-12),(0.8892699765686355,-0.4573826721396635,1.2616713317124343E-12),(0.8892699765686456,-0.4573826721396436,1.2616713317123792E-12),(0.784978946319045,-0.6195224401390494,1.7091073553038714E-12),(0.8892699765686456,-0.4573826721396436,1.2616713317123792E-12),(0.9460355692139014,-0.3240628053049744,8.937113719138453E-13),(0.946035569213902,-0.3240628053049727,8.937113719138408E-13),(0.8892699765686355,-0.4573826721396635,1.2616713317124343E-12),(0.946035569213902,-0.3240628053049727,8.937113719138408E-13),(0.9789776170751959,-0.20396770642866793,5.624002959044366E-13),(0.9789776170751897,-0.20396770642869805,5.624002959045196E-13),(0.9460355692139014,-0.3240628053049744,8.937113719138453E-13),(0.9789776170751897,-0.20396770642869805,5.624002959045196E-13),(0.9953832851063591,-0.09597976729953485,2.6437787751035277E-13),(0.9953832851063574,-0.0959797672995527,2.64377877510402E-13),(0.9789776170751959,-0.20396770642866793,5.624002959044366E-13),(0.9953832851063574,-0.0959797672995527,2.64377877510402E-13),(1.,-6.809851204870718E-16,-4.742943833968864E-16),(1.,6.45609270072475E-16,-4.742943834005386E-16),(0.9953832851063591,-0.09597976729953485,2.6437787751035277E-13),(1.,6.45609270072475E-16,-4.742943834005386E-16),(0.9953832851063579,0.09597976729954767,-2.6524305043575115E-13),(0.9953832851063568,0.09597976729955957,-2.6524305043578386E-13),(1.,-6.809851204870718E-16,-4.742943833968864E-16),(0.9953832851063568,0.09597976729955957,-2.6524305043578386E-13),(0.9789776170751958,0.20396770642866877,-5.631814230693366E-13),(0.9789776170751952,0.20396770642867176,-5.631814230693448E-13),(0.9953832851063579,0.09597976729954767,-2.6524305043575115E-13),(0.9789776170751952,0.20396770642867176,-5.631814230693448E-13),(0.9460355692139023,0.32406280530497167,-8.945743322032901E-13),(0.9460355692139127,0.32406280530494147,-8.945743322032068E-13),(0.9789776170751958,0.20396770642866877,-5.631814230693366E-13),(0.9460355692139127,0.32406280530494147,-8.945743322032068E-13),(0.8891109963042099,0.4576916388256785,-1.2632346569490303E-12),(0.8891109963042216,0.45769163882565606,-1.2632346569489688E-12),(0.9460355692139023,0.32406280530497167,-8.945743322032901E-13),(0.8891109963042216,0.45769163882565606,-1.2632346569489688E-12),(0.7841350649780974,0.6205902028487036,-1.712637713724388E-12),(0.784135064978063,0.620590202848747,-1.7126377137245076E-12),(0.8891109963042099,0.4576916388256785,-1.2632346569490303E-12),(0.784135064978063,0.620590202848747,-1.7126377137245076E-12),(0.5952527509857987,0.8035385257993787,-2.2174039828038106E-12),(0.595252750985843,0.803538525799346,-2.21740398280372E-12),(0.7841350649780974,0.6205902028487036,-1.712637713724388E-12),(0.5952527509857987,0.8035385257993787,-2.2174039828038106E-12),(0.3175291106517308,0.9482485243272045,-2.6165639290146134E-12),(0.595252750985843,0.803538525799346,-2.21740398280372E-12),(0.31752911065161143,0.9482485243272446,-2.6165639290147237E-12),(0.31752911065161143,0.9482485243272446,-2.6165639290147237E-12),(-1.4062582279334957E-14,1.,-2.759214319657624E-12),(0.3175291106517308,0.9482485243272045,-2.6165639290146134E-12),(1.4796126647608864E-14,1.,-2.7592143196576233E-12),(-1.4062582279334957E-14,1.,-2.759214319657624E-12),(-0.31752911065161,0.9482485243272449,-2.6162777028999E-12),(-0.31752911065167166,0.9482485243272244,-2.616277702899842E-12),(1.4796126647608864E-14,1.,-2.7592143196576233E-12),(-0.31752911065167166,0.9482485243272244,-2.616277702899842E-12),(-0.5952527509858165,0.8035385257993655,-2.2167932132392455E-12),(-0.5952527509858213,0.8035385257993619,-2.216793213239236E-12),(-0.31752911065161,0.9482485243272449,-2.6162777028999E-12),(-0.5952527509858165,0.8035385257993655,-2.2167932132392455E-12),(-0.7841350649781005,0.6205902028486996,-1.7119763888366694E-12),(-0.5952527509858213,0.8035385257993619,-2.216793213239236E-12),(-0.7841350649780668,0.6205902028487421,-1.7119763888367866E-12),(-0.7841350649780668,0.6205902028487421,-1.7119763888367866E-12),(-0.8886633336049228,0.4585602245138429,-1.2649775210429096E-12),(-0.7841350649781005,0.6205902028486996,-1.7119763888366694E-12),(-0.8886633336049196,0.4585602245138489,-1.2649775210429262E-12),(-0.8886633336049196,0.4585602245138489,-1.2649775210429262E-12),(-0.945101558421973,0.32677674988952066,-9.012788010206007E-13),(-0.8886633336049228,0.4585602245138429,-1.2649775210429096E-12),(-0.9451015584219759,0.32677674988951194,-9.012788010205767E-13),(-0.9451015584219759,0.32677674988951194,-9.012788010205767E-13),(-0.9782446517648234,0.2074545764583652,-5.719998781999873E-13),(-0.945101558421973,0.32677674988952066,-9.012788010206007E-13),(-0.9782446517648219,0.2074545764583723,-5.719998782000068E-13),(-0.9782446517648219,0.2074545764583723,-5.719998782000068E-13),(-0.9951552549714545,0.09831591174728377,-2.7083929617386647E-13),(-0.9782446517648234,0.2074545764583652,-5.719998781999873E-13),(-0.9951552549714534,0.09831591174729407,-2.7083929617389494E-13),(-0.9951552549714534,0.09831591174729407,-2.7083929617389494E-13),(-0.9999987530813137,0.0015791883415384137,-3.859990033965968E-15),(-0.9951552549714545,0.09831591174728377,-2.7083929617386647E-13),(-0.9999987530813137,0.0015791883415576212,-3.8599900340189724E-15),(-0.9999987530813137,0.0015791883415576212,-3.8599900340189724E-15),(-0.9956491772094714,-0.09318109208472854,2.5755957356027965E-13),(-0.9999987530813137,0.0015791883415384137,-3.859990033965968E-15),(-0.995649177209472,-0.09318109208472376,2.5755957356026657E-13),(-0.995649177209472,-0.09318109208472376,2.5755957356026657E-13),(-0.979613746822012,-0.20089028607013118,5.546679673835245E-13),(-0.9956491772094714,-0.09318109208472854,2.5755957356027965E-13),(-0.9796137468220057,-0.2008902860701619,5.546679673836094E-13),(-0.9796137468220057,-0.2008902860701619,5.546679673836094E-13),(-0.9457986610955139,-0.3247535876167244,8.96409807520311E-13),(-0.979613746822012,-0.20089028607013118,5.546679673835245E-13),(-0.9457986610955131,-0.32475358761672657,8.96409807520317E-13),(-0.9457986610955131,-0.32475358761672657,8.96409807520317E-13),(-0.886378063178809,-0.46296212492533734,1.2777524217616496E-12),(-0.9457986610955139,-0.3247535876167244,8.96409807520311E-13),(-0.8863780631788213,-0.46296212492531347,1.2777524217615841E-12),(-0.8863780631788213,-0.46296212492531347,1.2777524217615841E-12),(-0.7799875144674657,-0.6257950761030844,1.7270220997526458E-12),(-0.886378063178809,-0.46296212492533734,1.2777524217616496E-12),(-0.7799875144674742,-0.6257950761030739,1.7270220997526171E-12),(-0.7799875144674657,-0.6257950761030844,1.7270220997526458E-12),(-0.59377879419472,-0.8046283263499144,2.2203957259091225E-12),(-0.593778794194671,-0.8046283263499506,2.2203957259092226E-12),(-0.7799875144674742,-0.6257950761030739,1.7270220997526171E-12),(-0.593778794194671,-0.8046283263499506,2.2203957259092226E-12),(-0.3238558108248667,-0.946106449505006,2.610652297479366E-12),(-0.32385581082476506,-0.9461064495050407,2.6106522974794616E-12),(-0.59377879419472,-0.8046283263499144,2.2203957259091225E-12),(-0.3238558108248667,-0.946106449505006,2.610652297479366E-12),(-0.005246717485740675,-0.9999862358830871,2.7591812796705137E-12),(-0.32385581082476506,-0.9461064495050407,2.6106522974794616E-12),(-0.005246717485677339,-0.9999862358830873,2.7591812796705133E-12),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.20007400713152548,0.9797807875593062,-2.7033570368873966E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.2000740071318276,0.9797807875592447,-2.703357036887226E-12),(-0.2000740071318276,0.9797807875592447,-2.703357036887226E-12),(-0.39205733655535346,0.9199407833404945,-2.5381802158445413E-12),(-0.20007400713152548,0.9797807875593062,-2.7033570368873966E-12),(-0.39205733655535346,0.9199407833404945,-2.5381802158445413E-12),(-0.9250216907185411,0.3799142952038156,-1.0479675062385885E-12),(-0.958982326684027,0.28346586585987765,-7.817976968416314E-13),(-0.9250216907185411,0.3799142952038156,-1.0479675062385885E-12),(-0.9589823266839906,0.2834658658600011,-7.817976968419721E-13),(-0.9589823266839906,0.2834658658600011,-7.817976968419721E-13),(-0.9829162037139707,0.18405362391573823,-5.074537044343894E-13),(-0.958982326684027,0.28346586585987765,-7.817976968416314E-13),(-0.9829162037139707,0.18405362391573823,-5.074537044343894E-13),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.9826489702535564,-0.1854750691053259,5.120640911291411E-13),(-0.9589087450177696,-0.2837146783803166,7.831549581619059E-13),(-0.9826489702535564,-0.1854750691053259,5.120640911291411E-13),(-0.9589087450177659,-0.28371467838032877,7.831549581619395E-13),(-0.9589087450177659,-0.28371467838032877,7.831549581619395E-13),(-0.8038585012002755,-0.5948205696241909,1.6415240859812903E-12),(-0.9589087450177696,-0.2837146783803166,7.831549581619059E-13),(-0.8038585012004971,-0.5948205696238914,1.6415240859804648E-12),(-0.8038585012002755,-0.5948205696241909,1.6415240859812903E-12),(-0.41828292848593485,-0.9083167904080769,2.506391505635967E-12),(-0.41828292848583404,-0.9083167904081234,2.506391505636095E-12),(-0.8038585012004971,-0.5948205696238914,1.6415240859804648E-12),(-0.41828292848593485,-0.9083167904080769,2.506391505635967E-12),(-0.08869355101094167,-0.9960589611107715,2.748382827420158E-12),(-0.41828292848583404,-0.9083167904081234,2.506391505636095E-12),(-0.08869355101079608,-0.9960589611107846,2.748382827420195E-12),(-0.08869355101094167,-0.9960589611107715,2.748382827420158E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(-0.08869355101079608,-0.9960589611107846,2.748382827420195E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-0.5954279130339785,0.8034087380530542,-2.216598066825565E-12),(-0.7353424654422698,0.6776956975791453,-1.8697234856883826E-12),(-0.7353424654422304,0.677695697579188,-1.8697234856885005E-12),(-0.5954279130339785,0.8034087380530542,-2.216598066825565E-12),(-0.7353424654422698,0.6776956975791453,-1.8697234856883826E-12),(-0.9279729502400419,0.3726475595288301,-1.0278924684570349E-12),(-0.7353424654422304,0.677695697579188,-1.8697234856885005E-12),(-0.9279729502400574,0.37264755952879125,-1.0278924684569274E-12),(-0.9279729502400574,0.37264755952879125,-1.0278924684569274E-12),(-0.9919380594528869,0.12672366080902567,-3.4920921670322926E-13),(-0.9279729502400419,0.3726475595288301,-1.0278924684570349E-12),(-0.9919380594528845,0.12672366080904565,-3.492092167032843E-13),(-0.9919380594528845,0.12672366080904565,-3.492092167032843E-13),(-0.9997278626286517,0.023328109309328878,-6.393651358590249E-14),(-0.9919380594528869,0.12672366080902567,-3.4920921670322926E-13),(-0.9997278626286515,0.023328109309333333,-6.393651358591478E-14),(-0.9997278626286515,0.023328109309333333,-6.393651358591478E-14),(-0.9997372811223784,-0.022920923498727593,6.371776302890448E-14),(-0.9997278626286517,0.023328109309328878,-6.393651358590249E-14),(-0.9997372811223789,-0.022920923498710125,6.371776302885625E-14),(-0.9997372811223789,-0.022920923498710125,6.371776302885625E-14),(-0.9919210150229036,-0.12685700593949403,3.5040900621426316E-13),(-0.9997372811223784,-0.022920923498727593,6.371776302890448E-14),(-0.9919210150229122,-0.12685700593942653,3.50409006214077E-13),(-0.9919210150229122,-0.12685700593942653,3.50409006214077E-13),(-0.9257138949175249,-0.3782245163347108,1.0438610076510547E-12),(-0.9919210150229036,-0.12685700593949403,3.5040900621426316E-13),(-0.9257138949175149,-0.37822451633473536,1.0438610076511223E-12),(-0.9257138949175149,-0.37822451633473536,1.0438610076511223E-12),(-0.7298956734503225,-0.6835585606796979,1.8863464670089392E-12),(-0.9257138949175249,-0.3782245163347108,1.0438610076510547E-12),(-0.7298956734502887,-0.6835585606797341,1.8863464670090394E-12),(-0.7298956734502887,-0.6835585606797341,1.8863464670090394E-12),(-0.5913596447695503,-0.806407943002815,2.2252931113730115E-12),(-0.7298956734503225,-0.6835585606796979,1.8863464670089392E-12),(-0.5913596447695503,-0.806407943002815,2.2252931113730115E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.5913596447695502,-0.806407943002815,2.2248693493832347E-12),(0.7298956734503304,-0.6835585606796896,1.8858512060407538E-12),(0.5913596447695502,-0.806407943002815,2.2248693493832347E-12),(0.7298956734502946,-0.6835585606797276,1.8858512060408588E-12),(0.7298956734503304,-0.6835585606796896,1.8858512060407538E-12),(0.9257138949175322,-0.3782245163346928,1.0432699805879076E-12),(0.9257138949175271,-0.37822451633470505,1.0432699805879415E-12),(0.7298956734502946,-0.6835585606797276,1.8858512060408588E-12),(0.9257138949175271,-0.37822451633470505,1.0432699805879415E-12),(0.9919210150229029,-0.1268570059394997,3.496537982373704E-13),(0.9919210150229099,-0.1268570059394458,3.496537982372217E-13),(0.9257138949175322,-0.3782245163346928,1.0432699805879076E-12),(0.9919210150229099,-0.1268570059394458,3.496537982372217E-13),(0.9997372811223789,-0.022920923498710073,6.285315877326143E-14),(0.9997372811223788,-0.02292092349871427,6.285315877327304E-14),(0.9919210150229029,-0.1268570059394997,3.496537982373704E-13),(0.9997372811223788,-0.02292092349871427,6.285315877327304E-14),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.9997372811223789,-0.022920923498710073,6.285315877326143E-14),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(-0.9985580220656759,0.05368311250556469,-1.477320036569112E-13),(-0.9985580220656763,-0.053683112505556796,1.4851410160138073E-13),(-0.998558022065675,0.05368311250558329,-1.477320036569625E-13),(-0.9985580220656761,-0.05368311250556282,1.485141016013974E-13),(-0.9985580220656761,-0.05368311250556282,1.485141016013974E-13),(-0.994236246863431,-0.10721140528376129,2.961815686929806E-13),(-0.9985580220656763,-0.053683112505556796,1.4851410160138073E-13),(-0.994236246863431,-0.10721140528376129,2.961815686929806E-13),(-0.8507772826193604,-0.5255264173938519,1.4502541351253191E-12),(-0.7331764133483573,-0.6800384892854513,1.8766210270358865E-12),(-0.8507772826193604,-0.5255264173938519,1.4502541351253191E-12),(-0.7331764133483956,-0.68003848928541,1.876621027035772E-12),(-0.7331764133483956,-0.68003848928541,1.876621027035772E-12),(-0.5879319010498538,-0.8089104275059785,2.2322319033072458E-12),(-0.7331764133483573,-0.6800384892854513,1.8766210270358865E-12),(-0.5879319010498538,-0.8089104275059785,2.2322319033072458E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(0.06586923201172726,0.9978282639182884,-2.7532479197338154E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(0.06586923201174096,0.9978282639182874,-2.7532479197338122E-12),(0.06586923201174096,0.9978282639182874,-2.7532479197338122E-12),(0.26363297317792694,0.9646230639236067,-2.6616436065550703E-12),(0.06586923201172726,0.9978282639182884,-2.7532479197338154E-12),(0.26363297317782863,0.9646230639236335,-2.661643606555145E-12),(0.26363297317782863,0.9646230639236335,-2.661643606555145E-12),(0.4941723067129574,0.8693639808952259,-2.398895917261978E-12),(0.26363297317792694,0.9646230639236067,-2.6616436065550703E-12),(0.49417230671293877,0.8693639808952366,-2.3988959172620076E-12),(0.49417230671293877,0.8693639808952366,-2.3988959172620076E-12),(0.6822341669074508,0.7311337370851497,-2.0175520504160343E-12),(0.4941723067129574,0.8693639808952259,-2.398895917261978E-12),(0.6822341669074938,0.7311337370851094,-2.017552050415923E-12),(0.6822341669074508,0.7311337370851497,-2.0175520504160343E-12),(0.8170818871976416,0.5765216297881117,-1.5909026623951247E-12),(0.8170818871976462,0.5765216297881053,-1.590902662395107E-12),(0.6822341669074938,0.7311337370851094,-2.017552050415923E-12),(0.8170818871976462,0.5765216297881053,-1.590902662395107E-12),(0.8956698069729665,0.44471968348276353,-1.2273738814997517E-12),(0.8956698069729655,0.44471968348276525,-1.2273738814997563E-12),(0.8170818871976416,0.5765216297881117,-1.5909026623951247E-12),(0.8956698069729655,0.44471968348276525,-1.2273738814997563E-12),(0.9418989444488495,0.33589638051956316,-9.273188725189524E-13),(0.9418989444488512,0.3358963805195581,-9.273188725189385E-13),(0.8956698069729665,0.44471968348276353,-1.2273738814997517E-12),(0.9418989444488512,0.3358963805195581,-9.273188725189385E-13),(0.9719072033706481,0.23536437291197268,-6.499130417900137E-13),(0.9719072033706505,0.23536437291196244,-6.499130417899854E-13),(0.9418989444488495,0.33589638051956316,-9.273188725189524E-13),(0.9719072033706505,0.23536437291196244,-6.499130417899854E-13),(0.9926609702408182,0.12093055098095644,-3.340887069299704E-13),(0.9926609702408176,0.12093055098096052,-3.340887069299817E-13),(0.9719072033706481,0.23536437291197268,-6.499130417900137E-13),(0.9926609702408176,0.12093055098096052,-3.340887069299817E-13),(0.9999176960541967,0.012829696709872374,-3.5871638473745644E-14),(0.9999176960541967,0.012829696709878598,-3.587163847376279E-14),(0.9926609702408182,0.12093055098095644,-3.340887069299704E-13),(0.9999176960541967,0.012829696709878598,-3.587163847376279E-14),(0.9977259706298166,-0.06740094606747518,1.8551712835894422E-13),(0.9977259706298175,-0.0674009460674604,1.8551712835890343E-13),(0.9999176960541967,0.012829696709872374,-3.5871638473745644E-14),(0.9977259706298175,-0.0674009460674604,1.8551712835890343E-13),(0.9902871124897815,-0.1390375303170006,3.832366000143694E-13),(0.9902871124897834,-0.1390375303169881,3.8323660001433495E-13),(0.9977259706298166,-0.06740094606747518,1.8551712835894422E-13),(0.9902871124897834,-0.1390375303169881,3.8323660001433495E-13),(0.9766392563350035,-0.2148854648072119,5.92549091900105E-13),(0.9766392563350028,-0.21488546480721524,5.925490919001141E-13),(0.9902871124897815,-0.1390375303170006,3.832366000143694E-13),(0.9766392563350028,-0.21488546480721524,5.925490919001141E-13),(0.956192572857882,-0.2927383876628142,8.07329836998879E-13),(0.9561925728578783,-0.2927383876628269,8.073298369989141E-13),(0.9766392563350035,-0.2148854648072119,5.92549091900105E-13),(0.9561925728578783,-0.2927383876628269,8.073298369989141E-13),(0.9254680870270003,-0.37882557977858955,1.0448964067888996E-12),(0.925468087026997,-0.3788255797785978,1.0448964067889222E-12),(0.956192572857882,-0.2927383876628142,8.07329836998879E-13),(0.925468087026997,-0.3788255797785978,1.0448964067889222E-12),(0.8749146921521967,-0.48427707095858563,1.3360115376774663E-12),(0.8749146921522147,-0.48427707095855305,1.3360115376773767E-12),(0.9254680870270003,-0.37882557977858955,1.0448964067888996E-12),(0.8749146921522147,-0.48427707095855305,1.3360115376773767E-12),(0.7908353863491634,-0.6120289141028957,1.6884825765190473E-12),(0.7908353863492028,-0.6120289141028448,1.6884825765189067E-12),(0.8749146921521967,-0.48427707095858563,1.3360115376774663E-12),(0.7908353863492028,-0.6120289141028448,1.6884825765189067E-12),(0.6577139687329254,-0.7532677713360533,2.0781721347183784E-12),(0.6577139687329435,-0.7532677713360374,2.078172134718335E-12),(0.7908353863491634,-0.6120289141028957,1.6884825765190473E-12),(0.6577139687329254,-0.7532677713360533,2.0781721347183784E-12),(0.48381045391931793,-0.8751728084660673,2.4146230852766434E-12),(0.6577139687329435,-0.7532677713360374,2.078172134718335E-12),(0.4838104539193804,-0.8751728084660328,2.4146230852765484E-12),(0.4838104539193804,-0.8751728084660328,2.4146230852765484E-12),(0.26498333539704805,-0.9642529916789763,2.660490810195478E-12),(0.48381045391931793,-0.8751728084660673,2.4146230852766434E-12),(0.26498333539706426,-0.9642529916789718,2.6604908101954653E-12),(0.26498333539706426,-0.9642529916789718,2.6604908101954653E-12),(0.06820622469696762,-0.9976712439038158,2.7527661381676745E-12),(0.26498333539704805,-0.9642529916789763,2.660490810195478E-12),(0.06820622469692826,-0.9976712439038183,2.752766138167681E-12),(0.06820622469696762,-0.9976712439038158,2.7527661381676745E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(0.06820622469692826,-0.9976712439038183,2.752766138167681E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-0.587931901049856,0.808910427505977,-2.2317528341055837E-12),(-0.733176413348437,0.6800384892853655,-1.876068205697338E-12),(-0.7331764133484753,0.6800384892853242,-1.876068205697224E-12),(-0.587931901049856,0.808910427505977,-2.2317528341055837E-12),(-0.733176413348437,0.6800384892853655,-1.876068205697338E-12),(-0.8507772826193596,0.5255264173938535,-1.4496484051955902E-12),(-0.7331764133484753,0.6800384892853242,-1.876068205697224E-12),(-0.8507772826193596,0.5255264173938535,-1.4496484051955902E-12),(-0.9942362468634309,0.10721140528376116,-2.9545628112976534E-13),(-0.998558022065675,0.05368311250558329,-1.477320036569625E-13),(-0.9942362468634309,0.10721140528376116,-2.9545628112976534E-13),(-0.9985580220656759,0.05368311250556469,-1.477320036569112E-13),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.07695947056770674,0.9970342220254721,-2.7510066228938896E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.0769594705677078,0.9970342220254721,-2.751006622893889E-12),(-0.07695947056770674,0.9970342220254721,-2.7510066228938896E-12),(-0.30631458433137615,0.9519303416878236,-2.626474119072985E-12),(-0.3063145843315041,0.9519303416877822,-2.6264741190728706E-12),(-0.0769594705677078,0.9970342220254721,-2.751006622893889E-12),(-0.3063145843315041,0.9519303416877822,-2.6264741190728706E-12),(-0.5625785556331592,0.82674383501887,-2.2809543551926174E-12),(-0.5625785556331618,0.8267438350188683,-2.2809543551926125E-12),(-0.30631458433137615,0.9519303416878236,-2.626474119072985E-12),(-0.5625785556331618,0.8267438350188683,-2.2809543551926125E-12),(-0.7436990877465491,0.6685145225684711,-1.8442649178375276E-12),(-0.7436990877464648,0.6685145225685648,-1.8442649178377865E-12),(-0.5625785556331592,0.82674383501887,-2.2809543551926174E-12),(-0.7436990877465491,0.6685145225684711,-1.8442649178375276E-12),(-0.8582582522446103,0.5132180554637833,-1.4157523590193218E-12),(-0.7436990877464648,0.6685145225685648,-1.8442649178377865E-12),(-0.8582582522446274,0.5132180554637548,-1.415752359019243E-12),(-0.8582582522446274,0.5132180554637548,-1.415752359019243E-12),(-0.9228983961102781,0.38504356955684416,-1.0620347241854526E-12),(-0.8582582522446103,0.5132180554637833,-1.4157523590193218E-12),(-0.9228983961102676,0.38504356955686964,-1.0620347241855231E-12),(-0.9228983961102676,0.38504356955686964,-1.0620347241855231E-12),(-0.9598249214871282,0.2805995725089912,-7.738663800519982E-13),(-0.9228983961102781,0.38504356955684416,-1.0620347241854526E-12),(-0.959824921487124,0.2805995725090049,-7.73866380052036E-13),(-0.959824921487124,0.2805995725090049,-7.73866380052036E-13),(-0.9825437042969424,0.18603190357151872,-5.12982371612686E-13),(-0.9598249214871282,0.2805995725089912,-7.738663800519982E-13),(-0.9825437042969416,0.18603190357152283,-5.129823716126973E-13),(-0.9825437042969416,0.18603190357152283,-5.129823716126973E-13),(-0.9959333498749684,0.09009307746338743,-2.481678499949749E-13),(-0.9825437042969424,0.18603190357151872,-5.12982371612686E-13),(-0.9959333498749663,0.09009307746340967,-2.4816784999503627E-13),(-0.9959333498749663,0.09009307746340967,-2.4816784999503627E-13),(-0.9999913518233414,0.004158879479668723,-1.0969465983110275E-14),(-0.9959333498749684,0.09009307746338743,-2.481678499949749E-13),(-0.9999913518233414,0.004158879479666016,-1.0969465983102807E-14),(-0.9999913518233414,0.004158879479666016,-1.0969465983102807E-14),(-0.997280073697995,-0.07370518709644312,2.0388906717321603E-13),(-0.9999913518233414,0.004158879479668723,-1.0969465983110275E-14),(-0.997280073697995,-0.07370518709644484,2.0388906717322073E-13),(-0.997280073697995,-0.07370518709644484,2.0388906717322073E-13),(-0.9867686117938449,-0.1621348413464799,4.4779914860596776E-13),(-0.997280073697995,-0.07370518709644312,2.0388906717321603E-13),(-0.9867686117938491,-0.16213484134645498,4.47799148605899E-13),(-0.9867686117938491,-0.16213484134645498,4.47799148605899E-13),(-0.9628292628321741,-0.2701107377244606,7.457527169273578E-13),(-0.9867686117938449,-0.1621348413464799,4.4779914860596776E-13),(-0.9628292628321742,-0.2701107377244601,7.457527169273564E-13),(-0.9628292628321742,-0.2701107377244601,7.457527169273564E-13),(-0.9101427787757594,-0.41429472871657336,1.143568543562473E-12),(-0.9628292628321741,-0.2701107377244606,7.457527169273578E-13),(-0.9101427787757602,-0.41429472871657175,1.1435685435624688E-12),(-0.9101427787757602,-0.41429472871657175,1.1435685435624688E-12),(-0.7869835626918029,-0.6169739638371438,1.7026726398990164E-12),(-0.9101427787757594,-0.41429472871657336,1.143568543562473E-12),(-0.7869835626917597,-0.6169739638371992,1.7026726398991697E-12),(-0.7869835626918029,-0.6169739638371438,1.7026726398990164E-12),(-0.5449321183150416,-0.8384801646006192,2.313762442949445E-12),(-0.5449321183150387,-0.8384801646006211,2.3137624429494508E-12),(-0.7869835626917597,-0.6169739638371992,1.7026726398991697E-12),(-0.5449321183150387,-0.8384801646006211,2.3137624429494508E-12),(-0.24629616144207656,-0.969194614542868,2.6743127018272744E-12),(-0.24629616144210634,-0.9691946145428606,2.6743127018272538E-12),(-0.5449321183150416,-0.8384801646006192,2.313762442949445E-12),(-0.24629616144207656,-0.969194614542868,2.6743127018272744E-12),(-0.05277084790588199,-0.9986066480908758,2.755388727980884E-12),(-0.24629616144210634,-0.9691946145428606,2.6743127018272538E-12),(-0.05277084790586261,-0.998606648090877,2.7553887279808872E-12),(-0.05277084790586261,-0.998606648090877,2.7553887279808872E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.05277084790588199,-0.9986066480908758,2.755388727980884E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.20007400713181706,0.9797807875592468,-2.703357036887236E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.20007400713174242,0.9797807875592619,-2.703357036887278E-12),(-0.20007400713181706,0.9797807875592468,-2.703357036887236E-12),(-0.39205733655535935,0.9199407833404918,-2.5381802158445413E-12),(-0.39205733655535935,0.9199407833404918,-2.5381802158445413E-12),(-0.20007400713174242,0.9797807875592619,-2.703357036887278E-12),(-0.9271481171496561,0.374695034482508,-1.0335900548120441E-12),(-0.9613689058329938,0.2752631956827363,-7.592040277542871E-13),(-0.9271481171496561,0.374695034482508,-1.0335900548120441E-12),(-0.9613689058329786,0.27526319568278984,-7.592040277544348E-13),(-0.9613689058329786,0.27526319568278984,-7.592040277544348E-13),(-0.9849591146664011,0.1727875644703044,-4.764229101229142E-13),(-0.9613689058329938,0.2752631956827363,-7.592040277542871E-13),(-0.9849591146664011,0.1727875644703044,-4.764229101229142E-13),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.9850568535010445,-0.1722294846146325,4.755933364007252E-13),(-0.9627290187837241,-0.2704678102690373,7.466956952228132E-13),(-0.9850568535010445,-0.1722294846146325,4.755933364007252E-13),(-0.9627290187837233,-0.2704678102690403,7.466956952228216E-13),(-0.9627290187837233,-0.2704678102690403,7.466956952228216E-13),(-0.8103422277042358,-0.5859568874920209,1.6171305876767547E-12),(-0.9627290187837241,-0.2704678102690373,7.466956952228132E-13),(-0.8103422277044423,-0.5859568874917351,1.6171305876759665E-12),(-0.8103422277042358,-0.5859568874920209,1.6171305876767547E-12),(-0.4221218672865516,-0.9065390941148183,2.5014907351571794E-12),(-0.4221218672861895,-0.9065390941149867,2.5014907351576447E-12),(-0.8103422277044423,-0.5859568874917351,1.6171305876759665E-12),(-0.4221218672861895,-0.9065390941149867,2.5014907351576447E-12),(-0.0889963508540526,-0.9960319520651245,2.7483040994560834E-12),(-0.08899635085414635,-0.9960319520651162,2.7483040994560607E-12),(-0.4221218672865516,-0.9065390941148183,2.5014907351571794E-12),(-0.0889963508540526,-0.9960319520651245,2.7483040994560834E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.08899635085414635,-0.9960319520651162,2.7483040994560607E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-0.5879319010498686,0.8089104275059679,-2.2316973229543524E-12),(-0.7331764133483359,0.6800384892854743,-1.876096494574361E-12),(-0.5879319010498686,0.8089104275059679,-2.2316973229543524E-12),(-0.7331764133483462,0.6800384892854633,-1.87609649457433E-12),(-0.7331764133483462,0.6800384892854633,-1.87609649457433E-12),(-0.8507772826193463,0.5255264173938747,-1.4497594274980523E-12),(-0.7331764133483359,0.6800384892854743,-1.876096494574361E-12),(-0.8507772826193463,0.5255264173938747,-1.4497594274980523E-12),(-0.9942362468634309,0.10721140528376116,-2.9545628112976534E-13),(-0.9985580220656761,0.05368311250556237,-1.4773200365690481E-13),(-0.9942362468634309,0.10721140528376116,-2.9545628112976534E-13),(-0.9985580220656766,0.05368311250555518,-1.477320036568849E-13),(-0.9985580220656766,0.05368311250555518,-1.477320036568849E-13),(-0.9997372811223788,-0.022920923498714715,6.371776302886894E-14),(-0.9985580220656761,0.05368311250556237,-1.4773200365690481E-13),(-0.9997372811223786,-0.02292092349872411,6.371776302889487E-14),(-0.9997372811223786,-0.02292092349872411,6.371776302889487E-14),(-0.9919210150229094,-0.12685700593944943,3.504368538932075E-13),(-0.9997372811223788,-0.022920923498714715,6.371776302886894E-14),(-0.9919210150229099,-0.12685700593944513,3.5043685389319575E-13),(-0.9919210150229099,-0.12685700593944513,3.5043685389319575E-13),(-0.9257138949175179,-0.3782245163347276,1.0438610076510708E-12),(-0.9919210150229094,-0.12685700593944943,3.504368538932075E-13),(-0.9257138949175853,-0.3782245163345627,1.043861007650616E-12),(-0.9257138949175853,-0.3782245163345627,1.043861007650616E-12),(-0.7298956734503028,-0.683558560679719,1.8863182273462366E-12),(-0.9257138949175179,-0.3782245163347276,1.0438610076510708E-12),(-0.7298956734503935,-0.6835585606796221,1.8863182273459684E-12),(-0.7298956734503935,-0.6835585606796221,1.8863182273459684E-12),(-0.5913596447695699,-0.8064079430028008,2.225293111373012E-12),(-0.7298956734503028,-0.683558560679719,1.8863182273462366E-12),(-0.5913596447695699,-0.8064079430028008,2.225293111373012E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.5257648893363474E-27,1.,-2.75921435746603E-12),(-0.08899635085414426,0.9960319520651163,-2.748229139094728E-12),(-1.5257648893363474E-27,1.,-2.75921435746603E-12),(-0.08899635085419927,0.9960319520651114,-2.7482291390947148E-12),(-0.08899635085419927,0.9960319520651114,-2.7482291390947148E-12),(-0.42212186728681367,0.9065390941146961,-2.5011068414201897E-12),(-0.08899635085414426,0.9960319520651163,-2.748229139094728E-12),(-0.422121867286689,0.9065390941147541,-2.50110684142035E-12),(-0.42212186728681367,0.9065390941146961,-2.5011068414201897E-12),(-0.8086796863924085,0.5882492369874152,-1.6227289495594614E-12),(-0.8086796863925371,0.5882492369872385,-1.622728949558974E-12),(-0.422121867286689,0.9065390941147541,-2.50110684142035E-12),(-0.8086796863924085,0.5882492369874152,-1.6227289495594614E-12),(-0.9603664303895799,0.27874059514318394,-7.687030664016887E-13),(-0.8086796863925371,0.5882492369872385,-1.622728949558974E-12),(-0.9603664303895832,0.278740595143172,-7.687030664016556E-13),(-0.9603664303895832,0.278740595143172,-7.687030664016556E-13),(-0.9830031215351334,0.18358884239567475,-5.061214342191786E-13),(-0.9603664303895799,0.27874059514318394,-7.687030664016887E-13),(-0.9830031215351334,0.18358884239567475,-5.061214342191786E-13),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.9832650394637042,-0.1821808501693859,5.031268141079426E-13),(-0.9604389766296882,-0.27849052438192123,7.688212727135255E-13),(-0.9832650394637042,-0.1821808501693859,5.031268141079426E-13),(-0.9604389766296882,-0.27849052438192123,7.688212727135256E-13),(-0.9604389766296882,-0.27849052438192123,7.688212727135256E-13),(-0.8061306092177407,-0.5917376453144033,1.633076566600616E-12),(-0.9604389766296882,-0.27849052438192123,7.688212727135255E-13),(-0.8061306092175928,-0.5917376453146048,1.6330765666011726E-12),(-0.8061306092175928,-0.5917376453146048,1.6330765666011726E-12),(-0.4173761927597633,-0.9087337969490104,2.5075817476577346E-12),(-0.8061306092177407,-0.5917376453144033,1.633076566600616E-12),(-0.41737619275943794,-0.9087337969491598,2.507581747658147E-12),(-0.41737619275943794,-0.9087337969491598,2.507581747658147E-12),(-0.0876379036952092,-0.9961523968931206,2.7486265371435124E-12),(-0.4173761927597633,-0.9087337969490104,2.5075817476577346E-12),(-0.08763790369517202,-0.996152396893124,2.7486265371435217E-12),(-0.0876379036952092,-0.9961523968931206,2.7486265371435124E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.08763790369517202,-0.996152396893124,2.7486265371435217E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.08899635085417186,0.996031952065114,-2.748222172557265E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.08899635085428885,0.9960319520651035,-2.748222172557236E-12),(-0.08899635085428885,0.9960319520651035,-2.748222172557236E-12),(-0.42212186728673545,0.9065390941147324,-2.5010996658424896E-12),(-0.08899635085417186,0.996031952065114,-2.748222172557265E-12),(-0.4221218672863759,0.9065390941149,-2.501099665842952E-12),(-0.42212186728673545,0.9065390941147324,-2.5010996658424896E-12),(-0.8086796863921236,0.5882492369878068,-1.622728949560507E-12),(-0.8086796863926936,0.588249236987023,-1.622728949558344E-12),(-0.4221218672863759,0.9065390941149,-2.501099665842952E-12),(-0.8086796863921236,0.5882492369878068,-1.622728949560507E-12),(-0.9603664303895966,0.2787405951431262,-7.687309553739348E-13),(-0.8086796863926936,0.588249236987023,-1.622728949558344E-12),(-0.9603664303895936,0.2787405951431366,-7.687309553739633E-13),(-0.9603664303895936,0.2787405951431366,-7.687309553739633E-13),(-0.9830031215351365,0.18358884239565865,-5.061769453704099E-13),(-0.9603664303895966,0.2787405951431262,-7.687309553739348E-13),(-0.9830031215351365,0.18358884239565865,-5.061769453704099E-13),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.9829162037139707,-0.18405362391573804,5.082338296439351E-13),(-0.9589823266839971,-0.2834658658599789,7.825243876377627E-13),(-0.9829162037139707,-0.18405362391573804,5.082338296439351E-13),(-0.9589823266839956,-0.283465865859984,7.825243876377769E-13),(-0.9589823266839956,-0.283465865859984,7.825243876377769E-13),(-0.9250216907185411,-0.3799142952038155,1.0486331646147884E-12),(-0.9589823266839971,-0.2834658658599789,7.825243876377627E-13),(-0.9250216907185411,-0.3799142952038155,1.0486331646147884E-12),(-0.39770665703451996,-0.9175126238643406,2.5317921720421993E-12),(-0.20308542061863116,-0.9791610245164756,2.7018061365958257E-12),(-0.39770665703451996,-0.9175126238643406,2.5317921720421993E-12),(-0.20308542061867696,-0.979161024516466,2.701806136595799E-12),(-0.20308542061863116,-0.9791610245164756,2.7018061365958257E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.20308542061867696,-0.979161024516466,2.701806136595799E-12),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(0.7352884309046378,0.677754323761786,-1.87035909204228E-12),(0.8219126130549742,0.5696136028055726,-1.5721196469078759E-12),(0.821912613054971,0.569613602805577,-1.5721196469078882E-12),(0.7352884309046378,0.677754323761786,-1.87035909204228E-12),(0.821912613054971,0.569613602805577,-1.5721196469078882E-12),(0.9379792061057557,0.34669151837507706,-9.570449307444145E-13),(0.937979206105743,0.3466915183751111,-9.570449307445082E-13),(0.8219126130549742,0.5696136028055726,-1.5721196469078759E-12),(0.937979206105743,0.3466915183751111,-9.570449307445082E-13),(0.98805711892142,0.15408805842343215,-4.2554104914245354E-13),(0.9880571189214249,0.15408805842340023,-4.255410491423655E-13),(0.9379792061057557,0.34669151837507706,-9.570449307444145E-13),(0.9880571189214249,0.15408805842340023,-4.255410491423655E-13),(0.9999397421523021,0.01097779870410655,-3.069520568657929E-14),(0.9999397421523019,0.010977798704114703,-3.0695205686601797E-14),(0.98805711892142,0.15408805842343215,-4.2554104914245354E-13),(0.9999397421523019,0.010977798704114703,-3.0695205686601797E-14),(0.9948858286649289,-0.10100588062928692,2.782993480303474E-13),(0.9948858286649307,-0.10100588062926952,2.782993480302994E-13),(0.9999397421523021,0.01097779870410655,-3.069520568657929E-14),(0.9948858286649307,-0.10100588062926952,2.782993480302994E-13),(0.9754732549000814,-0.22011798875748684,6.069039622906551E-13),(0.9754732549000839,-0.22011798875747546,6.069039622906238E-13),(0.9948858286649289,-0.10100588062928692,2.782993480303474E-13),(0.9754732549000839,-0.22011798875747546,6.069039622906238E-13),(0.9331889358875146,-0.359386157130639,9.912182214043033E-13),(0.9331889358875224,-0.35938615713061894,9.912182214042482E-13),(0.9754732549000814,-0.22011798875748684,6.069039622906551E-13),(0.9331889358875224,-0.35938615713061894,9.912182214042482E-13),(0.8533260584412695,-0.521377634718912,1.438315360095434E-12),(0.8533260584412645,-0.5213776347189203,1.4383153600954575E-12),(0.9331889358875146,-0.359386157130639,9.912182214043033E-13),(0.8533260584412645,-0.5213776347189203,1.4383153600954575E-12),(0.7046792499668371,-0.7095260070400352,1.957522154307947E-12),(0.7046792499668799,-0.7095260070399927,1.95752215430783E-12),(0.8533260584412695,-0.521377634718912,1.438315360095434E-12),(0.7046792499668371,-0.7095260070400352,1.957522154307947E-12),(0.46309034133606747,-0.886311082950701,2.4453431487773834E-12),(0.7046792499668799,-0.7095260070399927,1.95752215430783E-12),(0.46309034133616733,-0.8863110829506489,2.4453431487772396E-12),(0.46309034133616733,-0.8863110829506489,2.4453431487772396E-12),(0.20131673991194704,-0.9795261968070204,2.702635299227371E-12),(0.46309034133606747,-0.886311082950701,2.4453431487773834E-12),(0.2013167399120235,-0.9795261968070046,2.7026352992273273E-12),(0.2013167399120235,-0.9795261968070046,2.7026352992273273E-12),(0.04276298507064453,-0.9990852451657206,2.756680843898158E-12),(0.20131673991194704,-0.9795261968070204,2.702635299227371E-12),(0.04276298507064104,-0.9990852451657207,2.756680843898158E-12),(0.04276298507064104,-0.9990852451657207,2.756680843898158E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(0.04276298507064453,-0.9990852451657206,2.756680843898158E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-0.595427913033985,0.8034087380530496,-2.216598066825565E-12),(-0.7353424654422723,0.6776956975791426,-1.8696952302766296E-12),(-0.7353424654423132,0.6776956975790981,-1.869695230276507E-12),(-0.595427913033985,0.8034087380530496,-2.216598066825565E-12),(-0.7353424654422723,0.6776956975791426,-1.8696952302766296E-12),(-0.9279729502400482,0.37264755952881395,-1.0279206514985313E-12),(-0.7353424654423132,0.6776956975790981,-1.869695230276507E-12),(-0.9279729502401372,0.37264755952859296,-1.0279206514979212E-12),(-0.9279729502401372,0.37264755952859296,-1.0279206514979212E-12),(-0.9919380594528827,0.12672366080905945,-3.4926490777736237E-13),(-0.9279729502400482,0.37264755952881395,-1.0279206514985313E-12),(-0.9919380594528854,0.12672366080903733,-3.492649077773013E-13),(-0.9919380594528854,0.12672366080903733,-3.492649077773013E-13),(-0.9997278626286517,0.023328109309328406,-6.39365135859012E-14),(-0.9919380594528827,0.12672366080905945,-3.4926490777736237E-13),(-0.9997278626286514,0.023328109309333794,-6.393651358591607E-14),(-0.9997278626286514,0.023328109309333794,-6.393651358591607E-14),(-0.9997372811223784,-0.022920923498728103,6.371776302890588E-14),(-0.9997278626286517,0.023328109309328406,-6.39365135859012E-14),(-0.9997372811223787,-0.022920923498716585,6.371776302887409E-14),(-0.9997372811223787,-0.022920923498716585,6.371776302887409E-14),(-0.9919210150229141,-0.12685700593941257,3.505203969303831E-13),(-0.9997372811223784,-0.022920923498728103,6.371776302890588E-14),(-0.9919210150229048,-0.1268570059394845,3.5052039693058143E-13),(-0.9919210150229048,-0.1268570059394845,3.5052039693058143E-13),(-0.9257138949175897,-0.3782245163345522,1.0439456313611323E-12),(-0.9919210150229141,-0.12685700593941257,3.505203969303831E-13),(-0.9257138949175633,-0.3782245163346167,1.0439456313613104E-12),(-0.9257138949175633,-0.3782245163346167,1.0439456313613104E-12),(-0.7298956734501725,-0.6835585606798581,1.886346467009373E-12),(-0.9257138949175897,-0.3782245163345522,1.0439456313611323E-12),(-0.7298956734503791,-0.6835585606796375,1.8863464670087643E-12),(-0.7298956734501725,-0.6835585606798581,1.886346467009373E-12),(-0.5913596447695568,-0.8064079430028104,2.2253486225242428E-12),(-0.5913596447695568,-0.8064079430028104,2.2253486225242428E-12),(-0.7298956734503791,-0.6835585606796375,1.8863464670087643E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(0.07795967280676985,0.9969565133022913,-2.7508637374917015E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(0.07795967280676629,0.9969565133022915,-2.7508637374917027E-12),(0.07795967280676629,0.9969565133022915,-2.7508637374917027E-12),(0.33819741169692114,0.941075188665339,-2.5968134625291812E-12),(0.07795967280676985,0.9969565133022913,-2.7508637374917015E-12),(0.3381974116971664,0.941075188665251,-2.5968134625289385E-12),(0.3381974116971664,0.941075188665251,-2.5968134625289385E-12),(0.6202213981854017,0.7844268080789601,-2.1646664507430132E-12),(0.33819741169692114,0.941075188665339,-2.5968134625291812E-12),(0.6202213981854617,0.7844268080789125,-2.1646664507428816E-12),(0.6202213981854017,0.7844268080789601,-2.1646664507430132E-12),(0.7950566191211772,0.6065352194156605,-1.6737720652848473E-12),(0.7950566191211507,0.6065352194156955,-1.6737720652849437E-12),(0.6202213981854617,0.7844268080789125,-2.1646664507428816E-12),(0.7950566191211507,0.6065352194156955,-1.6737720652849437E-12),(0.9071364246607834,0.4208366750339745,-1.1615147323507174E-12),(0.9071364246607592,0.4208366750340265,-1.161514732350861E-12),(0.7950566191211772,0.6065352194156605,-1.6737720652848473E-12),(0.9071364246607592,0.4208366750340265,-1.161514732350861E-12),(0.9665120711748036,0.2566211532071962,-7.084907828668615E-13),(0.9665120711748055,0.25662115320718937,-7.084907828668428E-13),(0.9071364246607834,0.4208366750339745,-1.1615147323507174E-12),(0.9665120711748055,0.25662115320718937,-7.084907828668428E-13),(0.9924147561708995,0.12293474583800236,-3.3956012286423207E-13),(0.9924147561708991,0.12293474583800497,-3.3956012286423924E-13),(0.9665120711748036,0.2566211532071962,-7.084907828668615E-13),(0.9924147561708991,0.12293474583800497,-3.3956012286423924E-13),(0.9999871034548478,-0.005078673447265601,1.3654482815675751E-14),(0.9999871034548478,-0.005078673447250062,1.3654482815632867E-14),(0.9924147561708995,0.12293474583800236,-3.3956012286423207E-13),(0.9999871034548478,-0.005078673447250062,1.3654482815632867E-14),(0.9883938693820078,-0.15191299802209976,4.188525744066463E-13),(0.9883938693820004,-0.151912998022149,4.1885257440678225E-13),(0.9999871034548478,-0.005078673447265601,1.3654482815675751E-14),(0.9883938693820004,-0.151912998022149,4.1885257440678225E-13),(0.9438486732585091,-0.3303780894492741,9.112807658215183E-13),(0.9438486732585174,-0.3303780894492497,9.112807658214512E-13),(0.9883938693820078,-0.15191299802209976,4.188525744066463E-13),(0.9438486732585174,-0.3303780894492497,9.112807658214512E-13),(0.8505249238695582,-0.5259347429830835,1.4508718145365783E-12),(0.8505249238695977,-0.52593474298302,1.4508718145364034E-12),(0.9438486732585091,-0.3303780894492741,9.112807658215183E-13),(0.8505249238695977,-0.52593474298302,1.4508718145364034E-12),(0.7840634204835987,-0.6206807171642756,1.7123291574483076E-12),(0.7840634204835987,-0.6206807171642756,1.7123291574483076E-12),(0.8505249238695582,-0.5259347429830835,1.4508718145365783E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.04985214699043369,0.9987566087092712,-2.755763979841219E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.04985214699045902,0.99875660870927,-2.755763979841215E-12),(-0.04985214699043369,0.9987566087092712,-2.755763979841219E-12),(-0.34263505180297543,0.9394685845072056,-2.592027398673364E-12),(-0.34263505180298326,0.9394685845072027,-2.592027398673356E-12),(-0.04985214699045902,0.99875660870927,-2.755763979841215E-12),(-0.34263505180298326,0.9394685845072027,-2.592027398673356E-12),(-0.7067512124899926,0.7074621711751983,-1.9518362606171056E-12),(-0.7067512124899772,0.7074621711752135,-1.951836260617148E-12),(-0.34263505180297543,0.9394685845072056,-2.592027398673364E-12),(-0.7067512124899926,0.7074621711751983,-1.9518362606171056E-12),(-0.8848347895576633,0.465904920760069,-1.2852633234800445E-12),(-0.7067512124899772,0.7074621711752135,-1.951836260617148E-12),(-0.8848347895576638,0.4659049207600676,-1.2852633234800411E-12),(-0.8848347895576638,0.4659049207600676,-1.2852633234800411E-12),(-0.9613660408982533,0.27527320139748107,-7.591715030544337E-13),(-0.8848347895576633,0.465904920760069,-1.2852633234800445E-12),(-0.9613660408982357,0.27527320139754213,-7.591715030546021E-13),(-0.9613660408982357,0.27527320139754213,-7.591715030546021E-13),(-0.9926019629217055,0.12141393331894552,-3.3465816464386727E-13),(-0.9613660408982533,0.27527320139748107,-7.591715030544337E-13),(-0.9926019629217047,0.12141393331895171,-3.3465816464388434E-13),(-0.9926019629217047,0.12141393331895171,-3.3465816464388434E-13),(-0.9999995995077935,-0.0008949772360086743,2.92072984110734E-15),(-0.9926019629217055,0.12141393331894552,-3.3465816464386727E-13),(-0.9999995995077935,-0.0008949772360261393,2.9207298411555495E-15),(-0.9999995995077935,-0.0008949772360261393,2.9207298411555495E-15),(-0.9922297490278524,-0.12441915103441759,3.437038532306228E-13),(-0.9999995995077935,-0.0008949772360086743,2.92072984110734E-15),(-0.9922297490278514,-0.1244191510344244,3.437038532306416E-13),(-0.9922297490278514,-0.1244191510344244,3.437038532306416E-13),(-0.9603398875491048,-0.2788320289747448,7.697238237529197E-13),(-0.9922297490278524,-0.12441915103441759,3.437038532306228E-13),(-0.9603398875491099,-0.2788320289747272,7.697238237528711E-13),(-0.9603398875491099,-0.2788320289747272,7.697238237528711E-13),(-0.8853076919779572,-0.46500568870139897,1.2833918157907752E-12),(-0.9603398875491048,-0.2788320289747448,7.697238237529197E-13),(-0.8853076919779543,-0.4650056887014047,1.2833918157907911E-12),(-0.8853076919779543,-0.4650056887014047,1.2833918157907911E-12),(-0.7047839328151388,-0.7094220239361236,1.957679741971694E-12),(-0.8853076919779572,-0.46500568870139897,1.2833918157907752E-12),(-0.7047839328151851,-0.7094220239360776,1.9576797419715668E-12),(-0.7047839328151388,-0.7094220239361236,1.957679741971694E-12),(-0.3382277690985446,-0.9410642784691285,2.596734681207466E-12),(-0.33822776909836216,-0.9410642784691942,2.596734681207648E-12),(-0.7047839328151851,-0.7094220239360776,1.9576797419715668E-12),(-0.33822776909836216,-0.9410642784691942,2.596734681207648E-12),(-0.05052755331290805,-0.9987226673888058,2.755714716777417E-12),(-0.050527553312888905,-0.9987226673888068,2.75571471677742E-12),(-0.3382277690985446,-0.9410642784691285,2.596734681207466E-12),(-0.05052755331290805,-0.9987226673888058,2.755714716777417E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.050527553312888905,-0.9987226673888068,2.75571471677742E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.0537500230457373,0.9985544226643749,-2.7551995941444583E-12),(-0.05375002304574732,0.9985544226643743,-2.7551995941444563E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.0537500230457373,0.9985544226643749,-2.7551995941444583E-12),(-0.29184427840924615,0.9564658473567085,-2.6389500832738537E-12),(-0.05375002304574732,0.9985544226643743,-2.7551995941444563E-12),(-0.2918442784093408,0.9564658473566796,-2.6389500832737745E-12),(-0.2918442784093408,0.9564658473566796,-2.6389500832737745E-12),(-0.5877775740479074,0.8090225728904954,-2.2320632396540114E-12),(-0.29184427840924615,0.9564658473567085,-2.6389500832738537E-12),(-0.5877775740478249,0.8090225728905553,-2.2320632396541766E-12),(-0.5877775740479074,0.8090225728904954,-2.2320632396540114E-12),(-0.7805286589002669,0.6251199985885519,-1.7246085404424547E-12),(-0.7805286589003659,0.6251199985884281,-1.7246085404421128E-12),(-0.5877775740478249,0.8090225728905553,-2.2320632396541766E-12),(-0.7805286589002669,0.6251199985885519,-1.7246085404424547E-12),(-0.9023997685575124,0.4308998232853527,-1.1885226487822296E-12),(-0.7805286589003659,0.6251199985884281,-1.7246085404421128E-12),(-0.9023997685575618,0.43089982328524945,-1.1885226487819446E-12),(-0.9023997685575618,0.43089982328524945,-1.1885226487819446E-12),(-0.9670946829224584,0.254416733457353,-7.015249683306344E-13),(-0.9023997685575124,0.4308998232853527,-1.1885226487822296E-12),(-0.9670946829224693,0.254416733457312,-7.015249683305213E-13),(-0.9670946829224693,0.254416733457312,-7.015249683305213E-13),(-0.9936360937840041,0.11263797374627356,-3.103519353937647E-13),(-0.9670946829224584,0.254416733457353,-7.015249683306344E-13),(-0.9936360937840051,0.11263797374626337,-3.103519353937366E-13),(-0.9936360937840051,0.11263797374626337,-3.103519353937366E-13),(-0.9999995871945382,-0.0009086312527777199,3.003540540726038E-15),(-0.9936360937840041,0.11263797374627356,-3.103519353937647E-13),(-0.9999995871945381,-0.0009086312527694739,3.0035405407032906E-15),(-0.9999995871945381,-0.0009086312527694739,3.0035405407032906E-15),(-0.99317464071528,-0.11663675681394135,3.222473995430006E-13),(-0.9999995871945382,-0.0009086312527777199,3.003540540726038E-15),(-0.9931746407152823,-0.11663675681392228,3.222473995429481E-13),(-0.9931746407152823,-0.11663675681392228,3.222473995429481E-13),(-0.9647953651843898,-0.2630017173303625,7.260839254289956E-13),(-0.99317464071528,-0.11663675681394135,3.222473995430006E-13),(-0.9647953651843933,-0.2630017173303498,7.260839254289606E-13),(-0.9647953651843933,-0.2630017173303498,7.260839254289606E-13),(-0.8962309242385643,-0.4435877933831011,1.2243082268609163E-12),(-0.9647953651843898,-0.2630017173303625,7.260839254289956E-13),(-0.8962309242385652,-0.44358779338309967,1.224308226860912E-12),(-0.8962309242385652,-0.44358779338309967,1.224308226860912E-12),(-0.7748453025522769,-0.6321508974229733,1.744530786776525E-12),(-0.8962309242385643,-0.4435877933831011,1.2243082268609163E-12),(-0.7748453025522536,-0.632150897423002,1.7445307867766048E-12),(-0.7748453025522769,-0.6321508974229733,1.744530786776525E-12),(-0.5881877933364362,-0.8087243781227408,2.231723287258817E-12),(-0.5881877933364911,-0.8087243781227011,2.2317232872587076E-12),(-0.7748453025522536,-0.632150897423002,1.7445307867766048E-12),(-0.5881877933364362,-0.8087243781227408,2.231723287258817E-12),(-0.2965226979440034,-0.9550258057267402,2.6352588013852027E-12),(-0.5881877933364911,-0.8087243781227011,2.2317232872587076E-12),(-0.2965226979439802,-0.9550258057267476,2.6352588013852225E-12),(-0.2965226979440034,-0.9550258057267402,2.6352588013852027E-12),(-0.05742883068678888,-0.9983496027975112,2.754683897460064E-12),(-0.05742883068676342,-0.9983496027975126,2.7546838974600684E-12),(-0.2965226979439802,-0.9550258057267476,2.6352588013852225E-12),(-0.05742883068678888,-0.9983496027975112,2.754683897460064E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.05742883068676342,-0.9983496027975126,2.7546838974600684E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.9997278626286515,0.02332810930933182,-6.480112486626948E-14),(0.9997278626286512,0.023328109309348012,-6.480112486631418E-14),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.9997278626286512,0.023328109309348012,-6.480112486631418E-14),(0.991938059452877,0.1267236608091028,-3.5004790875373345E-13),(0.9919380594528837,0.1267236608090516,-3.5004790875359224E-13),(0.9997278626286515,0.02332810930933182,-6.480112486626948E-14),(0.9919380594528837,0.1267236608090516,-3.5004790875359224E-13),(0.9279729502401031,0.3726475595286776,-1.0285395236317125E-12),(0.9279729502400951,0.3726475595286975,-1.0285395236317674E-12),(0.991938059452877,0.1267236608091028,-3.5004790875373345E-13),(0.9279729502400951,0.3726475595286975,-1.0285395236317674E-12),(0.7353424654422643,0.6776956975791512,-1.8701910672943493E-12),(0.7353424654422448,0.6776956975791725,-1.8701910672944074E-12),(0.9279729502401031,0.3726475595286776,-1.0285395236317125E-12),(0.7353424654422643,0.6776956975791512,-1.8701910672943493E-12),(0.595427913033985,0.8034087380530496,-2.2170220708637667E-12),(0.7353424654422448,0.6776956975791725,-1.8701910672944074E-12),(0.595427913033985,0.8034087380530496,-2.2170220708637667E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-0.587931901049856,0.808910427505977,-2.2317528341055837E-12),(-0.7331764133481704,0.6800384892856528,-1.8761247834516394E-12),(-0.587931901049856,0.808910427505977,-2.2317528341055837E-12),(-0.7331764133483906,0.6800384892854153,-1.876124783450984E-12),(-0.7331764133483906,0.6800384892854153,-1.876124783450984E-12),(-0.8507772826193725,0.5255264173938323,-1.4497594274980523E-12),(-0.7331764133481704,0.6800384892856528,-1.8761247834516394E-12),(-0.8507772826193725,0.5255264173938323,-1.4497594274980523E-12),(-0.99423624686343,0.10721140528377023,-2.954562811297654E-13),(-0.9985580220656779,0.053683112505529824,-1.4773200365680243E-13),(-0.99423624686343,0.10721140528377023,-2.954562811297654E-13),(-0.9985580220656758,0.05368311250557031,-1.4773200365691415E-13),(-0.9985580220656758,0.05368311250557031,-1.4773200365691415E-13),(-0.9997372811223786,-0.022920923498727014,6.369000015947804E-14),(-0.9985580220656779,0.053683112505529824,-1.4773200365680243E-13),(-0.9997372811223788,-0.022920923498716328,6.369000015944855E-14),(-0.9997372811223788,-0.022920923498716328,6.369000015944855E-14),(-0.9919210150229154,-0.12685700593940089,3.504090062140119E-13),(-0.9997372811223786,-0.022920923498727014,6.369000015947804E-14),(-0.9919210150229056,-0.12685700593947852,3.5040900621422605E-13),(-0.9919210150229056,-0.12685700593947852,3.5040900621422605E-13),(-0.9257138949176099,-0.3782245163345029,1.0438610076504506E-12),(-0.9919210150229154,-0.12685700593940089,3.504090062140119E-13),(-0.9257138949176389,-0.3782245163344319,1.043861007650255E-12),(-0.9257138949176389,-0.3782245163344319,1.043861007650255E-12),(-0.7298956734501645,-0.6835585606798666,1.8863464670093964E-12),(-0.9257138949176099,-0.3782245163345029,1.0438610076504506E-12),(-0.7298956734503237,-0.6835585606796967,1.8863464670089275E-12),(-0.7298956734501645,-0.6835585606798666,1.8863464670093964E-12),(-0.5913596447695568,-0.8064079430028104,2.2253486225242428E-12),(-0.5913596447695568,-0.8064079430028104,2.2253486225242428E-12),(-0.7298956734503237,-0.6835585606796967,1.8863464670089275E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(0.03853104078009802,0.9992574037235865,-2.7571770182035085E-12),(0.03853104078008816,0.9992574037235867,-2.757177018203508E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(0.03853104078009802,0.9992574037235865,-2.7571770182035085E-12),(0.17889663461281743,0.9838678743226695,-2.714773340513428E-12),(0.03853104078008816,0.9992574037235867,-2.757177018203508E-12),(0.17889663461278768,0.9838678743226749,-2.714773340513443E-12),(0.17889663461278768,0.9838678743226749,-2.714773340513443E-12),(0.41226168019314996,0.9110654790103296,-2.514003535881718E-12),(0.17889663461281743,0.9838678743226695,-2.714773340513428E-12),(0.41226168019310827,0.9110654790103483,-2.5140035358817698E-12),(0.41226168019310827,0.9110654790103483,-2.5140035358817698E-12),(0.6473041242886012,0.7622318352568118,-2.103496211241168E-12),(0.41226168019314996,0.9110654790103296,-2.514003535881718E-12),(0.6473041242885218,0.762231835256879,-2.1034962112413537E-12),(0.6473041242886012,0.7622318352568118,-2.103496211241168E-12),(0.8137975087381796,0.5811485307316305,-1.6039622995382776E-12),(0.8137975087381611,0.5811485307316561,-1.6039622995383477E-12),(0.6473041242885218,0.762231835256879,-2.1034962112413537E-12),(0.8137975087381611,0.5811485307316561,-1.6039622995383477E-12),(0.915097394613651,0.4032328835441228,-1.1130802151941215E-12),(0.9150973946136156,0.4032328835442033,-1.1130802151943438E-12),(0.8137975087381796,0.5811485307316305,-1.6039622995382776E-12),(0.9150973946136156,0.4032328835442033,-1.1130802151943438E-12),(0.9704191606545896,0.241426288200855,-6.665557466722803E-13),(0.9704191606545819,0.24142628820088544,-6.665557466723643E-13),(0.915097394613651,0.4032328835441228,-1.1130802151941215E-12),(0.9704191606545819,0.24142628820088544,-6.665557466723643E-13),(0.9941110589328176,0.10836605791239322,-2.9945643695642347E-13),(0.9941110589328194,0.10836605791237704,-2.9945643695637884E-13),(0.9704191606545896,0.241426288200855,-6.665557466722803E-13),(0.9941110589328194,0.10836605791237704,-2.9945643695637884E-13),(0.9999930758042374,0.0037213362628470636,-1.0726722939693668E-14),(0.9999930758042371,0.00372133626285637,-1.0726722939719366E-14),(0.9941110589328176,0.10836605791239322,-2.9945643695642347E-13),(0.9999930758042371,0.00372133626285637,-1.0726722939719366E-14),(0.9958593468083936,-0.09090743299840695,2.5046273190119656E-13),(0.9958593468083943,-0.09090743299839879,2.5046273190117404E-13),(0.9999930758042374,0.0037213362628470636,-1.0726722939693668E-14),(0.9958593468083943,-0.09090743299839879,2.5046273190117404E-13),(0.9797523183883908,-0.20021337271164855,5.520671437006962E-13),(0.9797523183883889,-0.20021337271165762,5.520671437007212E-13),(0.9958593468083936,-0.09090743299840695,2.5046273190119656E-13),(0.9797523183883889,-0.20021337271165762,5.520671437007212E-13),(0.9432066145957844,-0.33220668593928016,9.16286323645322E-13),(0.9432066145957768,-0.3322066859393016,9.16286323645381E-13),(0.9797523183883908,-0.20021337271164855,5.520671437006962E-13),(0.9432066145957768,-0.3322066859393016,9.16286323645381E-13),(0.87462096294249,-0.48480735471066383,1.3373656651244873E-12),(0.8746209629424875,-0.4848073547106688,1.337365665124501E-12),(0.9432066145957844,-0.33220668593928016,9.16286323645322E-13),(0.8746209629424875,-0.4848073547106688,1.337365665124501E-12),(0.7610063543191211,-0.6487444247821482,1.789742022686841E-12),(0.7610063543191802,-0.6487444247820788,1.789742022686649E-12),(0.87462096294249,-0.48480735471066383,1.3373656651244873E-12),(0.7610063543191211,-0.6487444247821482,1.789742022686841E-12),(0.5967658568195328,-0.8024154236643568,2.213781391445497E-12),(0.7610063543191802,-0.6487444247820788,1.789742022686649E-12),(0.5967658568194558,-0.802415423664414,2.2137813914456546E-12),(0.5967658568194558,-0.802415423664414,2.2137813914456546E-12),(0.3962631411435402,-0.9181369848617662,2.5331618621787445E-12),(0.5967658568195328,-0.8024154236643568,2.213781391445497E-12),(0.39626314114354483,-0.918136984861764,2.5331618621787384E-12),(0.39626314114354483,-0.918136984861764,2.5331618621787384E-12),(0.2886029626037723,-0.9574488654629686,2.641697712698536E-12),(0.3962631411435402,-0.9181369848617662,2.5331618621787445E-12),(0.2886029626037723,-0.9574488654629686,2.641697712698536E-12),(0.9529875987463974,0.30300930123607694,-8.364703765481575E-13),(0.9296841404730456,0.36835770516292254,-1.0168022719739659E-12),(0.929684140473054,0.36835770516290123,-1.0168022719739073E-12),(0.9529875987463974,0.30300930123607694,-8.364703765481575E-13),(0.929684140473054,0.36835770516290123,-1.0168022719739073E-12),(0.9019056800696664,0.43193303214511475,-1.192239825187194E-12),(0.9019056800696664,0.43193303214511475,-1.192239825187194E-12),(0.9296841404730456,0.36835770516292254,-1.0168022719739659E-12),(0.444982586999434,0.8955392215125428,-2.4711754012779288E-12),(0.444982586999434,0.8955392215125428,-2.4711754012779288E-12),(0.444982586999434,0.8955392215125428,-2.4711754012779288E-12),(0.444982586999434,0.8955392215125428,-2.4711754012779288E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-0.5702090938650628,0.8214995978535741,-2.266447830849148E-12),(-0.5702090938650628,0.8214995978535741,-2.266447830849148E-12),(-0.5702090938650628,0.8214995978535741,-2.266447830849148E-12),(-0.5702090938650628,0.8214995978535741,-2.266447830849148E-12),(-0.9485728622037648,0.3165588809219502,-8.729401457982634E-13),(-0.9485728622037648,0.3165588809219502,-8.729401457982634E-13),(-0.9485728622037648,0.3165588809219502,-8.729401457982634E-13),(-0.9485728622037648,0.3165588809219502,-8.729401457982634E-13),(-0.9719489691963694,-0.23519183931020027,6.492873386655807E-13),(-0.9628838370128916,-0.2699161284905579,7.452461516283996E-13),(-0.9719489691963694,-0.23519183931020027,6.492873386655807E-13),(-0.9628838370128899,-0.2699161284905638,7.452461516284158E-13),(-0.9628838370128899,-0.2699161284905638,7.452461516284158E-13),(-0.952578555817858,-0.3042927784157289,8.402451226635364E-13),(-0.9628838370128916,-0.2699161284905579,7.452461516283996E-13),(-0.952578555817858,-0.3042927784157289,8.402451226635364E-13),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.04792972972070176,0.9988507100707795,-2.756025433210665E-12),(-0.04792972972066793,0.9988507100707813,-2.756025433210671E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.04792972972070176,0.9988507100707795,-2.756025433210665E-12),(-0.3206778121135941,0.9471883343971453,-2.61336969983533E-12),(-0.04792972972066793,0.9988507100707813,-2.756025433210671E-12),(-0.32067781211367463,0.9471883343971181,-2.6133696998352554E-12),(-0.3206778121135941,0.9471883343971453,-2.61336969983533E-12),(-0.6954181980173404,0.718605267073875,-1.982625110305029E-12),(-0.6954181980174247,0.7186052670737935,-1.9826251103048036E-12),(-0.32067781211367463,0.9471883343971181,-2.6133696998352554E-12),(-0.6954181980173404,0.718605267073875,-1.982625110305029E-12),(-0.8917373201927142,0.45255336898040777,-1.2484005407939519E-12),(-0.6954181980174247,0.7186052670737935,-1.9826251103048036E-12),(-0.8917373201926667,0.4525533689805009,-1.2484005407942091E-12),(-0.8917373201926667,0.4525533689805009,-1.2484005407942091E-12),(-0.9658311636130653,0.2591720729435028,-7.146791639274982E-13),(-0.8917373201927142,0.45255336898040777,-1.2484005407939519E-12),(-0.9658311636130642,0.25917207294350686,-7.146791639275094E-13),(-0.9658311636130642,0.25917207294350686,-7.146791639275094E-13),(-0.9937219264957836,0.11187820521222491,-3.0824773212696183E-13),(-0.9658311636130653,0.2591720729435028,-7.146791639274982E-13),(-0.9937219264957871,0.11187820521219376,-3.0824773212687585E-13),(-0.9937219264957871,0.11187820521219376,-3.0824773212687585E-13),(-0.9999994968635364,0.0010031314340942707,-2.221084730734423E-15),(-0.9937219264957836,0.11187820521222491,-3.0824773212696183E-13),(-0.9999994968635365,0.0010031314340779212,-2.221084730689299E-15),(-0.9999994968635365,0.0010031314340779212,-2.221084730689299E-15),(-0.9945078930900839,-0.1046616003199005,2.892487771090994E-13),(-0.9999994968635364,0.0010031314340942707,-2.221084730734423E-15),(-0.9945078930900895,-0.1046616003198478,2.8924877710895403E-13),(-0.9945078930900895,-0.1046616003198478,2.8924877710895403E-13),(-0.9720690082233135,-0.2346952135254229,6.480343024560763E-13),(-0.9945078930900839,-0.1046616003199005,2.892487771090994E-13),(-0.9720690082233349,-0.23469521352533462,6.480343024558325E-13),(-0.9720690082233349,-0.23469521352533462,6.480343024558325E-13),(-0.9183762991966798,-0.39570819182045036,1.0923724361134429E-12),(-0.9720690082233135,-0.2346952135254229,6.480343024560763E-13),(-0.9183762991966443,-0.3957081918205334,1.092372436113672E-12),(-0.9183762991966443,-0.3957081918205334,1.092372436113672E-12),(-0.8089731333683899,-0.587845617052751,1.6224954063821647E-12),(-0.9183762991966798,-0.39570819182045036,1.0923724361134429E-12),(-0.8089731333682966,-0.5878456170528793,1.6224954063825187E-12),(-0.8089731333682966,-0.5878456170528793,1.6224954063825187E-12),(-0.6233369684433753,-0.7819533386154335,2.1579613758183395E-12),(-0.8089731333683899,-0.587845617052751,1.6224954063821647E-12),(-0.6233369684433545,-0.7819533386154501,2.1579613758183856E-12),(-0.6233369684433545,-0.7819533386154501,2.1579613758183856E-12),(-0.3440068091234996,-0.9389671534599432,2.5909600694877703E-12),(-0.6233369684433753,-0.7819533386154335,2.1579613758183395E-12),(-0.34400680912364484,-0.9389671534598899,2.5909600694876237E-12),(-0.3440068091234996,-0.9389671534599432,2.5909600694877703E-12),(-0.08618514690951971,-0.9962791378184052,2.7489733106338224E-12),(-0.086185146909493,-0.9962791378184075,2.7489733106338293E-12),(-0.34400680912364484,-0.9389671534598899,2.5909600694876237E-12),(-0.08618514690951971,-0.9962791378184052,2.7489733106338224E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.086185146909493,-0.9962791378184075,2.7489733106338293E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(0.9852620991274315,-0.17105144262182528,4.715491017825289E-13),(0.9985580220656768,0.053683112505551744,-1.4851410160135448E-13),(0.998558022065676,0.05368311250556627,-1.4851410160139456E-13),(0.9852620991274349,-0.17105144262180608,4.715491017824761E-13),(0.998558022065676,0.05368311250556627,-1.4851410160139456E-13),(0.99423624686343,0.1072114052837702,-2.961815686929806E-13),(0.99423624686343,0.1072114052837702,-2.961815686929806E-13),(0.9985580220656768,0.053683112505551744,-1.4851410160135448E-13),(0.8507772826193725,0.5255264173938323,-1.4503651574277816E-12),(0.7331764133483752,0.6800384892854321,-1.876677604789342E-12),(0.733176413348323,0.6800384892854884,-1.8766776047894976E-12),(0.8507772826193725,0.5255264173938323,-1.4503651574277816E-12),(0.7331764133483752,0.6800384892854321,-1.876677604789342E-12),(0.587931901049856,0.808910427505977,-2.2322319033072458E-12),(0.733176413348323,0.6800384892854884,-1.8766776047894976E-12),(0.587931901049856,0.808910427505977,-2.2322319033072458E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-0.595427913033985,0.8034087380530496,-2.216598066825565E-12),(-0.7353424654422683,0.6776956975791468,-1.8696952302766417E-12),(-0.7353424654421585,0.6776956975792661,-1.869695230276971E-12),(-0.595427913033985,0.8034087380530496,-2.216598066825565E-12),(-0.7353424654422683,0.6776956975791468,-1.8696952302766417E-12),(-0.9279729502400907,0.3726475595287086,-1.02792065149821E-12),(-0.7353424654421585,0.6776956975792661,-1.869695230276971E-12),(-0.9279729502400598,0.37264755952878564,-1.0279206514984224E-12),(-0.9279729502400598,0.37264755952878564,-1.0279206514984224E-12),(-0.9919380594528906,0.1267236608089965,-3.4926490777717986E-13),(-0.9279729502400907,0.3726475595287086,-1.02792065149821E-12),(-0.9919380594528778,0.12672366080909672,-3.492649077774564E-13),(-0.9919380594528778,0.12672366080909672,-3.492649077774564E-13),(-0.9997278626286514,0.023328109309335668,-6.393651358594235E-14),(-0.9919380594528906,0.1267236608089965,-3.4926490777717986E-13),(-0.9997278626286514,0.023328109309338194,-6.393651358594933E-14),(-0.9997278626286514,0.023328109309338194,-6.393651358594933E-14),(-1.,1.0761972206014589E-42,4.1832639490547976E-16),(-0.9997278626286514,0.023328109309335668,-6.393651358594235E-14),(-1.,1.0761972206014589E-42,4.1832639490547976E-16),(-0.9325271362086448,-0.3610999033986354,9.968414837905411E-13),(-0.9262080086179268,-0.3770128973550036,1.0406811080924713E-12),(-0.9325271362086448,-0.3610999033986354,9.968414837905411E-13),(-0.9262080086179288,-0.37701289735499893,1.0406811080924582E-12),(-0.9262080086179288,-0.37701289735499893,1.0406811080924582E-12),(-0.8723365420137861,-0.48890587792276585,1.349357099680846E-12),(-0.9262080086179268,-0.3770128973550036,1.0406811080924713E-12),(-0.8723365420137832,-0.4889058779227708,1.3493570996808597E-12),(-0.8723365420137832,-0.4889058779227708,1.3493570996808597E-12),(-0.730188377765645,-0.6832458803212618,1.8855408283225637E-12),(-0.8723365420137861,-0.48890587792276585,1.349357099680846E-12),(-0.7301883777656969,-0.6832458803212063,1.8855408283224102E-12),(-0.730188377765645,-0.6832458803212618,1.8855408283225637E-12),(-0.6321911971634502,-0.7748124226088815,2.1381418186106884E-12),(-0.6321911971634502,-0.7748124226088815,2.1381418186106884E-12),(-0.7301883777656969,-0.6832458803212063,1.8855408283224102E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.6156006345831257,-0.7880582838222391,2.1742979694824417E-12),(0.6156006345831257,-0.7880582838222391,2.1742979694824417E-12),(0.6156006345831257,-0.7880582838222391,2.1742979694824417E-12),(0.6156006345831257,-0.7880582838222391,2.1742979694824417E-12),(0.9762553099163308,-0.21662310555471498,5.972709452770732E-13),(0.998637758841438,-0.052178794698135106,1.4358477460580818E-13),(0.9986377588414385,-0.05217879469812459,1.4358477460577918E-13),(0.9762553099163308,-0.21662310555471498,5.972709452770732E-13),(0.9986377588414385,-0.05217879469812459,1.4358477460577918E-13),(0.9788258497336725,0.20469478716653747,-5.652297082401526E-13),(0.9788258497336696,0.2046947871665516,-5.652297082401914E-13),(0.998637758841438,-0.052178794698135106,1.4358477460580818E-13),(0.9788258497336696,0.2046947871665516,-5.652297082401914E-13),(0.9450084045283325,0.3270460447258393,-9.029092045425201E-13),(0.9450084045283396,0.3270460447258185,-9.029092045424627E-13),(0.9788258497336725,0.20469478716653747,-5.652297082401526E-13),(0.9450084045283396,0.3270460447258185,-9.029092045424627E-13),(0.9330496485399467,0.3597476245362602,-9.931222522019194E-13),(0.9330496485399467,0.3597476245362602,-9.931222522019194E-13),(0.9450084045283325,0.3270460447258393,-9.029092045425201E-13),(-0.941482093321121,0.33706300294704605,-9.295062198414925E-13),(-0.9606480611335356,0.2777684334844022,-7.659860390816943E-13),(-0.941482093321121,0.33706300294704605,-9.295062198414925E-13),(-0.9606480611335216,0.2777684334844508,-7.659860390818286E-13),(-0.9606480611335216,0.2777684334844508,-7.659860390818286E-13),(-0.9760836593293745,0.21739523911571249,-5.994913964326429E-13),(-0.9606480611335356,0.2777684334844022,-7.659860390816943E-13),(-0.9760836593293745,0.21739523911571249,-5.994913964326429E-13),(-0.9792141269629987,-0.20282922263838732,5.599701124608434E-13),(-0.9792141269629987,-0.20282922263838732,5.599701124608434E-13),(-0.9792141269629987,-0.20282922263838732,5.599701124608434E-13),(-0.9792141269629987,-0.20282922263838732,5.599701124608434E-13),(-0.6124868691939012,-0.7904807619828917,2.1813289080976322E-12),(-0.6124868691939012,-0.7904807619828917,2.1813289080976322E-12),(-0.6124868691939012,-0.7904807619828917,2.1813289080976322E-12),(-0.6124868691939012,-0.7904807619828917,2.1813289080976322E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.6823833044151579,-0.7309945457084137,2.016755335614812E-12),(0.7673233100206696,-0.6412604290761467,1.7691891586056286E-12),(0.6823833044151579,-0.7309945457084137,2.016755335614812E-12),(0.7673233100207348,-0.6412604290760685,1.769189158605413E-12),(0.7673233100206696,-0.6412604290761467,1.7691891586056286E-12),(0.8868360880342167,-0.46208414056334735,1.2746730212628473E-12),(0.8868360880342113,-0.46208414056335717,1.2746730212628743E-12),(0.7673233100207348,-0.6412604290760685,1.769189158605413E-12),(0.8868360880342113,-0.46208414056335717,1.2746730212628743E-12),(0.9337699395388017,-0.35787386047838504,9.870093402008136E-13),(0.9337699395388005,-0.35787386047838804,9.87009340200822E-13),(0.8868360880342167,-0.46208414056334735,1.2746730212628473E-12),(0.9337699395388005,-0.35787386047838804,9.87009340200822E-13),(0.9852620991274349,-0.17105144262180608,4.715491017824761E-13),(0.9852620991274315,-0.17105144262182528,4.715491017825289E-13),(0.9337699395388017,-0.35787386047838504,9.870093402008136E-13),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(0.9536861696258785,-0.3008034073349574,8.294192511205685E-13),(0.9536861696258785,-0.3008034073349574,8.294192511205685E-13),(0.9536861696258785,-0.3008034073349574,8.294192511205685E-13),(0.9536861696258785,-0.3008034073349574,8.294192511205685E-13),(-0.7700417988451072,-0.6379934388623381,1.7606145799129604E-12),(-0.7700417988451072,-0.6379934388623381,1.7606145799129604E-12),(-0.7700417988451072,-0.6379934388623381,1.7606145799129604E-12),(-0.7700417988451072,-0.6379934388623381,1.7606145799129604E-12),(-0.994302470776474,0.10659548117907772,-2.9373543347154515E-13),(-0.994302470776474,0.10659548117907772,-2.9373543347154515E-13),(-0.994302470776474,0.10659548117907772,-2.9373543347154515E-13),(-0.994302470776474,0.10659548117907772,-2.9373543347154515E-13),(-0.9408175538277588,-0.33891345563366515,9.356684417598264E-13),(-0.8797598194001592,-0.4754184053746753,1.312215174727072E-12),(-0.9408175538277588,-0.33891345563366515,9.356684417598264E-13),(-0.8797598194001869,-0.4754184053746245,1.312215174726932E-12),(-0.8797598194001869,-0.4754184053746245,1.312215174726932E-12),(-0.7490764788486547,-0.6624835309920549,1.828184682788307E-12),(-0.8797598194001592,-0.4754184053746753,1.312215174727072E-12),(-0.7490764788486777,-0.662483530992029,1.828184682788235E-12),(-0.7490764788486547,-0.6624835309920549,1.828184682788307E-12),(-0.6277478308059733,-0.7784167655686737,2.148002877057963E-12),(-0.6277478308059808,-0.7784167655686675,2.1480028770579456E-12),(-0.7490764788486777,-0.662483530992029,1.828184682788235E-12),(-0.6277478308059733,-0.7784167655686737,2.148002877057963E-12),(-0.46242915451716665,-0.8866562338654922,2.4466655210755724E-12),(-0.6277478308059808,-0.7784167655686675,2.1480028770579456E-12),(-0.46242915451719524,-0.8866562338654773,2.446665521075531E-12),(-0.46242915451716665,-0.8866562338654922,2.4466655210755724E-12),(-0.24619523010030192,-0.9692202580816496,2.674409352298623E-12),(-0.2461952301003007,-0.9692202580816499,2.674409352298624E-12),(-0.46242915451719524,-0.8866562338654773,2.446665521075531E-12),(-0.24619523010030192,-0.9692202580816496,2.674409352298623E-12),(0.01107595437302213,-0.9999386597360495,2.759041705616567E-12),(-0.2461952301003007,-0.9692202580816499,2.674409352298624E-12),(0.01107595437300701,-0.9999386597360496,2.7590417056165674E-12),(0.01107595437300701,-0.9999386597360496,2.7590417056165674E-12),(0.29728615576795203,-0.9547884276575168,2.6343137181964544E-12),(0.01107595437302213,-0.9999386597360495,2.759041705616567E-12),(0.29728615576786194,-0.9547884276575449,2.6343137181965324E-12),(0.29728615576795203,-0.9547884276575168,2.6343137181964544E-12),(0.5611488072511259,-0.8277149365093267,2.283576617558577E-12),(0.5611488072510544,-0.8277149365093752,2.283576617558711E-12),(0.29728615576786194,-0.9547884276575449,2.6343137181965324E-12),(0.5611488072511259,-0.8277149365093267,2.283576617558577E-12),(0.7489939741665258,-0.6625768081228272,1.8278532181623816E-12),(0.5611488072510544,-0.8277149365093752,2.283576617558711E-12),(0.7489939741665401,-0.662576808122811,1.8278532181623376E-12),(0.7489939741665258,-0.6625768081228272,1.8278532181623816E-12),(0.8635495158077536,-0.5042640516120445,1.3909567292984932E-12),(0.8635495158077526,-0.5042640516120462,1.390956729298498E-12),(0.7489939741665401,-0.662576808122811,1.8278532181623376E-12),(0.8635495158077526,-0.5042640516120462,1.390956729298498E-12),(0.9334175416532469,-0.35879199117874594,9.89507096892698E-13),(0.9334175416532348,-0.3587919911787773,9.895070968927845E-13),(0.8635495158077536,-0.5042640516120445,1.3909567292984932E-12),(0.9334175416532348,-0.3587919911787773,9.895070968927845E-13),(0.9749062702748591,-0.22261573210077437,6.137816218987995E-13),(0.9749062702748557,-0.22261573210078947,6.137816218988411E-13),(0.9334175416532469,-0.35879199117874594,9.89507096892698E-13),(0.9749062702748557,-0.22261573210078947,6.137816218988411E-13),(0.9946566839741976,-0.10323798247473452,2.8437204511474835E-13),(0.9946566839741967,-0.10323798247474142,2.8437204511476743E-13),(0.9749062702748591,-0.22261573210077437,6.137816218987995E-13),(0.9946566839741967,-0.10323798247474142,2.8437204511476743E-13),(0.9999996706240923,-0.0008116352057429888,1.720813878406038E-15),(0.9999996706240923,-0.0008116352057321722,1.720813878376187E-15),(0.9946566839741976,-0.10323798247473452,2.8437204511474835E-13),(0.9999996706240923,-0.0008116352057321722,1.720813878376187E-15),(0.9950173309235021,0.0997021121234151,-2.7553474214447757E-13),(0.9950173309235023,0.09970211212341235,-2.7553474214447E-13),(0.9999996706240923,-0.0008116352057429888,1.720813878406038E-15),(0.9950173309235023,0.09970211212341235,-2.7553474214447E-13),(0.9766138235826096,0.21500102229374587,-5.936675829305664E-13),(0.9766138235826148,0.21500102229372134,-5.936675829304988E-13),(0.9950173309235021,0.0997021121234151,-2.7553474214447757E-13),(0.9766138235826148,0.21500102229372134,-5.936675829304988E-13),(0.937885089864574,0.34694604509883137,-9.577001964441785E-13),(0.9378850898645769,0.34694604509882304,-9.57700196444155E-13),(0.9766138235826096,0.21500102229374587,-5.936675829305664E-13),(0.9378850898645769,0.34694604509882304,-9.57700196444155E-13),(0.8712497287927936,0.49084000456206067,-1.3546245125662513E-12),(0.8712497287927798,0.4908400045620854,-1.3546245125663194E-12),(0.937885089864574,0.34694604509883137,-9.577001964441785E-13),(0.8712497287927798,0.4908400045620854,-1.3546245125663194E-12),(0.7558037417969682,0.6547982161595295,-1.8070350330033544E-12),(0.7558037417969727,0.6547982161595243,-1.8070350330033397E-12),(0.8712497287927936,0.49084000456206067,-1.3546245125662513E-12),(0.7558037417969682,0.6547982161595295,-1.8070350330033544E-12),(0.5617419259877942,0.8273125217156595,-2.283048801609119E-12),(0.7558037417969727,0.6547982161595243,-1.8070350330033397E-12),(0.56174192598777,0.827312521715676,-2.283048801609164E-12),(0.56174192598777,0.827312521715676,-2.283048801609164E-12),(0.29396712482546045,0.9558155311156291,-2.637474352287062E-12),(0.5617419259877942,0.8273125217156595,-2.283048801609119E-12),(0.2939671248254585,0.9558155311156297,-2.6374743522870633E-12),(0.2939671248254585,0.9558155311156297,-2.6374743522870633E-12),(-0.002695267450449311,0.9999963677600887,-2.7592104981658698E-12),(0.29396712482546045,0.9558155311156291,-2.637474352287062E-12),(-0.0026952674504793607,0.9999963677600887,-2.7592104981658698E-12),(-0.0026952674504793607,0.9999963677600887,-2.7592104981658698E-12),(-0.2926144101614126,0.9562305197837437,-2.6383369383607793E-12),(-0.002695267450449311,0.9999963677600887,-2.7592104981658698E-12),(-0.2926144101613252,0.9562305197837706,-2.6383369383608528E-12),(-0.2926144101614126,0.9562305197837437,-2.6383369383607793E-12),(-0.5408366900001049,0.8411276209646967,-2.320627046402213E-12),(-0.5408366900001452,0.841127620964671,-2.320627046402141E-12),(-0.2926144101613252,0.9562305197837706,-2.6383369383608528E-12),(-0.5408366900001452,0.841127620964671,-2.320627046402141E-12),(-0.7259710978950735,0.6877252104009433,-1.8972810890864104E-12),(-0.7259710978950947,0.6877252104009208,-1.897281089086349E-12),(-0.5408366900001049,0.8411276209646967,-2.320627046402213E-12),(-0.7259710978950735,0.6877252104009433,-1.8972810890864104E-12),(-0.799321709095357,0.6009033244781372,-1.657705730728049E-12),(-0.7259710978950947,0.6877252104009208,-1.897281089086349E-12),(-0.799321709095357,0.6009033244781372,-1.657705730728049E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(0.08869355101080907,-0.9960589611107835,2.7483009206149294E-12),(0.08869355101079084,-0.9960589611107851,2.748300920614934E-12),(1.5257648893363474E-27,-1.,2.75921435746603E-12),(0.08869355101080907,-0.9960589611107835,2.7483009206149294E-12),(0.41828292848581383,-0.9083167904081326,2.506001011191422E-12),(0.08869355101079084,-0.9960589611107851,2.748300920614934E-12),(0.41828292848587684,-0.9083167904081038,2.506001011191342E-12),(0.41828292848587684,-0.9083167904081038,2.506001011191342E-12),(0.8055283032698622,-0.5925572990278469,1.6346307732097947E-12),(0.41828292848581383,-0.9083167904081326,2.506001011191422E-12),(0.8055283032698332,-0.5925572990278865,1.6346307732099033E-12),(0.8055283032698622,-0.5925572990278469,1.6346307732097947E-12),(0.9613077859588501,-0.2754765700652123,7.597271844674613E-13),(0.9613077859588718,-0.2754765700651368,7.597271844672532E-13),(0.8055283032698332,-0.5925572990278865,1.6346307732099033E-12),(0.9613077859588718,-0.2754765700651368,7.597271844672532E-13),(0.9847230941359341,-0.17412761950751132,4.800311419741642E-13),(0.9847230941359341,-0.17412761950751132,4.800311419741642E-13),(0.9613077859588501,-0.2754765700652123,7.597271844674613E-13),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(0.9850106999604984,0.1724932490369674,-4.762594688425094E-13),(0.9614949837727648,0.27482248121252945,-7.586623473344419E-13),(0.9614949837727732,0.2748224812124999,-7.586623473343604E-13),(0.9850106999604984,0.1724932490369674,-4.762594688425094E-13),(0.9614949837727732,0.2748224812124999,-7.586623473343604E-13),(0.9273794962553974,0.37412199871844704,-1.0327015343522095E-12),(0.9273794962553974,0.37412199871844704,-1.0327015343522095E-12),(0.9614949837727648,0.27482248121252945,-7.586623473344419E-13),(0.3926681168676969,0.9196802433430745,-2.5377594709113726E-12),(0.200399297225422,0.9797143061482553,-2.7033257527914195E-12),(0.3926681168676969,0.9196802433430745,-2.5377594709113726E-12),(0.20039929722539637,0.9797143061482605,-2.7033257527914344E-12),(0.20039929722539637,0.9797143061482605,-2.7033257527914344E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(0.200399297225422,0.9797143061482553,-2.7033257527914195E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.5672614750584217,-0.8235377458954407,2.2720267892346443E-12),(0.7214044108111449,-0.6925140258956672,1.9105084807667906E-12),(0.5672614750584217,-0.8235377458954407,2.2720267892346443E-12),(0.7214044108113933,-0.6925140258954087,1.910508480766077E-12),(0.7214044108111449,-0.6925140258956672,1.9105084807667906E-12),(0.8460222407894988,-0.5331476044113067,1.4707982952692824E-12),(0.8460222407894988,-0.5331476044113067,1.4707982952692824E-12),(0.7214044108113933,-0.6925140258954087,1.910508480766077E-12),(0.9941612242434783,-0.10790486648297537,2.9734366250342627E-13),(0.9985392391497387,-0.054031360137064166,1.4867985376386638E-13),(0.99853923914974,-0.05403136013704105,1.4867985376380264E-13),(0.9941612242434783,-0.10790486648297537,2.9734366250342627E-13),(0.99853923914974,-0.05403136013704105,1.4867985376380264E-13),(0.9985392391497393,0.054031360137051426,-1.4946196418482968E-13),(0.9985392391497397,0.05403136013704346,-1.494619641848077E-13),(0.9985392391497387,-0.054031360137064166,1.4867985376386638E-13),(0.9985392391497397,0.05403136013704346,-1.494619641848077E-13),(0.9941612242434782,0.1079048664829755,-2.9806894560304523E-13),(0.9941612242434782,0.1079048664829755,-2.9806894560304523E-13),(0.9985392391497393,0.054031360137051426,-1.4946196418482968E-13),(0.8460222407894984,0.5331476044113076,-1.471403742289845E-12),(0.7214044108112283,0.6925140258955805,-1.9111181103523465E-12),(0.7214044108113113,0.692514025895494,-1.9111181103521074E-12),(0.8460222407894984,0.5331476044113076,-1.471403742289845E-12),(0.7214044108112283,0.6925140258955805,-1.9111181103523465E-12),(0.5672614750584241,0.8235377458954392,-2.2726156509172023E-12),(0.7214044108113113,0.692514025895494,-1.9111181103521074E-12),(0.5672614750584241,0.8235377458954392,-2.2726156509172023E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.8194722387884859,-0.5731188793391708,1.5810442314329484E-12),(0.7574045442264162,-0.6529459061707751,1.8013364556836293E-12),(0.7574045442264307,-0.6529459061707586,1.8013364556835839E-12),(0.8194722387884859,-0.5731188793391708,1.5810442314329484E-12),(0.7574045442264162,-0.6529459061707751,1.8013364556836293E-12),(0.5831639704137637,-0.8123544691889466,2.2412232233703595E-12),(0.7574045442264307,-0.6529459061707586,1.8013364556835839E-12),(0.5831639704137174,-0.8123544691889798,2.241223223370452E-12),(0.5831639704137174,-0.8123544691889798,2.241223223370452E-12),(0.3197400203626559,-0.9475053136412948,2.614228690268775E-12),(0.5831639704137637,-0.8123544691889466,2.2412232233703595E-12),(0.31974002036271576,-0.9475053136412748,2.6142286902687196E-12),(0.31974002036271576,-0.9475053136412748,2.6142286902687196E-12),(0.012699053705120382,-0.9999193637663962,2.7589900422465964E-12),(0.3197400203626559,-0.9475053136412948,2.614228690268775E-12),(0.012699053705104884,-0.9999193637663965,2.758990042246598E-12),(0.012699053705120382,-0.9999193637663962,2.7589900422465964E-12),(-0.2815655603975249,-0.9595419924099351,2.647680286489206E-12),(-0.28156556039741143,-0.9595419924099683,2.6476802864892972E-12),(0.012699053705104884,-0.9999193637663965,2.758990042246598E-12),(-0.2815655603975249,-0.9595419924099351,2.647680286489206E-12),(-0.5404333018571977,-0.8413868588489645,2.3217849592199153E-12),(-0.28156556039741143,-0.9595419924099683,2.6476802864892972E-12),(-0.540433301857118,-0.8413868588490157,2.3217849592200563E-12),(-0.5404333018571977,-0.8413868588489645,2.3217849592199153E-12),(-0.7333107949378584,-0.6798935784573981,1.876336346843231E-12),(-0.7333107949378527,-0.6798935784574043,1.8763363468432485E-12),(-0.540433301857118,-0.8413868588490157,2.3217849592200563E-12),(-0.7333107949378584,-0.6798935784573981,1.876336346843231E-12),(-0.857100934324648,-0.515148510994466,1.421838236635534E-12),(-0.7333107949378527,-0.6798935784574043,1.8763363468432485E-12),(-0.8571009343246425,-0.5151485109944751,1.421838236635559E-12),(-0.8571009343246425,-0.5151485109944751,1.421838236635559E-12),(-0.930947415719256,-0.3651532680473211,1.0080293293775354E-12),(-0.857100934324648,-0.515148510994466,1.421838236635534E-12),(-0.9309474157192436,-0.3651532680473529,1.0080293293776233E-12),(-0.9309474157192436,-0.3651532680473529,1.0080293293776233E-12),(-0.9717468331379525,-0.23602561786035084,6.517164895541571E-13),(-0.930947415719256,-0.3651532680473211,1.0080293293775354E-12),(-0.9717468331379511,-0.23602561786035728,6.517164895541746E-13),(-0.9717468331379511,-0.23602561786035728,6.517164895541746E-13),(-0.9931098274040339,-0.1171873317109414,3.2382436153424646E-13),(-0.9717468331379525,-0.23602561786035084,6.517164895541571E-13),(-0.9931098274040338,-0.11718733171094246,3.238243615342495E-13),(-0.9931098274040338,-0.11718733171094246,3.238243615342495E-13),(-0.9999579620805333,-0.009169191444562432,2.5844865235747E-14),(-0.9931098274040339,-0.1171873317109414,3.2382436153424646E-13),(-0.9999579620805331,-0.009169191444566668,2.5844865235758688E-14),(-0.9999579620805331,-0.009169191444566668,2.5844865235758688E-14),(-0.9967023029360896,0.08114505112386929,-2.2348917946437247E-13),(-0.9999579620805333,-0.009169191444562432,2.5844865235747E-14),(-0.9967023029360891,0.08114505112387725,-2.2348917946439453E-13),(-0.9967023029360891,0.08114505112387725,-2.2348917946439453E-13),(-0.9857538147747108,0.16819457974948349,-4.637515077264077E-13),(-0.9967023029360896,0.08114505112386929,-2.2348917946437247E-13),(-0.9857538147747129,0.16819457974947152,-4.637515077263746E-13),(-0.9857538147747129,0.16819457974947152,-4.637515077263746E-13),(-0.9654101412336251,0.2607359952198245,-7.190119774474812E-13),(-0.9857538147747108,0.16819457974948349,-4.637515077264077E-13),(-0.9654101412336293,0.26073599521980817,-7.190119774474362E-13),(-0.9654101412336293,0.26073599521980817,-7.190119774474362E-13),(-0.933824740070632,0.3577308413207013,-9.86652423969427E-13),(-0.9654101412336251,0.2607359952198245,-7.190119774474812E-13),(-0.933824740070634,0.357730841320696,-9.866524239694126E-13),(-0.933824740070634,0.357730841320696,-9.866524239694126E-13),(-0.887595750904099,0.4606232549242262,-1.2707356214919325E-12),(-0.933824740070632,0.3577308413207013,-9.86652423969427E-13),(-0.8875957509041004,0.4606232549242236,-1.2707356214919256E-12),(-0.8875957509041004,0.4606232549242236,-1.2707356214919256E-12),(-0.819804938826555,0.5726428749889312,-1.5798800955690818E-12),(-0.887595750904099,0.4606232549242262,-1.2707356214919325E-12),(-0.8198049388265481,0.5726428749889407,-1.5798800955691079E-12),(-0.8198049388265481,0.5726428749889407,-1.5798800955691079E-12),(-0.7226711292766403,0.6911920419897972,-1.906905096063903E-12),(-0.819804938826555,0.5726428749889312,-1.5798800955690818E-12),(-0.7226711292765956,0.6911920419898439,-1.9069050960640323E-12),(-0.7226711292766403,0.6911920419897972,-1.906905096063903E-12),(-0.5715761942912734,0.8205489955630344,-2.2638376180697867E-12),(-0.571576194291267,0.8205489955630387,-2.2638376180697985E-12),(-0.7226711292765956,0.6911920419898439,-1.9069050960640323E-12),(-0.5715761942912734,0.8205489955630344,-2.2638376180697867E-12),(-0.3225397005865454,0.9465559368286386,-2.6116014205882584E-12),(-0.571576194291267,0.8205489955630387,-2.2638376180697985E-12),(-0.32253970058654396,0.9465559368286391,-2.6116014205882596E-12),(-0.3225397005865454,0.9465559368286386,-2.6116014205882584E-12),(-0.02037212465314542,0.9997924667335301,-2.7586321734525926E-12),(-0.020372124653092762,0.9997924667335312,-2.758632173452596E-12),(-0.32253970058654396,0.9465559368286391,-2.6116014205882596E-12),(-0.02037212465314542,0.9997924667335301,-2.7586321734525926E-12),(0.25541347674785303,0.9668319170856814,-2.6677956938745385E-12),(-0.020372124653092762,0.9997924667335312,-2.758632173452596E-12),(0.25541347674790693,0.9668319170856672,-2.667795693874499E-12),(0.25541347674790693,0.9668319170856672,-2.667795693874499E-12),(0.4905585459951927,0.8714082355309036,-2.4045763044428377E-12),(0.25541347674785303,0.9668319170856814,-2.6677956938745385E-12),(0.4905585459951778,0.871408235530912,-2.4045763044428607E-12),(0.4905585459951778,0.871408235530912,-2.4045763044428607E-12),(0.6462378453519254,0.7631360607617106,-2.10586443651587E-12),(0.4905585459951927,0.8714082355309036,-2.4045763044428377E-12),(0.6462378453519061,0.763136060761727,-2.1058644365159154E-12),(0.6462378453519061,0.763136060761727,-2.1058644365159154E-12),(0.6427392629565352,0.7660850082426167,-2.1140122214723044E-12),(0.6462378453519254,0.7631360607617106,-2.10586443651587E-12),(0.6427392629565662,0.7660850082425907,-2.114012221472232E-12),(0.6427392629565662,0.7660850082425907,-2.114012221472232E-12),(0.5846038255640311,0.8113189059401364,-2.2388376312990567E-12),(0.6427392629565352,0.7660850082426167,-2.1140122214723044E-12),(0.5846038255640311,0.8113189059401364,-2.2388376312990567E-12),(-0.8601478920980523,0.5100447075691285,-1.4070710734411735E-12),(-0.8601478920980523,0.5100447075691285,-1.4070710734411735E-12),(-0.8601478920980523,0.5100447075691285,-1.4070710734411735E-12),(-0.8601478920980523,0.5100447075691285,-1.4070710734411735E-12),(0.8094388435365364,0.587204188144324,-1.6206721396554934E-12),(0.8094388435365364,0.587204188144324,-1.6206721396554934E-12),(0.8094388435365364,0.587204188144324,-1.6206721396554934E-12),(0.8094388435365364,0.587204188144324,-1.6206721396554934E-12),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(0.9536861696258785,-0.3008034073349574,8.294192511205685E-13),(0.9536861696258785,-0.3008034073349574,8.294192511205685E-13),(0.9536861696258785,-0.3008034073349574,8.294192511205685E-13),(0.9536861696258785,-0.3008034073349574,8.294192511205685E-13),(-0.770041798845136,-0.637993438862303,1.7605590687617287E-12),(-0.770041798845136,-0.637993438862303,1.7605590687617287E-12),(-0.770041798845136,-0.637993438862303,1.7605590687617287E-12),(-0.770041798845136,-0.637993438862303,1.7605590687617287E-12),(-0.994302470776474,0.10659548117907772,-2.9373543347154515E-13),(-0.994302470776474,0.10659548117907772,-2.9373543347154515E-13),(-0.994302470776474,0.10659548117907772,-2.9373543347154515E-13),(-0.994302470776474,0.10659548117907772,-2.9373543347154515E-13),(-0.9408175538277588,-0.33891345563366515,9.356684417598264E-13),(-0.8797598194001714,-0.4754184053746529,1.3121871053121885E-12),(-0.9408175538277588,-0.33891345563366515,9.356684417598264E-13),(-0.8797598194001328,-0.4754184053747243,1.3121871053123856E-12),(-0.8797598194001328,-0.4754184053747243,1.3121871053123856E-12),(-0.7490764788486469,-0.6624835309920637,1.828156840349135E-12),(-0.8797598194001714,-0.4754184053746529,1.3121871053121885E-12),(-0.7490764788486561,-0.6624835309920533,1.8281568403491064E-12),(-0.7490764788486469,-0.6624835309920637,1.828156840349135E-12),(-0.6277478308059852,-0.778416765568664,2.148002877057945E-12),(-0.6277478308059492,-0.7784167655686931,2.1480028770580255E-12),(-0.7490764788486561,-0.6624835309920533,1.8281568403491064E-12),(-0.6277478308059492,-0.7784167655686931,2.1480028770580255E-12),(-0.4624291545171812,-0.8866562338654849,2.4466655210755607E-12),(-0.4624291545172642,-0.8866562338654415,2.446665521075441E-12),(-0.6277478308059852,-0.778416765568664,2.148002877057945E-12),(-0.4624291545171812,-0.8866562338654849,2.4466655210755607E-12),(-0.24619523010037206,-0.9692202580816319,2.674409352298574E-12),(-0.4624291545172642,-0.8866562338654415,2.446665521075441E-12),(-0.2461952301003438,-0.9692202580816389,2.6744093522985933E-12),(-0.2461952301003438,-0.9692202580816389,2.6744093522985933E-12),(0.011075954373054989,-0.9999386597360491,2.7590347013096172E-12),(-0.24619523010037206,-0.9692202580816319,2.674409352298574E-12),(0.0110759543730961,-0.9999386597360487,2.7590347013096152E-12),(0.011075954373054989,-0.9999386597360491,2.7590347013096172E-12),(0.29728615576782064,-0.9547884276575576,2.634306696201371E-12),(0.2972861557679879,-0.9547884276575057,2.6343066962012276E-12),(0.0110759543730961,-0.9999386597360487,2.7590347013096152E-12),(0.29728615576782064,-0.9547884276575576,2.634306696201371E-12),(0.5611488072510459,-0.8277149365093812,2.283576617558722E-12),(0.2972861557679879,-0.9547884276575057,2.6343066962012276E-12),(0.5611488072509848,-0.8277149365094224,2.283576617558836E-12),(0.5611488072509848,-0.8277149365094224,2.283576617558836E-12),(0.7489939741665427,-0.6625768081228082,1.82785321816233E-12),(0.5611488072510459,-0.8277149365093812,2.283576617558722E-12),(0.7489939741665566,-0.6625768081227924,1.827853218162286E-12),(0.7489939741665427,-0.6625768081228082,1.82785321816233E-12),(0.8635495158077704,-0.5042640516120157,1.3909567292984136E-12),(0.8635495158077656,-0.5042640516120236,1.3909567292984359E-12),(0.7489939741665566,-0.6625768081227924,1.827853218162286E-12),(0.8635495158077656,-0.5042640516120236,1.3909567292984359E-12),(0.9334175416532352,-0.35879199117877647,9.895070968927825E-13),(0.9334175416532393,-0.3587919911787656,9.89507096892752E-13),(0.8635495158077704,-0.5042640516120157,1.3909567292984136E-12),(0.9334175416532393,-0.3587919911787656,9.89507096892752E-13),(0.9749062702748574,-0.2226157321007812,6.137816218988183E-13),(0.9749062702748587,-0.22261573210077576,6.137816218988033E-13),(0.9334175416532352,-0.35879199117877647,9.895070968927825E-13),(0.9749062702748587,-0.22261573210077576,6.137816218988033E-13),(0.9946566839741972,-0.1032379824747367,2.843720451147544E-13),(0.994656683974197,-0.10323798247473812,2.843720451147583E-13),(0.9749062702748574,-0.2226157321007812,6.137816218988183E-13),(0.994656683974197,-0.10323798247473812,2.843720451147583E-13),(0.9999996706240923,-0.0008116352057429553,1.7208138783906328E-15),(0.9999996706240923,-0.0008116352057480785,1.7208138784047613E-15),(0.9946566839741972,-0.1032379824747367,2.843720451147544E-13),(0.9999996706240923,-0.0008116352057480785,1.7208138784047613E-15),(0.9950173309235023,0.09970211212341352,-2.7553474214448853E-13),(0.9950173309235034,0.09970211212340235,-2.755347421444577E-13),(0.9999996706240923,-0.0008116352057429553,1.7208138783906328E-15),(0.9950173309235034,0.09970211212340235,-2.755347421444577E-13),(0.9766138235826098,0.2150010222937444,-5.937232061238268E-13),(0.9766138235826136,0.21500102229372753,-5.937232061237801E-13),(0.9950173309235023,0.09970211212341352,-2.7553474214448853E-13),(0.9766138235826136,0.21500102229372753,-5.937232061237801E-13),(0.9378850898645635,0.3469460450988595,-9.577558605028239E-13),(0.9378850898645755,0.34694604509882676,-9.577558605027336E-13),(0.9766138235826098,0.2150010222937444,-5.937232061238268E-13),(0.9378850898645755,0.34694604509882676,-9.577558605027336E-13),(0.8712497287927936,0.4908400045620607,-1.3546245125662362E-12),(0.8712497287927745,0.4908400045620945,-1.3546245125663293E-12),(0.9378850898645635,0.3469460450988595,-9.577558605028239E-13),(0.8712497287927745,0.4908400045620945,-1.3546245125663293E-12),(0.7558037417969744,0.6547982161595223,-1.8070350330033189E-12),(0.7558037417969822,0.6547982161595135,-1.8070350330032946E-12),(0.8712497287927936,0.4908400045620607,-1.3546245125662362E-12),(0.7558037417969744,0.6547982161595223,-1.8070350330033189E-12),(0.5617419259878124,0.8273125217156473,-2.283048801609085E-12),(0.7558037417969822,0.6547982161595135,-1.8070350330032946E-12),(0.5617419259877519,0.8273125217156883,-2.2830488016091985E-12),(0.5617419259877519,0.8273125217156883,-2.2830488016091985E-12),(0.29396712482546045,0.9558155311156291,-2.637474352287062E-12),(0.5617419259878124,0.8273125217156473,-2.283048801609085E-12),(0.2939671248254585,0.9558155311156297,-2.6374743522870633E-12),(0.2939671248254585,0.9558155311156297,-2.6374743522870633E-12),(-0.002695267450516672,0.9999963677600887,-2.75921049816587E-12),(0.29396712482546045,0.9558155311156291,-2.637474352287062E-12),(-0.002695267450412,0.9999963677600888,-2.7592104981658706E-12),(-0.002695267450412,0.9999963677600888,-2.7592104981658706E-12),(-0.2926144101614269,0.9562305197837393,-2.6383369383607663E-12),(-0.002695267450516672,0.9999963677600887,-2.75921049816587E-12),(-0.29261441016138784,0.9562305197837514,-2.6383369383608003E-12),(-0.2926144101614269,0.9562305197837393,-2.6383369383607663E-12),(-0.5408366900001067,0.8411276209646955,-2.3205990644270868E-12),(-0.5408366900001648,0.8411276209646582,-2.320599064426984E-12),(-0.29261441016138784,0.9562305197837514,-2.6383369383608003E-12),(-0.5408366900001648,0.8411276209646582,-2.320599064426984E-12),(-0.7259710978950983,0.6877252104009172,-1.897281089086344E-12),(-0.7259710978950612,0.6877252104009562,-1.8972810890864516E-12),(-0.5408366900001067,0.8411276209646955,-2.3205990644270868E-12),(-0.7259710978950983,0.6877252104009172,-1.897281089086344E-12),(-0.7993217090953496,0.6009033244781474,-1.6577612418792807E-12),(-0.7259710978950612,0.6877252104009562,-1.8972810890864516E-12),(-0.7993217090953496,0.6009033244781474,-1.6577612418792807E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(0.08869355101086293,-0.9960589611107787,2.748300920614913E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(0.08869355101077159,-0.9960589611107867,2.748300920614935E-12),(0.08869355101077159,-0.9960589611107867,2.748300920614935E-12),(0.4182829284859115,-0.9083167904080877,2.5060583614662E-12),(0.08869355101086293,-0.9960589611107787,2.748300920614913E-12),(0.41828292848561616,-0.9083167904082237,2.5060583614665753E-12),(0.41828292848561616,-0.9083167904082237,2.5060583614665753E-12),(0.8055283032698752,-0.5925572990278292,1.6346880812569148E-12),(0.4182829284859115,-0.9083167904080877,2.5060583614662E-12),(0.8055283032697906,-0.592557299027944,1.6346880812572316E-12),(0.8055283032698752,-0.5925572990278292,1.6346880812569148E-12),(0.9613077859588944,-0.27547657006505755,7.597271844669893E-13),(0.9613077859588679,-0.2754765700651501,7.597271844672447E-13),(0.8055283032697906,-0.592557299027944,1.6346880812572316E-12),(0.9613077859588679,-0.2754765700651501,7.597271844672447E-13),(0.9847230941359283,-0.17412761950754374,4.800311419741642E-13),(0.9847230941359283,-0.17412761950754374,4.800311419741642E-13),(0.9613077859588944,-0.27547657006505755,7.597271844669893E-13),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(0.9850106999604984,0.1724932490369674,-4.762594688425094E-13),(0.961494983772804,0.2748224812123921,-7.586623473340006E-13),(0.961494983772787,0.2748224812124512,-7.586623473341636E-13),(0.9850106999604984,0.1724932490369674,-4.762594688425094E-13),(0.961494983772787,0.2748224812124512,-7.586623473341636E-13),(0.9273794962553793,0.3741219987184919,-1.0327015343522093E-12),(0.9273794962553793,0.3741219987184919,-1.0327015343522093E-12),(0.961494983772804,0.2748224812123921,-7.586623473340006E-13),(0.3926681168676969,0.9196802433430745,-2.5377594709113726E-12),(0.20039929722533362,0.9797143061482733,-2.70332575279147E-12),(0.3926681168676969,0.9196802433430745,-2.5377594709113726E-12),(0.2003992972254554,0.9797143061482484,-2.703325752791401E-12),(0.2003992972254554,0.9797143061482484,-2.703325752791401E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(0.20039929722533362,0.9797143061482733,-2.70332575279147E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.5672614750584476,-0.8235377458954231,2.2720267892346447E-12),(0.7214044108111475,-0.6925140258956647,1.9105368161879373E-12),(0.5672614750584476,-0.8235377458954231,2.2720267892346447E-12),(0.7214044108112989,-0.6925140258955069,1.910536816187502E-12),(0.7214044108111475,-0.6925140258956647,1.9105368161879373E-12),(0.8460222407894723,-0.5331476044113491,1.4708538064205136E-12),(0.8460222407894723,-0.5331476044113491,1.4708538064205136E-12),(0.7214044108112989,-0.6925140258955069,1.910536816187502E-12),(0.9941612242434783,-0.10790486648297537,2.9734366250342627E-13),(0.9985392391497385,-0.054031360137068975,1.4867985376387969E-13),(0.9985392391497395,-0.054031360137050524,1.4867985376382877E-13),(0.9941612242434783,-0.10790486648297537,2.9734366250342627E-13),(0.9985392391497395,-0.054031360137050524,1.4867985376382877E-13),(0.9985392391497385,0.05403136013706628,-1.4946196418487068E-13),(0.9985392391497392,0.05403136013705365,-1.494619641848358E-13),(0.9985392391497385,-0.054031360137068975,1.4867985376387969E-13),(0.9985392391497392,0.05403136013705365,-1.494619641848358E-13),(0.9941612242434782,0.1079048664829755,-2.9806894560304523E-13),(0.9941612242434782,0.1079048664829755,-2.9806894560304523E-13),(0.9985392391497385,0.05403136013706628,-1.4946196418487068E-13),(0.8460222407894719,0.53314760441135,-1.4712927199873829E-12),(0.7214044108113185,0.6925140258954865,-1.911004768667298E-12),(0.7214044108112997,0.6925140258955061,-1.911004768667352E-12),(0.8460222407894719,0.53314760441135,-1.4712927199873829E-12),(0.7214044108113185,0.6925140258954865,-1.911004768667298E-12),(0.5672614750584498,0.8235377458954214,-2.2725046286147394E-12),(0.7214044108112997,0.6925140258955061,-1.911004768667352E-12),(0.5672614750584498,0.8235377458954214,-2.2725046286147394E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(0.8194722387884859,-0.5731188793391708,1.5810442314329484E-12),(0.757404544226434,-0.6529459061707545,1.801364353885305E-12),(0.7574045442264348,-0.6529459061707538,1.8013643538853029E-12),(0.8194722387884859,-0.5731188793391708,1.5810442314329484E-12),(0.757404544226434,-0.6529459061707545,1.801364353885305E-12),(0.583163970413716,-0.8123544691889808,2.2412652421666774E-12),(0.7574045442264348,-0.6529459061707538,1.8013643538853029E-12),(0.5831639704137412,-0.8123544691889628,2.2412652421666274E-12),(0.5831639704137412,-0.8123544691889628,2.2412652421666274E-12),(0.3197400203626799,-0.9475053136412869,2.6142427512849984E-12),(0.583163970413716,-0.8123544691889808,2.2412652421666774E-12),(0.3197400203626479,-0.9475053136412975,2.6142427512850283E-12),(0.3197400203626479,-0.9475053136412975,2.6142427512850283E-12),(0.012699053705094217,-0.9999193637663966,2.758986532790597E-12),(0.3197400203626799,-0.9475053136412869,2.6142427512849984E-12),(0.012699053705109459,-0.9999193637663963,2.7589865327905968E-12),(0.012699053705094217,-0.9999193637663966,2.758986532790597E-12),(-0.28156556039750363,-0.9595419924099412,2.647676779225572E-12),(-0.2815655603974348,-0.9595419924099615,2.647676779225628E-12),(0.012699053705109459,-0.9999193637663963,2.7589865327905968E-12),(-0.2815655603974348,-0.9595419924099615,2.647676779225628E-12),(-0.540433301857153,-0.8413868588489932,2.3217849592199763E-12),(-0.5404333018571272,-0.8413868588490098,2.321784959220022E-12),(-0.28156556039750363,-0.9595419924099412,2.647676779225572E-12),(-0.5404333018571272,-0.8413868588490098,2.321784959220022E-12),(-0.7333107949378317,-0.6798935784574272,1.8763084109461554E-12),(-0.73331079493784,-0.679893578457418,1.876308410946131E-12),(-0.540433301857153,-0.8413868588489932,2.3217849592199763E-12),(-0.7333107949378317,-0.6798935784574272,1.8763084109461554E-12),(-0.85710093432464,-0.5151485109944794,1.4218103612338795E-12),(-0.73331079493784,-0.679893578457418,1.876308410946131E-12),(-0.8571009343246485,-0.5151485109944652,1.4218103612338403E-12),(-0.8571009343246485,-0.5151485109944652,1.4218103612338403E-12),(-0.9309474157192527,-0.36515326804732995,1.0079458302361512E-12),(-0.85710093432464,-0.5151485109944794,1.4218103612338795E-12),(-0.930947415719251,-0.3651532680473342,1.0079458302361631E-12),(-0.930947415719251,-0.3651532680473342,1.0079458302361631E-12),(-0.9717468331379574,-0.23602561786033083,6.516330682046901E-13),(-0.9309474157192527,-0.36515326804732995,1.0079458302361512E-12),(-0.9717468331379546,-0.23602561786034235,6.516330682047218E-13),(-0.9717468331379546,-0.23602561786034235,6.516330682047218E-13),(-0.9931098274040329,-0.11718733171094989,3.237965560539515E-13),(-0.9717468331379574,-0.23602561786033083,6.516330682046901E-13),(-0.9931098274040345,-0.11718733171093668,3.237965560539151E-13),(-0.9931098274040345,-0.11718733171093668,3.237965560539151E-13),(-0.9999579620805331,-0.009169191444583459,2.581707716457124E-14),(-0.9931098274040329,-0.11718733171094989,3.237965560539515E-13),(-0.999957962080533,-0.009169191444587096,2.5817077164581284E-14),(-0.999957962080533,-0.009169191444587096,2.5817077164581284E-14),(-0.9967023029360895,0.08114505112387327,-2.2348917946439978E-13),(-0.9999579620805331,-0.009169191444583459,2.581707716457124E-14),(-0.99670230293609,0.08114505112386673,-2.2348917946438168E-13),(-0.99670230293609,0.08114505112386673,-2.2348917946438168E-13),(-0.9857538147747091,0.16819457974949253,-4.63751507726399E-13),(-0.9967023029360895,0.08114505112387327,-2.2348917946439978E-13),(-0.9857538147747111,0.168194579749481,-4.63751507726367E-13),(-0.9857538147747111,0.168194579749481,-4.63751507726367E-13),(-0.9654101412336203,0.26073599521984153,-7.190119774474945E-13),(-0.9857538147747091,0.16819457974949253,-4.63751507726399E-13),(-0.965410141233624,0.26073599521982815,-7.190119774474575E-13),(-0.965410141233624,0.26073599521982815,-7.190119774474575E-13),(-0.933824740070633,0.3577308413206985,-9.866524239694556E-13),(-0.9654101412336203,0.26073599521984153,-7.190119774474945E-13),(-0.9338247400706331,0.3577308413206983,-9.866524239694552E-13),(-0.9338247400706331,0.3577308413206983,-9.866524239694552E-13),(-0.8875957509041146,0.46062325492419626,-1.2707356214918862E-12),(-0.933824740070633,0.3577308413206985,-9.866524239694556E-13),(-0.8875957509041126,0.4606232549242003,-1.2707356214918971E-12),(-0.8875957509041126,0.4606232549242003,-1.2707356214918971E-12),(-0.8198049388265566,0.572642874988929,-1.5798800955690756E-12),(-0.8875957509041146,0.46062325492419626,-1.2707356214918862E-12),(-0.8198049388265604,0.5726428749889236,-1.5798800955690608E-12),(-0.8198049388265604,0.5726428749889236,-1.5798800955690608E-12),(-0.722671129276619,0.6911920419898193,-1.9069050960639523E-12),(-0.8198049388265566,0.572642874988929,-1.5798800955690756E-12),(-0.7226711292766199,0.6911920419898184,-1.9069050960639503E-12),(-0.722671129276619,0.6911920419898193,-1.9069050960639523E-12),(-0.5715761942912858,0.8205489955630256,-2.263837618069745E-12),(-0.5715761942912485,0.8205489955630518,-2.263837618069817E-12),(-0.7226711292766199,0.6911920419898184,-1.9069050960639503E-12),(-0.5715761942912485,0.8205489955630518,-2.263837618069817E-12),(-0.32253970058651305,0.9465559368286498,-2.6116014205882842E-12),(-0.32253970058652687,0.9465559368286449,-2.6116014205882713E-12),(-0.5715761942912858,0.8205489955630256,-2.263837618069745E-12),(-0.32253970058651305,0.9465559368286498,-2.6116014205882842E-12),(-0.020372124653166204,0.9997924667335297,-2.7586321734525922E-12),(-0.32253970058652687,0.9465559368286449,-2.6116014205882713E-12),(-0.02037212465307671,0.9997924667335314,-2.758632173452597E-12),(-0.02037212465307671,0.9997924667335314,-2.758632173452597E-12),(0.25541347674785186,0.9668319170856817,-2.6677956938745385E-12),(-0.020372124653166204,0.9997924667335297,-2.7586321734525922E-12),(0.25541347674788184,0.966831917085674,-2.667795693874517E-12),(0.25541347674788184,0.966831917085674,-2.667795693874517E-12),(0.4905585459952011,0.8714082355308989,-2.404576304442824E-12),(0.25541347674785186,0.9668319170856817,-2.6677956938745385E-12),(0.4905585459951661,0.8714082355309185,-2.404576304442878E-12),(0.4905585459951661,0.8714082355309185,-2.404576304442878E-12),(0.6462378453519136,0.7631360607617204,-2.105864436515905E-12),(0.4905585459952011,0.8714082355308989,-2.404576304442824E-12),(0.646237845351932,0.7631360607617048,-2.1058644365158617E-12),(0.646237845351932,0.7631360607617048,-2.1058644365158617E-12),(0.6427392629565304,0.7660850082426208,-2.114040052551329E-12),(0.6462378453519136,0.7631360607617204,-2.105864436515905E-12),(0.6427392629565537,0.7660850082426012,-2.1140400525512756E-12),(0.6427392629565537,0.7660850082426012,-2.1140400525512756E-12),(0.5846038255640063,0.8113189059401544,-2.238893142450288E-12),(0.6427392629565304,0.7660850082426208,-2.114040052551329E-12),(0.5846038255640063,0.8113189059401544,-2.238893142450288E-12),(-0.8601478920980623,0.5100447075691116,-1.407182095743636E-12),(-0.8601478920980623,0.5100447075691116,-1.407182095743636E-12),(-0.8601478920980623,0.5100447075691116,-1.407182095743636E-12),(-0.8601478920980623,0.5100447075691116,-1.407182095743636E-12),(0.8094388435365364,0.587204188144324,-1.6206721396554934E-12),(0.8094388435365364,0.587204188144324,-1.6206721396554934E-12),(0.8094388435365364,0.587204188144324,-1.6206721396554934E-12),(0.8094388435365364,0.587204188144324,-1.6206721396554934E-12),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.20007400713178172,0.9797807875592539,-2.703357036887256E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.20007400713178403,0.9797807875592535,-2.703357036887254E-12),(-0.20007400713178172,0.9797807875592539,-2.703357036887256E-12),(-0.39205733655535935,0.9199407833404918,-2.5381802158445413E-12),(-0.39205733655535935,0.9199407833404918,-2.5381802158445413E-12),(-0.20007400713178403,0.9797807875592535,-2.703357036887254E-12),(-0.9271481171496652,0.37469503448248564,-1.0335900548120443E-12),(-0.9613689058329687,0.27526319568282365,-7.592040277545593E-13),(-0.9271481171496652,0.37469503448248564,-1.0335900548120443E-12),(-0.9613689058329601,0.27526319568285385,-7.592040277546427E-13),(-0.9613689058329601,0.27526319568285385,-7.592040277546427E-13),(-0.9849591146664011,0.1727875644703044,-4.764229101229142E-13),(-0.9613689058329687,0.27526319568282365,-7.592040277545593E-13),(-0.9849591146664011,0.1727875644703044,-4.764229101229142E-13),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.9850568535010445,-0.1722294846146325,4.755933364007252E-13),(-0.9627290187837485,-0.2704678102689502,7.466956952226043E-13),(-0.9850568535010445,-0.1722294846146325,4.755933364007252E-13),(-0.9627290187837382,-0.2704678102689871,7.466956952227058E-13),(-0.9627290187837382,-0.2704678102689871,7.466956952227058E-13),(-0.8103422277042295,-0.5859568874920293,1.617130587676769E-12),(-0.9627290187837485,-0.2704678102689502,7.466956952226043E-13),(-0.8103422277044079,-0.5859568874917827,1.6171305876760882E-12),(-0.8103422277042295,-0.5859568874920293,1.617130587676769E-12),(-0.4221218672866537,-0.9065390941147706,2.5014835595792063E-12),(-0.4221218672864478,-0.9065390941148664,2.5014835595794704E-12),(-0.8103422277044079,-0.5859568874917827,1.6171305876760882E-12),(-0.4221218672866537,-0.9065390941147706,2.5014835595792063E-12),(-0.08899635085419964,-0.9960319520651113,2.74829713291859E-12),(-0.4221218672864478,-0.9065390941148664,2.5014835595794704E-12),(-0.08899635085420729,-0.9960319520651107,2.7482971329185886E-12),(-0.08899635085420729,-0.9960319520651107,2.7482971329185886E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.08899635085419964,-0.9960319520651113,2.74829713291859E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-0.587931901049856,0.808910427505977,-2.2317528341055837E-12),(-0.7331764133481863,0.6800384892856357,-1.876124783451532E-12),(-0.587931901049856,0.808910427505977,-2.2317528341055837E-12),(-0.7331764133483407,0.6800384892854691,-1.8761247834510723E-12),(-0.7331764133483407,0.6800384892854691,-1.8761247834510723E-12),(-0.8507772826193463,0.5255264173938747,-1.4497594274980523E-12),(-0.7331764133481863,0.6800384892856357,-1.876124783451532E-12),(-0.8507772826193463,0.5255264173938747,-1.4497594274980523E-12),(-0.994236246863432,0.1072114052837521,-2.955673034322279E-13),(-0.9985580220656773,0.05368311250553952,-1.4778759496953175E-13),(-0.994236246863432,0.1072114052837521,-2.955673034322279E-13),(-0.9985580220656758,0.053683112505568904,-1.4778759496961286E-13),(-0.9985580220656758,0.053683112505568904,-1.4778759496961286E-13),(-0.9997372811223786,-0.022920923498721792,6.371776302886765E-14),(-0.9985580220656773,0.05368311250553952,-1.4778759496953175E-13),(-0.9997372811223787,-0.022920923498718167,6.371776302885764E-14),(-0.9997372811223787,-0.022920923498718167,6.371776302885764E-14),(-0.9919210150229111,-0.12685700593943589,3.5043685389320923E-13),(-0.9997372811223786,-0.022920923498721792,6.371776302886765E-14),(-0.9919210150229133,-0.12685700593941754,3.504368538931587E-13),(-0.9919210150229133,-0.12685700593941754,3.504368538931587E-13),(-0.9257138949175407,-0.37822451633467224,1.0438892155545436E-12),(-0.9919210150229111,-0.12685700593943589,3.5043685389320923E-13),(-0.9257138949176085,-0.37822451633450627,1.0438892155540856E-12),(-0.9257138949176085,-0.37822451633450627,1.0438892155540856E-12),(-0.7298956734501632,-0.6835585606798681,1.8863747066722004E-12),(-0.9257138949175407,-0.37822451633467224,1.0438892155545436E-12),(-0.729895673450331,-0.6835585606796888,1.8863747066717057E-12),(-0.7298956734501632,-0.6835585606798681,1.8863747066722004E-12),(-0.5913596447695311,-0.8064079430028291,2.2253486225242428E-12),(-0.5913596447695311,-0.8064079430028291,2.2253486225242428E-12),(-0.729895673450331,-0.6835585606796888,1.8863747066717057E-12),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.,-1.0761972206014589E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.9832650394637132,-0.18218085016933794,5.029602806542489E-13),(-0.9604389766296769,-0.27849052438196026,7.687097039147037E-13),(-0.9832650394637132,-0.18218085016933794,5.029602806542489E-13),(-0.9604389766296849,-0.27849052438193206,7.687097039146259E-13),(-0.9604389766296849,-0.27849052438193206,7.687097039146259E-13),(-0.8061306092176249,-0.5917376453145607,1.633047905996456E-12),(-0.9604389766296769,-0.27849052438196026,7.687097039147037E-13),(-0.8061306092174902,-0.5917376453147445,1.633047905996963E-12),(-0.8061306092176249,-0.5917376453145607,1.633047905996456E-12),(-0.4173761927595571,-0.9087337969491049,2.507574576781867E-12),(-0.41737619275961,-0.9087337969490807,2.5075745767817993E-12),(-0.8061306092174902,-0.5917376453147445,1.633047905996963E-12),(-0.4173761927595571,-0.9087337969491049,2.507574576781867E-12),(-0.0876379036952066,-0.996152396893121,2.7486195714483775E-12),(-0.41737619275961,-0.9087337969490807,2.5075745767817993E-12),(-0.0876379036952242,-0.9961523968931193,2.7486195714483726E-12),(-0.0876379036952066,-0.996152396893121,2.7486195714483775E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.0876379036952242,-0.9961523968931193,2.7486195714483726E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.08899635085425409,0.9960319520651065,-2.7482221725572434E-12),(-0.08899635085416184,0.9960319520651149,-2.748222172557266E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-0.08899635085425409,0.9960319520651065,-2.7482221725572434E-12),(-0.422121867286659,0.9065390941147681,-2.5010996658425873E-12),(-0.08899635085416184,0.9960319520651149,-2.748222172557266E-12),(-0.422121867286817,0.9065390941146945,-2.5010996658423837E-12),(-0.422121867286659,0.9065390941147681,-2.5010996658425873E-12),(-0.8086796863923623,0.5882492369874787,-1.6227862208368616E-12),(-0.8086796863925251,0.5882492369872546,-1.6227862208362432E-12),(-0.422121867286817,0.9065390941146945,-2.5010996658423837E-12),(-0.8086796863923623,0.5882492369874787,-1.6227862208368616E-12),(-0.9603664303895912,0.2787405951431447,-7.687588443464164E-13),(-0.8086796863925251,0.5882492369872546,-1.6227862208362432E-12),(-0.9603664303895675,0.27874059514322663,-7.687588443466426E-13),(-0.9603664303895675,0.27874059514322663,-7.687588443466426E-13),(-0.9830031215351425,0.1835888423956264,-5.061214342191787E-13),(-0.9603664303895912,0.2787405951431447,-7.687588443464164E-13),(-0.9830031215351425,0.1835888423956264,-5.061214342191787E-13),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.,-1.0761972206014592E-42,-4.1832639490547976E-16),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.9829162037139707,-0.18405362391573804,5.082338296439351E-13),(-0.9589823266839851,-0.2834658658600195,7.825243876378746E-13),(-0.9829162037139707,-0.18405362391573804,5.082338296439351E-13),(-0.958982326683998,-0.2834658658599764,7.825243876377559E-13),(-0.958982326683998,-0.2834658658599764,7.825243876377559E-13),(-0.9250216907185411,-0.3799142952038155,1.0486331646147884E-12),(-0.9589823266839851,-0.2834658658600195,7.825243876378746E-13),(-0.9250216907185411,-0.3799142952038155,1.0486331646147884E-12),(-0.39770665703451996,-0.9175126238643406,2.5317921720421993E-12),(-0.20308542061848583,-0.9791610245165054,2.701806136595908E-12),(-0.2030854206186462,-0.9791610245164724,2.701806136595817E-12),(-0.39770665703451996,-0.9175126238643406,2.5317921720421993E-12),(-0.20308542061848583,-0.9791610245165054,2.701806136595908E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(-0.2030854206186462,-0.9791610245164724,2.701806136595817E-12),(1.1218681058631891E-27,-1.,2.7592143574660292E-12),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.,1.0761972206014592E-42,4.1832639490547976E-16),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.1218681058631891E-27,1.,-2.7592143574660292E-12),(-1.5257648893363474E-27,1.,-2.75921435746603E-12),(-0.08899635085414169,0.9960319520651166,-2.7482221725572696E-12),(-1.5257648893363474E-27,1.,-2.75921435746603E-12),(-0.08899635085414813,0.9960319520651161,-2.7482221725572672E-12),(-0.9603664303895796,0.2787405951431853,-7.687588443465316E-13),(-0.9830031215351425,0.1835888423956264,-5.061214342191787E-13),(-0.960366430389585,0.2787405951431662,-7.687588443464785E-13),(-0.9830031215351425,0.1835888423956264,-5.061214342191787E-13),(-0.08899635085414813,0.9960319520651161,-2.7482221725572672E-12),(-0.4221218672867728,0.9065390941147151,-2.5010996658424387E-12),(-0.08899635085414169,0.9960319520651166,-2.7482221725572696E-12),(-0.4221218672867537,0.906539094114724,-2.5010996658424633E-12),(-0.4221218672867728,0.9065390941147151,-2.5010996658424387E-12),(-0.8086796863926495,0.5882492369870835,-1.6227862208357747E-12),(-0.8086796863925304,0.5882492369872474,-1.6227862208362265E-12),(-0.4221218672867537,0.906539094114724,-2.5010996658424633E-12),(-0.8086796863926495,0.5882492369870835,-1.6227862208357747E-12),(-0.960366430389585,0.2787405951431662,-7.687588443464785E-13),(-0.8086796863925304,0.5882492369872474,-1.6227862208362265E-12),(-0.9603664303895796,0.2787405951431853,-7.687588443465316E-13),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(2.8459428809374868E-15,-2.753816448777958E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(7.508879584363145E-15,-2.762882014836081E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(1.3393061614876474E-14,-2.7681850473853533E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(5.699856804559158E-16,-2.7588738478177244E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(1.128363786808868E-14,-2.7463497837929584E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(2.3691877306836875E-16,-2.75749174968622E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(8.952169516375848E-15,-2.7643353439559525E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(9.618303331150947E-15,-2.7461948200471406E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.160071921872904E-14,-2.7571002251900776E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(3.1790097883250337E-15,-2.768257652314093E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(2.416222495374049E-14,-2.7527431704243738E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(1.73571985631233E-15,-2.7562066450224008E-12,-1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.),(7.067707978630143E-16,2.759214357466027E-12,1.)),$,((1,2,3),(2,1,4),(3,2,5),(3,5,6),(7,8,9),(8,7,10),(8,10,6),(8,6,11),(11,6,5),(8,11,12),(8,12,13),(14,15,16),(15,14,17),(17,14,18),(18,14,19),(19,14,20),(20,14,21),(20,21,22),(22,21,4),(22,4,1),(21,14,23),(23,14,24),(25,26,27),(26,25,22),(26,22,28),(28,22,1),(29,30,31),(30,29,32),(32,29,33),(32,33,25),(32,25,34),(34,25,27),(32,34,35),(36,37,38),(37,36,39),(40,41,42),(41,40,43),(44,45,46),(45,44,47),(48,49,50),(49,48,51),(52,53,54),(53,52,55),(56,57,58),(57,56,59),(60,61,62),(61,60,63),(64,65,66),(65,64,67),(68,69,70),(69,68,71),(72,73,74),(73,72,75),(76,77,78),(77,76,79),(80,81,82),(81,80,83),(84,85,86),(85,84,87),(88,89,90),(89,88,91),(92,93,94),(93,92,95),(96,97,98),(97,96,99),(100,101,102),(101,100,103),(104,105,106),(105,104,107),(108,109,110),(109,108,111),(112,113,114),(113,112,115),(116,117,118),(117,116,119),(120,121,122),(121,120,123),(124,125,126),(125,124,127),(128,129,130),(129,128,131),(132,133,134),(133,132,135),(136,137,138),(137,136,139),(140,141,142),(141,140,143),(144,145,146),(145,144,147),(148,149,150),(149,148,151),(152,153,154),(153,152,155),(156,157,158),(157,156,159),(160,161,162),(161,160,163),(164,165,166),(165,164,167),(168,169,170),(169,168,171),(172,173,174),(173,172,175),(176,177,178),(177,176,179),(180,181,182),(181,180,183),(184,185,186),(185,184,187),(188,189,190),(189,188,191),(192,193,194),(193,192,195),(196,197,198),(197,196,199),(200,201,202),(201,200,203),(204,205,206),(205,204,207),(208,209,210),(209,208,211),(212,213,214),(213,212,215),(216,217,218),(217,216,219),(220,221,222),(221,220,223),(224,225,226),(225,224,227),(228,229,230),(229,228,231),(232,233,234),(233,232,235),(236,237,238),(237,236,239),(240,241,242),(241,240,243),(244,245,246),(245,244,247),(248,249,250),(249,248,251),(252,253,254),(253,252,255),(256,257,258),(257,256,259),(260,261,262),(261,260,263),(264,265,266),(265,264,267),(268,269,270),(269,268,271),(272,273,274),(273,272,275),(276,277,278),(277,276,279),(280,281,282),(281,280,283),(284,285,286),(285,284,287),(288,289,290),(289,288,291),(292,293,294),(293,292,295),(296,297,298),(297,296,299),(300,301,302),(301,300,303),(304,305,306),(305,304,307),(308,309,310),(309,308,311),(312,313,314),(313,312,315),(316,317,318),(317,316,319),(320,321,322),(321,320,323),(324,325,326),(325,324,327),(328,329,330),(329,328,331),(332,333,334),(333,332,335),(336,337,338),(337,336,339),(340,341,342),(341,340,343),(344,345,346),(345,344,347),(348,349,350),(349,348,351),(352,353,354),(353,352,355),(356,357,358),(357,356,359),(360,361,362),(361,360,363),(364,365,366),(365,364,367),(368,369,370),(369,368,371),(372,373,374),(373,372,375),(373,375,376),(376,375,377),(377,375,378),(377,378,379),(379,378,380),(380,378,381),(380,381,382),(382,381,383),(382,383,384),(384,383,385),(384,385,386),(386,385,387),(387,385,388),(387,388,389),(387,389,390),(390,389,391),(390,391,392),(392,391,393),(392,393,394),(394,393,395),(394,395,396),(396,395,397),(396,397,398),(398,397,399),(398,399,400),(400,399,401),(402,403,404),(403,402,405),(405,402,406),(405,406,407),(407,406,372),(407,372,408),(408,372,409),(409,372,374),(409,374,410),(409,410,411),(411,410,412),(411,412,413),(411,413,414),(414,413,415),(414,415,416),(414,416,417),(417,416,418),(417,418,419),(419,418,420),(419,420,421),(421,420,422),(421,422,423),(421,423,424),(424,423,425),(424,425,426),(426,425,427),(426,427,428),(428,427,429),(428,429,430),(430,429,431),(430,431,432),(430,432,433),(433,432,434),(433,434,401),(433,401,399),(433,399,435),(433,435,436),(436,435,437),(436,437,438),(436,438,439),(439,438,440),(439,440,441),(442,443,444),(443,442,445),(446,447,448),(447,446,449),(450,451,452),(451,450,453),(454,455,456),(455,454,457),(458,459,460),(459,458,461),(462,463,464),(463,462,465),(466,467,468),(467,466,469),(470,471,472),(471,470,473),(474,475,476),(475,474,477),(478,479,480),(479,478,481),(482,483,484),(483,482,485),(486,487,488),(487,486,489),(490,491,492),(491,490,493),(494,495,496),(495,494,497),(498,499,500),(499,498,501),(502,503,504),(503,502,505),(506,507,508),(507,506,509),(510,511,512),(511,510,513),(514,515,516),(515,514,517),(518,519,520),(519,518,521),(522,523,524),(523,522,525),(526,527,528),(527,526,529),(530,531,532),(531,530,533),(534,535,536),(535,534,537),(538,539,540),(539,538,541),(542,543,544),(543,542,545),(546,547,548),(547,546,549),(550,551,552),(551,550,553),(554,555,556),(555,554,557),(558,559,560),(559,558,561),(562,563,564),(563,562,565),(566,567,568),(567,566,569),(570,571,572),(571,570,573),(574,575,576),(575,574,577),(578,579,580),(579,578,581),(582,583,584),(583,582,585),(586,587,588),(587,586,589),(590,591,592),(591,590,593),(594,595,596),(595,594,597),(598,599,600),(599,598,601),(602,603,604),(603,602,605),(606,607,608),(607,606,609),(610,611,612),(611,610,613),(614,615,616),(615,614,617),(618,619,620),(619,618,621),(622,623,624),(623,622,625),(626,627,628),(627,626,629),(630,631,632),(631,630,633),(634,635,636),(635,634,637),(638,639,640),(639,638,641),(642,643,644),(643,642,645),(646,647,648),(647,646,649),(650,651,652),(651,650,653),(654,655,656),(655,654,657),(658,659,660),(659,658,661),(662,663,664),(663,662,665),(666,667,668),(667,666,669),(670,671,672),(671,670,673),(674,675,676),(675,674,677),(678,679,680),(679,678,681),(682,683,684),(683,682,685),(686,687,688),(687,686,689),(690,691,692),(691,690,693),(694,695,696),(695,694,697),(698,699,700),(699,698,701),(702,703,704),(703,702,705),(706,707,708),(707,706,709),(710,711,712),(711,710,713),(714,715,716),(715,714,717),(718,719,720),(719,718,721),(722,723,724),(723,722,725),(725,722,726),(726,722,727),(727,722,728),(728,722,729),(728,729,730),(730,729,731),(729,722,732),(732,722,733),(732,733,734),(734,733,735),(734,735,736),(736,735,737),(736,737,738),(736,738,739),(739,738,740),(739,740,741),(742,743,744),(743,742,745),(745,742,746),(745,746,747),(745,747,730),(745,730,748),(748,730,749),(749,730,731),(745,748,750),(745,750,751),(752,753,754),(753,752,755),(756,757,758),(757,756,759),(760,761,762),(761,760,763),(764,765,766),(765,764,767),(768,769,770),(769,768,771),(772,773,774),(773,772,775),(776,777,778),(777,776,779),(780,781,782),(781,780,783),(784,785,786),(785,784,787),(788,789,790),(789,788,791),(792,793,794),(793,792,795),(796,797,798),(797,796,799),(800,801,802),(801,800,803),(804,805,806),(805,804,807),(808,809,810),(809,808,811),(812,813,814),(813,812,815),(816,817,818),(817,816,819),(820,821,822),(821,820,823),(824,825,826),(825,824,827),(828,829,830),(829,828,831),(832,833,834),(833,832,835),(836,837,838),(837,836,839),(840,841,842),(841,840,843),(844,845,846),(845,844,847),(848,849,850),(849,848,851),(852,853,854),(853,852,855),(856,857,858),(857,856,859),(860,861,862),(861,860,863),(864,865,866),(865,864,867),(868,869,870),(869,868,871),(872,873,874),(873,872,875),(873,875,876),(876,875,877),(877,875,878),(878,875,879),(879,875,880),(880,875,881),(880,881,882),(882,881,883),(882,883,884),(884,883,885),(884,885,886),(886,885,887),(887,885,888),(887,888,889),(889,888,890),(889,890,891),(891,890,892),(892,890,893),(892,893,894),(895,896,897),(896,895,898),(896,898,899),(896,899,900),(896,900,901),(901,900,877),(901,877,878),(896,901,902),(896,902,903),(896,903,904),(904,903,905),(904,905,906),(906,905,907),(906,907,908),(908,907,909),(908,909,910),(910,909,911),(910,911,912),(912,911,913),(912,913,914),(912,914,915),(915,914,894),(915,894,893),(915,893,916),(915,916,917),(917,916,918),(917,918,919),(919,918,920),(919,920,921),(919,921,922),(923,924,925),(924,923,926),(927,928,929),(928,927,930),(931,932,933),(932,931,934),(935,936,937),(936,935,938),(939,940,941),(940,939,942),(943,944,945),(944,943,946),(947,948,949),(948,947,950),(951,952,953),(952,951,954),(955,956,957),(956,955,958),(959,960,961),(960,959,962),(963,964,965),(964,963,966),(967,968,969),(968,967,970),(971,972,973),(972,971,974),(975,976,977),(976,975,978),(979,980,981),(980,979,982),(983,984,985),(984,983,986),(987,988,989),(988,987,990),(991,992,993),(992,991,994),(995,996,997),(996,995,998),(999,1000,1001),(1000,999,1002),(1003,1004,1005),(1004,1003,1006),(1007,1008,1009),(1008,1007,1010),(1011,1012,1013),(1012,1011,1014),(1015,1016,1017),(1016,1015,1018),(1019,1020,1021),(1020,1019,1022),(1023,1024,1025),(1024,1023,1026),(1027,1028,1029),(1028,1027,1030),(1031,1032,1033),(1032,1031,1034),(1035,1036,1037),(1036,1035,1038),(1039,1040,1041),(1040,1039,1042),(1043,1044,1045),(1044,1043,1046),(1047,1048,1049),(1048,1047,1050),(1051,1052,1053),(1052,1051,1054),(1055,1056,1057),(1056,1055,1058),(1059,1060,1061),(1060,1059,1062),(1063,1064,1065),(1064,1063,1066),(1067,1068,1069),(1068,1067,1070),(1071,1072,1073),(1072,1071,1074),(1075,1076,1077),(1076,1075,1078),(1079,1080,1081),(1080,1079,1082),(1083,1084,1085),(1084,1083,1086),(1087,1088,1089),(1088,1087,1090),(1091,1092,1093),(1092,1091,1094),(1095,1096,1097),(1096,1095,1098),(1099,1100,1101),(1100,1099,1102),(1103,1104,1105),(1104,1103,1106),(1107,1108,1109),(1108,1107,1110),(1111,1112,1113),(1112,1111,1114),(1115,1116,1117),(1116,1115,1118),(1119,1120,1121),(1120,1119,1122),(1123,1124,1125),(1124,1123,1126),(1127,1128,1129),(1128,1127,1130),(1130,1127,1131),(1131,1127,1132),(1132,1127,1133),(1132,1133,1134),(1133,1127,1135),(1135,1127,1136),(1136,1127,1137),(1136,1137,1138),(1136,1138,1139),(1139,1138,1140),(1139,1140,1141),(1141,1140,1142),(1141,1142,1143),(1143,1142,1144),(1145,1146,1133),(1146,1145,1147),(1147,1145,1148),(1147,1148,1149),(1147,1149,1150),(1150,1149,1151),(1151,1149,1152),(1151,1152,1153),(1153,1152,1154),(1153,1154,1155),(1155,1154,1156),(1155,1156,1157),(1158,1159,1160),(1159,1158,1161),(1159,1161,1162),(1159,1162,1163),(1159,1163,1134),(1159,1134,1164),(1164,1134,1133),(1164,1133,1146),(1159,1164,1165),(1159,1165,1166),(1159,1166,1167),(1167,1166,1168),(1168,1166,1169),(1168,1169,1170),(1170,1169,1171),(1170,1171,1172),(1172,1171,1173),(1172,1173,1174),(1172,1174,1175),(1176,1177,1178),(1177,1176,1179),(1180,1181,1182),(1181,1180,1183),(1184,1185,1186),(1185,1184,1187),(1188,1189,1190),(1189,1188,1191),(1192,1193,1194),(1193,1192,1195),(1196,1197,1198),(1197,1196,1199),(1200,1201,1202),(1201,1200,1203),(1204,1205,1206),(1205,1204,1207),(1208,1209,1210),(1209,1208,1211),(1212,1213,1214),(1213,1212,1215),(1216,1217,1218),(1217,1216,1219),(1220,1221,1222),(1221,1220,1223),(1224,1225,1226),(1225,1224,1227),(1228,1229,1230),(1229,1228,1231),(1232,1233,1234),(1233,1232,1235),(1236,1237,1238),(1237,1236,1239),(1240,1241,1242),(1241,1240,1243),(1244,1245,1246),(1245,1244,1247),(1248,1249,1250),(1249,1248,1251),(1252,1253,1254),(1253,1252,1255),(1256,1257,1258),(1257,1256,1259),(1260,1261,1262),(1261,1260,1263),(1264,1265,1266),(1265,1264,1267),(1268,1269,1270),(1269,1268,1271),(1272,1273,1274),(1273,1272,1275),(1276,1277,1278),(1277,1276,1279),(1280,1281,1282),(1281,1280,1283),(1284,1285,1286),(1285,1284,1287),(1288,1289,1290),(1289,1288,1291),(1292,1293,1294),(1293,1292,1295),(1296,1297,1298),(1297,1296,1299),(1300,1301,1302),(1301,1300,1303),(1304,1305,1306),(1305,1304,1307),(1308,1309,1310),(1309,1308,1311),(1312,1313,1314),(1313,1312,1315),(1316,1317,1318),(1317,1316,1319),(1320,1321,1322),(1321,1320,1323),(1324,1325,1326),(1325,1324,1327),(1328,1329,1330),(1329,1328,1331),(1332,1333,1334),(1333,1332,1335),(1336,1337,1338),(1337,1336,1339),(1340,1341,1342),(1341,1340,1343),(1344,1345,1346),(1345,1344,1347),(1348,1349,1350),(1349,1348,1351),(1352,1353,1354),(1353,1352,1355),(1356,1357,1358),(1357,1356,1359),(1360,1361,1362),(1361,1360,1363),(1364,1365,1366),(1365,1364,1367),(1368,1369,1370),(1369,1368,1371),(1372,1373,1374),(1373,1372,1375),(1375,1372,1376),(1376,1372,1377),(1377,1372,1378),(1378,1372,1379),(1378,1379,1380),(1380,1379,1381),(1379,1372,1382),(1382,1372,1383),(1383,1372,1384),(1383,1384,1385),(1383,1385,1386),(1386,1385,1387),(1387,1385,1388),(1387,1388,1389),(1389,1388,1390),(1390,1388,1391),(1390,1391,1392),(1392,1391,1393),(1393,1391,1394),(1394,1391,1395),(1395,1391,1396),(1395,1396,1397),(1395,1397,1398),(1398,1397,1399),(1398,1399,1400),(1401,1402,1381),(1402,1401,1403),(1403,1401,1404),(1404,1401,1405),(1404,1405,1406),(1406,1405,1407),(1406,1407,1408),(1406,1408,1409),(1409,1408,1410),(1409,1410,1411),(1411,1410,1394),(1394,1410,1412),(1394,1412,1413),(1394,1413,1393),(1411,1414,1409),(1414,1411,1415),(1414,1415,1416),(1416,1415,1417),(1417,1415,1418),(1418,1415,1419),(1419,1415,1420),(1419,1420,1421),(1421,1420,1422),(1421,1422,1423),(1423,1422,1424),(1425,1426,1427),(1426,1425,1428),(1428,1425,1429),(1428,1429,1430),(1428,1430,1380),(1428,1380,1431),(1431,1380,1381),(1431,1381,1402),(1428,1431,1432),(1428,1432,1433),(1428,1433,1434),(1434,1433,1435),(1434,1435,1436),(1436,1435,1437),(1436,1437,1438),(1436,1438,1418),(1418,1438,1439),(1418,1439,1417),(1440,1441,1442),(1441,1440,1443),(1444,1445,1446),(1445,1444,1447),(1448,1449,1450),(1449,1448,1451),(1452,1453,1454),(1453,1452,1455),(1456,1457,1458),(1457,1456,1459),(1460,1461,1462),(1461,1460,1463),(1464,1465,1466),(1465,1464,1467),(1468,1469,1470),(1469,1468,1471),(1472,1473,1474),(1473,1472,1475),(1476,1477,1478),(1477,1476,1479),(1480,1481,1482),(1481,1480,1483),(1484,1485,1486),(1485,1484,1487),(1488,1489,1490),(1489,1488,1491),(1492,1493,1494),(1493,1492,1495),(1496,1497,1498),(1497,1496,1499),(1500,1501,1502),(1501,1500,1503),(1504,1505,1506),(1505,1504,1507),(1508,1509,1510),(1509,1508,1511),(1512,1513,1514),(1513,1512,1515),(1516,1517,1518),(1517,1516,1519),(1520,1521,1522),(1521,1520,1523),(1524,1525,1526),(1525,1524,1527),(1528,1529,1530),(1529,1528,1531),(1532,1533,1534),(1533,1532,1535),(1536,1537,1538),(1537,1536,1539),(1540,1541,1542),(1541,1540,1543),(1544,1545,1546),(1545,1544,1547),(1548,1549,1550),(1549,1548,1551),(1552,1553,1554),(1553,1552,1555),(1556,1557,1558),(1557,1556,1559),(1560,1561,1562),(1561,1560,1563),(1564,1565,1566),(1565,1564,1567),(1568,1569,1570),(1569,1568,1571),(1572,1573,1574),(1573,1572,1575),(1576,1577,1578),(1577,1576,1579),(1580,1581,1582),(1581,1580,1583),(1584,1585,1586),(1585,1584,1587),(1588,1589,1590),(1589,1588,1591),(1592,1593,1594),(1593,1592,1595),(1596,1597,1598),(1597,1596,1599),(1600,1601,1602),(1601,1600,1603),(1604,1605,1606),(1605,1604,1607),(1608,1609,1610),(1609,1608,1611),(1612,1613,1614),(1613,1612,1615),(1616,1617,1618),(1617,1616,1619),(1620,1621,1622),(1621,1620,1623),(1624,1625,1626),(1625,1624,1627),(1628,1629,1630),(1629,1628,1631),(1632,1633,1634),(1633,1632,1635),(1636,1637,1638),(1637,1636,1639),(1640,1641,1642),(1641,1640,1643),(1644,1645,1646),(1645,1644,1647),(1648,1649,1650),(1649,1648,1651),(1652,1653,1654),(1653,1652,1655),(1656,1657,1658),(1657,1656,1659),(1660,1661,1662),(1661,1660,1663),(1664,1665,1666),(1665,1664,1667),(1668,1669,1670),(1669,1668,1671),(1672,1673,1674),(1673,1672,1675),(1676,1677,1678),(1677,1676,1679),(1680,1681,1682),(1681,1680,1683),(1684,1685,1686),(1685,1684,1687),(1688,1689,1690),(1689,1688,1691),(1692,1693,1694),(1693,1692,1695),(1696,1697,1698),(1697,1696,1699),(1700,1701,1702),(1701,1700,1703),(1704,1705,1706),(1705,1704,1707),(1708,1709,1710),(1709,1708,1711),(1712,1713,1714),(1713,1712,1715),(1715,1712,1716),(1716,1712,1717),(1717,1712,1718),(1717,1718,1719),(1717,1719,1720),(1720,1719,1721),(1720,1721,1722),(1718,1712,1723),(1723,1712,1724),(1725,1726,1727),(1726,1725,1728),(1726,1728,1729),(1729,1728,1730),(1729,1730,1731),(1730,1728,1732),(1722,1733,1734),(1733,1722,1721),(1734,1733,1735),(1734,1735,1736),(1734,1736,1737),(1737,1736,1731),(1731,1736,1729),(1737,1738,1734),(1738,1737,1739),(1738,1739,1740),(1740,1739,1741),(1740,1741,1742),(1742,1741,1743),(1742,1743,1744),(1744,1743,1745),(1745,1743,1746),(1747,1748,1749),(1748,1747,1750),(1748,1750,1751),(1748,1751,1752),(1748,1752,1720),(1748,1720,1753),(1753,1720,1722),(1748,1753,1754),(1748,1754,1755),(1748,1755,1756),(1756,1755,1757),(1757,1755,1758),(1757,1758,1759),(1757,1759,1760),(1760,1759,1761),(1760,1761,1762),(1760,1762,1763),(1763,1762,1764),(1763,1764,1746),(1763,1746,1743),(1763,1743,1765),(1763,1765,1766),(1766,1765,1767),(1766,1767,1768),(1768,1767,1769),(1768,1769,1770),(1770,1769,1771),(1770,1771,1772),(1773,1774,1775),(1774,1773,1776),(1777,1778,1779),(1778,1777,1780),(1781,1782,1783),(1782,1781,1784),(1785,1786,1787),(1786,1785,1788),(1789,1790,1791),(1790,1789,1792),(1793,1794,1795),(1794,1793,1796),(1797,1798,1799),(1798,1797,1800),(1801,1802,1803),(1802,1801,1804),(1805,1806,1807),(1806,1805,1808),(1809,1810,1811),(1810,1809,1812),(1813,1814,1815),(1814,1813,1816),(1817,1818,1819),(1818,1817,1820),(1821,1822,1823),(1822,1821,1824),(1825,1826,1827),(1826,1825,1828),(1829,1830,1831),(1830,1829,1832),(1833,1834,1835),(1834,1833,1836),(1837,1838,1839),(1838,1837,1840),(1841,1842,1843),(1842,1841,1844),(1845,1846,1847),(1846,1845,1848),(1849,1850,1851),(1850,1849,1852),(1853,1854,1855),(1854,1853,1856),(1857,1858,1859),(1858,1857,1860),(1861,1862,1863),(1862,1861,1864),(1865,1866,1867),(1866,1865,1868),(1869,1870,1871),(1870,1869,1872),(1873,1874,1875),(1874,1873,1876),(1877,1878,1879),(1878,1877,1880),(1881,1882,1883),(1882,1881,1884),(1885,1886,1887),(1886,1885,1888),(1889,1890,1891),(1890,1889,1892),(1893,1894,1895),(1894,1893,1896),(1897,1898,1899),(1898,1897,1900),(1901,1902,1903),(1902,1901,1904),(1905,1906,1907),(1906,1905,1908),(1909,1910,1911),(1910,1909,1912),(1913,1914,1915),(1914,1913,1916),(1917,1918,1919),(1918,1917,1920),(1921,1922,1923),(1922,1921,1924),(1925,1926,1927),(1926,1925,1928),(1929,1930,1931),(1930,1929,1932),(1933,1934,1935),(1934,1933,1936),(1937,1938,1939),(1938,1937,1940),(1941,1942,1943),(1942,1941,1944),(1945,1946,1947),(1946,1945,1948),(1949,1950,1951),(1950,1949,1952),(1953,1954,1955),(1954,1953,1956),(1957,1958,1959),(1958,1957,1960),(1961,1962,1963),(1962,1961,1964),(1965,1966,1967),(1966,1965,1968),(1969,1970,1971),(1970,1969,1972),(1973,1974,1975),(1974,1973,1976),(1977,1978,1979),(1978,1977,1980),(1981,1982,1983),(1982,1981,1984),(1985,1986,1987),(1986,1985,1988),(1989,1990,1991),(1990,1989,1992),(1993,1994,1995),(1994,1993,1996),(1997,1998,1999),(1998,1997,2000),(2001,2002,2003),(2002,2001,2004),(2005,2006,2007),(2006,2005,2008),(2009,2010,2011),(2010,2009,2012),(2013,2014,2015),(2014,2013,2016),(2017,2018,2019),(2018,2017,2020),(2018,2020,2021),(2021,2020,2022),(2023,2024,2025),(2024,2023,2026),(2026,2023,2027),(2026,2027,2017),(2026,2017,2028),(2028,2017,2019),(2026,2028,2029),(2030,2031,2032),(2031,2030,2033),(2033,2030,2034),(2034,2030,2035),(2035,2030,2036),(2036,2030,2037),(2036,2037,2020),(2020,2037,2038),(2020,2038,2022),(2022,2038,2039),(2037,2030,2040),(2040,2030,2041),(2039,2042,2022),(2042,2039,2043),(2042,2043,2044),(2045,2046,2047),(2046,2045,2048),(2046,2048,2044),(2046,2044,2049),(2049,2044,2043),(2046,2049,2050),(2046,2050,2051),(2052,2053,2054),(2053,2052,2055),(2056,2057,2058),(2057,2056,2059),(2060,2061,2062),(2061,2060,2063),(2064,2065,2066),(2065,2064,2067),(2068,2069,2070),(2069,2068,2071),(2072,2073,2074),(2073,2072,2075),(2076,2077,2078),(2077,2076,2079),(2080,2081,2082),(2081,2080,2083),(2084,2085,2086),(2085,2084,2087),(2088,2089,2090),(2089,2088,2091),(2092,2093,2094),(2093,2092,2095),(2096,2097,2098),(2097,2096,2099),(2100,2101,2102),(2101,2100,2103),(2104,2105,2106),(2105,2104,2107),(2108,2109,2110),(2109,2108,2111),(2112,2113,2114),(2113,2112,2115),(2116,2117,2118),(2117,2116,2119),(2120,2121,2122),(2121,2120,2123),(2124,2125,2126),(2125,2124,2127),(2128,2129,2130),(2129,2128,2131),(2132,2133,2134),(2133,2132,2135),(2136,2137,2138),(2137,2136,2139),(2140,2141,2142),(2141,2140,2143),(2144,2145,2146),(2145,2144,2147),(2148,2149,2150),(2149,2148,2151),(2152,2153,2154),(2153,2152,2155),(2156,2157,2158),(2157,2156,2159),(2160,2161,2162),(2161,2160,2163),(2164,2165,2166),(2165,2164,2167),(2168,2169,2170),(2169,2168,2171),(2172,2173,2174),(2173,2172,2175),(2176,2177,2178),(2177,2176,2179),(2180,2181,2182),(2181,2180,2183),(2184,2185,2186),(2185,2184,2187),(2188,2189,2190),(2189,2188,2191),(2192,2193,2194),(2193,2192,2195),(2193,2195,2196),(2196,2195,2197),(2197,2195,2198),(2197,2198,2199),(2199,2198,2200),(2200,2198,2201),(2200,2201,2202),(2202,2201,2203),(2202,2203,2204),(2204,2203,2205),(2204,2205,2206),(2206,2205,2207),(2206,2207,2208),(2208,2207,2209),(2209,2207,2210),(2209,2210,2211),(2211,2210,2212),(2211,2212,2213),(2213,2212,2214),(2212,2215,2216),(2215,2212,2217),(2217,2212,2218),(2217,2218,2219),(2219,2218,2220),(2221,2222,2223),(2222,2221,2224),(2224,2221,2225),(2224,2225,2226),(2226,2225,2227),(2227,2225,2228),(2227,2228,2229),(2229,2228,2230),(2229,2230,2231),(2229,2231,2232),(2232,2231,2214),(2232,2214,2233),(2233,2214,2212),(2233,2212,2216),(2232,2233,2234),(2232,2234,2235),(2236,2237,2238),(2239,2240,2241),(2240,2239,2242),(2242,2239,2243),(2242,2243,2244),(2244,2243,2192),(2244,2192,2245),(2245,2192,2246),(2246,2192,2194),(2246,2194,2247),(2246,2247,2248),(2246,2248,2249),(2249,2248,2250),(2249,2250,2251),(2251,2250,2252),(2251,2252,2253),(2253,2252,2254),(2253,2254,2255),(2253,2255,2256),(2256,2255,2257),(2256,2257,2258),(2258,2257,2259),(2258,2259,2260),(2260,2259,2261),(2260,2261,2262),(2260,2262,2263),(2263,2262,2264),(2263,2264,2265),(2265,2264,2266),(2265,2266,2267),(2265,2267,2268),(2268,2267,2237),(2268,2237,2236),(2268,2236,2269),(2269,2236,2270),(2269,2270,2271),(2272,2273,2274),(2273,2272,2275),(2276,2277,2278),(2277,2276,2279),(2280,2281,2282),(2281,2280,2283),(2284,2285,2286),(2285,2284,2287),(2288,2289,2290),(2289,2288,2291),(2292,2293,2294),(2293,2292,2295),(2296,2297,2298),(2297,2296,2299),(2300,2301,2302),(2301,2300,2303),(2304,2305,2306),(2305,2304,2307),(2308,2309,2310),(2309,2308,2311),(2312,2313,2314),(2313,2312,2315),(2316,2317,2318),(2317,2316,2319),(2320,2321,2322),(2321,2320,2323),(2324,2325,2326),(2325,2324,2327),(2328,2329,2330),(2329,2328,2331),(2332,2333,2334),(2333,2332,2335),(2336,2337,2338),(2337,2336,2339),(2340,2341,2342),(2341,2340,2343),(2344,2345,2346),(2345,2344,2347),(2348,2349,2350),(2349,2348,2351),(2352,2353,2354),(2353,2352,2355),(2356,2357,2358),(2357,2356,2359),(2360,2361,2362),(2361,2360,2363),(2364,2365,2366),(2365,2364,2367),(2368,2369,2370),(2369,2368,2371),(2372,2373,2374),(2373,2372,2375),(2376,2377,2378),(2377,2376,2379),(2380,2381,2382),(2381,2380,2383),(2384,2385,2386),(2385,2384,2387),(2388,2389,2390),(2389,2388,2391),(2392,2393,2394),(2393,2392,2395),(2396,2397,2398),(2397,2396,2399),(2400,2401,2402),(2401,2400,2403),(2404,2405,2406),(2405,2404,2407),(2408,2409,2410),(2409,2408,2411),(2412,2413,2414),(2413,2412,2415),(2416,2417,2418),(2417,2416,2419),(2420,2421,2422),(2421,2420,2423),(2424,2425,2426),(2425,2424,2427),(2428,2429,2430),(2429,2428,2431),(2432,2433,2434),(2433,2432,2435),(2436,2437,2438),(2437,2436,2439),(2440,2441,2442),(2441,2440,2443),(2444,2445,2446),(2445,2444,2447),(2448,2449,2450),(2449,2448,2451),(2452,2453,2454),(2453,2452,2455),(2456,2457,2458),(2457,2456,2459),(2460,2461,2462),(2461,2460,2463),(2464,2465,2466),(2465,2464,2467),(2468,2469,2470),(2469,2468,2471),(2472,2473,2474),(2473,2472,2475),(2476,2477,2478),(2477,2476,2479),(2480,2481,2482),(2481,2480,2483),(2484,2485,2486),(2485,2484,2487),(2488,2489,2490),(2489,2488,2491),(2492,2493,2494),(2493,2492,2495),(2496,2497,2498),(2497,2496,2499),(2500,2501,2502),(2501,2500,2503),(2504,2505,2506),(2505,2504,2507),(2508,2509,2510),(2509,2508,2511),(2512,2513,2514),(2513,2512,2515),(2516,2517,2518),(2517,2516,2519),(2520,2521,2522),(2521,2520,2523),(2524,2525,2526),(2525,2524,2527),(2528,2529,2530),(2529,2528,2531),(2532,2533,2534),(2533,2532,2535),(2536,2537,2538),(2537,2536,2539),(2540,2541,2542),(2541,2540,2543),(2544,2545,2546),(2545,2544,2547),(2548,2549,2550),(2549,2548,2551),(2552,2553,2554),(2553,2552,2555),(2556,2557,2558),(2557,2556,2559),(2560,2561,2562),(2561,2560,2563),(2564,2565,2566),(2565,2564,2567),(2568,2569,2570),(2569,2568,2571),(2572,2573,2574),(2573,2572,2575),(2576,2577,2578),(2577,2576,2579),(2580,2581,2582),(2581,2580,2583),(2584,2585,2586),(2585,2584,2587),(2588,2589,2590),(2589,2588,2591),(2592,2593,2594),(2593,2592,2595),(2593,2595,2596),(2596,2595,2597),(2597,2595,2598),(2597,2598,2599),(2599,2598,2600),(2600,2598,2601),(2600,2601,2602),(2602,2601,2603),(2602,2603,2604),(2604,2603,2605),(2604,2605,2606),(2606,2605,2607),(2606,2607,2608),(2608,2607,2609),(2609,2607,2610),(2609,2610,2611),(2611,2610,2612),(2611,2612,2613),(2613,2612,2614),(2612,2615,2616),(2615,2612,2617),(2615,2617,2618),(2618,2617,2619),(2620,2621,2622),(2621,2620,2623),(2623,2620,2624),(2624,2620,2625),(2624,2625,2626),(2626,2625,2627),(2626,2627,2628),(2628,2627,2629),(2628,2629,2630),(2628,2630,2631),(2631,2630,2614),(2631,2614,2632),(2632,2614,2612),(2632,2612,2633),(2633,2612,2616),(2631,2632,2634),(2631,2634,2635),(2636,2637,2638),(2639,2640,2641),(2640,2639,2642),(2642,2639,2643),(2642,2643,2644),(2644,2643,2592),(2644,2592,2645),(2645,2592,2646),(2646,2592,2594),(2646,2594,2647),(2646,2647,2648),(2646,2648,2649),(2649,2648,2650),(2649,2650,2651),(2651,2650,2652),(2651,2652,2653),(2653,2652,2654),(2653,2654,2655),(2653,2655,2656),(2656,2655,2657),(2656,2657,2658),(2658,2657,2659),(2658,2659,2660),(2660,2659,2661),(2660,2661,2662),(2660,2662,2663),(2663,2662,2664),(2663,2664,2665),(2665,2664,2666),(2665,2666,2667),(2665,2667,2668),(2668,2667,2637),(2668,2637,2636),(2668,2636,2669),(2669,2636,2670),(2669,2670,2671),(2672,2673,2674),(2673,2672,2675),(2676,2677,2678),(2677,2676,2679),(2680,2681,2682),(2681,2680,2683),(2684,2685,2686),(2685,2684,2687),(2688,2689,2690),(2689,2688,2691),(2692,2693,2694),(2693,2692,2695),(2696,2697,2698),(2697,2696,2699),(2700,2701,2702),(2701,2700,2703),(2704,2705,2706),(2705,2704,2707),(2708,2709,2710),(2709,2708,2711),(2712,2713,2714),(2713,2712,2715),(2716,2717,2718),(2717,2716,2719),(2720,2721,2722),(2721,2720,2723),(2724,2725,2726),(2725,2724,2727),(2728,2729,2730),(2729,2728,2731),(2732,2733,2734),(2733,2732,2735),(2736,2737,2738),(2737,2736,2739),(2740,2741,2742),(2741,2740,2743),(2744,2745,2746),(2745,2744,2747),(2748,2749,2750),(2749,2748,2751),(2752,2753,2754),(2753,2752,2755),(2756,2757,2758),(2757,2756,2759),(2760,2761,2762),(2761,2760,2763),(2764,2765,2766),(2765,2764,2767),(2768,2769,2770),(2769,2768,2771),(2772,2773,2774),(2773,2772,2775),(2776,2777,2778),(2777,2776,2779),(2780,2781,2782),(2781,2780,2783),(2784,2785,2786),(2785,2784,2787),(2788,2789,2790),(2789,2788,2791),(2792,2793,2794),(2793,2792,2795),(2796,2797,2798),(2797,2796,2799),(2800,2801,2802),(2801,2800,2803),(2804,2805,2806),(2805,2804,2807),(2808,2809,2810),(2809,2808,2811),(2812,2813,2814),(2813,2812,2815),(2816,2817,2818),(2817,2816,2819),(2820,2821,2822),(2821,2820,2823),(2824,2825,2826),(2825,2824,2827),(2828,2829,2830),(2829,2828,2831),(2832,2833,2834),(2833,2832,2835),(2836,2837,2838),(2837,2836,2839),(2840,2841,2842),(2841,2840,2843),(2844,2845,2846),(2845,2844,2847),(2848,2849,2850),(2849,2848,2851),(2852,2853,2854),(2853,2852,2855),(2856,2857,2858),(2857,2856,2859),(2860,2861,2862),(2861,2860,2863),(2864,2865,2866),(2865,2864,2867),(2868,2869,2870),(2869,2868,2871),(2872,2873,2874),(2873,2872,2875),(2876,2877,2878),(2877,2876,2879),(2880,2881,2882),(2881,2880,2883),(2884,2885,2886),(2885,2884,2887),(2888,2889,2890),(2889,2888,2891),(2892,2893,2894),(2893,2892,2895),(2896,2897,2898),(2897,2896,2899),(2900,2901,2902),(2901,2900,2903),(2904,2905,2906),(2905,2904,2907),(2908,2909,2910),(2909,2908,2911),(2912,2913,2914),(2913,2912,2915),(2916,2917,2918),(2917,2916,2919),(2920,2921,2922),(2921,2920,2923),(2924,2925,2926),(2925,2924,2927),(2928,2929,2930),(2929,2928,2931),(2932,2933,2934),(2933,2932,2935),(2936,2937,2938),(2937,2936,2939),(2940,2941,2942),(2941,2940,2943),(2944,2945,2946),(2945,2944,2947),(2948,2949,2950),(2949,2948,2951),(2952,2953,2954),(2953,2952,2955),(2956,2957,2958),(2957,2956,2959),(2960,2961,2962),(2961,2960,2963),(2964,2965,2966),(2965,2964,2967),(2968,2969,2970),(2969,2968,2971),(2972,2973,2974),(2973,2972,2975),(2976,2977,2978),(2977,2976,2979),(2980,2981,2982),(2981,2980,2983),(2984,2985,2986),(2985,2984,2987),(2988,2989,2990),(2989,2988,2991),(2992,2993,2994),(2993,2992,2995),(2996,2997,2998),(2997,2996,2999),(3000,3001,3002),(3001,3000,3003),(3004,3005,3006),(3005,3004,3007),(3008,3009,3010),(3009,3008,3011),(3012,3013,3014),(3013,3012,3015),(3016,3017,3018),(3017,3016,3019),(3020,3021,3022),(3021,3020,3023),(3024,3025,3026),(3025,3024,3027),(3028,3029,3030),(3029,3028,3031),(3032,3033,3034),(3033,3032,3035),(3036,3037,3038),(3037,3036,3039),(3040,3041,3042),(3041,3040,3043),(3044,3045,3046),(3045,3044,3047),(3048,3049,3050),(3049,3048,3051),(3052,3053,3054),(3053,3052,3055),(3056,3057,3058),(3057,3056,3059),(3060,3061,3062),(3061,3060,3063),(3064,3065,3066),(3065,3064,3067),(3068,3069,3070),(3069,3068,3071),(3072,3073,3074),(3073,3072,3075),(3076,3077,3078),(3077,3076,3079),(3080,3081,3082),(3081,3080,3083),(3084,3085,3086),(3085,3084,3087),(3088,3089,3090),(3089,3088,3091),(3092,3093,3094),(3093,3092,3095),(3096,3097,3098),(3097,3096,3099),(3100,3101,3102),(3101,3100,3103),(3104,3105,3106),(3105,3104,3107),(3108,3109,3110),(3109,3108,3111),(3112,3113,3114),(3113,3112,3115),(3116,3117,3118),(3117,3116,3119),(3120,3121,3122),(3121,3120,3123),(3124,3125,3126),(3125,3124,3127),(3128,3129,3130),(3129,3128,3131),(3132,3133,3134),(3133,3132,3135),(3136,3137,3138),(3137,3136,3139),(3140,3141,3142),(3141,3140,3143),(3144,3145,3146),(3145,3144,3147),(3148,3149,3150),(3149,3148,3151),(3152,3153,3154),(3153,3152,3155),(3156,3157,3158),(3157,3156,3159),(3160,3161,3162),(3161,3160,3163),(3163,3160,3164),(3164,3160,3165),(3165,3160,3166),(3165,3166,3167),(3166,3160,3168),(3168,3160,3169),(3169,3160,3170),(3169,3170,3171),(3169,3171,3172),(3172,3171,3173),(3172,3173,3174),(3174,3173,3175),(3174,3175,3176),(3174,3176,3177),(3178,3179,3166),(3179,3178,3180),(3180,3178,3181),(3180,3181,3182),(3180,3182,3183),(3183,3182,3184),(3184,3182,3185),(3184,3185,3186),(3186,3185,3187),(3186,3187,3188),(3188,3187,3189),(3188,3189,3190),(3191,3192,3193),(3192,3191,3194),(3194,3191,3195),(3194,3195,3196),(3194,3196,3167),(3194,3167,3197),(3197,3167,3179),(3179,3167,3166),(3194,3197,3198),(3194,3198,3199),(3194,3199,3200),(3200,3199,3201),(3201,3199,3202),(3201,3202,3203),(3203,3202,3204),(3203,3204,3205),(3203,3205,3206),(3206,3205,3207),(3206,3207,3208),(3209,3210,3211),(3210,3209,3212),(3213,3214,3215),(3214,3213,3216),(3217,3218,3219),(3218,3217,3220),(3221,3222,3223),(3222,3221,3224),(3225,3226,3227),(3226,3225,3228),(3229,3230,3231),(3230,3229,3232),(3233,3234,3235),(3234,3233,3236),(3237,3238,3239),(3238,3237,3240),(3240,3237,3241),(3241,3237,3242),(3242,3237,3243),(3243,3237,3244),(3243,3244,3245),(3245,3244,3246),(3244,3237,3247),(3247,3237,3248),(3247,3248,3249),(3249,3248,3250),(3249,3250,3251),(3251,3250,3252),(3251,3252,3253),(3253,3252,3254),(3253,3254,3255),(3255,3254,3256),(3256,3254,3257),(3246,3258,3259),(3258,3246,3260),(3258,3260,3261),(3261,3260,3262),(3261,3262,3263),(3263,3262,3264),(3263,3264,3265),(3265,3264,3266),(3265,3266,3267),(3267,3266,3268),(3267,3268,3269),(3267,3269,3270),(3271,3272,3273),(3272,3271,3274),(3274,3271,3275),(3274,3275,3245),(3274,3245,3259),(3259,3245,3246),(3274,3259,3276),(3274,3276,3277),(3274,3277,3278),(3278,3277,3279),(3279,3277,3280),(3279,3280,3281),(3281,3280,3282),(3281,3282,3283),(3283,3282,3284),(3284,3282,3285),(3286,3287,3288),(3287,3286,3289),(3287,3289,3290),(3290,3289,3291),(3290,3291,3292),(3292,3291,3293),(3292,3293,3294),(3292,3294,3295),(3295,3294,3296),(3296,3294,3297),(3297,3294,3298),(3297,3298,3299),(3299,3298,3300),(3299,3300,3301),(3301,3300,3302),(3301,3302,3303),(3303,3302,3304),(3304,3302,3305),(3304,3305,3306),(3306,3305,3307),(3306,3307,3308),(3308,3307,3309),(3308,3309,3310),(3310,3309,3311),(3311,3309,3312),(3311,3312,3313),(3313,3312,3314),(3313,3314,3315),(3315,3314,3316),(3316,3314,3317),(3316,3317,3318),(3318,3317,3319),(3319,3317,3320),(3319,3320,3321),(3321,3320,3322),(3319,3323,3318),(3324,3325,3326),(3325,3324,3327),(3327,3324,3328),(3327,3328,3329),(3329,3328,3330),(3329,3330,3331),(3331,3330,3332),(3331,3332,3333),(3333,3332,3334),(3334,3332,3335),(3334,3335,3336),(3336,3335,3337),(3336,3337,3338),(3338,3337,3339),(3339,3337,3340),(3339,3340,3341),(3337,3335,3342),(3342,3335,3343),(3339,3344,3345),(3344,3339,3341),(3345,3344,3346),(3345,3346,3347),(3292,3348,3349),(3348,3292,3295),(3349,3348,3350),(3349,3350,3351),(3349,3351,3352),(3352,3351,3353),(3352,3353,3354),(3352,3354,3355),(3355,3354,3356),(3355,3356,3357),(3357,3356,3358),(3357,3358,3359),(3359,3358,3360),(3359,3360,3361),(3361,3360,3362),(3361,3362,3363),(3361,3363,3364),(3364,3363,3365),(3364,3365,3339),(3339,3365,3338),(3366,3367,3368),(3367,3366,3369),(3367,3369,3370),(3370,3369,3371),(3370,3371,3372),(3372,3371,3373),(3372,3373,3374),(3372,3374,3375),(3375,3374,3376),(3376,3374,3377),(3377,3374,3378),(3377,3378,3379),(3379,3378,3380),(3379,3380,3381),(3381,3380,3382),(3381,3382,3383),(3383,3382,3384),(3384,3382,3385),(3384,3385,3386),(3386,3385,3387),(3386,3387,3388),(3388,3387,3389),(3388,3389,3390),(3390,3389,3391),(3391,3389,3392),(3391,3392,3393),(3393,3392,3394),(3393,3394,3395),(3395,3394,3396),(3396,3394,3397),(3396,3397,3398),(3398,3397,3399),(3399,3397,3400),(3399,3400,3401),(3401,3400,3402),(3399,3403,3398),(3404,3405,3406),(3405,3404,3407),(3405,3407,3408),(3405,3408,3409),(3409,3408,3410),(3409,3410,3411),(3411,3410,3412),(3411,3412,3413),(3413,3412,3414),(3414,3412,3415),(3414,3415,3416),(3416,3415,3417),(3416,3417,3418),(3418,3417,3419),(3419,3417,3420),(3417,3415,3421),(3421,3415,3422),(3419,3423,3424),(3423,3419,3425),(3425,3419,3420),(3424,3423,3426),(3424,3426,3427),(3372,3428,3429),(3428,3372,3375),(3429,3428,3430),(3429,3430,3431),(3429,3431,3432),(3432,3431,3433),(3432,3433,3434),(3432,3434,3435),(3435,3434,3436),(3435,3436,3437),(3437,3436,3438),(3437,3438,3439),(3439,3438,3440),(3439,3440,3441),(3441,3440,3442),(3441,3442,3443),(3441,3443,3444),(3444,3443,3445),(3444,3445,3419),(3419,3445,3418),(3446,3447,3448),(3447,3446,3449),(3449,3446,3450),(3450,3446,3451),(3451,3446,3452),(3451,3452,3453),(3452,3446,3454),(3451,3455,3456),(3455,3451,3453),(3456,3455,3457),(3456,3457,3458),(3456,3458,3459),(3460,3461,3462),(3461,3460,3463),(3463,3460,3464),(3464,3460,3465),(3464,3465,3466),(3465,3460,3467),(3467,3460,3468),(3469,3470,3458),(3470,3469,3466),(3466,3469,3464),(3471,3472,3473),(3472,3471,3474),(3472,3474,3475),(3472,3475,3476),(3472,3476,3459),(3472,3459,3477),(3477,3459,3478),(3478,3459,3458),(3478,3458,3470),(3472,3477,3479),(3472,3479,3480),(3481,3482,3483),(3482,3481,3484),(3484,3481,3485),(3485,3481,3486),(3486,3481,3487),(3487,3481,3488),(3487,3488,3489),(3489,3488,3490),(3488,3481,3491),(3491,3481,3492),(3492,3481,3493),(3492,3493,3494),(3492,3494,3495),(3495,3494,3496),(3496,3494,3497),(3496,3497,3498),(3498,3497,3499),(3499,3497,3500),(3499,3500,3501),(3501,3500,3502),(3502,3500,3503),(3503,3500,3504),(3504,3500,3505),(3504,3505,3506),(3506,3505,3507),(3506,3507,3508),(3508,3507,3509),(3508,3509,3510),(3510,3509,3511),(3512,3513,3514),(3513,3512,3515),(3515,3512,3516),(3515,3516,3517),(3517,3516,3518),(3517,3518,3503),(3503,3518,3519),(3503,3519,3520),(3503,3520,3502),(3490,3521,3522),(3521,3490,3488),(3522,3521,3514),(3522,3514,3523),(3523,3514,3513),(3523,3513,3524),(3523,3524,3525),(3526,3527,3528),(3527,3526,3529),(3527,3529,3525),(3527,3525,3530),(3530,3525,3524),(3527,3530,3531),(3532,3533,3534),(3533,3532,3535),(3535,3532,3536),(3535,3536,3537),(3535,3537,3538),(3538,3537,3539),(3539,3537,3487),(3539,3487,3489),(3535,3538,3540),(3535,3540,3541),(3542,3543,3544),(3543,3542,3545),(3543,3545,3546),(3546,3545,3547),(3547,3545,3548),(3548,3545,3549),(3548,3549,3550),(3549,3545,3551),(3551,3545,3552),(3552,3545,3553),(3552,3553,3554),(3554,3553,3555),(3554,3555,3556),(3556,3555,3557),(3557,3555,3558),(3557,3558,3559),(3559,3558,3560),(3561,3562,3563),(3562,3561,3564),(3564,3561,3565),(3564,3565,3560),(3564,3560,3558),(3564,3558,3566),(3564,3566,3567),(3567,3566,3568),(3567,3568,3569),(3569,3568,3570),(3569,3570,3571),(3550,3572,3573),(3572,3550,3574),(3572,3574,3575),(3575,3574,3576),(3575,3576,3577),(3577,3576,3578),(3577,3578,3579),(3579,3578,3580),(3580,3578,3563),(3580,3563,3581),(3581,3563,3562),(3581,3562,3582),(3581,3582,3583),(3583,3582,3584),(3584,3582,3585),(3586,3587,3588),(3587,3586,3589),(3587,3589,3590),(3587,3590,3591),(3587,3591,3592),(3587,3592,3573),(3573,3592,3548),(3573,3548,3550),(3587,3573,3593),(3587,3593,3594),(3587,3594,3595),(3595,3594,3596),(3596,3594,3597),(3596,3597,3598),(3596,3598,3599),(3599,3598,3600),(3599,3600,3601),(3599,3601,3602),(3602,3601,3603),(3602,3603,3585),(3602,3585,3582),(3602,3582,3604),(3602,3604,3605),(3605,3604,3606),(3606,3604,3607),(3606,3607,3608),(3608,3607,3609),(3610,3611,3612),(3611,3610,3613),(3613,3610,3614),(3614,3610,3615),(3615,3610,3616),(3616,3610,3617),(3617,3610,3618),(3618,3610,3619),(3618,3619,3620),(3620,3619,3621),(3621,3619,3622),(3621,3622,3623),(3621,3623,3624),(3624,3623,3625),(3624,3625,3626),(3626,3625,3627),(3626,3627,3628),(3629,3630,3617),(3630,3629,3631),(3631,3629,3632),(3631,3632,3633),(3633,3632,3634),(3633,3634,3635),(3633,3635,3636),(3636,3635,3637),(3636,3637,3638),(3638,3637,3639),(3638,3639,3640),(3640,3639,3641),(3642,3643,3644),(3643,3642,3645),(3643,3645,3646),(3643,3646,3647),(3643,3647,3648),(3648,3647,3616),(3648,3616,3617),(3648,3617,3630),(3643,3648,3649),(3643,3649,3650),(3643,3650,3651),(3651,3650,3652),(3652,3650,3653),(3652,3653,3654),(3654,3653,3655),(3654,3655,3656),(3656,3655,3657),(3657,3655,3658),(3659,3660,3661),(3660,3659,3662),(3662,3659,3663),(3663,3659,3664),(3664,3659,3665),(3664,3665,3666),(3665,3659,3667),(3667,3659,3668),(3668,3659,3669),(3668,3669,3670),(3670,3669,3671),(3670,3671,3672),(3672,3671,3673),(3672,3673,3674),(3674,3673,3675),(3674,3675,3676),(3676,3675,3677),(3676,3677,3678),(3678,3677,3679),(3679,3677,3680),(3679,3680,3681),(3681,3680,3682),(3682,3680,3683),(3683,3680,3684),(3683,3684,3685),(3685,3684,3686),(3685,3686,3687),(3687,3686,3688),(3688,3686,3689),(3690,3691,3692),(3691,3690,3693),(3691,3693,3694),(3691,3694,3695),(3691,3695,3666),(3666,3695,3664),(3691,3666,3696),(3691,3696,3697),(3691,3697,3698),(3698,3697,3699),(3698,3699,3700),(3700,3699,3701),(3700,3701,3702),(3702,3701,3703),(3702,3703,3704),(3702,3704,3705),(3705,3704,3706),(3705,3706,3707),(3707,3706,3708),(3707,3708,3709),(3707,3709,3682),(3682,3709,3681),(3710,3711,3712),(3711,3710,3713),(3713,3710,3714),(3714,3710,3715),(3715,3710,3716),(3716,3710,3717),(3716,3717,3718),(3716,3718,3719),(3719,3718,3720),(3717,3710,3721),(3721,3710,3722),(3723,3724,3725),(3724,3723,3726),(3726,3723,3727),(3726,3727,3728),(3726,3728,3719),(3726,3719,3729),(3729,3719,3720),(3726,3729,3730),(3726,3730,3731),(3726,3731,3732),(3732,3731,3733),(3733,3731,3734),(3734,3731,3735),(3734,3735,3736),(3736,3735,3737),(3736,3737,3738),(3738,3737,3739),(3740,3741,3742),(3741,3740,3743),(3741,3743,3744),(3744,3743,3745),(3744,3745,3746),(3746,3745,3747),(3746,3747,3748),(3746,3748,3749),(3749,3748,3750),(3750,3748,3751),(3750,3751,3752),(3752,3751,3753),(3753,3751,3754),(3753,3754,3755),(3755,3754,3756),(3756,3754,3757),(3756,3757,3758),(3758,3757,3759),(3758,3759,3760),(3760,3759,3761),(3760,3761,3762),(3762,3761,3763),(3762,3763,3764),(3764,3763,3765),(3765,3763,3766),(3765,3766,3767),(3767,3766,3768),(3767,3768,3769),(3769,3768,3770),(3769,3770,3771),(3771,3770,3772),(3772,3770,3773),(3772,3773,3774),(3774,3773,3775),(3775,3773,3776),(3776,3773,3777),(3777,3773,3778),(3777,3778,3779),(3779,3778,3780),(3780,3778,3781),(3780,3781,3782),(3782,3781,3783),(3746,3784,3785),(3784,3746,3749),(3785,3784,3786),(3785,3786,3787),(3785,3787,3788),(3788,3787,3789),(3788,3789,3790),(3788,3790,3791),(3791,3790,3792),(3791,3792,3793),(3793,3792,3794),(3793,3794,3795),(3795,3794,3796),(3795,3796,3797),(3795,3797,3798),(3798,3797,3799),(3799,3797,3800),(3799,3800,3801),(3801,3800,3802),(3801,3802,3803),(3803,3802,3804),(3803,3804,3805),(3805,3804,3806),(3805,3806,3807),(3807,3806,3808),(3807,3808,3776),(3776,3808,3809),(3776,3809,3775),(3810,3811,3812),(3811,3810,3813),(3813,3810,3814),(3814,3810,3815),(3815,3810,3816),(3816,3810,3817),(3816,3817,3818),(3817,3810,3819),(3819,3810,3820),(3820,3810,3821),(3820,3821,3822),(3820,3822,3823),(3823,3822,3824),(3824,3822,3825),(3824,3825,3826),(3824,3826,3827),(3827,3826,3828),(3828,3826,3829),(3830,3831,3832),(3831,3830,3833),(3833,3830,3834),(3833,3834,3835),(3835,3834,3836),(3835,3836,3837),(3837,3836,3838),(3837,3838,3839),(3839,3838,3840),(3839,3840,3841),(3841,3840,3842),(3843,3844,3845),(3844,3843,3846),(3844,3846,3847),(3844,3847,3818),(3844,3818,3848),(3848,3818,3832),(3832,3818,3817),(3848,3832,3831),(3844,3848,3849),(3844,3849,3850),(3844,3850,3851),(3851,3850,3852),(3852,3850,3853),(3852,3853,3854),(3854,3853,3855),(3854,3855,3856),(3856,3855,3857),(3857,3855,3858),(3859,3860,3861),(3860,3859,3862),(3862,3859,3863),(3863,3859,3864),(3864,3859,3865),(3864,3865,3866),(3865,3859,3867),(3864,3868,3869),(3868,3864,3866),(3869,3868,3870),(3869,3870,3871),(3872,3873,3874),(3873,3872,3875),(3873,3875,3876),(3876,3875,3877),(3876,3877,3878),(3877,3875,3879),(3879,3875,3880),(3881,3882,3871),(3882,3881,3878),(3878,3881,3876),(3883,3884,3885),(3884,3883,3886),(3886,3883,3887),(3886,3887,3888),(3886,3888,3889),(3886,3889,3890),(3890,3889,3869),(3890,3869,3891),(3891,3869,3871),(3891,3871,3882),(3886,3890,3892),(3886,3892,3893),(3894,3895,3896),(3895,3894,3897),(3897,3894,3898),(3898,3894,3899),(3899,3894,3900),(3899,3900,3901),(3901,3900,3902),(3902,3900,3903),(3900,3894,3904),(3904,3894,3905),(3905,3894,3906),(3905,3906,3907),(3905,3907,3908),(3908,3907,3909),(3908,3909,3910),(3910,3909,3911),(3910,3911,3912),(3910,3912,3913),(3903,3914,3902),(3914,3903,3915),(3914,3915,3916),(3916,3915,3917),(3916,3917,3918),(3918,3917,3919),(3918,3919,3920),(3920,3919,3921),(3920,3921,3922),(3922,3921,3923),(3922,3923,3924),(3925,3926,3927),(3926,3925,3928),(3928,3925,3929),(3928,3929,3930),(3928,3930,3901),(3928,3901,3931),(3931,3901,3902),(3928,3931,3932),(3928,3932,3933),(3933,3932,3934),(3933,3934,3935),(3935,3934,3936),(3935,3936,3937),(3935,3937,3938),(3938,3937,3939),(3938,3939,3940),(3940,3939,3941),(3941,3939,3942)),$); +#617=IFCCARTESIANPOINTLIST3D(((-649.364,207.683,50.),(-644.419,188.936,50.),(-626.045,272.817,50.),(-644.419,124.493,50.),(-619.101,259.655,50.),(-623.715,283.277,50.),(-627.494,290.034,50.),(-603.16,294.595,50.),(-627.494,294.595,50.),(-624.66,287.838,50.),(-610.236,281.334,50.),(-606.847,286.592,50.),(-603.16,290.034,50.),(-638.964,105.405,50.),(-662.065,109.966,50.),(-662.065,105.405,50.),(-659.359,111.972,50.),(-657.718,114.611,50.),(-656.887,118.56,50.),(-656.61,124.493,50.),(-643.354,114.611,50.),(-656.61,188.936,50.),(-641.723,111.972,50.),(-638.964,109.966,50.),(-686.02,264.886,50.),(-676.266,278.593,50.),(-676.841,283.615,50.),(-674.542,272.986,50.),(-696.739,287.373,50.),(-700.,294.595,50.),(-700.,290.034,50.),(-673.093,294.595,50.),(-693.948,283.446,50.),(-675.904,287.838,50.),(-673.093,290.034,50.),(-644.419,188.936,30.),(-644.419,124.493,50.),(-644.419,124.493,30.),(-644.419,188.936,50.),(-644.419,124.493,30.),(-643.354,114.611,50.),(-643.354,114.611,30.),(-644.419,124.493,50.),(-643.354,114.611,30.),(-641.723,111.972,50.),(-641.723,111.972,30.),(-643.354,114.611,50.),(-641.723,111.972,50.),(-638.964,109.966,30.),(-641.723,111.972,30.),(-638.964,109.966,50.),(-638.964,109.966,30.),(-638.964,105.405,50.),(-638.964,105.405,30.),(-638.964,109.966,50.),(-638.964,105.405,50.),(-662.065,105.405,30.),(-638.964,105.405,30.),(-662.065,105.405,50.),(-662.065,105.405,50.),(-662.065,109.966,30.),(-662.065,105.405,30.),(-662.065,109.966,50.),(-662.065,109.966,50.),(-659.359,111.972,30.),(-662.065,109.966,30.),(-659.359,111.972,50.),(-659.359,111.972,50.),(-657.718,114.611,30.),(-659.359,111.972,30.),(-657.718,114.611,50.),(-657.718,114.611,50.),(-656.887,118.56,30.),(-657.718,114.611,30.),(-656.887,118.56,50.),(-656.887,118.56,50.),(-656.61,124.493,30.),(-656.887,118.56,30.),(-656.61,124.493,50.),(-656.61,124.493,50.),(-656.61,188.936,30.),(-656.61,124.493,30.),(-656.61,188.936,50.),(-656.61,188.936,50.),(-686.02,264.886,30.),(-656.61,188.936,30.),(-686.02,264.886,50.),(-686.02,264.886,50.),(-693.948,283.446,30.),(-686.02,264.886,30.),(-693.948,283.446,50.),(-693.948,283.446,50.),(-696.739,287.373,30.),(-693.948,283.446,30.),(-696.739,287.373,50.),(-696.739,287.373,30.),(-700.,290.034,50.),(-700.,290.034,30.),(-696.739,287.373,50.),(-700.,290.034,50.),(-700.,294.595,30.),(-700.,290.034,30.),(-700.,294.595,50.),(-700.,294.595,30.),(-673.093,294.595,50.),(-673.093,294.595,30.),(-700.,294.595,50.),(-673.093,294.595,30.),(-673.093,290.034,50.),(-673.093,290.034,30.),(-673.093,294.595,50.),(-673.093,290.034,50.),(-675.904,287.838,30.),(-673.093,290.034,30.),(-675.904,287.838,50.),(-675.904,287.838,30.),(-676.841,283.615,50.),(-676.841,283.615,30.),(-675.904,287.838,50.),(-676.841,283.615,30.),(-676.266,278.593,50.),(-676.266,278.593,30.),(-676.841,283.615,50.),(-676.266,278.593,30.),(-674.542,272.986,50.),(-674.542,272.986,30.),(-676.266,278.593,50.),(-674.542,272.986,30.),(-649.364,207.683,50.),(-649.364,207.683,30.),(-674.542,272.986,50.),(-649.364,207.683,50.),(-626.045,272.817,30.),(-649.364,207.683,30.),(-626.045,272.817,50.),(-626.045,272.817,50.),(-623.715,283.277,30.),(-626.045,272.817,30.),(-623.715,283.277,50.),(-623.715,283.277,50.),(-624.66,287.838,30.),(-623.715,283.277,30.),(-624.66,287.838,50.),(-624.66,287.838,50.),(-627.494,290.034,30.),(-624.66,287.838,30.),(-627.494,290.034,50.),(-627.494,290.034,50.),(-627.494,294.595,30.),(-627.494,290.034,30.),(-627.494,294.595,50.),(-627.494,294.595,50.),(-603.16,294.595,30.),(-627.494,294.595,30.),(-603.16,294.595,50.),(-603.16,294.595,30.),(-603.16,290.034,50.),(-603.16,290.034,30.),(-603.16,294.595,50.),(-603.16,290.034,50.),(-606.847,286.592,30.),(-603.16,290.034,30.),(-606.847,286.592,50.),(-606.847,286.592,30.),(-610.236,281.334,50.),(-610.236,281.334,30.),(-606.847,286.592,50.),(-610.236,281.334,30.),(-619.101,259.655,50.),(-619.101,259.655,30.),(-610.236,281.334,50.),(-619.101,259.655,30.),(-644.419,188.936,50.),(-644.419,188.936,30.),(-619.101,259.655,50.),(-576.137,193.919,30.),(-576.137,123.818,50.),(-576.137,123.818,30.),(-576.137,193.919,50.),(-576.137,123.818,50.),(-517.147,123.818,30.),(-576.137,123.818,30.),(-517.147,123.818,50.),(-517.147,123.818,30.),(-512.075,125.979,50.),(-512.075,125.979,30.),(-517.147,123.818,50.),(-512.075,125.979,50.),(-510.764,129.222,30.),(-512.075,125.979,30.),(-510.764,129.222,50.),(-510.764,129.222,50.),(-509.816,134.628,30.),(-510.764,129.222,30.),(-509.816,134.628,50.),(-509.816,134.628,50.),(-507.429,134.628,30.),(-509.816,134.628,30.),(-507.429,134.628,50.),(-507.429,134.628,30.),(-507.429,94.595,50.),(-507.429,94.595,30.),(-507.429,134.628,50.),(-507.429,94.595,50.),(-509.816,94.595,30.),(-507.429,94.595,30.),(-509.816,94.595,50.),(-509.816,94.595,50.),(-510.753,99.958,30.),(-509.816,94.595,30.),(-510.753,99.958,50.),(-510.753,99.958,50.),(-512.032,103.209,30.),(-510.753,99.958,30.),(-512.032,103.209,50.),(-512.032,103.209,30.),(-514.014,104.856,50.),(-514.014,104.856,30.),(-512.032,103.209,50.),(-514.014,104.856,50.),(-517.061,105.405,30.),(-514.014,104.856,30.),(-517.061,105.405,50.),(-517.061,105.405,30.),(-593.783,105.405,50.),(-593.783,105.405,30.),(-517.061,105.405,50.),(-593.783,105.405,50.),(-593.783,109.966,30.),(-593.783,105.405,30.),(-593.783,109.966,50.),(-593.783,109.966,30.),(-591.023,111.972,50.),(-591.023,111.972,30.),(-593.783,109.966,50.),(-591.023,111.972,50.),(-589.393,114.611,30.),(-591.023,111.972,30.),(-589.393,114.611,50.),(-589.393,114.611,50.),(-588.327,124.493,30.),(-589.393,114.611,30.),(-588.327,124.493,50.),(-588.327,124.493,50.),(-588.327,275.507,30.),(-588.327,124.493,30.),(-588.327,275.507,50.),(-588.327,275.507,50.),(-588.604,281.546,30.),(-588.327,275.507,30.),(-588.604,281.546,50.),(-588.604,281.546,50.),(-589.436,285.473,30.),(-588.604,281.546,30.),(-589.436,285.473,50.),(-589.436,285.473,50.),(-591.077,288.049,30.),(-589.436,285.473,30.),(-591.077,288.049,50.),(-591.077,288.049,50.),(-593.783,290.034,30.),(-591.077,288.049,30.),(-593.783,290.034,50.),(-593.783,290.034,50.),(-593.783,294.595,30.),(-593.783,290.034,30.),(-593.783,294.595,50.),(-593.783,294.595,50.),(-517.658,294.595,30.),(-593.783,294.595,30.),(-517.658,294.595,50.),(-517.658,294.595,30.),(-514.611,295.144,50.),(-514.611,295.144,30.),(-517.658,294.595,50.),(-514.611,295.144,50.),(-512.629,296.791,30.),(-514.611,295.144,30.),(-512.629,296.791,50.),(-512.629,296.791,50.),(-511.329,300.042,30.),(-512.629,296.791,30.),(-511.329,300.042,50.),(-511.329,300.042,50.),(-510.327,305.405,30.),(-511.329,300.042,30.),(-510.327,305.405,50.),(-510.327,305.405,50.),(-508.025,305.405,30.),(-510.327,305.405,30.),(-508.025,305.405,50.),(-508.025,305.405,30.),(-508.025,265.372,50.),(-508.025,265.372,30.),(-508.025,305.405,50.),(-508.025,265.372,50.),(-510.327,265.372,30.),(-508.025,265.372,30.),(-510.327,265.372,50.),(-510.327,265.372,50.),(-511.329,270.778,30.),(-510.327,265.372,30.),(-511.329,270.778,50.),(-511.329,270.778,50.),(-512.629,274.021,30.),(-511.329,270.778,30.),(-512.629,274.021,50.),(-512.629,274.021,50.),(-514.611,275.642,30.),(-512.629,274.021,30.),(-514.611,275.642,50.),(-514.611,275.642,30.),(-517.658,276.182,50.),(-517.658,276.182,30.),(-514.611,275.642,50.),(-517.658,276.182,50.),(-576.137,276.182,30.),(-517.658,276.182,30.),(-576.137,276.182,50.),(-576.137,276.182,30.),(-576.137,212.331,50.),(-576.137,212.331,30.),(-576.137,276.182,50.),(-576.137,212.331,50.),(-538.884,212.331,30.),(-576.137,212.331,30.),(-538.884,212.331,50.),(-538.884,212.331,50.),(-535.837,212.88,30.),(-538.884,212.331,30.),(-535.837,212.88,50.),(-535.837,212.88,30.),(-533.855,214.527,50.),(-533.855,214.527,30.),(-535.837,212.88,50.),(-533.855,214.527,50.),(-532.555,217.779,30.),(-533.855,214.527,30.),(-532.555,217.779,50.),(-532.555,217.779,50.),(-531.553,223.142,30.),(-532.555,217.779,30.),(-531.553,223.142,50.),(-531.553,223.142,50.),(-529.252,223.142,30.),(-531.553,223.142,30.),(-529.252,223.142,50.),(-529.252,223.142,30.),(-529.252,183.108,50.),(-529.252,183.108,30.),(-529.252,223.142,50.),(-529.252,183.108,30.),(-531.553,183.108,50.),(-531.553,183.108,30.),(-529.252,183.108,50.),(-531.553,183.108,50.),(-532.566,188.514,30.),(-531.553,183.108,30.),(-532.566,188.514,50.),(-532.566,188.514,50.),(-533.898,191.757,30.),(-532.566,188.514,30.),(-533.898,191.757,50.),(-533.898,191.757,30.),(-538.884,193.919,50.),(-538.884,193.919,30.),(-533.898,191.757,50.),(-538.884,193.919,30.),(-576.137,193.919,50.),(-576.137,193.919,30.),(-538.884,193.919,50.),(-439.002,142.736,50.),(-434.873,184.734,50.),(-435.566,200.,50.),(-431.73,127.703,50.),(-432.795,170.693,50.),(-429.332,157.876,50.),(-423.322,116.174,50.),(-424.484,146.284,50.),(-417.616,135.198,50.),(-413.7,107.939,50.),(-409.715,127.28,50.),(-402.863,102.998,50.),(-400.78,122.53,50.),(-390.812,101.351,50.),(-390.812,120.946,50.),(-380.843,122.53,50.),(-382.619,102.053,50.),(-375.004,104.16,50.),(-371.908,127.28,50.),(-367.967,107.67,50.),(-364.007,135.198,50.),(-361.508,112.584,50.),(-357.139,146.284,50.),(-355.628,118.903,50.),(-352.291,157.813,50.),(-350.325,126.626,50.),(-348.828,170.439,50.),(-345.6,135.753,50.),(-346.75,184.164,50.),(-346.057,198.986,50.),(-447.314,178.885,50.),(-447.847,214.569,50.),(-448.353,200.,50.),(-446.328,228.378,50.),(-444.197,159.797,50.),(-443.798,241.427,50.),(-440.255,253.716,50.),(-435.518,265.446,50.),(-434.873,215.266,50.),(-429.918,275.465,50.),(-432.795,229.307,50.),(-429.332,242.124,50.),(-423.456,283.773,50.),(-424.484,253.716,50.),(-417.627,264.802,50.),(-416.13,290.372,50.),(-409.758,272.72,50.),(-404.515,296.41,50.),(-400.876,277.47,50.),(-390.982,298.649,50.),(-390.982,279.054,50.),(-380.971,277.344,50.),(-378.856,297.002,50.),(-371.994,272.551,50.),(-367.966,292.061,50.),(-364.05,264.675,50.),(-358.312,283.826,50.),(-357.139,253.716,50.),(-349.893,272.297,50.),(-352.291,242.251,50.),(-348.828,229.307,50.),(-342.621,257.242,50.),(-346.75,214.886,50.),(-341.454,146.284,50.),(-337.426,239.949,50.),(-337.874,158.488,50.),(-335.316,171.284,50.),(-334.309,220.418,50.),(-333.782,184.671,50.),(-333.27,198.649,50.),(-390.982,298.649,50.),(-378.856,297.002,30.),(-390.982,298.649,30.),(-378.856,297.002,50.),(-378.856,297.002,50.),(-367.966,292.061,30.),(-378.856,297.002,30.),(-367.966,292.061,50.),(-367.966,292.061,50.),(-358.312,283.826,30.),(-367.966,292.061,30.),(-358.312,283.826,50.),(-358.312,283.826,30.),(-349.893,272.297,50.),(-349.893,272.297,30.),(-358.312,283.826,50.),(-349.893,272.297,30.),(-342.621,257.242,50.),(-342.621,257.242,30.),(-349.893,272.297,50.),(-342.621,257.242,30.),(-337.426,239.949,50.),(-337.426,239.949,30.),(-342.621,257.242,50.),(-337.426,239.949,30.),(-334.309,220.418,50.),(-334.309,220.418,30.),(-337.426,239.949,50.),(-334.309,220.418,30.),(-333.27,198.649,50.),(-333.27,198.649,30.),(-334.309,220.418,50.),(-333.27,198.649,30.),(-333.782,184.671,50.),(-333.782,184.671,30.),(-333.27,198.649,50.),(-333.782,184.671,30.),(-335.316,171.284,50.),(-335.316,171.284,30.),(-333.782,184.671,50.),(-335.316,171.284,30.),(-337.874,158.488,50.),(-337.874,158.488,30.),(-335.316,171.284,50.),(-337.874,158.488,30.),(-341.454,146.284,50.),(-341.454,146.284,30.),(-337.874,158.488,50.),(-341.454,146.284,30.),(-345.6,135.753,50.),(-345.6,135.753,30.),(-341.454,146.284,50.),(-345.6,135.753,30.),(-350.325,126.626,50.),(-350.325,126.626,30.),(-345.6,135.753,50.),(-350.325,126.626,30.),(-355.628,118.903,50.),(-355.628,118.903,30.),(-350.325,126.626,50.),(-355.628,118.903,30.),(-361.508,112.584,50.),(-361.508,112.584,30.),(-355.628,118.903,50.),(-361.508,112.584,50.),(-367.967,107.67,30.),(-361.508,112.584,30.),(-367.967,107.67,50.),(-367.967,107.67,50.),(-375.004,104.16,30.),(-367.967,107.67,30.),(-375.004,104.16,50.),(-375.004,104.16,50.),(-382.619,102.053,30.),(-375.004,104.16,30.),(-382.619,102.053,50.),(-382.619,102.053,50.),(-390.812,101.351,30.),(-382.619,102.053,30.),(-390.812,101.351,50.),(-390.812,101.351,50.),(-402.863,102.998,30.),(-390.812,101.351,30.),(-402.863,102.998,50.),(-402.863,102.998,30.),(-413.7,107.939,50.),(-413.7,107.939,30.),(-402.863,102.998,50.),(-413.7,107.939,30.),(-423.322,116.174,50.),(-423.322,116.174,30.),(-413.7,107.939,50.),(-423.322,116.174,50.),(-431.73,127.703,30.),(-423.322,116.174,30.),(-431.73,127.703,50.),(-431.73,127.703,50.),(-439.002,142.736,30.),(-431.73,127.703,30.),(-439.002,142.736,50.),(-439.002,142.736,50.),(-444.197,159.797,30.),(-439.002,142.736,30.),(-444.197,159.797,50.),(-444.197,159.797,50.),(-447.314,178.885,30.),(-444.197,159.797,30.),(-447.314,178.885,50.),(-447.314,178.885,50.),(-448.353,200.,30.),(-447.314,178.885,30.),(-448.353,200.,50.),(-448.353,200.,50.),(-447.847,214.569,30.),(-448.353,200.,30.),(-447.847,214.569,50.),(-447.847,214.569,50.),(-446.328,228.378,30.),(-447.847,214.569,30.),(-446.328,228.378,50.),(-446.328,228.378,50.),(-443.798,241.427,30.),(-446.328,228.378,30.),(-443.798,241.427,50.),(-443.798,241.427,50.),(-440.255,253.716,30.),(-443.798,241.427,30.),(-440.255,253.716,50.),(-440.255,253.716,50.),(-435.518,265.446,30.),(-440.255,253.716,30.),(-435.518,265.446,50.),(-435.518,265.446,50.),(-429.918,275.465,30.),(-435.518,265.446,30.),(-429.918,275.465,50.),(-429.918,275.465,50.),(-423.456,283.773,30.),(-429.918,275.465,30.),(-423.456,283.773,50.),(-423.456,283.773,30.),(-416.13,290.372,50.),(-416.13,290.372,30.),(-423.456,283.773,50.),(-416.13,290.372,30.),(-404.515,296.41,50.),(-404.515,296.41,30.),(-416.13,290.372,50.),(-404.515,296.41,30.),(-390.982,298.649,50.),(-390.982,298.649,30.),(-404.515,296.41,50.),(-390.982,279.054,50.),(-400.876,277.47,30.),(-390.982,279.054,30.),(-400.876,277.47,50.),(-400.876,277.47,50.),(-409.758,272.72,30.),(-400.876,277.47,30.),(-409.758,272.72,50.),(-409.758,272.72,30.),(-417.627,264.802,50.),(-417.627,264.802,30.),(-409.758,272.72,50.),(-417.627,264.802,30.),(-424.484,253.716,50.),(-424.484,253.716,30.),(-417.627,264.802,50.),(-424.484,253.716,30.),(-429.332,242.124,50.),(-429.332,242.124,30.),(-424.484,253.716,50.),(-429.332,242.124,30.),(-432.795,229.307,50.),(-432.795,229.307,30.),(-429.332,242.124,50.),(-432.795,229.307,30.),(-434.873,215.266,50.),(-434.873,215.266,30.),(-432.795,229.307,50.),(-434.873,215.266,30.),(-435.566,200.,50.),(-435.566,200.,30.),(-434.873,215.266,50.),(-435.566,200.,30.),(-434.873,184.734,50.),(-434.873,184.734,30.),(-435.566,200.,50.),(-434.873,184.734,30.),(-432.795,170.693,50.),(-432.795,170.693,30.),(-434.873,184.734,50.),(-432.795,170.693,30.),(-429.332,157.876,50.),(-429.332,157.876,30.),(-432.795,170.693,50.),(-429.332,157.876,30.),(-424.484,146.284,50.),(-424.484,146.284,30.),(-429.332,157.876,50.),(-424.484,146.284,30.),(-417.616,135.198,50.),(-417.616,135.198,30.),(-424.484,146.284,50.),(-417.616,135.198,30.),(-409.715,127.28,50.),(-409.715,127.28,30.),(-417.616,135.198,50.),(-409.715,127.28,50.),(-400.78,122.53,30.),(-409.715,127.28,30.),(-400.78,122.53,50.),(-400.78,122.53,50.),(-390.812,120.946,30.),(-400.78,122.53,30.),(-390.812,120.946,50.),(-390.812,120.946,30.),(-380.843,122.53,50.),(-380.843,122.53,30.),(-390.812,120.946,50.),(-380.843,122.53,30.),(-371.908,127.28,50.),(-371.908,127.28,30.),(-380.843,122.53,50.),(-371.908,127.28,50.),(-364.007,135.198,30.),(-371.908,127.28,30.),(-364.007,135.198,50.),(-364.007,135.198,50.),(-357.139,146.284,30.),(-364.007,135.198,30.),(-357.139,146.284,50.),(-357.139,146.284,50.),(-352.291,157.813,30.),(-357.139,146.284,30.),(-352.291,157.813,50.),(-352.291,157.813,50.),(-348.828,170.439,30.),(-352.291,157.813,30.),(-348.828,170.439,50.),(-348.828,170.439,50.),(-346.75,184.164,30.),(-348.828,170.439,30.),(-346.75,184.164,50.),(-346.75,184.164,50.),(-346.057,198.986,30.),(-346.75,184.164,30.),(-346.057,198.986,50.),(-346.057,198.986,50.),(-346.75,214.886,30.),(-346.057,198.986,30.),(-346.75,214.886,50.),(-346.75,214.886,50.),(-348.828,229.307,30.),(-346.75,214.886,30.),(-348.828,229.307,50.),(-348.828,229.307,50.),(-352.291,242.251,30.),(-348.828,229.307,30.),(-352.291,242.251,50.),(-352.291,242.251,50.),(-357.139,253.716,30.),(-352.291,242.251,30.),(-357.139,253.716,50.),(-357.139,253.716,50.),(-364.05,264.675,30.),(-357.139,253.716,30.),(-364.05,264.675,50.),(-364.05,264.675,30.),(-371.994,272.551,50.),(-371.994,272.551,30.),(-364.05,264.675,50.),(-371.994,272.551,30.),(-380.971,277.344,50.),(-380.971,277.344,30.),(-371.994,272.551,50.),(-380.971,277.344,50.),(-390.982,279.054,30.),(-380.971,277.344,30.),(-390.982,279.054,50.),(-239.244,105.405,50.),(-315.113,109.966,50.),(-315.113,105.405,50.),(-312.406,111.972,50.),(-310.765,114.611,50.),(-309.934,118.56,50.),(-309.657,124.493,50.),(-297.467,123.818,50.),(-309.657,275.507,50.),(-297.467,275.507,50.),(-239.244,123.818,50.),(-236.186,104.856,50.),(-234.172,125.979,50.),(-234.172,103.209,50.),(-232.84,129.222,50.),(-232.84,99.958,50.),(-231.827,94.595,50.),(-231.827,134.628,50.),(-229.526,94.595,50.),(-229.526,134.628,50.),(-312.406,288.049,50.),(-315.113,294.595,50.),(-315.113,290.034,50.),(-292.011,294.595,50.),(-310.765,285.473,50.),(-309.934,281.546,50.),(-296.359,285.473,50.),(-297.19,281.546,50.),(-294.718,288.049,50.),(-292.011,290.034,50.),(-297.467,123.818,50.),(-239.244,123.818,30.),(-297.467,123.818,30.),(-239.244,123.818,50.),(-239.244,123.818,50.),(-234.172,125.979,30.),(-239.244,123.818,30.),(-234.172,125.979,50.),(-234.172,125.979,50.),(-232.84,129.222,30.),(-234.172,125.979,30.),(-232.84,129.222,50.),(-232.84,129.222,50.),(-231.827,134.628,30.),(-232.84,129.222,30.),(-231.827,134.628,50.),(-231.827,134.628,50.),(-229.526,134.628,30.),(-231.827,134.628,30.),(-229.526,134.628,50.),(-229.526,134.628,30.),(-229.526,94.595,50.),(-229.526,94.595,30.),(-229.526,134.628,50.),(-229.526,94.595,50.),(-231.827,94.595,30.),(-229.526,94.595,30.),(-231.827,94.595,50.),(-231.827,94.595,50.),(-232.84,99.958,30.),(-231.827,94.595,30.),(-232.84,99.958,50.),(-232.84,99.958,50.),(-234.172,103.209,30.),(-232.84,99.958,30.),(-234.172,103.209,50.),(-234.172,103.209,30.),(-236.186,104.856,50.),(-236.186,104.856,30.),(-234.172,103.209,50.),(-236.186,104.856,50.),(-239.244,105.405,30.),(-236.186,104.856,30.),(-239.244,105.405,50.),(-239.244,105.405,30.),(-315.113,105.405,50.),(-315.113,105.405,30.),(-239.244,105.405,50.),(-315.113,105.405,50.),(-315.113,109.966,30.),(-315.113,105.405,30.),(-315.113,109.966,50.),(-315.113,109.966,30.),(-312.406,111.972,50.),(-312.406,111.972,30.),(-315.113,109.966,50.),(-312.406,111.972,50.),(-310.765,114.611,30.),(-312.406,111.972,30.),(-310.765,114.611,50.),(-310.765,114.611,50.),(-309.934,118.56,30.),(-310.765,114.611,30.),(-309.934,118.56,50.),(-309.934,118.56,50.),(-309.657,124.493,30.),(-309.934,118.56,30.),(-309.657,124.493,50.),(-309.657,124.493,50.),(-309.657,275.507,30.),(-309.657,124.493,30.),(-309.657,275.507,50.),(-309.657,275.507,50.),(-309.934,281.546,30.),(-309.657,275.507,30.),(-309.934,281.546,50.),(-309.934,281.546,50.),(-310.765,285.473,30.),(-309.934,281.546,30.),(-310.765,285.473,50.),(-310.765,285.473,50.),(-312.406,288.049,30.),(-310.765,285.473,30.),(-312.406,288.049,50.),(-312.406,288.049,50.),(-315.113,290.034,30.),(-312.406,288.049,30.),(-315.113,290.034,50.),(-315.113,290.034,50.),(-315.113,294.595,30.),(-315.113,290.034,30.),(-315.113,294.595,50.),(-315.113,294.595,50.),(-292.011,294.595,30.),(-315.113,294.595,30.),(-292.011,294.595,50.),(-292.011,294.595,30.),(-292.011,290.034,50.),(-292.011,290.034,30.),(-292.011,294.595,50.),(-292.011,290.034,50.),(-294.718,288.049,30.),(-292.011,290.034,30.),(-294.718,288.049,50.),(-294.718,288.049,30.),(-296.359,285.473,50.),(-296.359,285.473,30.),(-294.718,288.049,50.),(-296.359,285.473,30.),(-297.19,281.546,50.),(-297.19,281.546,30.),(-296.359,285.473,50.),(-297.19,281.546,30.),(-297.467,275.507,50.),(-297.467,275.507,30.),(-297.19,281.546,50.),(-297.467,275.507,30.),(-297.467,123.818,50.),(-297.467,123.818,30.),(-297.467,275.507,50.),(-217.421,105.405,50.),(-214.661,111.972,50.),(-217.421,109.966,50.),(-169.171,105.405,50.),(-213.031,114.611,50.),(-211.965,124.493,50.),(-199.775,123.818,50.),(-169.853,123.818,50.),(-155.17,126.098,50.),(-152.879,107.644,50.),(-149.538,128.948,50.),(-146.259,110.441,50.),(-145.047,132.939,50.),(-140.656,114.358,50.),(-140.976,138.64,50.),(-137.46,145.777,50.),(-135.784,119.637,50.),(-134.497,154.35,50.),(-131.354,126.52,50.),(-132.089,164.358,50.),(-129.724,181.377,50.),(-127.366,135.008,50.),(-128.935,200.,50.),(-217.421,290.034,50.),(-169.171,294.595,50.),(-217.421,294.595,50.),(-214.661,288.028,50.),(-213.031,285.389,50.),(-211.965,275.507,50.),(-199.775,276.182,50.),(-169.853,276.182,50.),(-158.697,275.,50.),(-152.293,292.356,50.),(-150.119,271.453,50.),(-145.707,289.559,50.),(-143.416,265.076,50.),(-140.358,285.642,50.),(-137.886,255.405,50.),(-134.796,279.054,50.),(-133.97,244.151,50.),(-129.873,270.608,50.),(-131.173,231.166,50.),(-129.494,216.448,50.),(-125.589,260.304,50.),(-123.82,145.101,50.),(-121.945,248.142,50.),(-120.464,157.908,50.),(-117.597,224.789,50.),(-118.066,171.326,50.),(-116.628,185.357,50.),(-116.148,200.,50.),(-211.965,124.493,50.),(-211.965,275.507,30.),(-211.965,124.493,30.),(-211.965,275.507,50.),(-211.965,275.507,50.),(-213.031,285.389,30.),(-211.965,275.507,30.),(-213.031,285.389,50.),(-213.031,285.389,50.),(-214.661,288.028,30.),(-213.031,285.389,30.),(-214.661,288.028,50.),(-214.661,288.028,50.),(-217.421,290.034,30.),(-214.661,288.028,30.),(-217.421,290.034,50.),(-217.421,290.034,50.),(-217.421,294.595,30.),(-217.421,290.034,30.),(-217.421,294.595,50.),(-217.421,294.595,50.),(-169.171,294.595,30.),(-217.421,294.595,30.),(-169.171,294.595,50.),(-169.171,294.595,50.),(-152.293,292.356,30.),(-169.171,294.595,30.),(-152.293,292.356,50.),(-152.293,292.356,50.),(-145.707,289.559,30.),(-152.293,292.356,30.),(-145.707,289.559,50.),(-145.707,289.559,50.),(-140.358,285.642,30.),(-145.707,289.559,30.),(-140.358,285.642,50.),(-140.358,285.642,30.),(-134.796,279.054,50.),(-134.796,279.054,30.),(-140.358,285.642,50.),(-134.796,279.054,30.),(-129.873,270.608,50.),(-129.873,270.608,30.),(-134.796,279.054,50.),(-129.873,270.608,30.),(-125.589,260.304,50.),(-125.589,260.304,30.),(-129.873,270.608,50.),(-125.589,260.304,30.),(-121.945,248.142,50.),(-121.945,248.142,30.),(-125.589,260.304,50.),(-121.945,248.142,30.),(-117.597,224.789,50.),(-117.597,224.789,30.),(-121.945,248.142,50.),(-117.597,224.789,30.),(-116.148,200.,50.),(-116.148,200.,30.),(-117.597,224.789,50.),(-116.148,200.,30.),(-116.628,185.357,50.),(-116.628,185.357,30.),(-116.148,200.,50.),(-116.628,185.357,30.),(-118.066,171.326,50.),(-118.066,171.326,30.),(-116.628,185.357,50.),(-118.066,171.326,30.),(-120.464,157.908,50.),(-120.464,157.908,30.),(-118.066,171.326,50.),(-120.464,157.908,30.),(-123.82,145.101,50.),(-123.82,145.101,30.),(-120.464,157.908,50.),(-123.82,145.101,30.),(-127.366,135.008,50.),(-127.366,135.008,30.),(-123.82,145.101,50.),(-127.366,135.008,30.),(-131.354,126.52,50.),(-131.354,126.52,30.),(-127.366,135.008,50.),(-131.354,126.52,30.),(-135.784,119.637,50.),(-135.784,119.637,30.),(-131.354,126.52,50.),(-135.784,119.637,30.),(-140.656,114.358,50.),(-140.656,114.358,30.),(-135.784,119.637,50.),(-140.656,114.358,50.),(-146.259,110.441,30.),(-140.656,114.358,30.),(-146.259,110.441,50.),(-146.259,110.441,50.),(-152.879,107.644,30.),(-146.259,110.441,30.),(-152.879,107.644,50.),(-152.879,107.644,50.),(-169.171,105.405,30.),(-152.879,107.644,30.),(-169.171,105.405,50.),(-169.171,105.405,30.),(-217.421,105.405,50.),(-217.421,105.405,30.),(-169.171,105.405,50.),(-217.421,105.405,50.),(-217.421,109.966,30.),(-217.421,105.405,30.),(-217.421,109.966,50.),(-217.421,109.966,30.),(-214.661,111.972,50.),(-214.661,111.972,30.),(-217.421,109.966,50.),(-214.661,111.972,50.),(-213.031,114.611,30.),(-214.661,111.972,30.),(-213.031,114.611,50.),(-213.031,114.611,50.),(-211.965,124.493,30.),(-213.031,114.611,30.),(-211.965,124.493,50.),(-199.775,123.818,50.),(-169.853,123.818,30.),(-199.775,123.818,30.),(-169.853,123.818,50.),(-169.853,123.818,30.),(-155.17,126.098,50.),(-155.17,126.098,30.),(-169.853,123.818,50.),(-155.17,126.098,30.),(-149.538,128.948,50.),(-149.538,128.948,30.),(-155.17,126.098,50.),(-149.538,128.948,30.),(-145.047,132.939,50.),(-145.047,132.939,30.),(-149.538,128.948,50.),(-145.047,132.939,50.),(-140.976,138.64,30.),(-145.047,132.939,30.),(-140.976,138.64,50.),(-140.976,138.64,50.),(-137.46,145.777,30.),(-140.976,138.64,30.),(-137.46,145.777,50.),(-137.46,145.777,50.),(-134.497,154.35,30.),(-137.46,145.777,30.),(-134.497,154.35,50.),(-134.497,154.35,50.),(-132.089,164.358,30.),(-134.497,154.35,30.),(-132.089,164.358,50.),(-132.089,164.358,50.),(-129.724,181.377,30.),(-132.089,164.358,30.),(-129.724,181.377,50.),(-129.724,181.377,50.),(-128.935,200.,30.),(-129.724,181.377,30.),(-128.935,200.,50.),(-128.935,200.,50.),(-129.494,216.448,30.),(-128.935,200.,30.),(-129.494,216.448,50.),(-129.494,216.448,50.),(-131.173,231.166,30.),(-129.494,216.448,30.),(-131.173,231.166,50.),(-131.173,231.166,50.),(-133.97,244.151,30.),(-131.173,231.166,30.),(-133.97,244.151,50.),(-133.97,244.151,50.),(-137.886,255.405,30.),(-133.97,244.151,30.),(-137.886,255.405,50.),(-137.886,255.405,50.),(-143.416,265.076,30.),(-137.886,255.405,30.),(-143.416,265.076,50.),(-143.416,265.076,30.),(-150.119,271.453,50.),(-150.119,271.453,30.),(-143.416,265.076,50.),(-150.119,271.453,30.),(-158.697,275.,50.),(-158.697,275.,30.),(-150.119,271.453,50.),(-158.697,275.,50.),(-169.853,276.182,30.),(-158.697,275.,30.),(-169.853,276.182,50.),(-169.853,276.182,50.),(-199.775,276.182,30.),(-169.853,276.182,30.),(-199.775,276.182,50.),(-199.775,276.182,30.),(-199.775,123.818,50.),(-199.775,123.818,30.),(-199.775,276.182,50.),(-21.269,105.405,50.),(-97.991,109.966,50.),(-97.991,105.405,50.),(-95.231,111.972,50.),(-93.6,114.611,50.),(-92.535,124.493,50.),(-80.345,123.818,50.),(-92.535,275.507,50.),(-21.354,123.818,50.),(-16.282,125.979,50.),(-18.221,104.856,50.),(-16.239,103.209,50.),(-14.971,129.222,50.),(-14.961,99.958,50.),(-14.023,134.628,50.),(-14.023,94.595,50.),(-11.636,134.628,50.),(-11.636,94.595,50.),(-80.345,193.919,50.),(-80.345,212.331,50.),(-43.092,212.331,50.),(-43.092,193.919,50.),(-38.105,191.757,50.),(-40.044,212.88,50.),(-38.062,214.527,50.),(-36.773,188.514,50.),(-36.762,217.779,50.),(-35.761,183.108,50.),(-35.761,223.142,50.),(-33.459,183.108,50.),(-33.459,223.142,50.),(-97.991,290.034,50.),(-21.866,294.595,50.),(-97.991,294.595,50.),(-95.284,288.049,50.),(-93.643,285.473,50.),(-92.812,281.546,50.),(-80.345,276.182,50.),(-21.866,276.182,50.),(-18.818,275.642,50.),(-18.818,295.144,50.),(-16.836,296.791,50.),(-16.836,274.021,50.),(-15.536,300.042,50.),(-15.536,270.778,50.),(-14.534,305.405,50.),(-14.534,265.372,50.),(-12.233,265.372,50.),(-12.233,305.405,50.),(-80.345,193.919,30.),(-80.345,123.818,50.),(-80.345,123.818,30.),(-80.345,193.919,50.),(-80.345,123.818,50.),(-21.354,123.818,30.),(-80.345,123.818,30.),(-21.354,123.818,50.),(-21.354,123.818,30.),(-16.282,125.979,50.),(-16.282,125.979,30.),(-21.354,123.818,50.),(-16.282,125.979,50.),(-14.971,129.222,30.),(-16.282,125.979,30.),(-14.971,129.222,50.),(-14.971,129.222,50.),(-14.023,134.628,30.),(-14.971,129.222,30.),(-14.023,134.628,50.),(-14.023,134.628,50.),(-11.636,134.628,30.),(-14.023,134.628,30.),(-11.636,134.628,50.),(-11.636,134.628,30.),(-11.636,94.595,50.),(-11.636,94.595,30.),(-11.636,134.628,50.),(-11.636,94.595,50.),(-14.023,94.595,30.),(-11.636,94.595,30.),(-14.023,94.595,50.),(-14.023,94.595,50.),(-14.961,99.958,30.),(-14.023,94.595,30.),(-14.961,99.958,50.),(-14.961,99.958,50.),(-16.239,103.209,30.),(-14.961,99.958,30.),(-16.239,103.209,50.),(-16.239,103.209,30.),(-18.221,104.856,50.),(-18.221,104.856,30.),(-16.239,103.209,50.),(-18.221,104.856,30.),(-21.269,105.405,50.),(-21.269,105.405,30.),(-18.221,104.856,50.),(-21.269,105.405,50.),(-97.991,105.405,30.),(-21.269,105.405,30.),(-97.991,105.405,50.),(-97.991,105.405,50.),(-97.991,109.966,30.),(-97.991,105.405,30.),(-97.991,109.966,50.),(-97.991,109.966,50.),(-95.231,111.972,30.),(-97.991,109.966,30.),(-95.231,111.972,50.),(-95.231,111.972,50.),(-93.6,114.611,30.),(-95.231,111.972,30.),(-93.6,114.611,50.),(-93.6,114.611,50.),(-92.535,124.493,30.),(-93.6,114.611,30.),(-92.535,124.493,50.),(-92.535,124.493,50.),(-92.535,275.507,30.),(-92.535,124.493,30.),(-92.535,275.507,50.),(-92.535,275.507,50.),(-92.812,281.546,30.),(-92.535,275.507,30.),(-92.812,281.546,50.),(-92.812,281.546,50.),(-93.643,285.473,30.),(-92.812,281.546,30.),(-93.643,285.473,50.),(-93.643,285.473,50.),(-95.284,288.049,30.),(-93.643,285.473,30.),(-95.284,288.049,50.),(-95.284,288.049,50.),(-97.991,290.034,30.),(-95.284,288.049,30.),(-97.991,290.034,50.),(-97.991,290.034,50.),(-97.991,294.595,30.),(-97.991,290.034,30.),(-97.991,294.595,50.),(-97.991,294.595,50.),(-21.866,294.595,30.),(-97.991,294.595,30.),(-21.866,294.595,50.),(-21.866,294.595,50.),(-18.818,295.144,30.),(-21.866,294.595,30.),(-18.818,295.144,50.),(-18.818,295.144,30.),(-16.836,296.791,50.),(-16.836,296.791,30.),(-18.818,295.144,50.),(-16.836,296.791,50.),(-15.536,300.042,30.),(-16.836,296.791,30.),(-15.536,300.042,50.),(-15.536,300.042,50.),(-14.534,305.405,30.),(-15.536,300.042,30.),(-14.534,305.405,50.),(-14.534,305.405,50.),(-12.233,305.405,30.),(-14.534,305.405,30.),(-12.233,305.405,50.),(-12.233,305.405,30.),(-12.233,265.372,50.),(-12.233,265.372,30.),(-12.233,305.405,50.),(-12.233,265.372,50.),(-14.534,265.372,30.),(-12.233,265.372,30.),(-14.534,265.372,50.),(-14.534,265.372,50.),(-15.536,270.778,30.),(-14.534,265.372,30.),(-15.536,270.778,50.),(-15.536,270.778,50.),(-16.836,274.021,30.),(-15.536,270.778,30.),(-16.836,274.021,50.),(-16.836,274.021,50.),(-18.818,275.642,30.),(-16.836,274.021,30.),(-18.818,275.642,50.),(-18.818,275.642,50.),(-21.866,276.182,30.),(-18.818,275.642,30.),(-21.866,276.182,50.),(-21.866,276.182,30.),(-80.345,276.182,50.),(-80.345,276.182,30.),(-21.866,276.182,50.),(-80.345,276.182,30.),(-80.345,212.331,50.),(-80.345,212.331,30.),(-80.345,276.182,50.),(-80.345,212.331,50.),(-43.092,212.331,30.),(-80.345,212.331,30.),(-43.092,212.331,50.),(-43.092,212.331,50.),(-40.044,212.88,30.),(-43.092,212.331,30.),(-40.044,212.88,50.),(-40.044,212.88,30.),(-38.062,214.527,50.),(-38.062,214.527,30.),(-40.044,212.88,50.),(-38.062,214.527,50.),(-36.762,217.779,30.),(-38.062,214.527,30.),(-36.762,217.779,50.),(-36.762,217.779,50.),(-35.761,223.142,30.),(-36.762,217.779,30.),(-35.761,223.142,50.),(-35.761,223.142,50.),(-33.459,223.142,30.),(-35.761,223.142,30.),(-33.459,223.142,50.),(-33.459,223.142,30.),(-33.459,183.108,50.),(-33.459,183.108,30.),(-33.459,223.142,50.),(-33.459,183.108,30.),(-35.761,183.108,50.),(-35.761,183.108,30.),(-33.459,183.108,50.),(-35.761,183.108,50.),(-36.773,188.514,30.),(-35.761,183.108,30.),(-36.773,188.514,50.),(-36.773,188.514,50.),(-38.105,191.757,30.),(-36.773,188.514,30.),(-38.105,191.757,50.),(-38.105,191.757,50.),(-43.092,193.919,30.),(-38.105,191.757,30.),(-43.092,193.919,50.),(-43.092,193.919,30.),(-80.345,193.919,50.),(-80.345,193.919,30.),(-43.092,193.919,50.),(108.817,105.405,50.),(49.741,109.966,50.),(49.741,105.405,50.),(52.448,111.972,50.),(54.089,114.611,50.),(54.92,118.56,50.),(55.197,124.493,50.),(67.387,123.818,50.),(55.197,275.507,50.),(67.387,195.101,50.),(105.407,123.818,50.),(118.705,125.253,50.),(118.173,106.208,50.),(125.44,108.615,50.),(122.755,127.386,50.),(126.378,130.912,50.),(131.301,113.007,50.),(129.399,135.821,50.),(131.556,141.934,50.),(136.437,119.764,50.),(132.851,149.25,50.),(133.283,157.77,50.),(135.515,196.59,50.),(140.763,186.191,50.),(140.166,127.544,50.),(142.83,136.529,50.),(143.912,173.364,50.),(144.429,146.717,50.),(144.961,158.108,50.),(104.299,195.101,50.),(67.387,213.514,50.),(103.617,213.514,50.),(116.276,214.78,50.),(117.469,193.581,50.),(123.565,219.764,50.),(121.615,191.385,50.),(125.269,187.838,50.),(126.436,223.955,50.),(128.775,182.348,50.),(128.168,204.561,50.),(131.279,175.507,50.),(132.782,167.314,50.),(128.487,229.265,50.),(134.135,212.099,50.),(129.718,235.695,50.),(130.128,243.243,50.),(131.151,284.628,50.),(135.574,277.196,50.),(138.397,221.199,50.),(138.951,267.399,50.),(140.955,231.862,50.),(141.093,256.081,50.),(141.807,244.088,50.),(52.448,288.049,50.),(49.741,294.595,50.),(49.741,290.034,50.),(107.027,294.595,50.),(54.089,285.473,50.),(54.92,281.546,50.),(67.387,276.182,50.),(102.594,276.182,50.),(115.083,274.916,50.),(121.519,292.314,50.),(122.542,269.932,50.),(126.697,289.253,50.),(125.861,265.034,50.),(128.232,258.953,50.),(129.654,251.689,50.),(128.168,204.561,30.),(135.515,196.59,50.),(135.515,196.59,30.),(128.168,204.561,50.),(135.515,196.59,30.),(140.763,186.191,50.),(140.763,186.191,30.),(135.515,196.59,50.),(140.763,186.191,30.),(143.912,173.364,50.),(143.912,173.364,30.),(140.763,186.191,50.),(143.912,173.364,30.),(144.961,158.108,50.),(144.961,158.108,30.),(143.912,173.364,50.),(144.961,158.108,30.),(144.429,146.717,50.),(144.429,146.717,30.),(144.961,158.108,50.),(144.429,146.717,30.),(142.83,136.529,50.),(142.83,136.529,30.),(144.429,146.717,50.),(142.83,136.529,30.),(140.166,127.544,50.),(140.166,127.544,30.),(142.83,136.529,50.),(140.166,127.544,30.),(136.437,119.764,50.),(136.437,119.764,30.),(140.166,127.544,50.),(136.437,119.764,30.),(131.301,113.007,50.),(131.301,113.007,30.),(136.437,119.764,50.),(131.301,113.007,50.),(125.44,108.615,30.),(131.301,113.007,30.),(125.44,108.615,50.),(125.44,108.615,50.),(118.173,106.208,30.),(125.44,108.615,30.),(118.173,106.208,50.),(118.173,106.208,50.),(108.817,105.405,30.),(118.173,106.208,30.),(108.817,105.405,50.),(108.817,105.405,50.),(49.741,105.405,30.),(108.817,105.405,30.),(49.741,105.405,50.),(49.741,105.405,50.),(49.741,109.966,30.),(49.741,105.405,30.),(49.741,109.966,50.),(49.741,109.966,30.),(52.448,111.972,50.),(52.448,111.972,30.),(49.741,109.966,50.),(52.448,111.972,50.),(54.089,114.611,30.),(52.448,111.972,30.),(54.089,114.611,50.),(54.089,114.611,50.),(54.92,118.56,30.),(54.089,114.611,30.),(54.92,118.56,50.),(54.92,118.56,50.),(55.197,124.493,30.),(54.92,118.56,30.),(55.197,124.493,50.),(55.197,124.493,50.),(55.197,275.507,30.),(55.197,124.493,30.),(55.197,275.507,50.),(55.197,275.507,50.),(54.92,281.546,30.),(55.197,275.507,30.),(54.92,281.546,50.),(54.92,281.546,50.),(54.089,285.473,30.),(54.92,281.546,30.),(54.089,285.473,50.),(54.089,285.473,50.),(52.448,288.049,30.),(54.089,285.473,30.),(52.448,288.049,50.),(52.448,288.049,30.),(49.741,290.034,50.),(49.741,290.034,30.),(52.448,288.049,50.),(49.741,290.034,50.),(49.741,294.595,30.),(49.741,290.034,30.),(49.741,294.595,50.),(49.741,294.595,50.),(107.027,294.595,30.),(49.741,294.595,30.),(107.027,294.595,50.),(107.027,294.595,50.),(121.519,292.314,30.),(107.027,294.595,30.),(121.519,292.314,50.),(121.519,292.314,50.),(126.697,289.253,30.),(121.519,292.314,30.),(126.697,289.253,50.),(126.697,289.253,30.),(131.151,284.628,50.),(131.151,284.628,30.),(126.697,289.253,50.),(131.151,284.628,30.),(135.574,277.196,50.),(135.574,277.196,30.),(131.151,284.628,50.),(135.574,277.196,30.),(138.951,267.399,50.),(138.951,267.399,30.),(135.574,277.196,50.),(138.951,267.399,30.),(141.093,256.081,50.),(141.093,256.081,30.),(138.951,267.399,50.),(141.093,256.081,30.),(141.807,244.088,50.),(141.807,244.088,30.),(141.093,256.081,50.),(141.807,244.088,30.),(140.955,231.862,50.),(140.955,231.862,30.),(141.807,244.088,50.),(140.955,231.862,30.),(138.397,221.199,50.),(138.397,221.199,30.),(140.955,231.862,50.),(138.397,221.199,30.),(134.135,212.099,50.),(134.135,212.099,30.),(138.397,221.199,50.),(134.135,212.099,30.),(128.168,204.561,50.),(128.168,204.561,30.),(134.135,212.099,50.),(67.387,213.514,50.),(103.617,213.514,30.),(67.387,213.514,30.),(103.617,213.514,50.),(103.617,213.514,30.),(116.276,214.78,50.),(116.276,214.78,30.),(103.617,213.514,50.),(116.276,214.78,30.),(123.565,219.764,50.),(123.565,219.764,30.),(116.276,214.78,50.),(123.565,219.764,50.),(126.436,223.955,30.),(123.565,219.764,30.),(126.436,223.955,50.),(126.436,223.955,50.),(128.487,229.265,30.),(126.436,223.955,30.),(128.487,229.265,50.),(128.487,229.265,50.),(129.718,235.695,30.),(128.487,229.265,30.),(129.718,235.695,50.),(129.718,235.695,50.),(130.128,243.243,30.),(129.718,235.695,30.),(130.128,243.243,50.),(130.128,243.243,50.),(129.654,251.689,30.),(130.128,243.243,30.),(129.654,251.689,50.),(129.654,251.689,50.),(128.232,258.953,30.),(129.654,251.689,30.),(128.232,258.953,50.),(128.232,258.953,50.),(125.861,265.034,30.),(128.232,258.953,30.),(125.861,265.034,50.),(125.861,265.034,50.),(122.542,269.932,30.),(125.861,265.034,30.),(122.542,269.932,50.),(122.542,269.932,30.),(115.083,274.916,50.),(115.083,274.916,30.),(122.542,269.932,50.),(115.083,274.916,30.),(102.594,276.182,50.),(102.594,276.182,30.),(115.083,274.916,50.),(102.594,276.182,50.),(67.387,276.182,30.),(102.594,276.182,30.),(67.387,276.182,50.),(67.387,276.182,30.),(67.387,213.514,50.),(67.387,213.514,30.),(67.387,276.182,50.),(67.387,123.818,30.),(105.407,123.818,50.),(105.407,123.818,30.),(67.387,123.818,50.),(105.407,123.818,50.),(118.705,125.253,30.),(105.407,123.818,30.),(118.705,125.253,50.),(118.705,125.253,50.),(122.755,127.386,30.),(118.705,125.253,30.),(122.755,127.386,50.),(122.755,127.386,30.),(126.378,130.912,50.),(126.378,130.912,30.),(122.755,127.386,50.),(126.378,130.912,50.),(129.399,135.821,30.),(126.378,130.912,30.),(129.399,135.821,50.),(129.399,135.821,50.),(131.556,141.934,30.),(129.399,135.821,30.),(131.556,141.934,50.),(131.556,141.934,50.),(132.851,149.25,30.),(131.556,141.934,30.),(132.851,149.25,50.),(132.851,149.25,50.),(133.283,157.77,30.),(132.851,149.25,30.),(133.283,157.77,50.),(133.283,157.77,50.),(132.782,167.314,30.),(133.283,157.77,30.),(132.782,167.314,50.),(132.782,167.314,50.),(131.279,175.507,30.),(132.782,167.314,30.),(131.279,175.507,50.),(131.279,175.507,50.),(128.775,182.348,30.),(131.279,175.507,30.),(128.775,182.348,50.),(128.775,182.348,50.),(125.269,187.838,30.),(128.775,182.348,30.),(125.269,187.838,50.),(125.269,187.838,30.),(121.615,191.385,50.),(121.615,191.385,30.),(125.269,187.838,50.),(121.615,191.385,50.),(117.469,193.581,30.),(121.615,191.385,30.),(117.469,193.581,50.),(117.469,193.581,30.),(104.299,195.101,50.),(104.299,195.101,30.),(117.469,193.581,50.),(104.299,195.101,50.),(67.387,195.101,30.),(104.299,195.101,30.),(67.387,195.101,50.),(67.387,195.101,30.),(67.387,123.818,50.),(67.387,123.818,30.),(67.387,195.101,50.),(185.794,105.405,50.),(162.693,109.966,50.),(162.693,105.405,50.),(165.452,111.972,50.),(167.083,114.611,50.),(168.148,124.493,50.),(181.447,114.611,50.),(180.616,118.56,50.),(168.148,275.507,50.),(180.339,124.493,50.),(180.339,209.459,50.),(183.088,111.972,50.),(185.794,109.966,50.),(235.647,105.405,50.),(238.142,111.698,50.),(235.647,109.966,50.),(259.277,105.405,50.),(238.973,114.189,50.),(254.886,112.148,50.),(252.372,117.399,50.),(259.277,109.966,50.),(180.339,191.047,50.),(216.653,209.459,50.),(215.05,191.047,50.),(237.011,122.297,50.),(228.417,192.736,50.),(229.824,210.726,50.),(234.704,194.632,50.),(237.283,215.372,50.),(240.181,197.783,50.),(240.229,219.774,50.),(244.849,202.191,50.),(242.334,225.549,50.),(243.597,232.696,50.),(244.018,241.216,50.),(162.693,290.034,50.),(219.381,294.595,50.),(162.693,294.595,50.),(165.399,288.049,50.),(167.04,285.473,50.),(167.871,281.546,50.),(180.339,276.182,50.),(218.017,276.182,50.),(229.888,274.113,50.),(228.13,293.919,50.),(235.109,291.892,50.),(234.305,271.527,50.),(237.709,267.905,50.),(240.81,288.26,50.),(240.469,262.88,50.),(242.44,256.757,50.),(245.722,282.77,50.),(243.623,249.535,50.),(248.706,207.855,50.),(250.049,275.042,50.),(251.727,214.722,50.),(253.139,265.709,50.),(253.885,222.741,50.),(254.993,254.772,50.),(255.179,231.91,50.),(255.611,242.23,50.),(180.339,191.047,30.),(180.339,124.493,50.),(180.339,124.493,30.),(180.339,191.047,50.),(180.339,124.493,30.),(180.616,118.56,50.),(180.616,118.56,30.),(180.339,124.493,50.),(180.616,118.56,30.),(181.447,114.611,50.),(181.447,114.611,30.),(180.616,118.56,50.),(181.447,114.611,30.),(183.088,111.972,50.),(183.088,111.972,30.),(181.447,114.611,50.),(183.088,111.972,50.),(185.794,109.966,30.),(183.088,111.972,30.),(185.794,109.966,50.),(185.794,109.966,30.),(185.794,105.405,50.),(185.794,105.405,30.),(185.794,109.966,50.),(185.794,105.405,50.),(162.693,105.405,30.),(185.794,105.405,30.),(162.693,105.405,50.),(162.693,105.405,50.),(162.693,109.966,30.),(162.693,105.405,30.),(162.693,109.966,50.),(162.693,109.966,50.),(165.452,111.972,30.),(162.693,109.966,30.),(165.452,111.972,50.),(165.452,111.972,50.),(167.083,114.611,30.),(165.452,111.972,30.),(167.083,114.611,50.),(167.083,114.611,50.),(168.148,124.493,30.),(167.083,114.611,30.),(168.148,124.493,50.),(168.148,124.493,50.),(168.148,275.507,30.),(168.148,124.493,30.),(168.148,275.507,50.),(168.148,275.507,50.),(167.871,281.546,30.),(168.148,275.507,30.),(167.871,281.546,50.),(167.871,281.546,50.),(167.04,285.473,30.),(167.871,281.546,30.),(167.04,285.473,50.),(167.04,285.473,50.),(165.399,288.049,30.),(167.04,285.473,30.),(165.399,288.049,50.),(165.399,288.049,30.),(162.693,290.034,50.),(162.693,290.034,30.),(165.399,288.049,50.),(162.693,290.034,50.),(162.693,294.595,30.),(162.693,290.034,30.),(162.693,294.595,50.),(162.693,294.595,30.),(219.381,294.595,50.),(219.381,294.595,30.),(162.693,294.595,50.),(219.381,294.595,50.),(228.13,293.919,30.),(219.381,294.595,30.),(228.13,293.919,50.),(228.13,293.919,50.),(235.109,291.892,30.),(228.13,293.919,30.),(235.109,291.892,50.),(235.109,291.892,50.),(240.81,288.26,30.),(235.109,291.892,30.),(240.81,288.26,50.),(240.81,288.26,30.),(245.722,282.77,50.),(245.722,282.77,30.),(240.81,288.26,50.),(245.722,282.77,30.),(250.049,275.042,50.),(250.049,275.042,30.),(245.722,282.77,50.),(250.049,275.042,30.),(253.139,265.709,50.),(253.139,265.709,30.),(250.049,275.042,50.),(253.139,265.709,30.),(254.993,254.772,50.),(254.993,254.772,30.),(253.139,265.709,50.),(254.993,254.772,30.),(255.611,242.23,50.),(255.611,242.23,30.),(254.993,254.772,50.),(255.611,242.23,30.),(255.179,231.91,50.),(255.179,231.91,30.),(255.611,242.23,50.),(255.179,231.91,30.),(253.885,222.741,50.),(253.885,222.741,30.),(255.179,231.91,50.),(253.885,222.741,30.),(251.727,214.722,50.),(251.727,214.722,30.),(253.885,222.741,50.),(251.727,214.722,30.),(248.706,207.855,50.),(248.706,207.855,30.),(251.727,214.722,50.),(248.706,207.855,30.),(244.849,202.191,50.),(244.849,202.191,30.),(248.706,207.855,50.),(244.849,202.191,50.),(240.181,197.783,30.),(244.849,202.191,30.),(240.181,197.783,50.),(240.181,197.783,50.),(234.704,194.632,30.),(240.181,197.783,30.),(234.704,194.632,50.),(234.704,194.632,50.),(228.417,192.736,30.),(234.704,194.632,30.),(228.417,192.736,50.),(228.417,192.736,30.),(252.372,117.399,50.),(252.372,117.399,30.),(228.417,192.736,50.),(252.372,117.399,30.),(254.886,112.148,50.),(254.886,112.148,30.),(252.372,117.399,50.),(254.886,112.148,50.),(259.277,109.966,30.),(254.886,112.148,30.),(259.277,109.966,50.),(259.277,109.966,30.),(259.277,105.405,50.),(259.277,105.405,30.),(259.277,109.966,50.),(259.277,105.405,50.),(235.647,105.405,30.),(259.277,105.405,30.),(235.647,105.405,50.),(235.647,105.405,50.),(235.647,109.966,30.),(235.647,105.405,30.),(235.647,109.966,50.),(235.647,109.966,50.),(238.142,111.698,30.),(235.647,109.966,30.),(238.142,111.698,50.),(238.142,111.698,50.),(238.973,114.189,30.),(238.142,111.698,30.),(238.973,114.189,50.),(238.973,114.189,50.),(237.011,122.297,30.),(238.973,114.189,30.),(237.011,122.297,50.),(237.011,122.297,50.),(215.05,191.047,30.),(237.011,122.297,30.),(215.05,191.047,50.),(215.05,191.047,50.),(180.339,191.047,30.),(215.05,191.047,30.),(180.339,191.047,50.),(180.339,209.459,30.),(216.653,209.459,50.),(216.653,209.459,30.),(180.339,209.459,50.),(216.653,209.459,50.),(229.824,210.726,30.),(216.653,209.459,30.),(229.824,210.726,50.),(229.824,210.726,30.),(237.283,215.372,50.),(237.283,215.372,30.),(229.824,210.726,50.),(237.283,215.372,50.),(240.229,219.774,30.),(237.283,215.372,30.),(240.229,219.774,50.),(240.229,219.774,50.),(242.334,225.549,30.),(240.229,219.774,30.),(242.334,225.549,50.),(242.334,225.549,50.),(243.597,232.696,30.),(242.334,225.549,30.),(243.597,232.696,50.),(243.597,232.696,50.),(244.018,241.216,30.),(243.597,232.696,30.),(244.018,241.216,50.),(244.018,241.216,50.),(243.623,249.535,30.),(244.018,241.216,30.),(243.623,249.535,50.),(243.623,249.535,50.),(242.44,256.757,30.),(243.623,249.535,30.),(242.44,256.757,50.),(242.44,256.757,50.),(240.469,262.88,30.),(242.44,256.757,30.),(240.469,262.88,50.),(240.469,262.88,50.),(237.709,267.905,30.),(240.469,262.88,30.),(237.709,267.905,50.),(237.709,267.905,50.),(234.305,271.527,30.),(237.709,267.905,30.),(234.305,271.527,50.),(234.305,271.527,50.),(229.888,274.113,30.),(234.305,271.527,30.),(229.888,274.113,50.),(229.888,274.113,30.),(218.017,276.182,50.),(218.017,276.182,30.),(229.888,274.113,50.),(218.017,276.182,50.),(180.339,276.182,30.),(218.017,276.182,30.),(180.339,276.182,50.),(180.339,276.182,30.),(180.339,209.459,50.),(180.339,209.459,30.),(180.339,276.182,50.),(276.923,264.886,50.),(286.676,278.593,50.),(286.101,283.615,50.),(306.333,188.936,50.),(288.4,272.986,50.),(313.579,207.683,50.),(266.203,287.373,50.),(262.942,294.595,50.),(262.942,290.034,50.),(289.849,294.595,50.),(268.995,283.446,50.),(287.038,287.838,50.),(289.849,290.034,50.),(323.979,105.405,50.),(300.877,109.966,50.),(300.877,105.405,50.),(303.583,111.972,50.),(305.224,114.611,50.),(306.056,118.56,50.),(306.333,124.493,50.),(319.588,114.611,50.),(318.523,124.493,50.),(318.523,188.936,50.),(321.219,111.972,50.),(323.979,109.966,50.),(336.897,272.817,50.),(343.841,259.655,50.),(339.227,283.277,50.),(335.448,290.034,50.),(359.782,294.595,50.),(335.448,294.595,50.),(338.282,287.838,50.),(352.707,281.334,50.),(356.095,286.592,50.),(359.782,290.034,50.),(318.523,188.936,30.),(318.523,124.493,50.),(318.523,124.493,30.),(318.523,188.936,50.),(318.523,124.493,30.),(319.588,114.611,50.),(319.588,114.611,30.),(318.523,124.493,50.),(319.588,114.611,30.),(321.219,111.972,50.),(321.219,111.972,30.),(319.588,114.611,50.),(321.219,111.972,50.),(323.979,109.966,30.),(321.219,111.972,30.),(323.979,109.966,50.),(323.979,109.966,30.),(323.979,105.405,50.),(323.979,105.405,30.),(323.979,109.966,50.),(323.979,105.405,50.),(300.877,105.405,30.),(323.979,105.405,30.),(300.877,105.405,50.),(300.877,105.405,50.),(300.877,109.966,30.),(300.877,105.405,30.),(300.877,109.966,50.),(300.877,109.966,30.),(303.583,111.972,50.),(303.583,111.972,30.),(300.877,109.966,50.),(303.583,111.972,50.),(305.224,114.611,30.),(303.583,111.972,30.),(305.224,114.611,50.),(305.224,114.611,50.),(306.056,118.56,30.),(305.224,114.611,30.),(306.056,118.56,50.),(306.056,118.56,50.),(306.333,124.493,30.),(306.056,118.56,30.),(306.333,124.493,50.),(306.333,124.493,50.),(306.333,188.936,30.),(306.333,124.493,30.),(306.333,188.936,50.),(306.333,188.936,50.),(276.923,264.886,30.),(306.333,188.936,30.),(276.923,264.886,50.),(276.923,264.886,50.),(268.995,283.446,30.),(276.923,264.886,30.),(268.995,283.446,50.),(268.995,283.446,50.),(266.203,287.373,30.),(268.995,283.446,30.),(266.203,287.373,50.),(266.203,287.373,30.),(262.942,290.034,50.),(262.942,290.034,30.),(266.203,287.373,50.),(262.942,290.034,50.),(262.942,294.595,30.),(262.942,290.034,30.),(262.942,294.595,50.),(262.942,294.595,50.),(289.849,294.595,30.),(262.942,294.595,30.),(289.849,294.595,50.),(289.849,294.595,30.),(289.849,290.034,50.),(289.849,290.034,30.),(289.849,294.595,50.),(289.849,290.034,50.),(287.038,287.838,30.),(289.849,290.034,30.),(287.038,287.838,50.),(287.038,287.838,30.),(286.101,283.615,50.),(286.101,283.615,30.),(287.038,287.838,50.),(286.101,283.615,30.),(286.676,278.593,50.),(286.676,278.593,30.),(286.101,283.615,50.),(286.676,278.593,30.),(288.4,272.986,50.),(288.4,272.986,30.),(286.676,278.593,50.),(288.4,272.986,30.),(313.579,207.683,50.),(313.579,207.683,30.),(288.4,272.986,50.),(313.579,207.683,50.),(336.897,272.817,30.),(313.579,207.683,30.),(336.897,272.817,50.),(336.897,272.817,50.),(339.227,283.277,30.),(336.897,272.817,30.),(339.227,283.277,50.),(339.227,283.277,50.),(338.282,287.838,30.),(339.227,283.277,30.),(338.282,287.838,50.),(338.282,287.838,30.),(335.448,290.034,50.),(335.448,290.034,30.),(338.282,287.838,50.),(335.448,290.034,50.),(335.448,294.595,30.),(335.448,290.034,30.),(335.448,294.595,50.),(335.448,294.595,30.),(359.782,294.595,50.),(359.782,294.595,30.),(335.448,294.595,50.),(359.782,294.595,30.),(359.782,290.034,50.),(359.782,290.034,30.),(359.782,294.595,50.),(359.782,290.034,50.),(356.095,286.592,30.),(359.782,290.034,30.),(356.095,286.592,50.),(356.095,286.592,30.),(352.707,281.334,50.),(352.707,281.334,30.),(356.095,286.592,50.),(352.707,281.334,30.),(343.841,259.655,50.),(343.841,259.655,30.),(352.707,281.334,50.),(343.841,259.655,30.),(318.523,188.936,50.),(318.523,188.936,30.),(343.841,259.655,50.),(377.079,140.709,50.),(380.406,182.454,50.),(379.644,198.818,50.),(384.149,126.014,50.),(382.692,167.652,50.),(386.501,154.413,50.),(392.081,115.224,50.),(391.835,142.736,50.),(398.324,133.203,50.),(401.057,107.517,50.),(405.772,126.394,50.),(411.076,102.893,50.),(414.18,122.308,50.),(422.138,101.351,50.),(423.546,120.946,50.),(436.379,103.706,50.),(433.2,122.403,50.),(442.386,126.774,50.),(449.715,110.769,50.),(450.655,133.72,50.),(462.145,122.54,50.),(457.56,142.905,50.),(457.56,177.703,50.),(468.215,157.432,50.),(468.215,177.027,50.),(469.306,147.382,50.),(473.671,139.02,50.),(470.943,144.785,50.),(473.671,142.905,50.),(428.746,166.892,50.),(426.445,206.926,50.),(426.445,166.892,50.),(428.746,206.926,50.),(429.695,172.255,50.),(429.693,201.52,50.),(431.001,198.276,50.),(431.005,175.507,50.),(436.064,196.115,50.),(433.019,177.154,50.),(436.077,177.703,50.),(473.671,196.115,50.),(469.306,187.078,50.),(470.943,189.675,50.),(473.671,191.554,50.),(459.989,239.696,50.),(458.881,250.,50.),(458.03,242.061,50.),(368.071,178.421,50.),(367.465,214.981,50.),(366.857,199.493,50.),(369.287,229.688,50.),(371.712,158.108,50.),(372.324,243.613,50.),(376.576,256.757,50.),(381.28,267.325,50.),(380.475,216.058,50.),(382.967,231.63,50.),(386.699,276.394,50.),(387.121,245.534,50.),(392.831,283.963,50.),(392.936,257.77,50.),(399.677,290.034,50.),(399.284,266.786,50.),(406.398,273.226,50.),(410.802,295.988,50.),(414.279,277.09,50.),(422.694,297.973,50.),(422.927,278.378,50.),(432.806,296.706,50.),(430.196,277.46,50.),(437.262,274.704,50.),(442.002,292.905,50.),(444.126,270.112,50.),(451.603,285.853,50.),(450.788,263.682,50.),(456.858,255.617,50.),(462.93,274.831,50.),(465.743,272.804,50.),(471.71,276.858,50.),(469.75,279.561,50.),(471.71,276.858,30.),(459.989,239.696,50.),(459.989,239.696,30.),(471.71,276.858,50.),(459.989,239.696,50.),(458.03,242.061,30.),(459.989,239.696,30.),(458.03,242.061,50.),(458.03,242.061,50.),(458.881,250.,30.),(458.03,242.061,30.),(458.881,250.,50.),(458.881,250.,50.),(456.858,255.617,30.),(458.881,250.,30.),(456.858,255.617,50.),(456.858,255.617,50.),(450.788,263.682,30.),(456.858,255.617,30.),(450.788,263.682,50.),(450.788,263.682,30.),(444.126,270.112,50.),(444.126,270.112,30.),(450.788,263.682,50.),(444.126,270.112,50.),(437.262,274.704,30.),(444.126,270.112,30.),(437.262,274.704,50.),(437.262,274.704,30.),(430.196,277.46,50.),(430.196,277.46,30.),(437.262,274.704,50.),(430.196,277.46,50.),(422.927,278.378,30.),(430.196,277.46,30.),(422.927,278.378,50.),(422.927,278.378,50.),(414.279,277.09,30.),(422.927,278.378,30.),(414.279,277.09,50.),(414.279,277.09,30.),(406.398,273.226,50.),(406.398,273.226,30.),(414.279,277.09,50.),(406.398,273.226,50.),(399.284,266.786,30.),(406.398,273.226,30.),(399.284,266.786,50.),(399.284,266.786,30.),(392.936,257.77,50.),(392.936,257.77,30.),(399.284,266.786,50.),(392.936,257.77,30.),(387.121,245.534,50.),(387.121,245.534,30.),(392.936,257.77,50.),(387.121,245.534,30.),(382.967,231.63,50.),(382.967,231.63,30.),(387.121,245.534,50.),(382.967,231.63,30.),(380.475,216.058,50.),(380.475,216.058,30.),(382.967,231.63,50.),(380.475,216.058,30.),(379.644,198.818,50.),(379.644,198.818,30.),(380.475,216.058,50.),(379.644,198.818,30.),(380.406,182.454,50.),(380.406,182.454,30.),(379.644,198.818,50.),(380.406,182.454,30.),(382.692,167.652,50.),(382.692,167.652,30.),(380.406,182.454,50.),(382.692,167.652,30.),(386.501,154.413,50.),(386.501,154.413,30.),(382.692,167.652,50.),(386.501,154.413,30.),(391.835,142.736,50.),(391.835,142.736,30.),(386.501,154.413,50.),(391.835,142.736,30.),(398.324,133.203,50.),(398.324,133.203,30.),(391.835,142.736,50.),(398.324,133.203,50.),(405.772,126.394,30.),(398.324,133.203,30.),(405.772,126.394,50.),(405.772,126.394,50.),(414.18,122.308,30.),(405.772,126.394,30.),(414.18,122.308,50.),(414.18,122.308,50.),(423.546,120.946,30.),(414.18,122.308,30.),(423.546,120.946,50.),(423.546,120.946,50.),(433.2,122.403,30.),(423.546,120.946,30.),(433.2,122.403,50.),(433.2,122.403,30.),(442.386,126.774,50.),(442.386,126.774,30.),(433.2,122.403,50.),(442.386,126.774,30.),(450.655,133.72,50.),(450.655,133.72,30.),(442.386,126.774,50.),(450.655,133.72,50.),(457.56,142.905,30.),(450.655,133.72,30.),(457.56,142.905,50.),(457.56,142.905,50.),(457.56,177.703,30.),(457.56,142.905,30.),(457.56,177.703,50.),(457.56,177.703,30.),(436.077,177.703,50.),(436.077,177.703,30.),(457.56,177.703,50.),(436.077,177.703,50.),(433.019,177.154,30.),(436.077,177.703,30.),(433.019,177.154,50.),(433.019,177.154,50.),(431.005,175.507,30.),(433.019,177.154,30.),(431.005,175.507,50.),(431.005,175.507,30.),(429.695,172.255,50.),(429.695,172.255,30.),(431.005,175.507,50.),(429.695,172.255,30.),(428.746,166.892,50.),(428.746,166.892,30.),(429.695,172.255,50.),(428.746,166.892,50.),(426.445,166.892,30.),(428.746,166.892,30.),(426.445,166.892,50.),(426.445,166.892,50.),(426.445,206.926,30.),(426.445,166.892,30.),(426.445,206.926,50.),(426.445,206.926,50.),(428.746,206.926,30.),(426.445,206.926,30.),(428.746,206.926,50.),(428.746,206.926,30.),(429.693,201.52,50.),(429.693,201.52,30.),(428.746,206.926,50.),(429.693,201.52,30.),(431.001,198.276,50.),(431.001,198.276,30.),(429.693,201.52,50.),(431.001,198.276,50.),(436.064,196.115,30.),(431.001,198.276,30.),(436.064,196.115,50.),(436.064,196.115,50.),(473.671,196.115,30.),(436.064,196.115,30.),(473.671,196.115,50.),(473.671,196.115,30.),(473.671,191.554,50.),(473.671,191.554,30.),(473.671,196.115,50.),(473.671,191.554,50.),(470.943,189.675,30.),(473.671,191.554,30.),(470.943,189.675,50.),(470.943,189.675,30.),(469.306,187.078,50.),(469.306,187.078,30.),(470.943,189.675,50.),(469.306,187.078,30.),(468.215,177.027,50.),(468.215,177.027,30.),(469.306,187.078,50.),(468.215,177.027,30.),(468.215,157.432,50.),(468.215,157.432,30.),(468.215,177.027,50.),(468.215,157.432,30.),(469.306,147.382,50.),(469.306,147.382,30.),(468.215,157.432,50.),(469.306,147.382,30.),(470.943,144.785,50.),(470.943,144.785,30.),(469.306,147.382,50.),(470.943,144.785,50.),(473.671,142.905,30.),(470.943,144.785,30.),(473.671,142.905,50.),(473.671,142.905,30.),(473.671,139.02,50.),(473.671,139.02,30.),(473.671,142.905,50.),(473.671,139.02,30.),(462.145,122.54,50.),(462.145,122.54,30.),(473.671,139.02,50.),(462.145,122.54,50.),(449.715,110.769,30.),(462.145,122.54,30.),(449.715,110.769,50.),(449.715,110.769,50.),(436.379,103.706,30.),(449.715,110.769,30.),(436.379,103.706,50.),(436.379,103.706,50.),(422.138,101.351,30.),(436.379,103.706,30.),(422.138,101.351,50.),(422.138,101.351,30.),(411.076,102.893,50.),(411.076,102.893,30.),(422.138,101.351,50.),(411.076,102.893,50.),(401.057,107.517,30.),(411.076,102.893,30.),(401.057,107.517,50.),(401.057,107.517,30.),(392.081,115.224,50.),(392.081,115.224,30.),(401.057,107.517,50.),(392.081,115.224,50.),(384.149,126.014,30.),(392.081,115.224,30.),(384.149,126.014,50.),(384.149,126.014,50.),(377.079,140.709,30.),(384.149,126.014,30.),(377.079,140.709,50.),(377.079,140.709,50.),(371.712,158.108,30.),(377.079,140.709,30.),(371.712,158.108,50.),(371.712,158.108,50.),(368.071,178.421,30.),(371.712,158.108,30.),(368.071,178.421,50.),(368.071,178.421,50.),(366.857,199.493,30.),(368.071,178.421,30.),(366.857,199.493,50.),(366.857,199.493,50.),(367.465,214.981,30.),(366.857,199.493,30.),(367.465,214.981,50.),(367.465,214.981,50.),(369.287,229.688,30.),(367.465,214.981,30.),(369.287,229.688,50.),(369.287,229.688,50.),(372.324,243.613,30.),(369.287,229.688,30.),(372.324,243.613,50.),(372.324,243.613,50.),(376.576,256.757,30.),(372.324,243.613,30.),(376.576,256.757,50.),(376.576,256.757,50.),(381.28,267.325,30.),(376.576,256.757,30.),(381.28,267.325,50.),(381.28,267.325,50.),(386.699,276.394,30.),(381.28,267.325,30.),(386.699,276.394,50.),(386.699,276.394,50.),(392.831,283.963,30.),(386.699,276.394,30.),(392.831,283.963,50.),(392.831,283.963,30.),(399.677,290.034,50.),(399.677,290.034,30.),(392.831,283.963,50.),(399.677,290.034,50.),(410.802,295.988,30.),(399.677,290.034,30.),(410.802,295.988,50.),(410.802,295.988,30.),(422.694,297.973,50.),(422.694,297.973,30.),(410.802,295.988,50.),(422.694,297.973,50.),(432.806,296.706,30.),(422.694,297.973,30.),(432.806,296.706,50.),(432.806,296.706,50.),(442.002,292.905,30.),(432.806,296.706,30.),(442.002,292.905,50.),(442.002,292.905,50.),(451.603,285.853,30.),(442.002,292.905,30.),(451.603,285.853,50.),(451.603,285.853,50.),(462.93,274.831,30.),(451.603,285.853,30.),(462.93,274.831,50.),(462.93,274.831,50.),(465.743,272.804,30.),(462.93,274.831,30.),(465.743,272.804,50.),(465.743,272.804,50.),(469.75,279.561,30.),(465.743,272.804,30.),(469.75,279.561,50.),(469.75,279.561,30.),(471.71,276.858,50.),(471.71,276.858,30.),(469.75,279.561,50.),(499.322,140.709,50.),(502.649,182.454,50.),(501.888,198.818,50.),(506.392,126.014,50.),(504.935,167.652,50.),(508.745,154.413,50.),(514.324,115.224,50.),(514.078,142.736,50.),(520.567,133.203,50.),(523.3,107.517,50.),(528.016,126.394,50.),(533.319,102.893,50.),(536.423,122.308,50.),(544.382,101.351,50.),(545.789,120.946,50.),(558.622,103.706,50.),(555.444,122.403,50.),(564.629,126.774,50.),(571.958,110.769,50.),(572.898,133.72,50.),(584.388,122.54,50.),(579.803,142.905,50.),(579.803,177.703,50.),(591.549,147.382,50.),(590.459,157.432,50.),(595.914,139.02,50.),(593.186,144.785,50.),(595.914,142.905,50.),(550.989,166.892,50.),(548.688,206.926,50.),(548.688,166.892,50.),(550.989,206.926,50.),(551.936,201.52,50.),(551.938,172.255,50.),(553.244,198.276,50.),(553.248,175.507,50.),(558.307,196.115,50.),(555.262,177.154,50.),(558.321,177.703,50.),(595.914,196.115,50.),(591.549,187.078,50.),(590.459,177.027,50.),(593.186,189.675,50.),(595.914,191.554,50.),(582.232,239.696,50.),(581.124,250.,50.),(580.273,242.061,50.),(490.314,178.421,50.),(489.708,214.981,50.),(489.101,199.493,50.),(491.53,229.688,50.),(493.956,158.108,50.),(494.567,243.613,50.),(498.819,256.757,50.),(503.523,267.325,50.),(502.718,216.058,50.),(505.211,231.63,50.),(508.942,276.394,50.),(509.364,245.534,50.),(515.074,283.963,50.),(515.179,257.77,50.),(521.92,290.034,50.),(521.527,266.786,50.),(528.641,273.226,50.),(533.045,295.988,50.),(536.522,277.09,50.),(544.937,297.973,50.),(545.17,278.378,50.),(555.049,296.706,50.),(552.439,277.46,50.),(559.505,274.704,50.),(564.245,292.905,50.),(566.369,270.112,50.),(573.846,285.853,50.),(573.031,263.682,50.),(579.101,255.617,50.),(585.173,274.831,50.),(587.986,272.804,50.),(593.954,276.858,50.),(591.993,279.561,50.),(593.954,276.858,30.),(582.232,239.696,50.),(582.232,239.696,30.),(593.954,276.858,50.),(582.232,239.696,50.),(580.273,242.061,30.),(582.232,239.696,30.),(580.273,242.061,50.),(580.273,242.061,50.),(581.124,250.,30.),(580.273,242.061,30.),(581.124,250.,50.),(581.124,250.,50.),(579.101,255.617,30.),(581.124,250.,30.),(579.101,255.617,50.),(579.101,255.617,50.),(573.031,263.682,30.),(579.101,255.617,30.),(573.031,263.682,50.),(573.031,263.682,30.),(566.369,270.112,50.),(566.369,270.112,30.),(573.031,263.682,50.),(566.369,270.112,30.),(559.505,274.704,50.),(559.505,274.704,30.),(566.369,270.112,50.),(559.505,274.704,50.),(552.439,277.46,30.),(559.505,274.704,30.),(552.439,277.46,50.),(552.439,277.46,50.),(545.17,278.378,30.),(552.439,277.46,30.),(545.17,278.378,50.),(545.17,278.378,30.),(536.522,277.09,50.),(536.522,277.09,30.),(545.17,278.378,50.),(536.522,277.09,50.),(528.641,273.226,30.),(536.522,277.09,30.),(528.641,273.226,50.),(528.641,273.226,50.),(521.527,266.786,30.),(528.641,273.226,30.),(521.527,266.786,50.),(521.527,266.786,30.),(515.179,257.77,50.),(515.179,257.77,30.),(521.527,266.786,50.),(515.179,257.77,30.),(509.364,245.534,50.),(509.364,245.534,30.),(515.179,257.77,50.),(509.364,245.534,30.),(505.211,231.63,50.),(505.211,231.63,30.),(509.364,245.534,50.),(505.211,231.63,30.),(502.718,216.058,50.),(502.718,216.058,30.),(505.211,231.63,50.),(502.718,216.058,30.),(501.888,198.818,50.),(501.888,198.818,30.),(502.718,216.058,50.),(501.888,198.818,30.),(502.649,182.454,50.),(502.649,182.454,30.),(501.888,198.818,50.),(502.649,182.454,30.),(504.935,167.652,50.),(504.935,167.652,30.),(502.649,182.454,50.),(504.935,167.652,30.),(508.745,154.413,50.),(508.745,154.413,30.),(504.935,167.652,50.),(508.745,154.413,30.),(514.078,142.736,50.),(514.078,142.736,30.),(508.745,154.413,50.),(514.078,142.736,30.),(520.567,133.203,50.),(520.567,133.203,30.),(514.078,142.736,50.),(520.567,133.203,50.),(528.016,126.394,30.),(520.567,133.203,30.),(528.016,126.394,50.),(528.016,126.394,50.),(536.423,122.308,30.),(528.016,126.394,30.),(536.423,122.308,50.),(536.423,122.308,50.),(545.789,120.946,30.),(536.423,122.308,30.),(545.789,120.946,50.),(545.789,120.946,50.),(555.444,122.403,30.),(545.789,120.946,30.),(555.444,122.403,50.),(555.444,122.403,30.),(564.629,126.774,50.),(564.629,126.774,30.),(555.444,122.403,50.),(564.629,126.774,30.),(572.898,133.72,50.),(572.898,133.72,30.),(564.629,126.774,50.),(572.898,133.72,50.),(579.803,142.905,30.),(572.898,133.72,30.),(579.803,142.905,50.),(579.803,142.905,50.),(579.803,177.703,30.),(579.803,142.905,30.),(579.803,177.703,50.),(579.803,177.703,50.),(558.321,177.703,30.),(579.803,177.703,30.),(558.321,177.703,50.),(558.321,177.703,50.),(555.262,177.154,30.),(558.321,177.703,30.),(555.262,177.154,50.),(555.262,177.154,50.),(553.248,175.507,30.),(555.262,177.154,30.),(553.248,175.507,50.),(553.248,175.507,30.),(551.938,172.255,50.),(551.938,172.255,30.),(553.248,175.507,50.),(551.938,172.255,30.),(550.989,166.892,50.),(550.989,166.892,30.),(551.938,172.255,50.),(550.989,166.892,50.),(548.688,166.892,30.),(550.989,166.892,30.),(548.688,166.892,50.),(548.688,166.892,50.),(548.688,206.926,30.),(548.688,166.892,30.),(548.688,206.926,50.),(548.688,206.926,30.),(550.989,206.926,50.),(550.989,206.926,30.),(548.688,206.926,50.),(550.989,206.926,30.),(551.936,201.52,50.),(551.936,201.52,30.),(550.989,206.926,50.),(551.936,201.52,30.),(553.244,198.276,50.),(553.244,198.276,30.),(551.936,201.52,50.),(553.244,198.276,50.),(558.307,196.115,30.),(553.244,198.276,30.),(558.307,196.115,50.),(558.307,196.115,50.),(595.914,196.115,30.),(558.307,196.115,30.),(595.914,196.115,50.),(595.914,196.115,30.),(595.914,191.554,50.),(595.914,191.554,30.),(595.914,196.115,50.),(595.914,191.554,50.),(593.186,189.675,30.),(595.914,191.554,30.),(593.186,189.675,50.),(593.186,189.675,30.),(591.549,187.078,50.),(591.549,187.078,30.),(593.186,189.675,50.),(591.549,187.078,30.),(590.459,177.027,50.),(590.459,177.027,30.),(591.549,187.078,50.),(590.459,177.027,30.),(590.459,157.432,50.),(590.459,157.432,30.),(590.459,177.027,50.),(590.459,157.432,30.),(591.549,147.382,50.),(591.549,147.382,30.),(590.459,157.432,50.),(591.549,147.382,30.),(593.186,144.785,50.),(593.186,144.785,30.),(591.549,147.382,50.),(593.186,144.785,50.),(595.914,142.905,30.),(593.186,144.785,30.),(595.914,142.905,50.),(595.914,142.905,30.),(595.914,139.02,50.),(595.914,139.02,30.),(595.914,142.905,50.),(595.914,139.02,30.),(584.388,122.54,50.),(584.388,122.54,30.),(595.914,139.02,50.),(584.388,122.54,50.),(571.958,110.769,30.),(584.388,122.54,30.),(571.958,110.769,50.),(571.958,110.769,50.),(558.622,103.706,30.),(571.958,110.769,30.),(558.622,103.706,50.),(558.622,103.706,50.),(544.382,101.351,30.),(558.622,103.706,30.),(544.382,101.351,50.),(544.382,101.351,30.),(533.319,102.893,50.),(533.319,102.893,30.),(544.382,101.351,50.),(533.319,102.893,30.),(523.3,107.517,50.),(523.3,107.517,30.),(533.319,102.893,50.),(523.3,107.517,30.),(514.324,115.224,50.),(514.324,115.224,30.),(523.3,107.517,50.),(514.324,115.224,50.),(506.392,126.014,30.),(514.324,115.224,30.),(506.392,126.014,50.),(506.392,126.014,50.),(499.322,140.709,30.),(506.392,126.014,30.),(499.322,140.709,50.),(499.322,140.709,50.),(493.956,158.108,30.),(499.322,140.709,30.),(493.956,158.108,50.),(493.956,158.108,50.),(490.314,178.421,30.),(493.956,158.108,30.),(490.314,178.421,50.),(490.314,178.421,50.),(489.101,199.493,30.),(490.314,178.421,30.),(489.101,199.493,50.),(489.101,199.493,50.),(489.708,214.981,30.),(489.101,199.493,30.),(489.708,214.981,50.),(489.708,214.981,50.),(491.53,229.688,30.),(489.708,214.981,30.),(491.53,229.688,50.),(491.53,229.688,50.),(494.567,243.613,30.),(491.53,229.688,30.),(494.567,243.613,50.),(494.567,243.613,50.),(498.819,256.757,30.),(494.567,243.613,30.),(498.819,256.757,50.),(498.819,256.757,50.),(503.523,267.325,30.),(498.819,256.757,30.),(503.523,267.325,50.),(503.523,267.325,50.),(508.942,276.394,30.),(503.523,267.325,30.),(508.942,276.394,50.),(508.942,276.394,50.),(515.074,283.963,30.),(508.942,276.394,30.),(515.074,283.963,50.),(515.074,283.963,30.),(521.92,290.034,50.),(521.92,290.034,30.),(515.074,283.963,50.),(521.92,290.034,30.),(533.045,295.988,50.),(533.045,295.988,30.),(521.92,290.034,50.),(533.045,295.988,50.),(544.937,297.973,30.),(533.045,295.988,30.),(544.937,297.973,50.),(544.937,297.973,50.),(555.049,296.706,30.),(544.937,297.973,30.),(555.049,296.706,50.),(555.049,296.706,50.),(564.245,292.905,30.),(555.049,296.706,30.),(564.245,292.905,50.),(564.245,292.905,50.),(573.846,285.853,30.),(564.245,292.905,30.),(573.846,285.853,50.),(573.846,285.853,50.),(585.173,274.831,30.),(573.846,285.853,30.),(585.173,274.831,50.),(585.173,274.831,50.),(587.986,272.804,30.),(585.173,274.831,30.),(587.986,272.804,50.),(587.986,272.804,50.),(591.993,279.561,30.),(587.986,272.804,30.),(591.993,279.561,50.),(591.993,279.561,30.),(593.954,276.858,50.),(593.954,276.858,30.),(591.993,279.561,50.),(631.291,193.919,30.),(631.291,123.818,50.),(631.291,123.818,30.),(631.291,193.919,50.),(631.291,123.818,50.),(690.282,123.818,30.),(631.291,123.818,30.),(690.282,123.818,50.),(690.282,123.818,30.),(695.354,125.979,50.),(695.354,125.979,30.),(690.282,123.818,50.),(695.354,125.979,50.),(696.665,129.222,30.),(695.354,125.979,30.),(696.665,129.222,50.),(696.665,129.222,50.),(697.613,134.628,30.),(696.665,129.222,30.),(697.613,134.628,50.),(697.613,134.628,30.),(700.,134.628,50.),(700.,134.628,30.),(697.613,134.628,50.),(700.,134.628,30.),(700.,94.595,50.),(700.,94.595,30.),(700.,134.628,50.),(700.,94.595,50.),(697.613,94.595,30.),(700.,94.595,30.),(697.613,94.595,50.),(697.613,94.595,50.),(696.675,99.958,30.),(697.613,94.595,30.),(696.675,99.958,50.),(696.675,99.958,50.),(695.397,103.209,30.),(696.675,99.958,30.),(695.397,103.209,50.),(695.397,103.209,30.),(693.415,104.856,50.),(693.415,104.856,30.),(695.397,103.209,50.),(693.415,104.856,50.),(690.367,105.405,30.),(693.415,104.856,30.),(690.367,105.405,50.),(690.367,105.405,50.),(613.645,105.405,30.),(690.367,105.405,30.),(613.645,105.405,50.),(613.645,105.405,50.),(613.645,109.966,30.),(613.645,105.405,30.),(613.645,109.966,50.),(613.645,109.966,50.),(616.405,111.972,30.),(613.645,109.966,30.),(616.405,111.972,50.),(616.405,111.972,50.),(618.036,114.611,30.),(616.405,111.972,30.),(618.036,114.611,50.),(618.036,114.611,50.),(619.101,124.493,30.),(618.036,114.611,30.),(619.101,124.493,50.),(619.101,124.493,50.),(619.101,275.507,30.),(619.101,124.493,30.),(619.101,275.507,50.),(619.101,275.507,50.),(618.824,281.546,30.),(619.101,275.507,30.),(618.824,281.546,50.),(618.824,281.546,50.),(617.993,285.473,30.),(618.824,281.546,30.),(617.993,285.473,50.),(617.993,285.473,50.),(616.352,288.049,30.),(617.993,285.473,30.),(616.352,288.049,50.),(616.352,288.049,30.),(613.645,290.034,50.),(613.645,290.034,30.),(616.352,288.049,50.),(699.403,305.405,30.),(699.403,265.372,50.),(699.403,265.372,30.),(699.403,305.405,50.),(699.403,265.372,50.),(697.102,265.372,30.),(699.403,265.372,30.),(697.102,265.372,50.),(697.102,265.372,50.),(696.1,270.778,30.),(697.102,265.372,30.),(696.1,270.778,50.),(696.1,270.778,50.),(694.8,274.021,30.),(696.1,270.778,30.),(694.8,274.021,50.),(694.8,274.021,30.),(692.818,275.642,50.),(692.818,275.642,30.),(694.8,274.021,50.),(692.818,275.642,50.),(689.77,276.182,30.),(692.818,275.642,30.),(689.77,276.182,50.),(689.77,276.182,30.),(631.291,276.182,50.),(631.291,276.182,30.),(689.77,276.182,50.),(631.291,276.182,30.),(631.291,212.331,50.),(631.291,212.331,30.),(631.291,276.182,50.),(631.291,212.331,30.),(668.544,212.331,50.),(668.544,212.331,30.),(631.291,212.331,50.),(668.544,212.331,50.),(671.592,212.88,30.),(668.544,212.331,30.),(671.592,212.88,50.),(671.592,212.88,30.),(673.574,214.527,50.),(673.574,214.527,30.),(671.592,212.88,50.),(673.574,214.527,50.),(674.874,217.779,30.),(673.574,214.527,30.),(674.874,217.779,50.),(674.874,217.779,50.),(675.875,223.142,30.),(674.874,217.779,30.),(675.875,223.142,50.),(675.875,223.142,30.),(678.177,223.142,50.),(678.177,223.142,30.),(675.875,223.142,50.),(678.177,223.142,30.),(678.177,183.108,50.),(678.177,183.108,30.),(678.177,223.142,50.),(678.177,183.108,50.),(675.875,183.108,30.),(678.177,183.108,30.),(675.875,183.108,50.),(675.875,183.108,50.),(674.863,188.514,30.),(675.875,183.108,30.),(674.863,188.514,50.),(674.863,188.514,50.),(673.531,191.757,30.),(674.863,188.514,30.),(673.531,191.757,50.),(673.531,191.757,30.),(668.544,193.919,50.),(668.544,193.919,30.),(673.531,191.757,50.),(668.544,193.919,50.),(631.291,193.919,30.),(668.544,193.919,30.),(631.291,193.919,50.),(690.367,105.405,50.),(613.645,109.966,50.),(613.645,105.405,50.),(616.405,111.972,50.),(618.036,114.611,50.),(619.101,124.493,50.),(631.291,123.818,50.),(619.101,275.507,50.),(690.282,123.818,50.),(695.354,125.979,50.),(693.415,104.856,50.),(695.397,103.209,50.),(696.665,129.222,50.),(696.675,99.958,50.),(697.613,134.628,50.),(697.613,94.595,50.),(700.,94.595,50.),(700.,134.628,50.),(631.291,193.919,50.),(631.291,212.331,50.),(668.544,212.331,50.),(668.544,193.919,50.),(673.531,191.757,50.),(671.592,212.88,50.),(673.574,214.527,50.),(674.863,188.514,50.),(674.874,217.779,50.),(675.875,183.108,50.),(675.875,223.142,50.),(678.177,183.108,50.),(678.177,223.142,50.),(616.352,288.049,50.),(613.645,294.595,50.),(613.645,290.034,50.),(689.77,294.595,50.),(617.993,285.473,50.),(618.824,281.546,50.),(631.291,276.182,50.),(689.77,276.182,50.),(692.818,275.642,50.),(692.818,295.144,50.),(694.8,296.791,50.),(694.8,274.021,50.),(696.1,300.042,50.),(696.1,270.778,50.),(697.102,265.372,50.),(697.102,305.405,50.),(699.403,265.372,50.),(699.403,305.405,50.),(613.645,290.034,50.),(613.645,294.595,30.),(613.645,290.034,30.),(613.645,294.595,50.),(697.102,305.405,50.),(699.403,305.405,30.),(697.102,305.405,30.),(699.403,305.405,50.),(613.645,294.595,50.),(689.77,294.595,30.),(613.645,294.595,30.),(689.77,294.595,50.),(696.1,300.042,50.),(697.102,305.405,30.),(696.1,300.042,30.),(697.102,305.405,50.),(689.77,294.595,50.),(692.818,295.144,30.),(689.77,294.595,30.),(692.818,295.144,50.),(692.818,295.144,30.),(694.8,296.791,50.),(694.8,296.791,30.),(692.818,295.144,50.),(694.8,296.791,50.),(696.1,300.042,30.),(694.8,296.791,30.),(696.1,300.042,50.),(689.77,294.595,30.),(613.645,290.034,30.),(613.645,294.595,30.),(616.352,288.049,30.),(617.993,285.473,30.),(618.824,281.546,30.),(619.101,275.507,30.),(631.291,276.182,30.),(619.101,124.493,30.),(631.291,212.331,30.),(689.77,276.182,30.),(692.818,295.144,30.),(692.818,275.642,30.),(694.8,296.791,30.),(694.8,274.021,30.),(696.1,300.042,30.),(696.1,270.778,30.),(697.102,305.405,30.),(697.102,265.372,30.),(699.403,265.372,30.),(699.403,305.405,30.),(631.291,193.919,30.),(631.291,123.818,30.),(668.544,212.331,30.),(668.544,193.919,30.),(671.592,212.88,30.),(673.531,191.757,30.),(673.574,214.527,30.),(674.863,188.514,30.),(674.874,217.779,30.),(675.875,183.108,30.),(675.875,223.142,30.),(678.177,223.142,30.),(678.177,183.108,30.),(616.405,111.972,30.),(613.645,105.405,30.),(613.645,109.966,30.),(690.367,105.405,30.),(618.036,114.611,30.),(690.282,123.818,30.),(695.354,125.979,30.),(693.415,104.856,30.),(695.397,103.209,30.),(696.665,129.222,30.),(696.675,99.958,30.),(697.613,134.628,30.),(697.613,94.595,30.),(700.,94.595,30.),(700.,134.628,30.),(489.708,214.981,30.),(490.314,178.421,30.),(489.101,199.493,30.),(491.53,229.688,30.),(493.956,158.108,30.),(494.567,243.613,30.),(499.322,140.709,30.),(498.819,256.757,30.),(503.523,267.325,30.),(501.888,198.818,30.),(502.718,216.058,30.),(505.211,231.63,30.),(508.942,276.394,30.),(509.364,245.534,30.),(515.074,283.963,30.),(515.179,257.77,30.),(521.92,290.034,30.),(521.527,266.786,30.),(528.641,273.226,30.),(533.045,295.988,30.),(536.522,277.09,30.),(544.937,297.973,30.),(545.17,278.378,30.),(555.049,296.706,30.),(552.439,277.46,30.),(559.505,274.704,30.),(564.245,292.905,30.),(566.369,270.112,30.),(573.846,285.853,30.),(573.031,263.682,30.),(579.101,255.617,30.),(585.173,274.831,30.),(581.124,250.,30.),(582.232,239.696,30.),(587.986,272.804,30.),(593.954,276.858,30.),(591.993,279.561,30.),(580.273,242.061,30.),(550.989,206.926,30.),(548.688,166.892,30.),(548.688,206.926,30.),(550.989,166.892,30.),(551.936,201.52,30.),(551.938,172.255,30.),(553.244,198.276,30.),(553.248,175.507,30.),(558.307,196.115,30.),(555.262,177.154,30.),(558.321,177.703,30.),(595.914,196.115,30.),(579.803,177.703,30.),(591.549,187.078,30.),(579.803,142.905,30.),(584.388,122.54,30.),(590.459,177.027,30.),(590.459,157.432,30.),(593.186,189.675,30.),(595.914,191.554,30.),(591.549,147.382,30.),(595.914,139.02,30.),(593.186,144.785,30.),(595.914,142.905,30.),(502.649,182.454,30.),(506.392,126.014,30.),(504.935,167.652,30.),(508.745,154.413,30.),(514.324,115.224,30.),(514.078,142.736,30.),(520.567,133.203,30.),(523.3,107.517,30.),(528.016,126.394,30.),(533.319,102.893,30.),(536.423,122.308,30.),(544.382,101.351,30.),(545.789,120.946,30.),(558.622,103.706,30.),(555.444,122.403,30.),(564.629,126.774,30.),(571.958,110.769,30.),(572.898,133.72,30.),(367.465,214.981,30.),(368.071,178.421,30.),(366.857,199.493,30.),(369.287,229.688,30.),(371.712,158.108,30.),(372.324,243.613,30.),(377.079,140.709,30.),(376.576,256.757,30.),(381.28,267.325,30.),(379.644,198.818,30.),(380.475,216.058,30.),(382.967,231.63,30.),(386.699,276.394,30.),(387.121,245.534,30.),(392.831,283.963,30.),(392.936,257.77,30.),(399.677,290.034,30.),(399.284,266.786,30.),(406.398,273.226,30.),(410.802,295.988,30.),(414.279,277.09,30.),(422.694,297.973,30.),(422.927,278.378,30.),(432.806,296.706,30.),(430.196,277.46,30.),(437.262,274.704,30.),(442.002,292.905,30.),(444.126,270.112,30.),(451.603,285.853,30.),(450.788,263.682,30.),(456.858,255.617,30.),(462.93,274.831,30.),(458.881,250.,30.),(459.989,239.696,30.),(465.743,272.804,30.),(471.71,276.858,30.),(469.75,279.561,30.),(458.03,242.061,30.),(426.445,206.926,30.),(428.746,166.892,30.),(426.445,166.892,30.),(428.746,206.926,30.),(429.693,201.52,30.),(429.695,172.255,30.),(431.001,198.276,30.),(431.005,175.507,30.),(436.064,196.115,30.),(433.019,177.154,30.),(436.077,177.703,30.),(473.671,196.115,30.),(457.56,177.703,30.),(469.306,187.078,30.),(457.56,142.905,30.),(462.145,122.54,30.),(468.215,177.027,30.),(470.943,189.675,30.),(473.671,191.554,30.),(469.306,147.382,30.),(473.671,139.02,30.),(468.215,157.432,30.),(470.943,144.785,30.),(473.671,142.905,30.),(380.406,182.454,30.),(384.149,126.014,30.),(382.692,167.652,30.),(386.501,154.413,30.),(392.081,115.224,30.),(391.835,142.736,30.),(398.324,133.203,30.),(401.057,107.517,30.),(405.772,126.394,30.),(411.076,102.893,30.),(414.18,122.308,30.),(422.138,101.351,30.),(423.546,120.946,30.),(436.379,103.706,30.),(433.2,122.403,30.),(442.386,126.774,30.),(449.715,110.769,30.),(450.655,133.72,30.),(289.849,294.595,30.),(262.942,290.034,30.),(262.942,294.595,30.),(266.203,287.373,30.),(268.995,283.446,30.),(276.923,264.886,30.),(287.038,287.838,30.),(286.101,283.615,30.),(289.849,290.034,30.),(286.676,278.593,30.),(306.333,188.936,30.),(288.4,272.986,30.),(313.579,207.683,30.),(306.333,124.493,30.),(359.782,294.595,30.),(335.448,290.034,30.),(335.448,294.595,30.),(338.282,287.838,30.),(339.227,283.277,30.),(352.707,281.334,30.),(343.841,259.655,30.),(356.095,286.592,30.),(359.782,290.034,30.),(336.897,272.817,30.),(318.523,188.936,30.),(300.877,109.966,30.),(323.979,105.405,30.),(300.877,105.405,30.),(303.583,111.972,30.),(305.224,114.611,30.),(306.056,118.56,30.),(319.588,114.611,30.),(318.523,124.493,30.),(321.219,111.972,30.),(323.979,109.966,30.),(219.381,294.595,30.),(162.693,290.034,30.),(162.693,294.595,30.),(165.399,288.049,30.),(167.04,285.473,30.),(167.871,281.546,30.),(168.148,275.507,30.),(180.339,276.182,30.),(180.339,124.493,30.),(180.339,191.047,30.),(218.017,276.182,30.),(229.888,274.113,30.),(228.13,293.919,30.),(235.109,291.892,30.),(234.305,271.527,30.),(237.709,267.905,30.),(240.81,288.26,30.),(240.469,262.88,30.),(242.44,256.757,30.),(245.722,282.77,30.),(243.623,249.535,30.),(244.018,241.216,30.),(244.849,202.191,30.),(248.706,207.855,30.),(250.049,275.042,30.),(251.727,214.722,30.),(253.139,265.709,30.),(253.885,222.741,30.),(254.993,254.772,30.),(255.179,231.91,30.),(255.611,242.23,30.),(229.824,210.726,30.),(228.417,192.736,30.),(216.653,209.459,30.),(234.704,194.632,30.),(237.283,215.372,30.),(240.181,197.783,30.),(240.229,219.774,30.),(242.334,225.549,30.),(243.597,232.696,30.),(180.339,209.459,30.),(215.05,191.047,30.),(237.011,122.297,30.),(252.372,117.399,30.),(238.973,114.189,30.),(235.647,109.966,30.),(259.277,105.405,30.),(235.647,105.405,30.),(238.142,111.698,30.),(254.886,112.148,30.),(259.277,109.966,30.),(165.452,111.972,30.),(162.693,105.405,30.),(162.693,109.966,30.),(185.794,105.405,30.),(167.083,114.611,30.),(168.148,124.493,30.),(181.447,114.611,30.),(180.616,118.56,30.),(183.088,111.972,30.),(185.794,109.966,30.),(49.741,294.595,30.),(52.448,288.049,30.),(49.741,290.034,30.),(107.027,294.595,30.),(54.089,285.473,30.),(54.92,281.546,30.),(55.197,275.507,30.),(67.387,276.182,30.),(67.387,213.514,30.),(102.594,276.182,30.),(115.083,274.916,30.),(121.519,292.314,30.),(122.542,269.932,30.),(126.697,289.253,30.),(125.861,265.034,30.),(128.232,258.953,30.),(131.151,284.628,30.),(129.654,251.689,30.),(130.128,243.243,30.),(128.487,229.265,30.),(128.168,204.561,30.),(126.436,223.955,30.),(134.135,212.099,30.),(129.718,235.695,30.),(135.574,277.196,30.),(138.397,221.199,30.),(138.951,267.399,30.),(140.955,231.862,30.),(141.093,256.081,30.),(141.807,244.088,30.),(67.387,195.101,30.),(67.387,123.818,30.),(103.617,213.514,30.),(104.299,195.101,30.),(116.276,214.78,30.),(117.469,193.581,30.),(123.565,219.764,30.),(121.615,191.385,30.),(125.269,187.838,30.),(128.775,182.348,30.),(135.515,196.59,30.),(131.279,175.507,30.),(132.782,167.314,30.),(133.283,157.77,30.),(49.741,109.966,30.),(108.817,105.405,30.),(49.741,105.405,30.),(52.448,111.972,30.),(54.089,114.611,30.),(54.92,118.56,30.),(55.197,124.493,30.),(105.407,123.818,30.),(118.705,125.253,30.),(118.173,106.208,30.),(125.44,108.615,30.),(122.755,127.386,30.),(126.378,130.912,30.),(131.301,113.007,30.),(129.399,135.821,30.),(131.556,141.934,30.),(136.437,119.764,30.),(132.851,149.25,30.),(140.763,186.191,30.),(140.166,127.544,30.),(142.83,136.529,30.),(143.912,173.364,30.),(144.429,146.717,30.),(144.961,158.108,30.),(-21.866,294.595,30.),(-97.991,290.034,30.),(-97.991,294.595,30.),(-95.284,288.049,30.),(-93.643,285.473,30.),(-92.812,281.546,30.),(-92.535,275.507,30.),(-80.345,276.182,30.),(-21.866,276.182,30.),(-18.818,295.144,30.),(-18.818,275.642,30.),(-16.836,274.021,30.),(-16.836,296.791,30.),(-15.536,300.042,30.),(-15.536,270.778,30.),(-14.534,305.405,30.),(-14.534,265.372,30.),(-12.233,305.405,30.),(-12.233,265.372,30.),(-80.345,212.331,30.),(-80.345,193.919,30.),(-43.092,193.919,30.),(-43.092,212.331,30.),(-38.105,191.757,30.),(-40.044,212.88,30.),(-38.062,214.527,30.),(-36.773,188.514,30.),(-36.762,217.779,30.),(-35.761,183.108,30.),(-35.761,223.142,30.),(-33.459,183.108,30.),(-33.459,223.142,30.),(-97.991,109.966,30.),(-21.269,105.405,30.),(-97.991,105.405,30.),(-95.231,111.972,30.),(-93.6,114.611,30.),(-92.535,124.493,30.),(-80.345,123.818,30.),(-21.354,123.818,30.),(-16.282,125.979,30.),(-18.221,104.856,30.),(-16.239,103.209,30.),(-14.971,129.222,30.),(-14.961,99.958,30.),(-14.023,134.628,30.),(-14.023,94.595,30.),(-11.636,94.595,30.),(-11.636,134.628,30.),(-169.171,294.595,30.),(-217.421,290.034,30.),(-217.421,294.595,30.),(-214.661,288.028,30.),(-213.031,285.389,30.),(-211.965,275.507,30.),(-199.775,276.182,30.),(-199.775,123.818,30.),(-169.853,276.182,30.),(-158.697,275.,30.),(-152.293,292.356,30.),(-150.119,271.453,30.),(-145.707,289.559,30.),(-143.416,265.076,30.),(-140.358,285.642,30.),(-137.886,255.405,30.),(-134.796,279.054,30.),(-133.97,244.151,30.),(-129.873,270.608,30.),(-131.173,231.166,30.),(-129.494,216.448,30.),(-125.589,260.304,30.),(-128.935,200.,30.),(-127.366,135.008,30.),(-123.82,145.101,30.),(-121.945,248.142,30.),(-120.464,157.908,30.),(-117.597,224.789,30.),(-118.066,171.326,30.),(-116.628,185.357,30.),(-116.148,200.,30.),(-217.421,109.966,30.),(-169.171,105.405,30.),(-217.421,105.405,30.),(-214.661,111.972,30.),(-213.031,114.611,30.),(-211.965,124.493,30.),(-169.853,123.818,30.),(-155.17,126.098,30.),(-152.879,107.644,30.),(-149.538,128.948,30.),(-146.259,110.441,30.),(-145.047,132.939,30.),(-140.656,114.358,30.),(-140.976,138.64,30.),(-137.46,145.777,30.),(-135.784,119.637,30.),(-134.497,154.35,30.),(-131.354,126.52,30.),(-132.089,164.358,30.),(-129.724,181.377,30.),(-292.011,294.595,30.),(-315.113,290.034,30.),(-315.113,294.595,30.),(-312.406,288.049,30.),(-310.765,285.473,30.),(-309.934,281.546,30.),(-309.657,275.507,30.),(-296.359,285.473,30.),(-297.19,281.546,30.),(-309.657,124.493,30.),(-297.467,275.507,30.),(-294.718,288.049,30.),(-292.011,290.034,30.),(-312.406,111.972,30.),(-315.113,105.405,30.),(-315.113,109.966,30.),(-239.244,105.405,30.),(-310.765,114.611,30.),(-309.934,118.56,30.),(-297.467,123.818,30.),(-239.244,123.818,30.),(-234.172,125.979,30.),(-236.186,104.856,30.),(-234.172,103.209,30.),(-232.84,99.958,30.),(-232.84,129.222,30.),(-231.827,94.595,30.),(-231.827,134.628,30.),(-229.526,94.595,30.),(-229.526,134.628,30.),(-447.847,214.569,30.),(-447.314,178.885,30.),(-448.353,200.,30.),(-446.328,228.378,30.),(-444.197,159.797,30.),(-443.798,241.427,30.),(-439.002,142.736,30.),(-440.255,253.716,30.),(-435.518,265.446,30.),(-435.566,200.,30.),(-434.873,215.266,30.),(-429.918,275.465,30.),(-432.795,229.307,30.),(-429.332,242.124,30.),(-423.456,283.773,30.),(-424.484,253.716,30.),(-417.627,264.802,30.),(-416.13,290.372,30.),(-409.758,272.72,30.),(-404.515,296.41,30.),(-400.876,277.47,30.),(-390.982,298.649,30.),(-390.982,279.054,30.),(-378.856,297.002,30.),(-380.971,277.344,30.),(-371.994,272.551,30.),(-367.966,292.061,30.),(-364.05,264.675,30.),(-358.312,283.826,30.),(-357.139,253.716,30.),(-349.893,272.297,30.),(-352.291,242.251,30.),(-348.828,229.307,30.),(-342.621,257.242,30.),(-346.75,214.886,30.),(-346.057,198.986,30.),(-345.6,135.753,30.),(-341.454,146.284,30.),(-337.426,239.949,30.),(-337.874,158.488,30.),(-335.316,171.284,30.),(-334.309,220.418,30.),(-333.782,184.671,30.),(-333.27,198.649,30.),(-434.873,184.734,30.),(-431.73,127.703,30.),(-432.795,170.693,30.),(-429.332,157.876,30.),(-423.322,116.174,30.),(-424.484,146.284,30.),(-417.616,135.198,30.),(-413.7,107.939,30.),(-409.715,127.28,30.),(-402.863,102.998,30.),(-400.78,122.53,30.),(-390.812,101.351,30.),(-390.812,120.946,30.),(-380.843,122.53,30.),(-382.619,102.053,30.),(-375.004,104.16,30.),(-371.908,127.28,30.),(-367.967,107.67,30.),(-364.007,135.198,30.),(-361.508,112.584,30.),(-357.139,146.284,30.),(-355.628,118.903,30.),(-352.291,157.813,30.),(-350.325,126.626,30.),(-348.828,170.439,30.),(-346.75,184.164,30.),(-517.658,294.595,30.),(-593.783,290.034,30.),(-593.783,294.595,30.),(-591.077,288.049,30.),(-589.436,285.473,30.),(-588.604,281.546,30.),(-588.327,275.507,30.),(-576.137,276.182,30.),(-588.327,124.493,30.),(-517.658,276.182,30.),(-514.611,275.642,30.),(-514.611,295.144,30.),(-512.629,296.791,30.),(-512.629,274.021,30.),(-511.329,270.778,30.),(-511.329,300.042,30.),(-510.327,305.405,30.),(-510.327,265.372,30.),(-508.025,265.372,30.),(-508.025,305.405,30.),(-538.884,212.331,30.),(-576.137,193.919,30.),(-576.137,212.331,30.),(-538.884,193.919,30.),(-535.837,212.88,30.),(-533.898,191.757,30.),(-533.855,214.527,30.),(-532.566,188.514,30.),(-532.555,217.779,30.),(-531.553,183.108,30.),(-531.553,223.142,30.),(-529.252,183.108,30.),(-529.252,223.142,30.),(-593.783,109.966,30.),(-517.061,105.405,30.),(-593.783,105.405,30.),(-591.023,111.972,30.),(-589.393,114.611,30.),(-576.137,123.818,30.),(-517.147,123.818,30.),(-512.075,125.979,30.),(-514.014,104.856,30.),(-512.032,103.209,30.),(-510.764,129.222,30.),(-510.753,99.958,30.),(-509.816,134.628,30.),(-509.816,94.595,30.),(-507.429,94.595,30.),(-507.429,134.628,30.),(-673.093,294.595,30.),(-700.,290.034,30.),(-700.,294.595,30.),(-696.739,287.373,30.),(-693.948,283.446,30.),(-686.02,264.886,30.),(-675.904,287.838,30.),(-676.841,283.615,30.),(-673.093,290.034,30.),(-676.266,278.593,30.),(-656.61,188.936,30.),(-674.542,272.986,30.),(-649.364,207.683,30.),(-627.494,294.595,30.),(-624.66,287.838,30.),(-627.494,290.034,30.),(-603.16,294.595,30.),(-623.715,283.277,30.),(-610.236,281.334,30.),(-619.101,259.655,30.),(-606.847,286.592,30.),(-603.16,290.034,30.),(-626.045,272.817,30.),(-644.419,188.936,30.),(-659.359,111.972,30.),(-662.065,105.405,30.),(-662.065,109.966,30.),(-638.964,105.405,30.),(-657.718,114.611,30.),(-656.887,118.56,30.),(-656.61,124.493,30.),(-643.354,114.611,30.),(-644.419,124.493,30.),(-641.723,111.972,30.),(-638.964,109.966,30.),(-517.061,105.405,50.),(-593.783,109.966,50.),(-593.783,105.405,50.),(-591.023,111.972,50.),(-589.393,114.611,50.),(-588.327,124.493,50.),(-576.137,123.818,50.),(-588.327,275.507,50.),(-576.137,212.331,50.),(-576.137,193.919,50.),(-517.147,123.818,50.),(-512.075,125.979,50.),(-514.014,104.856,50.),(-512.032,103.209,50.),(-510.764,129.222,50.),(-510.753,99.958,50.),(-509.816,134.628,50.),(-509.816,94.595,50.),(-507.429,94.595,50.),(-507.429,134.628,50.),(-538.884,212.331,50.),(-538.884,193.919,50.),(-535.837,212.88,50.),(-533.898,191.757,50.),(-533.855,214.527,50.),(-532.566,188.514,50.),(-532.555,217.779,50.),(-531.553,183.108,50.),(-531.553,223.142,50.),(-529.252,183.108,50.),(-529.252,223.142,50.),(-591.077,288.049,50.),(-593.783,294.595,50.),(-593.783,290.034,50.),(-517.658,294.595,50.),(-589.436,285.473,50.),(-588.604,281.546,50.),(-576.137,276.182,50.),(-517.658,276.182,50.),(-514.611,295.144,50.),(-514.611,275.642,50.),(-512.629,296.791,50.),(-512.629,274.021,50.),(-511.329,270.778,50.),(-511.329,300.042,50.),(-510.327,265.372,50.),(-510.327,305.405,50.),(-508.025,305.405,50.),(-508.025,265.372,50.)),$); +#618=IFCSTYLEDITEM(#616,(#592),$); +#619=IFCMEMBERTYPE('3tp857bP5C98h0Br48EAp1',#1,'rail bridge - arch segment','An arch segment, forming part of the rail bridge\X\27s structure.',$,$,$,'1998901','arch_segment',.ARCH_SEGMENT.); +#620=IFCRELDEFINESBYTYPE('0dAccfHzj92er8ThLyGRQq',#1,$,$,(#621,#632,#640,#648,#813,#824,#832,#840),#619); +#621=IFCMEMBER('2YYLlceAvCKB$5luCgsyAd',#1,'rail bridge - arch segment','An arch segment, forming part of the rail bridge\X\27s structure.','arch_segment',#622,#631,'454425.1027894.955995.1884275.1998900',$); +#622=IFCLOCALPLACEMENT(#557,#623); +#623=IFCAXIS2PLACEMENT3D(#624,#625,#626); +#624=IFCCARTESIANPOINT((5750.,0.,3290.346)); +#625=IFCDIRECTION((0.,0.,1.)); +#626=IFCDIRECTION((1.,1.08886468012454E-17,0.)); +#627=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#628)); +#628=IFCTRIANGULATEDFACESET(#629,((2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(1.,2.9770809209750606E-14,9.229352089037605E-14),(1.,2.9770809209750606E-14,9.229352089037605E-14),(1.,2.9770809209750606E-14,9.229352089037605E-14),(1.,2.9770809209750606E-14,9.229352089037605E-14),(-0.08291671292690155,2.5445955641011694E-12,0.9965564804452369),(-0.06308989390333586,2.5488953252129456E-12,0.998007848309454),(-0.08291671292682903,2.544595564101187E-12,0.996556480445243),(-0.06308989390333586,2.5488953252129456E-12,0.998007848309454),(-0.20699731044011394,2.49434657889934E-12,0.9783415116770622),(-0.08291671292682903,2.544595564101187E-12,0.996556480445243),(-0.2069973104401177,2.494346578899338E-12,0.9783415116770615),(-0.08291671292690155,2.5445955641011694E-12,0.9965564804452369),(-0.41499643505859146,2.3130302896814405E-12,0.9098230371279133),(-0.2069973104401177,2.494346578899338E-12,0.9783415116770615),(-0.4149964350585932,2.313030289681439E-12,0.9098230371279126),(-0.20699731044011394,2.49434657889934E-12,0.9783415116770622),(-0.6202433193807648,1.986379761054646E-12,0.784409475187246),(-0.4149964350585932,2.313030289681439E-12,0.9098230371279126),(-0.6202433193807649,1.986379761054646E-12,0.7844094751872459),(-0.41499643505859146,2.3130302896814405E-12,0.9098230371279133),(-0.6202433193807648,1.986379761054646E-12,0.784409475187246),(-0.8079266005471487,1.4820756378559873E-12,0.5892831307006234),(-0.80792660054715,1.4820756378559833E-12,0.5892831307006218),(-0.6202433193807649,1.986379761054646E-12,0.7844094751872459),(-0.80792660054715,1.4820756378559833E-12,0.5892831307006218),(-0.9472992235199226,7.905697969928424E-13,0.32035009149140536),(-0.9472992235199245,7.905697969928283E-13,0.32035009149139987),(-0.8079266005471487,1.4820756378559873E-12,0.5892831307006234),(-0.9472992235199245,7.905697969928283E-13,0.32035009149139987),(-0.9922313039468913,2.893066370684859E-13,0.1244067500895838),(-0.992231303946883,2.8930663706865276E-13,0.12440675008964953),(-0.9472992235199226,7.905697969928424E-13,0.32035009149140536),(-0.992231303946883,2.8930663706865276E-13,0.12440675008964953),(-0.9965447579665395,1.8437282493117022E-13,0.08305748232044576),(-0.9965447579665395,1.8437282493117022E-13,0.08305748232044576),(-0.9922313039468913,2.893066370684859E-13,0.1244067500895838),(3.5614296695786857E-14,-2.556391479400031E-12,-1.),(3.5614296695786857E-14,-2.556391479400031E-12,-1.),(3.5614296695786857E-14,-2.556391479400031E-12,-1.),(3.5614296695786857E-14,-2.556391479400031E-12,-1.),(0.9862029092609518,-3.937404209212833E-13,-0.16554099723402418),(0.9472992235199246,-7.90569796992828E-13,-0.32035009149139976),(0.9862029092609518,-3.937404209212833E-13,-0.16554099723402418),(0.947299223519922,-7.905697969928468E-13,-0.32035009149140703),(0.947299223519922,-7.905697969928468E-13,-0.32035009149140703),(0.8079266005471502,-1.4820756378559827E-12,-0.5892831307006215),(0.9472992235199246,-7.90569796992828E-13,-0.32035009149139976),(0.8079266005471503,-1.4820756378559827E-12,-0.5892831307006215),(0.8079266005471503,-1.4820756378559827E-12,-0.5892831307006215),(0.6202433193807653,-1.986379761054646E-12,-0.7844094751872457),(0.8079266005471502,-1.4820756378559827E-12,-0.5892831307006215),(0.620243319380765,-1.986379761054646E-12,-0.7844094751872458),(0.41499643505859335,-2.3130302896814393E-12,-0.9098230371279125),(0.6202433193807653,-1.986379761054646E-12,-0.7844094751872457),(0.620243319380765,-1.986379761054646E-12,-0.7844094751872458),(0.41499643505859124,-2.3130302896814413E-12,-0.9098230371279136),(0.2069973104401176,-2.494346578899338E-12,-0.9783415116770615),(0.41499643505859124,-2.3130302896814413E-12,-0.9098230371279136),(0.41499643505859335,-2.3130302896814393E-12,-0.9098230371279125),(0.2069973104401136,-2.49434657889934E-12,-0.9783415116770622),(0.1027107625008487,-2.5392901553580776E-12,-0.9947112642704385),(0.2069973104401136,-2.49434657889934E-12,-0.9783415116770622),(0.2069973104401176,-2.494346578899338E-12,-0.9783415116770615),(0.1027107625008487,-2.5392901553580776E-12,-0.9947112642704385)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(5,6,7),(7,6,8),(7,8,9),(9,8,10),(9,10,11),(9,11,12),(12,11,13),(12,13,14),(12,14,15),(15,14,16),(17,18,19),(18,17,20),(20,17,21),(20,21,22),(22,21,23),(22,23,24),(24,23,25),(24,25,26),(26,25,27),(27,25,28),(27,28,29),(29,28,30),(30,28,31),(30,31,32),(33,34,35),(34,33,36),(37,38,39),(38,37,40),(41,42,43),(42,41,44),(45,46,47),(46,45,48),(49,50,51),(50,49,52),(53,54,55),(54,53,56),(57,58,59),(58,57,60),(61,62,63),(62,61,64),(65,66,67),(66,65,68),(69,70,71),(70,69,72),(73,74,75),(74,73,76),(77,78,79),(78,77,80),(81,82,83),(82,81,84),(85,86,87),(86,85,88),(89,90,91),(90,89,92),(93,94,95),(94,93,96)),$); +#629=IFCCARTESIANPOINTLIST3D(((0.,-1750.,0.),(-739.652,-1750.,124.156),(-750.,-1750.,0.),(144.815,-1750.,862.73),(-574.827,-1750.,1106.093),(569.392,-1750.,1666.667),(-42.915,-1750.,2113.269),(1244.796,-1750.,2357.023),(775.819,-1750.,2950.128),(2125.,-1750.,2886.751),(3150.019,-1750.,3219.753),(1811.726,-1750.,3573.563),(4250.,-1750.,3333.333),(4250.,-1750.,4084.236),(2993.901,-1750.,3957.62),(4172.967,-1750.,4079.367),(-739.652,1750.,124.156),(0.,1750.,0.),(-750.,1750.,0.),(144.815,1750.,862.73),(-574.827,1750.,1106.093),(569.392,1750.,1666.667),(-42.915,1750.,2113.269),(1244.796,1750.,2357.023),(775.819,1750.,2950.128),(2125.,1750.,2886.751),(3150.019,1750.,3219.753),(1811.726,1750.,3573.563),(4250.,1750.,3333.333),(4250.,1750.,4084.236),(2993.901,1750.,3957.62),(4172.967,1750.,4079.367),(4250.,1750.,3333.333),(4250.,-1750.,4084.236),(4250.,-1750.,3333.333),(4250.,1750.,4084.236),(4172.967,-1750.,4079.367),(4250.,1750.,4084.236),(4172.967,1750.,4079.367),(4250.,-1750.,4084.236),(2993.901,-1750.,3957.62),(4172.967,1750.,4079.367),(2993.901,1750.,3957.62),(4172.967,-1750.,4079.367),(1811.726,-1750.,3573.563),(2993.901,1750.,3957.62),(1811.726,1750.,3573.563),(2993.901,-1750.,3957.62),(775.819,-1750.,2950.128),(1811.726,1750.,3573.563),(775.819,1750.,2950.128),(1811.726,-1750.,3573.563),(775.819,-1750.,2950.128),(-42.915,1750.,2113.269),(-42.915,-1750.,2113.269),(775.819,1750.,2950.128),(-42.915,-1750.,2113.269),(-574.827,1750.,1106.093),(-574.827,-1750.,1106.093),(-42.915,1750.,2113.269),(-574.827,-1750.,1106.093),(-739.652,1750.,124.156),(-739.652,-1750.,124.156),(-574.827,1750.,1106.093),(-739.652,-1750.,124.156),(-750.,1750.,0.),(-750.,-1750.,0.),(-739.652,1750.,124.156),(0.,1750.,0.),(-750.,-1750.,0.),(-750.,1750.,0.),(0.,-1750.,0.),(0.,1750.,0.),(144.815,-1750.,862.73),(0.,-1750.,0.),(144.815,1750.,862.73),(144.815,1750.,862.73),(569.392,-1750.,1666.667),(144.815,-1750.,862.73),(569.392,1750.,1666.667),(569.392,1750.,1666.667),(1244.796,-1750.,2357.023),(569.392,-1750.,1666.667),(1244.796,1750.,2357.023),(2125.,1750.,2886.751),(1244.796,-1750.,2357.023),(1244.796,1750.,2357.023),(2125.,-1750.,2886.751),(3150.019,1750.,3219.753),(2125.,-1750.,2886.751),(2125.,1750.,2886.751),(3150.019,-1750.,3219.753),(4250.,1750.,3333.333),(3150.019,-1750.,3219.753),(3150.019,1750.,3219.753),(4250.,-1750.,3333.333)),$); +#630=IFCSTYLEDITEM(#628,(#353),$); +#631=IFCPRODUCTDEFINITIONSHAPE($,$,(#627)); +#632=IFCMEMBER('3kuqbEQ55DwQX5rk3QQW6b',#1,'rail bridge - arch segment','An arch segment, forming part of the rail bridge\X\27s structure.','arch_segment',#633,#639,'454425.1027894.955995.1884275.1998984',$); +#633=IFCLOCALPLACEMENT(#557,#634); +#634=IFCAXIS2PLACEMENT3D(#635,#636,#637); +#635=IFCCARTESIANPOINT((-4250.,0.,3290.346)); +#636=IFCDIRECTION((0.,0.,1.)); +#637=IFCDIRECTION((1.,1.08886468012454E-17,0.)); +#638=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#628)); +#639=IFCPRODUCTDEFINITIONSHAPE($,$,(#638)); +#640=IFCMEMBER('0mUNenrM54pwFfq2oXhCct',#1,'rail bridge - arch segment','An arch segment, forming part of the rail bridge\X\27s structure.','arch_segment',#641,#647,'454425.1027894.955995.1884275.1999105',$); +#641=IFCLOCALPLACEMENT(#557,#642); +#642=IFCAXIS2PLACEMENT3D(#643,#644,#645); +#643=IFCCARTESIANPOINT((-5750.,0.,3290.346)); +#644=IFCDIRECTION((0.,0.,1.)); +#645=IFCDIRECTION((-1.,-6.215113103450816E-16,0.)); +#646=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#628)); +#647=IFCPRODUCTDEFINITIONSHAPE($,$,(#646)); +#648=IFCMEMBER('3dxS5_Bpz7vB8wbZiDy6FO',#1,'rail bridge - arch segment','An arch segment, forming part of the rail bridge\X\27s structure.','arch_segment',#649,#655,'454425.1027894.955995.1884275.1999106',$); +#649=IFCLOCALPLACEMENT(#557,#650); +#650=IFCAXIS2PLACEMENT3D(#651,#652,#653); +#651=IFCCARTESIANPOINT((4250.,0.,3290.346)); +#652=IFCDIRECTION((0.,0.,1.)); +#653=IFCDIRECTION((-1.,-6.215113103450816E-16,0.)); +#654=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#628)); +#655=IFCPRODUCTDEFINITIONSHAPE($,$,(#654)); +#656=IFCEARTHWORKSFILL('1Ni63N3g9CwwsFbbNgF65B',#1,'rail bridge - filler','The filling material between the arches and the bridge deck.','backfill',#659,#671,'454425.1027894.955995.1884275.1999332',.BACKFILL.); +#657=IFCRELASSOCIATESMATERIAL('0bat_vVbL5e9xkiecCrRuV',#1,$,$,(#656,#672,#848,#859),#658); +#658=IFCMATERIAL('bulk-material_soil_generic',$,$); +#659=IFCLOCALPLACEMENT(#557,#660); +#660=IFCAXIS2PLACEMENT3D(#661,#662,#663); +#661=IFCCARTESIANPOINT((5000.,0.,3290.346)); +#662=IFCDIRECTION((0.,0.,1.)); +#663=IFCDIRECTION((1.,1.08886468012454E-17,0.)); +#664=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#665)); +#665=IFCTRIANGULATEDFACESET(#666,((-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-4.158209776511004E-14,2.302200580461437E-14,1.),(-4.158209776511004E-14,2.302200580461437E-14,1.),(-4.158209776511004E-14,2.302200580461437E-14,1.),(-4.158209776511004E-14,2.302200580461437E-14,1.),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(-0.6202433193807413,-1.6027708127658811E-12,-0.7844094751872648),(-0.8079266005471168,-2.0778065071996617E-12,-0.5892831307006671),(-0.6202433193807902,-1.6027708127660051E-12,-0.7844094751872258),(-0.8079266005471817,-2.0778065071998253E-12,-0.5892831307005784),(0.20699731044024583,5.063515577917526E-13,-0.9783415116770344),(0.4149964350585089,1.0393635520664958E-12,-0.9098230371279511),(0.4149964350586758,1.0393635520669242E-12,-0.9098230371278749),(0.20699731043998557,5.063515577910863E-13,-0.9783415116770895),(-0.206997310439986,-5.513983257127455E-13,-0.9783415116770894),(-0.0829167129268582,-2.347936542235796E-13,-0.9965564804452405),(-0.08291671292687262,-2.3479365422361636E-13,-0.9965564804452394),(-0.20699731044024544,-5.513983257134072E-13,-0.9783415116770344),(-0.41499643505851114,-1.0812554545505578E-12,-0.90982303712795),(-0.20699731044024544,-5.513983257134072E-13,-0.9783415116770344),(-0.206997310439986,-5.513983257127455E-13,-0.9783415116770894),(-0.4149964350586755,-1.081255454550976E-12,-0.9098230371278752),(-0.8079266005471817,-2.0778065071998253E-12,-0.5892831307005784),(-0.9472992235198696,-2.4277100354666596E-12,-0.32035009149156196),(-0.8079266005471168,-2.0778065071996617E-12,-0.5892831307006671),(-0.9472992235199775,-2.4277100354669278E-12,-0.32035009149124316),(-0.08291671292687262,-2.3479365422361636E-13,-0.9965564804452394),(-0.06308989390333586,-1.8416985022288968E-13,-0.998007848309454),(-0.06308989390333586,-1.8416985022288968E-13,-0.998007848309454),(-0.0829167129268582,-2.347936542235796E-13,-0.9965564804452405),(-0.6202433193807413,-1.6027708127658811E-12,-0.7844094751872648),(-0.4149964350586755,-1.081255454550976E-12,-0.9098230371278752),(-0.41499643505851114,-1.0812554545505578E-12,-0.90982303712795),(-0.6202433193807902,-1.6027708127660051E-12,-0.7844094751872258),(0.08291671292685875,1.8890819606849642E-13,-0.9965564804452406),(0.20699731043998557,5.063515577910863E-13,-0.9783415116770895),(0.20699731044024583,5.063515577917526E-13,-0.9783415116770344),(0.08291671292687233,1.8890819606853118E-13,-0.9965564804452395),(0.9472992235198712,2.4129598321349406E-12,-0.32035009149155774),(0.8079266005471799,2.0506735478885955E-12,-0.5892831307005809),(0.947299223519976,2.4129598321352157E-12,-0.3203500914912475),(0.8079266005471187,2.0506735478884375E-12,-0.5892831307006645),(0.8079266005471187,2.0506735478884375E-12,-0.5892831307006645),(0.6202433193807384,1.5666534537837957E-12,-0.7844094751872668),(0.8079266005471799,2.0506735478885955E-12,-0.5892831307005809),(0.6202433193807917,1.566653453783933E-12,-0.7844094751872249),(0.9922313039467627,2.5322716147048113E-12,-0.12440675009060917),(0.947299223519976,2.4129598321352157E-12,-0.3203500914912475),(0.9922313039467875,2.532271614704879E-12,-0.12440675009041002),(0.9472992235198712,2.4129598321349406E-12,-0.32035009149155774),(0.4149964350586758,1.0393635520669242E-12,-0.9098230371278749),(0.6202433193807384,1.5666534537837957E-12,-0.7844094751872668),(0.6202433193807917,1.566653453783933E-12,-0.7844094751872249),(0.4149964350585089,1.0393635520664958E-12,-0.9098230371279511),(0.06308989390333586,1.382175652690157E-13,-0.998007848309454),(0.08291671292687233,1.8890819606853118E-13,-0.9965564804452395),(0.08291671292685875,1.8890819606849642E-13,-0.9965564804452406),(0.06308989390333586,1.382175652690157E-13,-0.998007848309454),(-0.9922313039468903,-2.5379998005505785E-12,-0.1244067500895908),(-0.9965447579665395,-2.5480686660888355E-12,-0.08305748232044574),(-0.9922313039468839,-2.5379998005505636E-12,-0.12440675008964268),(-0.9965447579665395,-2.5480686660888355E-12,-0.08305748232044574),(-0.9472992235199775,-2.4277100354669278E-12,-0.32035009149124316),(-0.9922313039468839,-2.5379998005505636E-12,-0.12440675008964268),(-0.9472992235198696,-2.4277100354666596E-12,-0.32035009149156196),(-0.9922313039468903,-2.5379998005505785E-12,-0.1244067500895908),(0.9965447579663902,2.5442443664081987E-12,-0.0830574823222392),(0.9922313039467875,2.532271614704879E-12,-0.12440675009041002),(0.9965447579663902,2.5442443664081987E-12,-0.0830574823222392),(0.9922313039467627,2.5322716147048113E-12,-0.12440675009060917)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(5,6,7),(7,6,8),(7,8,9),(9,8,10),(9,10,11),(11,10,12),(11,12,13),(13,12,14),(13,14,15),(15,14,16),(15,16,17),(18,19,20),(19,18,21),(22,23,24),(23,22,25),(25,22,26),(25,26,27),(27,26,28),(27,28,29),(29,28,30),(29,30,31),(31,30,32),(31,32,33),(33,32,34),(33,34,35),(35,34,36),(35,36,37),(37,36,38),(39,40,41),(40,39,42),(43,44,45),(44,43,46),(47,48,49),(48,47,50),(51,52,53),(52,51,54),(55,56,57),(56,55,58),(59,60,61),(60,59,62),(63,64,65),(64,63,66),(67,68,69),(68,67,70),(71,72,73),(72,71,74),(75,76,77),(76,75,78),(79,80,81),(80,79,82),(83,84,85),(84,83,86),(87,88,89),(88,87,90),(91,92,93),(92,91,94),(95,96,97),(96,95,98),(99,100,101),(100,99,102)),$); +#666=IFCCARTESIANPOINTLIST3D(((-10.348,1750.,124.156),(10.348,1750.,124.156),(0.,1750.,0.),(-175.173,1750.,1106.093),(175.173,1750.,1106.093),(-707.085,1750.,2113.269),(707.085,1750.,2113.269),(-1525.819,1750.,2950.128),(1525.819,1750.,2950.128),(-2561.726,1750.,3573.563),(2561.726,1750.,3573.563),(-3743.901,1750.,3957.62),(3743.901,1750.,3957.62),(-4922.967,1750.,4079.367),(4922.967,1750.,4079.367),(-5000.,1750.,4084.236),(5000.,1750.,4084.236),(-5000.,-1750.,4084.236),(5000.,1750.,4084.236),(-5000.,1750.,4084.236),(5000.,-1750.,4084.236),(10.348,-1750.,124.156),(-10.348,-1750.,124.156),(0.,-1750.,0.),(-175.173,-1750.,1106.093),(175.173,-1750.,1106.093),(-707.085,-1750.,2113.269),(707.085,-1750.,2113.269),(-1525.819,-1750.,2950.128),(1525.819,-1750.,2950.128),(-2561.726,-1750.,3573.563),(2561.726,-1750.,3573.563),(-3743.901,-1750.,3957.62),(3743.901,-1750.,3957.62),(-4922.967,-1750.,4079.367),(4922.967,-1750.,4079.367),(-5000.,-1750.,4084.236),(5000.,-1750.,4084.236),(-1525.819,1750.,2950.128),(-707.085,-1750.,2113.269),(-1525.819,-1750.,2950.128),(-707.085,1750.,2113.269),(3743.901,1750.,3957.62),(2561.726,-1750.,3573.563),(2561.726,1750.,3573.563),(3743.901,-1750.,3957.62),(-3743.901,1750.,3957.62),(-4922.967,-1750.,4079.367),(-4922.967,1750.,4079.367),(-3743.901,-1750.,3957.62),(-2561.726,1750.,3573.563),(-3743.901,-1750.,3957.62),(-3743.901,1750.,3957.62),(-2561.726,-1750.,3573.563),(-707.085,1750.,2113.269),(-175.173,-1750.,1106.093),(-707.085,-1750.,2113.269),(-175.173,1750.,1106.093),(-4922.967,1750.,4079.367),(-5000.,-1750.,4084.236),(-5000.,1750.,4084.236),(-4922.967,-1750.,4079.367),(-1525.819,1750.,2950.128),(-2561.726,-1750.,3573.563),(-2561.726,1750.,3573.563),(-1525.819,-1750.,2950.128),(4922.967,1750.,4079.367),(3743.901,-1750.,3957.62),(3743.901,1750.,3957.62),(4922.967,-1750.,4079.367),(175.173,1750.,1106.093),(707.085,-1750.,2113.269),(175.173,-1750.,1106.093),(707.085,1750.,2113.269),(707.085,1750.,2113.269),(1525.819,-1750.,2950.128),(707.085,-1750.,2113.269),(1525.819,1750.,2950.128),(10.348,1750.,124.156),(175.173,-1750.,1106.093),(10.348,-1750.,124.156),(175.173,1750.,1106.093),(2561.726,1750.,3573.563),(1525.819,-1750.,2950.128),(1525.819,1750.,2950.128),(2561.726,-1750.,3573.563),(5000.,1750.,4084.236),(4922.967,-1750.,4079.367),(4922.967,1750.,4079.367),(5000.,-1750.,4084.236),(-10.348,1750.,124.156),(0.,-1750.,0.),(-10.348,-1750.,124.156),(0.,1750.,0.),(-175.173,1750.,1106.093),(-10.348,-1750.,124.156),(-175.173,-1750.,1106.093),(-10.348,1750.,124.156),(0.,1750.,0.),(10.348,-1750.,124.156),(0.,-1750.,0.),(10.348,1750.,124.156)),$); +#667=IFCSTYLEDITEM(#665,(#670),$); +#668=IFCSURFACESTYLERENDERING(#669,0.,$,$,$,$,$,$,.NOTDEFINED.); +#669=IFCCOLOURRGB($,0.5137254901960784,0.43529411764705883,0.36470588235294116); +#670=IFCSURFACESTYLE('bulk-material_soil_generic',.BOTH.,(#668)); +#671=IFCPRODUCTDEFINITIONSHAPE($,$,(#664)); +#672=IFCEARTHWORKSFILL('1ngF1j04v49eiBUKkKO16p',#1,'rail bridge - filler','The filling material between the arches and the bridge deck.','backfill',#673,#679,'454425.1027894.955995.1884275.1999335',.BACKFILL.); +#673=IFCLOCALPLACEMENT(#557,#674); +#674=IFCAXIS2PLACEMENT3D(#675,#676,#677); +#675=IFCCARTESIANPOINT((-5000.,0.,3290.346)); +#676=IFCDIRECTION((0.,0.,1.)); +#677=IFCDIRECTION((1.,1.08886468012454E-17,0.)); +#678=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#665)); +#679=IFCPRODUCTDEFINITIONSHAPE($,$,(#678)); +#680=IFCSITE('1$CApj9YLCeu0YyH5TXRVh',#1,'road rail bridge - site','The site of the road rail bridge, supporting both road and rail traffic.',$,#681,$,$,.PARTIAL.,$,$,0.,$,$); +#681=IFCLOCALPLACEMENT(#23,#682); +#682=IFCAXIS2PLACEMENT3D(#683,#684,#685); +#683=IFCCARTESIANPOINT((34641.016,40000.,0.)); +#684=IFCDIRECTION((0.,0.,1.)); +#685=IFCDIRECTION((-0.5000000000000007,0.8660254037844383,0.)); +#686=IFCBRIDGE('3JNhAW3zLAmRKwMCykb3V5',#1,'rail bridge','A strong rail bridge, supporting trains as they cross over.','arched',#688,$,$,.ELEMENT.,.ARCHED.); +#687=IFCRELAGGREGATES('0_lJ8mUEb7gxCZqaoe3AFK',#1,'road rail bridge - site container',$,#680,(#686)); +#688=IFCLOCALPLACEMENT(#681,#689); +#689=IFCAXIS2PLACEMENT3D(#690,#691,#692); +#690=IFCCARTESIANPOINT((0.,0.,0.)); +#691=IFCDIRECTION((0.,0.,1.)); +#692=IFCDIRECTION((0.49999999999999917,-0.8660254037844393,0.)); +#693=IFCBRIDGEPART('16qYo484fEuvo5B_xQN5wZ',#1,'rail bridge - substructure','The substructure, providing essential support for the rail bridge.','substructure',#695,$,$,.COMPLEX.,.LATERAL.,.SUBSTRUCTURE.); +#694=IFCRELAGGREGATES('2kUWwRDen9IuXBjtY34erM',#1,'rail bridge container',$,#686,(#693,#759)); +#695=IFCLOCALPLACEMENT(#688,#696); +#696=IFCAXIS2PLACEMENT3D(#697,#698,#699); +#697=IFCCARTESIANPOINT((0.,0.,0.)); +#698=IFCDIRECTION((0.,0.,1.)); +#699=IFCDIRECTION((2.57628149445829E-17,-1.,0.)); +#700=IFCBRIDGEPART('3UNm72MkH81wf0YgrOuk7D',#1,'rail bridge - pier','A sturdy pier, providing foundational support for the rail bridge.','pier',#702,$,$,.PARTIAL.,.LATERAL.,.PIER.); +#701=IFCRELAGGREGATES('0r88KPBRv0kg_rY4X74t1R',#1,'rail bridge - substructure container',$,#693,(#700,#733)); +#702=IFCLOCALPLACEMENT(#695,#703); +#703=IFCAXIS2PLACEMENT3D(#704,#705,#706); +#704=IFCCARTESIANPOINT((5000.,-2200.,-490.)); +#705=IFCDIRECTION((0.,0.,1.)); +#706=IFCDIRECTION((1.,2.57628149445829E-17,0.)); +#707=IFCCOLUMN('0XPURiAkzB3g2LT4CHIL$P',#1,'rail bridge - pierstem','A pierstem, providing vertical support for the bridge rail.','pierstem',#712,#721,'454425.1027895.956001.1884272.1884264.1886323',$); +#708=IFCQUANTITYVOLUME('NetVolume',$,$,24.95028116652671,$); +#709=IFCELEMENTQUANTITY('2HtwxjY_TBPwVgCQv3aOZ2',#1,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#708)); +#710=IFCRELDEFINESBYPROPERTIES('1kQ_CKJwzAkwMLuZgY1ABk',#1,$,$,(#707),#709); +#711=IFCRELCONTAINEDINSPATIALSTRUCTURE('29t_F7N9HDHulsIq8Bhv35',#1,$,$,(#707,#722),#700); +#712=IFCLOCALPLACEMENT(#702,#713); +#713=IFCAXIS2PLACEMENT3D(#714,#715,#716); +#714=IFCCARTESIANPOINT((0.,0.,0.)); +#715=IFCDIRECTION((0.,0.,1.)); +#716=IFCDIRECTION((1.,2.57628149445829E-17,0.)); +#717=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#718)); +#718=IFCTRIANGULATEDFACESET(#719,((-1.4438228390484296E-15,1.3667182588961932E-16,1.),(-1.4438228390484296E-15,1.3667182588961932E-16,1.),(-1.4438228390484296E-15,1.3667182588961932E-16,1.),(-1.4438228390484296E-15,1.3667182588961932E-16,1.),(-3.850194237500629E-15,1.,-4.9210247107397555E-15),(-3.850194237500629E-15,1.,-4.9210247107397555E-15),(-3.850194237500629E-15,1.,-4.9210247107397555E-15),(-3.850194237500629E-15,1.,-4.9210247107397555E-15),(-1.,1.5095181649265177E-15,1.9943536951002968E-14),(-1.,1.5095181649265177E-15,1.9943536951002968E-14),(-1.,1.5095181649265177E-15,1.9943536951002968E-14),(-1.,1.5095181649265177E-15,1.9943536951002968E-14),(2.5819881442508925E-15,-8.638541612123049E-16,-1.),(2.5819881442508925E-15,-8.638541612123049E-16,-1.),(2.5819881442508925E-15,-8.638541612123049E-16,-1.),(2.5819881442508925E-15,-8.638541612123049E-16,-1.),(-1.1550582712518771E-14,-1.,1.8655943773594968E-15),(-1.1550582712518771E-14,-1.,1.8655943773594968E-15),(-1.1550582712518771E-14,-1.,1.8655943773594968E-15),(-1.1550582712518771E-14,-1.,1.8655943773594968E-15),(1.,5.540398041441336E-15,-1.9209668689354544E-14),(1.,5.540398041441336E-15,-1.9209668689354544E-14),(1.,5.540398041441336E-15,-1.9209668689354544E-14),(1.,5.540398041441336E-15,-1.9209668689354544E-14)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#719=IFCCARTESIANPOINTLIST3D(((750.,0.,3780.346),(-750.,4400.,3780.346),(-750.,0.,3780.346),(750.,4400.,3780.346),(-750.,4400.,3780.346),(750.,4400.,0.),(-750.,4400.,0.),(750.,4400.,3780.346),(-750.,0.,3780.346),(-750.,4400.,0.),(-750.,0.,0.),(-750.,4400.,3780.346),(-750.,4400.,0.),(750.,0.,0.),(-750.,0.,0.),(750.,4400.,0.),(750.,0.,0.),(-750.,0.,3780.346),(-750.,0.,0.),(750.,0.,3780.346),(750.,0.,0.),(750.,4400.,3780.346),(750.,0.,3780.346),(750.,4400.,0.)),$); +#720=IFCSTYLEDITEM(#718,(#353),$); +#721=IFCPRODUCTDEFINITIONSHAPE($,$,(#717)); +#722=IFCFOOTING('1TNwPNu5vAJ8rWCr2_eafm',#1,'foundation - bridge rail','A solid foundation, providing support for the bridge rail.',$,#723,#732,'454425.1027895.956001.1884272.1884264.1886393',$); +#723=IFCLOCALPLACEMENT(#702,#724); +#724=IFCAXIS2PLACEMENT3D(#725,#726,#727); +#725=IFCCARTESIANPOINT((0.,2200.,0.)); +#726=IFCDIRECTION((4.351198265808898E-16,9.315505887349466E-16,1.)); +#727=IFCDIRECTION((-3.990681532858409E-15,-1.,9.315505887349487E-16)); +#728=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#729)); +#729=IFCTRIANGULATEDFACESET(#730,((-6.73473104237594E-17,1.,1.5517058229368014E-17),(-6.73473104237594E-17,1.,1.5517058229368014E-17),(-6.73473104237594E-17,1.,1.5517058229368014E-17),(-6.73473104237594E-17,1.,1.5517058229368014E-17),(-1.,-2.321506128457626E-16,-4.196027683515184E-16),(-1.,-2.321506128457626E-16,-4.196027683515184E-16),(-1.,-2.321506128457626E-16,-4.196027683515184E-16),(-1.,-2.321506128457626E-16,-4.196027683515184E-16),(-4.196027683515182E-16,-1.5517058229368014E-17,1.),(-4.196027683515182E-16,-1.5517058229368014E-17,1.),(-4.196027683515182E-16,-1.5517058229368014E-17,1.),(-4.196027683515182E-16,-1.5517058229368014E-17,1.),(6.73473104237594E-17,-1.,-1.5517058229368014E-17),(6.73473104237594E-17,-1.,-1.5517058229368014E-17),(6.73473104237594E-17,-1.,-1.5517058229368014E-17),(6.73473104237594E-17,-1.,-1.5517058229368014E-17),(1.,2.321506128457626E-16,4.196027683515184E-16),(1.,2.321506128457626E-16,4.196027683515184E-16),(1.,2.321506128457626E-16,4.196027683515184E-16),(1.,2.321506128457626E-16,4.196027683515184E-16),(4.196027683515182E-16,1.5517058229368014E-17,-1.),(4.196027683515182E-16,1.5517058229368014E-17,-1.),(4.196027683515182E-16,1.5517058229368014E-17,-1.),(4.196027683515182E-16,1.5517058229368014E-17,-1.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#730=IFCCARTESIANPOINTLIST3D(((-3200.,1750.,0.),(3200.,1750.,-1000.),(-3200.,1750.,-1000.),(3200.,1750.,0.),(-3200.,1750.,0.),(-3200.,-1750.,-1000.),(-3200.,-1750.,0.),(-3200.,1750.,-1000.),(-3200.,-1750.,0.),(3200.,1750.,0.),(-3200.,1750.,0.),(3200.,-1750.,0.),(3200.,-1750.,-1000.),(-3200.,-1750.,0.),(-3200.,-1750.,-1000.),(3200.,-1750.,0.),(3200.,-1750.,-1000.),(3200.,1750.,0.),(3200.,-1750.,0.),(3200.,1750.,-1000.),(3200.,1750.,-1000.),(-3200.,-1750.,-1000.),(-3200.,1750.,-1000.),(3200.,-1750.,-1000.)),$); +#731=IFCSTYLEDITEM(#729,(#78),$); +#732=IFCPRODUCTDEFINITIONSHAPE($,$,(#728)); +#733=IFCBRIDGEPART('0ZqHhx84T54vsUjUWpHX1r',#1,'rail bridge - pier','A sturdy pier, providing foundational support for the rail bridge.','pier',#734,$,$,.PARTIAL.,.LATERAL.,.PIER.); +#734=IFCLOCALPLACEMENT(#695,#735); +#735=IFCAXIS2PLACEMENT3D(#736,#737,#738); +#736=IFCCARTESIANPOINT((-5000.,-2200.,-490.)); +#737=IFCDIRECTION((0.,0.,1.)); +#738=IFCDIRECTION((1.,2.57628149445829E-17,0.)); +#739=IFCCOLUMN('0IBSrNevj23wueInn68pOs',#1,'rail bridge - pierstem','A pierstem, providing vertical support for the bridge rail.','pierstem',#744,#750,'454425.1027895.956001.1884272.1884267.1886323',$); +#740=IFCQUANTITYVOLUME('NetVolume',$,$,24.95028116652671,$); +#741=IFCELEMENTQUANTITY('15cT72abbCkwrooqbPq7ER',#1,'Qto_ColumnBaseQuantities',$,'BaseQuantities',(#740)); +#742=IFCRELDEFINESBYPROPERTIES('2lhqVT5tT6JO0yzDQAAYci',#1,$,$,(#739),#741); +#743=IFCRELCONTAINEDINSPATIALSTRUCTURE('3WwaSJ_zf3TuJnhCp8ps6b',#1,$,$,(#739,#751),#733); +#744=IFCLOCALPLACEMENT(#734,#745); +#745=IFCAXIS2PLACEMENT3D(#746,#747,#748); +#746=IFCCARTESIANPOINT((0.,0.,0.)); +#747=IFCDIRECTION((0.,0.,1.)); +#748=IFCDIRECTION((1.,2.57628149445829E-17,0.)); +#749=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#718)); +#750=IFCPRODUCTDEFINITIONSHAPE($,$,(#749)); +#751=IFCFOOTING('2Q4p8yWJzFIvhoX9T$V40D',#1,'foundation - bridge rail','A solid foundation, providing support for the bridge rail.',$,#752,#758,'454425.1027895.956001.1884272.1884267.1886393',$); +#752=IFCLOCALPLACEMENT(#734,#753); +#753=IFCAXIS2PLACEMENT3D(#754,#755,#756); +#754=IFCCARTESIANPOINT((0.,2200.,0.)); +#755=IFCDIRECTION((4.351198265808898E-16,9.315505887349466E-16,1.)); +#756=IFCDIRECTION((-3.990681532858409E-15,-1.,9.315505887349487E-16)); +#757=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#729)); +#758=IFCPRODUCTDEFINITIONSHAPE($,$,(#757)); +#759=IFCBRIDGEPART('1hMPjN1XP3D8IpowtvIj0R',#1,'railbridge - superstructure','The superstructure, forming the main body of the rail bridge.','superstructure',#760,$,$,.ELEMENT.,.LATERAL.,.SUPERSTRUCTURE.); +#760=IFCLOCALPLACEMENT(#688,#761); +#761=IFCAXIS2PLACEMENT3D(#762,#763,#764); +#762=IFCCARTESIANPOINT((0.,0.,0.)); +#763=IFCDIRECTION((0.,0.,1.)); +#764=IFCDIRECTION((2.57628149445829E-17,-1.,0.)); +#765=IFCWALL('2tKslGZJz0Nu12g9XAhM2h',#1,'rail bridge - spandrel wall','A spandrel wall, providing structural support for the rail bridge.','solidwall',#767,#776,'454425.1027895.956001.1884275.1998465',$); +#766=IFCRELCONTAINEDINSPATIALSTRUCTURE('2ijK$rCu55vvUGmB_QglJU',#1,$,$,(#765,#777,#791,#799,#813,#824,#832,#840,#848,#859),#759); +#767=IFCLOCALPLACEMENT(#760,#768); +#768=IFCAXIS2PLACEMENT3D(#769,#770,#771); +#769=IFCCARTESIANPOINT((-10000.,-2200.,3290.346)); +#770=IFCDIRECTION((0.,0.,1.)); +#771=IFCDIRECTION((1.,2.57628149445829E-17,0.)); +#772=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#773)); +#773=IFCTRIANGULATEDFACESET(#774,((-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(-3.697183691333753E-16,-1.,2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(3.697183691333753E-16,1.,-2.759214357466026E-12),(-0.9472992235199069,-8.837473813445069E-13,-0.3203500914914517),(-0.9862029092609431,-4.565306166790649E-13,-0.16554099723407595),(-0.9862029092609431,-4.565306166790649E-13,-0.16554099723407595),(-0.9472992235199171,-8.837473813444249E-13,-0.32035009149142196),(3.6095570976563183E-14,-2.7592143574660236E-12,-1.),(3.6095570976563183E-14,-2.7592143574660236E-12,-1.),(3.6095570976563183E-14,-2.7592143574660236E-12,-1.),(3.6095570976563183E-14,-2.7592143574660236E-12,-1.),(0.9862029092609518,-4.570163991337451E-13,-0.16554099723402418),(0.9472992235199178,-8.841567620337126E-13,-0.3203500914914197),(0.9862029092609518,-4.570163991337451E-13,-0.16554099723402418),(0.9472992235199273,-8.841567620336338E-13,-0.32035009149139126),(0.9472992235199273,-8.841567620336338E-13,-0.32035009149139126),(0.8079266005471405,-1.626212006710722E-12,-0.589283130700635),(0.9472992235199178,-8.841567620337126E-13,-0.3203500914914197),(0.8079266005471563,-1.6262120067106622E-12,-0.5892831307006133),(0.8079266005471563,-1.6262120067106622E-12,-0.5892831307006133),(0.620243319380759,-2.1645343373895867E-12,-0.7844094751872505),(0.8079266005471405,-1.626212006710722E-12,-0.589283130700635),(0.6202433193807736,-2.164534337389555E-12,-0.784409475187239),(0.4149964350585969,-2.5104914778997537E-12,-0.909823037127911),(0.620243319380759,-2.1645343373895867E-12,-0.7844094751872505),(0.6202433193807736,-2.164534337389555E-12,-0.784409475187239),(0.41499643505858896,-2.510491477899763E-12,-0.9098230371279145),(0.4149964350585969,-2.5104914778997537E-12,-0.909823037127911),(0.2069973104401112,-2.6995289614261125E-12,-0.9783415116770628),(0.41499643505858896,-2.510491477899763E-12,-0.9098230371279145),(0.2069973104401184,-2.6995289614261072E-12,-0.9783415116770612),(0.10271076250084926,-2.7446637351337455E-12,-0.9947112642704387),(0.2069973104401112,-2.6995289614261125E-12,-0.9783415116770628),(0.2069973104401184,-2.6995289614261072E-12,-0.9783415116770612),(0.10271076250084926,-2.7446637351337455E-12,-0.9947112642704387),(1.,-2.1115595812378585E-16,3.0108309204017E-14),(1.,-2.1115595812378585E-16,3.0108309204017E-14),(1.,-2.1115595812378585E-16,3.0108309204017E-14),(1.,-2.1115595812378585E-16,3.0108309204017E-14),(-1.313878783549651E-14,2.7592143574660228E-12,1.),(-1.313878783549651E-14,2.7592143574660228E-12,1.),(-1.313878783549651E-14,2.7592143574660228E-12,1.),(-1.313878783549651E-14,2.7592143574660228E-12,1.),(-1.,2.1115595812378585E-16,-2.5090257670012707E-14),(-1.,2.1115595812378585E-16,-2.5090257670012707E-14),(-1.,2.1115595812378585E-16,-2.5090257670012707E-14),(-1.,2.1115595812378585E-16,-2.5090257670012707E-14),(-0.10271076250082654,-2.744591148838705E-12,-0.9947112642704409),(-0.20699731044009634,-2.699400664921432E-12,-0.978341511677066),(-0.10271076250082654,-2.744591148838705E-12,-0.9947112642704409),(-0.20699731044010578,-2.6994006649214262E-12,-0.978341511677064),(-0.20699731044010578,-2.6994006649214262E-12,-0.978341511677064),(-0.41499643505855466,-2.5103397758999647E-12,-0.9098230371279302),(-0.20699731044009634,-2.699400664921432E-12,-0.978341511677066),(-0.41499643505856776,-2.5103397758999485E-12,-0.9098230371279242),(-0.41499643505856776,-2.5103397758999485E-12,-0.9098230371279242),(-0.6202433193807148,-2.1642345725036717E-12,-0.7844094751872855),(-0.41499643505855466,-2.5103397758999647E-12,-0.9098230371279302),(-0.6202433193807305,-2.164234572503637E-12,-0.7844094751872731),(-0.6202433193807148,-2.1642345725036717E-12,-0.7844094751872855),(-0.8079266005471326,-1.6258086337798539E-12,-0.5892831307006458),(-0.8079266005471168,-1.6258086337799133E-12,-0.5892831307006672),(-0.6202433193807305,-2.164234572503637E-12,-0.7844094751872731),(-0.8079266005471168,-1.6258086337799133E-12,-0.5892831307006672),(-0.9472992235199391,-8.837473813444392E-13,-0.32035009149135657),(-0.9472992235199298,-8.837473813445167E-13,-0.32035009149138466),(-0.8079266005471326,-1.6258086337798539E-12,-0.5892831307006458),(-0.9472992235199298,-8.837473813445167E-13,-0.32035009149138466),(-0.9862029092609697,-4.565306166790648E-13,-0.16554099723391769),(-0.9862029092609697,-4.565306166790648E-13,-0.16554099723391769),(-0.9472992235199391,-8.837473813444392E-13,-0.32035009149135657),(5.053379936723676E-14,-2.759214357466023E-12,-1.),(5.053379936723676E-14,-2.759214357466023E-12,-1.),(5.053379936723676E-14,-2.759214357466023E-12,-1.),(5.053379936723676E-14,-2.759214357466023E-12,-1.),(0.9862029092609593,-4.570719102849764E-13,-0.16554099723397883),(0.947299223519916,-8.841848757692245E-13,-0.3203500914914249),(0.9862029092609593,-4.570719102849764E-13,-0.16554099723397883),(0.9472992235199255,-8.841848757691471E-13,-0.3203500914913969),(0.9472992235199255,-8.841848757691471E-13,-0.3203500914913969),(0.8079266005471272,-1.626183959719012E-12,-0.5892831307006532),(0.947299223519916,-8.841848757692245E-13,-0.3203500914914249),(0.8079266005471418,-1.626183959718955E-12,-0.5892831307006328),(0.8079266005471418,-1.626183959718955E-12,-0.5892831307006328),(0.6202433193807623,-2.1645203464041856E-12,-0.7844094751872479),(0.8079266005471272,-1.626183959719012E-12,-0.5892831307006532),(0.6202433193807745,-2.1645203464041586E-12,-0.7844094751872384),(0.4149964350585986,-2.5105054460711E-12,-0.90982303712791),(0.6202433193807623,-2.1645203464041856E-12,-0.7844094751872479),(0.6202433193807745,-2.1645203464041586E-12,-0.7844094751872384),(0.41499643505859307,-2.510505446071106E-12,-0.9098230371279126),(0.4149964350585986,-2.5105054460711E-12,-0.90982303712791),(0.2069973104401141,-2.6995254725396924E-12,-0.9783415116770623),(0.41499643505859307,-2.510505446071106E-12,-0.9098230371279126),(0.20699731044012187,-2.6995254725396875E-12,-0.9783415116770606),(8.979548187779264E-15,-2.7592132528079225E-12,-1.),(0.2069973104401141,-2.6995254725396924E-12,-0.9783415116770623),(0.20699731044012187,-2.6995254725396875E-12,-0.9783415116770606),(1.3136252986870424E-14,-2.759213252807923E-12,-1.),(8.979548187779264E-15,-2.7592132528079225E-12,-1.),(-0.2069973104400882,-2.6994111315806955E-12,-0.9783415116770676),(1.3136252986870424E-14,-2.759213252807923E-12,-1.),(-0.20699731044010045,-2.699411131580689E-12,-0.9783415116770652),(-0.20699731044010045,-2.699411131580689E-12,-0.9783415116770652),(-0.41499643505855266,-2.5103397758999655E-12,-0.9098230371279312),(-0.2069973104400882,-2.6994111315806955E-12,-0.9783415116770676),(-0.4149964350585647,-2.51033977589995E-12,-0.9098230371279257),(-0.4149964350585647,-2.51033977589995E-12,-0.9098230371279257),(-0.620243319380716,-2.164248563489071E-12,-0.7844094751872847),(-0.41499643505855266,-2.5103397758999655E-12,-0.9098230371279312),(-0.6202433193807323,-2.164248563489035E-12,-0.7844094751872717),(-0.620243319380716,-2.164248563489071E-12,-0.7844094751872847),(-0.8079266005471378,-1.6258366807715576E-12,-0.5892831307006386),(-0.8079266005471227,-1.6258366807716147E-12,-0.5892831307006593),(-0.6202433193807323,-2.164248563489035E-12,-0.7844094751872717),(-0.8079266005471227,-1.6258366807716147E-12,-0.5892831307006593),(-0.9472992235199171,-8.837473813444249E-13,-0.32035009149142196),(-0.9472992235199069,-8.837473813445069E-13,-0.3203500914914517),(-0.8079266005471378,-1.6258366807715576E-12,-0.5892831307006386)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(5,6,7),(7,6,8),(7,8,9),(9,8,10),(9,10,11),(11,10,12),(11,12,13),(13,12,14),(15,16,17),(16,15,18),(16,18,19),(19,18,20),(19,20,21),(21,20,22),(21,22,23),(23,22,24),(23,24,25),(25,24,26),(25,26,27),(27,26,13),(27,13,28),(28,13,14),(28,14,29),(30,31,32),(31,30,33),(33,30,34),(33,34,35),(35,34,36),(35,36,37),(37,36,38),(37,38,39),(39,38,40),(39,40,41),(41,40,42),(41,42,43),(43,42,44),(43,44,45),(45,44,46),(47,48,49),(48,47,50),(50,47,51),(50,51,52),(52,51,53),(52,53,54),(54,53,55),(54,55,56),(56,55,57),(56,57,58),(58,57,43),(58,43,45),(59,60,61),(60,59,62),(63,64,65),(64,63,66),(67,68,69),(68,67,70),(71,72,73),(72,71,74),(75,76,77),(76,75,78),(79,80,81),(80,79,82),(83,84,85),(84,83,86),(87,88,89),(88,87,90),(91,92,93),(92,91,94),(95,96,97),(96,95,98),(99,100,101),(100,99,102),(103,104,105),(104,103,106),(107,108,109),(108,107,110),(111,112,113),(112,111,114),(115,116,117),(116,115,118),(119,120,121),(120,119,122),(123,124,125),(124,123,126),(127,128,129),(128,127,130),(131,132,133),(132,131,134),(135,136,137),(136,135,138),(139,140,141),(140,139,142),(143,144,145),(144,143,146),(147,148,149),(148,147,150),(151,152,153),(152,151,154),(155,156,157),(156,155,158),(159,160,161),(160,159,162),(163,164,165),(164,163,166),(167,168,169),(168,167,170),(171,172,173),(172,171,174)),$); +#774=IFCCARTESIANPOINTLIST3D(((15750.,0.,0.),(14105.185,0.,862.73),(14250.,0.,0.),(15894.815,0.,862.73),(13680.608,0.,1666.667),(16319.392,0.,1666.667),(13005.204,0.,2357.023),(16994.796,0.,2357.023),(12125.,0.,2886.751),(17875.,0.,2886.751),(11099.981,0.,3219.753),(18900.019,0.,3219.753),(10000.,0.,3333.333),(20000.,0.,3333.333),(5750.,0.,0.),(4105.185,0.,862.73),(4250.,0.,0.),(5894.815,0.,862.73),(3680.608,0.,1666.667),(6319.392,0.,1666.667),(3005.204,0.,2357.023),(6994.796,0.,2357.023),(2125.,0.,2886.751),(7875.,0.,2886.751),(1099.981,0.,3219.753),(8900.019,0.,3219.753),(0.,0.,3333.333),(0.,0.,4484.236),(20000.,0.,4484.236),(4105.185,450.,862.73),(5750.,450.,0.),(4250.,450.,0.),(5894.815,450.,862.73),(3680.608,450.,1666.667),(6319.392,450.,1666.667),(3005.204,450.,2357.023),(6994.796,450.,2357.023),(2125.,450.,2886.751),(7875.,450.,2886.751),(1099.981,450.,3219.753),(8900.019,450.,3219.753),(0.,450.,3333.333),(10000.,450.,3333.333),(0.,450.,4484.236),(20000.,450.,3333.333),(20000.,450.,4484.236),(14105.185,450.,862.73),(15750.,450.,0.),(14250.,450.,0.),(15894.815,450.,862.73),(13680.608,450.,1666.667),(16319.392,450.,1666.667),(13005.204,450.,2357.023),(16994.796,450.,2357.023),(12125.,450.,2886.751),(17875.,450.,2886.751),(11099.981,450.,3219.753),(18900.019,450.,3219.753),(14105.185,0.,862.73),(14250.,450.,0.),(14250.,0.,0.),(14105.185,450.,862.73),(14250.,450.,0.),(15750.,0.,0.),(14250.,0.,0.),(15750.,450.,0.),(15750.,450.,0.),(15894.815,0.,862.73),(15750.,0.,0.),(15894.815,450.,862.73),(15894.815,450.,862.73),(16319.392,0.,1666.667),(15894.815,0.,862.73),(16319.392,450.,1666.667),(16319.392,450.,1666.667),(16994.796,0.,2357.023),(16319.392,0.,1666.667),(16994.796,450.,2357.023),(17875.,450.,2886.751),(16994.796,0.,2357.023),(16994.796,450.,2357.023),(17875.,0.,2886.751),(17875.,450.,2886.751),(18900.019,0.,3219.753),(17875.,0.,2886.751),(18900.019,450.,3219.753),(20000.,450.,3333.333),(18900.019,0.,3219.753),(18900.019,450.,3219.753),(20000.,0.,3333.333),(20000.,450.,3333.333),(20000.,0.,4484.236),(20000.,0.,3333.333),(20000.,450.,4484.236),(20000.,0.,4484.236),(0.,450.,4484.236),(0.,0.,4484.236),(20000.,450.,4484.236),(0.,0.,4484.236),(0.,450.,3333.333),(0.,0.,3333.333),(0.,450.,4484.236),(0.,450.,3333.333),(1099.981,0.,3219.753),(0.,0.,3333.333),(1099.981,450.,3219.753),(1099.981,450.,3219.753),(2125.,0.,2886.751),(1099.981,0.,3219.753),(2125.,450.,2886.751),(2125.,450.,2886.751),(3005.204,0.,2357.023),(2125.,0.,2886.751),(3005.204,450.,2357.023),(3005.204,0.,2357.023),(3680.608,450.,1666.667),(3680.608,0.,1666.667),(3005.204,450.,2357.023),(3680.608,0.,1666.667),(4105.185,450.,862.73),(4105.185,0.,862.73),(3680.608,450.,1666.667),(4105.185,0.,862.73),(4250.,450.,0.),(4250.,0.,0.),(4105.185,450.,862.73),(4250.,450.,0.),(5750.,0.,0.),(4250.,0.,0.),(5750.,450.,0.),(5750.,450.,0.),(5894.815,0.,862.73),(5750.,0.,0.),(5894.815,450.,862.73),(5894.815,450.,862.73),(6319.392,0.,1666.667),(5894.815,0.,862.73),(6319.392,450.,1666.667),(6319.392,450.,1666.667),(6994.796,0.,2357.023),(6319.392,0.,1666.667),(6994.796,450.,2357.023),(7875.,450.,2886.751),(6994.796,0.,2357.023),(6994.796,450.,2357.023),(7875.,0.,2886.751),(7875.,450.,2886.751),(8900.019,0.,3219.753),(7875.,0.,2886.751),(8900.019,450.,3219.753),(10000.,450.,3333.333),(8900.019,0.,3219.753),(8900.019,450.,3219.753),(10000.,0.,3333.333),(10000.,450.,3333.333),(11099.981,0.,3219.753),(10000.,0.,3333.333),(11099.981,450.,3219.753),(11099.981,450.,3219.753),(12125.,0.,2886.751),(11099.981,0.,3219.753),(12125.,450.,2886.751),(12125.,450.,2886.751),(13005.204,0.,2357.023),(12125.,0.,2886.751),(13005.204,450.,2357.023),(13005.204,0.,2357.023),(13680.608,450.,1666.667),(13680.608,0.,1666.667),(13005.204,450.,2357.023),(13680.608,0.,1666.667),(14105.185,450.,862.73),(14105.185,0.,862.73),(13680.608,450.,1666.667)),$); +#775=IFCSTYLEDITEM(#773,(#353),$); +#776=IFCPRODUCTDEFINITIONSHAPE($,$,(#772)); +#777=IFCSIGN('1vfzhsgDT9APjV5mX_JX5Y',#1,'road rail bridge - name sign','Ye Olde Brygge\X\27s Timeless Plaque: A Gleaming Tribute to Bygone Eras','pictoral',#778,#787,'454425.1027895.956001.1884275.1998465.2028197',$); +#778=IFCLOCALPLACEMENT(#760,#779); +#779=IFCAXIS2PLACEMENT3D(#780,#781,#782); +#780=IFCCARTESIANPOINT((0.,-2200.,7024.582)); +#781=IFCDIRECTION((-7.136739233221677E-16,-1.,0.)); +#782=IFCDIRECTION((1.,-6.958821510617691E-16,0.)); +#783=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#784,#788)); +#784=IFCTRIANGULATEDFACESET(#785,((-1.,2.4770934453639655E-53,7.296160086905362E-16),(-1.,2.4770934453639655E-53,7.296160086905362E-16),(-1.,2.4770934453639655E-53,7.296160086905362E-16),(-1.,2.4770934453639655E-53,7.296160086905362E-16),(7.136739233221673E-16,2.757701622613239E-12,1.),(7.136739233221673E-16,2.757701622613239E-12,1.),(7.136739233221673E-16,2.757701622613239E-12,1.),(7.136739233221673E-16,2.757701622613239E-12,1.),(-7.136739233221673E-16,-2.757701622613239E-12,-1.),(-7.136739233221673E-16,-2.757701622613239E-12,-1.),(-7.136739233221673E-16,-2.757701622613239E-12,-1.),(-7.136739233221673E-16,-2.757701622613239E-12,-1.),(1.9680997363622977E-27,-1.,2.757701622613241E-12),(1.9680997363622977E-27,-1.,2.757701622613241E-12),(1.9680997363622977E-27,-1.,2.757701622613241E-12),(1.9680997363622977E-27,-1.,2.757701622613241E-12),(-1.9680997363622977E-27,1.,-2.757701622613241E-12),(-1.9680997363622977E-27,1.,-2.757701622613241E-12),(-1.9680997363622977E-27,1.,-2.757701622613241E-12),(-1.9680997363622977E-27,1.,-2.757701622613241E-12),(1.,-2.4770934453639655E-53,-7.296160086905362E-16),(1.,-2.4770934453639655E-53,-7.296160086905362E-16),(1.,-2.4770934453639655E-53,-7.296160086905362E-16),(1.,-2.4770934453639655E-53,-7.296160086905362E-16)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#785=IFCCARTESIANPOINTLIST3D(((-800.,0.,30.),(-800.,400.,0.),(-800.,0.,0.),(-800.,400.,30.),(800.,0.,30.),(-800.,400.,30.),(-800.,0.,30.),(800.,400.,30.),(800.,400.,0.),(-800.,0.,0.),(-800.,400.,0.),(800.,0.,0.),(800.,0.,30.),(-800.,0.,0.),(800.,0.,0.),(-800.,0.,30.),(-800.,400.,0.),(800.,400.,30.),(800.,400.,0.),(-800.,400.,30.),(800.,400.,0.),(800.,0.,30.),(800.,0.,0.),(800.,400.,30.)),$); +#786=IFCSTYLEDITEM(#784,(#592),$); +#787=IFCPRODUCTDEFINITIONSHAPE($,$,(#783)); +#788=IFCTRIANGULATEDFACESET(#789,((6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(0.985262099127433,-0.17105144262181596,4.715423873711248E-13),(0.998558022065677,0.05368311250554527,-1.484923557101204E-13),(0.9985580220656759,0.05368311250556592,-1.4849235571017734E-13),(0.9852620991274318,-0.17105144262182378,4.715423873711465E-13),(0.9985580220656759,0.05368311250556592,-1.4849235571017734E-13),(0.9942362468634307,0.10721140528376343,-2.9615991691832246E-13),(0.9942362468634307,0.10721140528376343,-2.9615991691832246E-13),(0.998558022065677,0.05368311250554527,-1.484923557101204E-13),(0.8507772826193545,0.5255264173938615,-1.4503466298011078E-12),(0.7331764133481148,0.6800384892857126,-1.876633349315321E-12),(0.7331764133484892,0.6800384892853092,-1.8766333493142077E-12),(0.8507772826193545,0.5255264173938615,-1.4503466298011078E-12),(0.7331764133481148,0.6800384892857126,-1.876633349315321E-12),(0.5879319010498577,0.8089104275059759,-2.2321635885903873E-12),(0.7331764133484892,0.6800384892853092,-1.8766333493142077E-12),(0.5879319010498577,0.8089104275059759,-2.2321635885903873E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-0.5954279130339792,0.8034087380530537,-2.216555522482815E-12),(-0.7353424654424054,0.6776956975789981,-1.8696829886332785E-12),(-0.5954279130339792,0.8034087380530537,-2.216555522482815E-12),(-0.735342465442188,0.6776956975792342,-1.86968298863393E-12),(-0.735342465442188,0.6776956975792342,-1.86968298863393E-12),(-0.9279729502401773,0.3726475595284927,-1.0278844941539628E-12),(-0.7353424654424054,0.6776956975789981,-1.8696829886332785E-12),(-0.9279729502400409,0.37264755952883255,-1.0278844941549009E-12),(-0.9279729502400409,0.37264755952883255,-1.0278844941549009E-12),(-0.9919380594528788,0.12672366080908923,-3.492308184297568E-13),(-0.9279729502401773,0.3726475595284927,-1.0278844941539628E-12),(-0.9919380594528859,0.12672366080903444,-3.4923081842960573E-13),(-0.9919380594528859,0.12672366080903444,-3.4923081842960573E-13),(-0.9997278626286515,0.02332810930933755,-6.39582849531095E-14),(-0.9919380594528788,0.12672366080908923,-3.492308184297568E-13),(-0.9997278626286514,0.02332810930934073,-6.39582849531183E-14),(-0.9997278626286514,0.02332810930934073,-6.39582849531183E-14),(-1.,1.0761972206014589E-42,3.9654910130298924E-16),(-0.9997278626286515,0.02332810930933755,-6.39582849531095E-14),(-1.,1.0761972206014589E-42,3.9654910130298924E-16),(-0.9325271362086447,-0.3610999033986357,9.968211758733037E-13),(-0.9262080086179281,-0.3770128973550006,1.0406609377887257E-12),(-0.9325271362086447,-0.3610999033986357,9.968211758733037E-13),(-0.9262080086179306,-0.3770128973549943,1.0406609377887083E-12),(-0.9262080086179306,-0.3770128973549943,1.0406609377887083E-12),(-0.8723365420137931,-0.48890587792275286,1.3492822712397969E-12),(-0.9262080086179281,-0.3770128973550006,1.0406609377887257E-12),(-0.8723365420138,-0.488905877922741,1.3492822712397643E-12),(-0.8723365420138,-0.488905877922741,1.3492822712397643E-12),(-0.7301883777656378,-0.6832458803212693,1.8854409043764884E-12),(-0.8723365420137931,-0.48890587792275286,1.3492822712397969E-12),(-0.7301883777657012,-0.6832458803212016,1.8854409043763014E-12),(-0.7301883777656378,-0.6832458803212693,1.8854409043764884E-12),(-0.6321911971634419,-0.7748124226088884,2.138072540046144E-12),(-0.6321911971634419,-0.7748124226088884,2.138072540046144E-12),(-0.7301883777657012,-0.6832458803212016,1.8854409043763014E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.6156006345831444,-0.7880582838222246,2.174255864446972E-12),(0.6156006345831444,-0.7880582838222246,2.174255864446972E-12),(0.6156006345831444,-0.7880582838222246,2.174255864446972E-12),(0.6156006345831444,-0.7880582838222246,2.174255864446972E-12),(0.976255309916327,-0.21662310555473194,5.972366943243571E-13),(0.9986377588414403,-0.0521787946980892,1.436346653809899E-13),(0.9986377588414309,-0.05217879469827008,1.4363466538148887E-13),(0.976255309916327,-0.21662310555473194,5.972366943243571E-13),(0.9986377588414309,-0.05217879469827008,1.4363466538148887E-13),(0.9788258497336634,0.20469478716658152,-5.651805180874172E-13),(0.9788258497336585,0.20469478716660464,-5.651805180874812E-13),(0.9986377588414403,-0.0521787946980892,1.436346653809899E-13),(0.9788258497336585,0.20469478716660464,-5.651805180874812E-13),(0.9450084045283365,0.32704604472582804,-9.029163972283381E-13),(0.9450084045283349,0.3270460447258325,-9.029163972283506E-13),(0.9788258497336634,0.20469478716658152,-5.651805180874172E-13),(0.9450084045283349,0.3270460447258325,-9.029163972283506E-13),(0.9330496485399467,0.35974762453626036,-9.931019329057775E-13),(0.9330496485399467,0.35974762453626036,-9.931019329057775E-13),(0.9450084045283365,0.32704604472582804,-9.029163972283381E-13),(-0.9414820933211209,0.3370630029470463,-9.295822339246914E-13),(-0.9606480611335328,0.2777684334844122,-7.660347689670178E-13),(-0.9414820933211209,0.3370630029470463,-9.295822339246914E-13),(-0.9606480611335284,0.27776843348442753,-7.660347689670601E-13),(-0.9606480611335284,0.27776843348442753,-7.660347689670601E-13),(-0.9760836593293772,0.21739523911570036,-5.995126528930727E-13),(-0.9606480611335328,0.2777684334844122,-7.660347689670178E-13),(-0.9760836593293772,0.21739523911570036,-5.995126528930727E-13),(-0.9792141269630011,-0.2028292226383756,5.599487878273007E-13),(-0.9792141269630011,-0.2028292226383756,5.599487878273007E-13),(-0.9792141269630011,-0.2028292226383756,5.599487878273007E-13),(-0.9792141269630011,-0.2028292226383756,5.599487878273007E-13),(-0.6124868691938966,-0.7904807619828953,2.1813155697912543E-12),(-0.6124868691938966,-0.7904807619828953,2.1813155697912543E-12),(-0.6124868691938966,-0.7904807619828953,2.1813155697912543E-12),(-0.6124868691938966,-0.7904807619828953,2.1813155697912543E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.6823833044151714,-0.7309945457084011,2.0167701960763817E-12),(0.7673233100207234,-0.641260429076082,1.7692058688304582E-12),(0.6823833044151714,-0.7309945457084011,2.0167701960763817E-12),(0.7673233100207456,-0.6412604290760555,1.769205868830385E-12),(0.7673233100207234,-0.641260429076082,1.7692058688304582E-12),(0.8868360880342053,-0.46208414056336894,1.2747480818688849E-12),(0.8868360880342097,-0.46208414056336067,1.274748081868862E-12),(0.7673233100207456,-0.6412604290760555,1.769205868830385E-12),(0.8868360880342097,-0.46208414056336067,1.274748081868862E-12),(0.9337699395388032,-0.35787386047838143,9.87057437597311E-13),(0.9337699395388004,-0.35787386047838854,9.870574375973308E-13),(0.8868360880342053,-0.46208414056336894,1.2747480818688849E-12),(0.9337699395388004,-0.35787386047838854,9.870574375973308E-13),(0.9852620991274318,-0.17105144262182378,4.715423873711465E-13),(0.985262099127433,-0.17105144262181596,4.715423873711248E-13),(0.9337699395388032,-0.35787386047838143,9.87057437597311E-13),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.20007400713171156,0.9797807875592683,-2.7033472297813925E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.20007400713202148,0.979780787559205,-2.703347229781218E-12),(-0.20007400713171156,0.9797807875592683,-2.7033472297813925E-12),(-0.3920573365553578,0.9199407833404925,-2.538160998216653E-12),(-0.3920573365553578,0.9199407833404925,-2.538160998216653E-12),(-0.20007400713202148,0.979780787559205,-2.703347229781218E-12),(-0.9271481171496583,0.37469503448250235,-1.0336102455888045E-12),(-0.9613689058329662,0.2752631956828324,-7.591970538815499E-13),(-0.9271481171496583,0.37469503448250235,-1.0336102455888045E-12),(-0.9613689058329608,0.27526319568285174,-7.591970538816034E-13),(-0.9613689058329608,0.27526319568285174,-7.591970538816034E-13),(-0.9849591146664003,0.1727875644703084,-4.763888487155095E-13),(-0.9613689058329662,0.2752631956828324,-7.591970538815499E-13),(-0.9849591146664003,0.1727875644703084,-4.763888487155095E-13),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.9850568535010431,-0.17222948461464055,4.755718845284114E-13),(-0.9627290187837146,-0.27046781026907074,7.466747295903924E-13),(-0.9850568535010431,-0.17222948461464055,4.755718845284114E-13),(-0.9627290187837202,-0.2704678102690515,7.466747295903393E-13),(-0.9627290187837202,-0.2704678102690515,7.466747295903393E-13),(-0.8103422277040963,-0.5859568874922134,1.6171989096663918E-12),(-0.9627290187837146,-0.27046781026907074,7.466747295903924E-13),(-0.81034222770443,-0.5859568874917522,1.6171989096651196E-12),(-0.8103422277040963,-0.5859568874922134,1.6171989096663918E-12),(-0.42212186728676276,-0.9065390941147197,2.5015604738409055E-12),(-0.4221218672866963,-0.9065390941147506,2.501560473840991E-12),(-0.81034222770443,-0.5859568874917522,1.6171989096651196E-12),(-0.42212186728676276,-0.9065390941147197,2.5015604738409055E-12),(-0.08899635085429565,-0.9960319520651028,2.7482951948189025E-12),(-0.4221218672866963,-0.9065390941147506,2.501560473840991E-12),(-0.08899635085414907,-0.996031952065116,2.7482951948189384E-12),(-0.08899635085429565,-0.9960319520651028,2.7482951948189025E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.08899635085414907,-0.996031952065116,2.7482951948189384E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-0.587931901049856,0.808910427505977,-2.231765637671211E-12),(-0.733176413348379,0.6800384892854279,-1.876112461172258E-12),(-0.7331764133482979,0.6800384892855155,-1.8761124611724995E-12),(-0.587931901049856,0.808910427505977,-2.231765637671211E-12),(-0.733176413348379,0.6800384892854279,-1.876112461172258E-12),(-0.850777282619356,0.5255264173938589,-1.4497224439734949E-12),(-0.7331764133482979,0.6800384892855155,-1.8761124611724995E-12),(-0.850777282619356,0.5255264173938589,-1.4497224439734949E-12),(-0.9942362468634307,0.10721140528376343,-2.954779329044235E-13),(-0.9985580220656771,0.05368311250554416,-1.4775374954807703E-13),(-0.9942362468634307,0.10721140528376343,-2.954779329044235E-13),(-0.9985580220656753,0.053683112505575656,-1.4775374954816392E-13),(-0.9985580220656753,0.053683112505575656,-1.4775374954816392E-13),(-0.9997372811223787,-0.022920923498716158,6.364046571768025E-14),(-0.9985580220656771,0.05368311250554416,-1.4775374954807703E-13),(-0.9997372811223788,-0.022920923498712536,6.364046571767024E-14),(-0.9997372811223788,-0.022920923498712536,6.364046571767024E-14),(-0.9919210150229099,-0.12685700593944488,3.5033170950078296E-13),(-0.9997372811223787,-0.022920923498716158,6.364046571768025E-14),(-0.9919210150229022,-0.12685700593950436,3.5033170950094704E-13),(-0.9919210150229022,-0.12685700593950436,3.5033170950094704E-13),(-0.9257138949175167,-0.37822451633473103,1.0438408481078363E-12),(-0.9919210150229099,-0.12685700593944488,3.5033170950078296E-13),(-0.9257138949175452,-0.3782245163346613,1.0438408481076436E-12),(-0.9257138949175452,-0.3782245163346613,1.0438408481076436E-12),(-0.7298956734503326,-0.6835585606796872,1.886330571856537E-12),(-0.9257138949175167,-0.37822451633473103,1.0438408481078363E-12),(-0.7298956734504372,-0.6835585606795754,1.886330571856229E-12),(-0.7298956734504372,-0.6835585606795754,1.886330571856229E-12),(-0.5913596447695503,-0.806407943002815,2.2252802331604026E-12),(-0.7298956734503326,-0.6835585606796872,1.886330571856537E-12),(-0.5913596447695503,-0.806407943002815,2.2252802331604026E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.0889963508542824,0.9960319520651041,-2.748231077194356E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.08899635085428109,0.9960319520651042,-2.7482310771943568E-12),(-0.0889963508542824,0.9960319520651041,-2.748231077194356E-12),(-0.42212186728667295,0.9065390941147616,-2.5011734387146367E-12),(-0.42212186728638,0.906539094114898,-2.501173438715013E-12),(-0.08899635085428109,0.9960319520651042,-2.7482310771943568E-12),(-0.42212186728667295,0.9065390941147616,-2.5011734387146367E-12),(-0.8086796863922657,0.5882492369876113,-1.622861102969537E-12),(-0.42212186728638,0.906539094114898,-2.501173438715013E-12),(-0.8086796863923503,0.588249236987495,-1.6228611029692163E-12),(-0.8086796863923503,0.588249236987495,-1.6228611029692163E-12),(-0.9603664303895992,0.27874059514311694,-7.688076475004823E-13),(-0.8086796863922657,0.5882492369876113,-1.622861102969537E-12),(-0.9603664303895765,0.27874059514319555,-7.688076475006995E-13),(-0.9603664303895765,0.27874059514319555,-7.688076475006995E-13),(-0.9830031215351365,0.18358884239565865,-5.061983525179996E-13),(-0.9603664303895992,0.27874059514311694,-7.688076475004823E-13),(-0.9830031215351365,0.18358884239565865,-5.061983525179996E-13),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.9832650394637072,-0.1821808501693699,5.031054012564892E-13),(-0.9604389766296841,-0.27849052438193517,7.687724647522556E-13),(-0.9832650394637072,-0.1821808501693699,5.031054012564892E-13),(-0.960438976629688,-0.2784905243819218,7.687724647522187E-13),(-0.960438976629688,-0.2784905243819218,7.687724647522187E-13),(-0.8061306092176587,-0.591737645314515,1.6330590112579545E-12),(-0.9604389766296841,-0.27849052438193517,7.687724647522556E-13),(-0.8061306092175907,-0.5917376453146074,1.6330590112582094E-12),(-0.8061306092175907,-0.5917376453146074,1.6330590112582094E-12),(-0.4173761927595036,-0.9087337969491296,2.5076013418386882E-12),(-0.8061306092176587,-0.591737645314515,1.6330590112579545E-12),(-0.4173761927594212,-0.9087337969491672,2.5076013418387916E-12),(-0.4173761927595036,-0.9087337969491296,2.5076013418386882E-12),(-0.08763790369519597,-0.9961523968931217,2.7486246286271558E-12),(-0.08763790369509214,-0.996152396893131,2.7486246286271812E-12),(-0.4173761927594212,-0.9087337969491672,2.5076013418387916E-12),(-0.08763790369519597,-0.9961523968931217,2.7486246286271558E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.08763790369509214,-0.996152396893131,2.7486246286271812E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(-1.3916449267378769E-27,1.,-2.75921435746603E-12),(-0.08899635085415496,0.9960319520651153,-2.748224110656931E-12),(-1.3916449267378769E-27,1.,-2.75921435746603E-12),(-0.08899635085419567,0.9960319520651116,-2.748224110656921E-12),(-0.08899635085419567,0.9960319520651116,-2.748224110656921E-12),(-0.42212186728709555,0.906539094114565,-2.5011088585138673E-12),(-0.08899635085415496,0.9960319520651153,-2.748224110656931E-12),(-0.42212186728641377,0.9065390941148823,-2.5011088585147438E-12),(-0.42212186728709555,0.906539094114565,-2.5011088585138673E-12),(-0.8086796863924871,0.5882492369873068,-1.6228038316913884E-12),(-0.8086796863927596,0.5882492369869325,-1.6228038316903556E-12),(-0.42212186728641377,0.9065390941148823,-2.5011088585147438E-12),(-0.8086796863924871,0.5882492369873068,-1.6228038316913884E-12),(-0.9603664303895686,0.27874059514322275,-7.688076475007694E-13),(-0.8086796863927596,0.5882492369869325,-1.6228038316903556E-12),(-0.960366430389606,0.27874059514309385,-7.688076475004137E-13),(-0.960366430389606,0.27874059514309385,-7.688076475004137E-13),(-0.9830031215351371,0.1835888423956546,-5.061983525179996E-13),(-0.9603664303895686,0.27874059514322275,-7.688076475007694E-13),(-0.9830031215351371,0.1835888423956546,-5.061983525179996E-13),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.9829162037139715,-0.1840536239157341,5.082124243891802E-13),(-0.95898232668401,-0.2834658658599357,7.82559306476142E-13),(-0.9829162037139715,-0.1840536239157341,5.082124243891802E-13),(-0.9589823266840098,-0.28346586585993633,7.825593064761438E-13),(-0.9589823266840098,-0.28346586585993633,7.825593064761438E-13),(-0.9250216907185366,-0.3799142952038267,1.0487240424483034E-12),(-0.95898232668401,-0.2834658658599357,7.82559306476142E-13),(-0.9250216907185366,-0.3799142952038267,1.0487240424483034E-12),(-0.3977066570345245,-0.9175126238643386,2.531755755491946E-12),(-0.20308542061857274,-0.9791610245164875,2.701787540803473E-12),(-0.20308542061850404,-0.9791610245165019,2.7017875408035127E-12),(-0.3977066570345245,-0.9175126238643386,2.531755755491946E-12),(-0.20308542061850404,-0.9791610245165019,2.7017875408035127E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(-0.20308542061857274,-0.9791610245164875,2.701787540803473E-12),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(-0.01445616326355981,0.9998955042121639,-2.758913785080831E-12),(0.276796250063706,0.9609286320797555,-2.651501734006735E-12),(-0.01445616326357933,0.9998955042121637,-2.758913785080831E-12),(0.2767962500636958,0.9609286320797585,-2.6515017340067427E-12),(0.2767962500636958,0.9609286320797585,-2.6515017340067427E-12),(0.5363224181349204,0.8440131893554221,-2.3289945581928067E-12),(0.276796250063706,0.9609286320797555,-2.651501734006735E-12),(0.53632241813488,0.8440131893554479,-2.3289945581928774E-12),(0.53632241813488,0.8440131893554479,-2.3289945581928774E-12),(0.7332983821190578,0.6799069662693362,-1.8762457733461176E-12),(0.5363224181349204,0.8440131893554221,-2.3289945581928067E-12),(0.733298382119046,0.6799069662693491,-1.8762457733461523E-12),(0.7332983821190578,0.6799069662693362,-1.8762457733461176E-12),(0.8575262393066199,0.514440228695857,-1.4197768381917242E-12),(0.857526239306608,0.514440228695877,-1.4197768381917793E-12),(0.733298382119046,0.6799069662693491,-1.8762457733461523E-12),(0.857526239306608,0.514440228695877,-1.4197768381917793E-12),(0.9319963445918341,0.3624676725826169,-1.000587991041896E-12),(0.931996344591825,0.3624676725826408,-1.0005879910419619E-12),(0.8575262393066199,0.514440228695857,-1.4197768381917242E-12),(0.931996344591825,0.3624676725826408,-1.0005879910419619E-12),(0.9747870892284454,0.2231370221938414,-6.161117198299329E-13),(0.9747870892284406,0.22313702219386236,-6.161117198299906E-13),(0.9319963445918341,0.3624676725826169,-1.000587991041896E-12),(0.9747870892284406,0.22313702219386236,-6.161117198299906E-13),(0.9947035144805423,0.10278578831753733,-2.839926765433697E-13),(0.9947035144805428,0.10278578831753325,-2.8399267654335854E-13),(0.9747870892284454,0.2231370221938414,-6.161117198299329E-13),(0.9947035144805428,0.10278578831753325,-2.8399267654335854E-13),(0.9999845618336788,0.005556626162130687,-1.5787140549852294E-14),(0.9999845618336788,0.005556626162136084,-1.5787140549867172E-14),(0.9947035144805423,0.10278578831753733,-2.839926765433697E-13),(0.9999845618336788,0.005556626162136084,-1.5787140549867172E-14),(0.9971625390869557,-0.07527862008336489,2.0731550146238103E-13),(0.9971625390869561,-0.075278620083362,2.0731550146237308E-13),(0.9999845618336788,0.005556626162130687,-1.5787140549852294E-14),(0.9971625390869561,-0.075278620083362,2.0731550146237308E-13),(0.9879040014647004,-0.15506670787126917,4.2757534460464006E-13),(0.9879040014647001,-0.15506670787127036,4.2757534460464334E-13),(0.9971625390869557,-0.07527862008336489,2.0731550146238103E-13),(0.9879040014647001,-0.15506670787127036,4.2757534460464334E-13),(0.9710252517045587,-0.2389769038047369,6.589936792652735E-13),(0.9710252517045607,-0.2389769038047292,6.589936792652521E-13),(0.9879040014647004,-0.15506670787126917,4.2757534460464006E-13),(0.9710252517045607,-0.2389769038047292,6.589936792652521E-13),(0.945969042642219,-0.32425695113993125,8.942333527441841E-13),(0.9459690426422243,-0.3242569511399157,8.942333527441413E-13),(0.9710252517045587,-0.2389769038047369,6.589936792652735E-13),(0.9459690426422243,-0.3242569511399157,8.942333527441413E-13),(0.9104691640560179,-0.413576959347515,1.1407479983148905E-12),(0.9104691640560099,-0.41357695934753264,1.1407479983149394E-12),(0.945969042642219,-0.32425695113993125,8.942333527441841E-13),(0.9104691640560099,-0.41357695934753264,1.1407479983149394E-12),(0.8578749092656005,-0.5138585798179669,1.417474899438105E-12),(0.857874909265601,-0.5138585798179663,1.4174748994381035E-12),(0.9104691640560179,-0.413576959347515,1.1407479983148905E-12),(0.857874909265601,-0.5138585798179663,1.4174748994381035E-12),(0.7803315071929187,-0.62536608389169,1.7252167508400374E-12),(0.780331507192952,-0.6253660838916482,1.7252167508399217E-12),(0.8578749092656005,-0.5138585798179669,1.417474899438105E-12),(0.780331507192952,-0.6253660838916482,1.7252167508399217E-12),(0.671227437601915,-0.7412514600392821,2.045015467583765E-12),(0.6712274376019304,-0.7412514600392682,2.0450154675837263E-12),(0.7803315071929187,-0.62536608389169,1.7252167508400374E-12),(0.671227437601915,-0.7412514600392821,2.045015467583765E-12),(0.5282915656620173,-0.849063025723282,2.3425236783196096E-12),(0.6712274376019304,-0.7412514600392682,2.0450154675837263E-12),(0.5282915656620125,-0.8490630257232851,2.342523678319619E-12),(0.5282915656620125,-0.8490630257232851,2.342523678319619E-12),(0.35815172061543016,-0.9336634002788194,2.5760072164233985E-12),(0.5282915656620173,-0.849063025723282,2.3425236783196096E-12),(0.3581517206153977,-0.9336634002788318,2.576007216423432E-12),(0.3581517206153977,-0.9336634002788318,2.576007216423432E-12),(0.17673045900502438,-0.9842592874135726,2.7156952122309812E-12),(0.35815172061543016,-0.9336634002788194,2.5760072164233985E-12),(0.17673045900501702,-0.9842592874135739,2.7156952122309852E-12),(0.17673045900501702,-0.9842592874135739,2.7156952122309852E-12),(-0.02516421475156609,-0.9996833310083435,2.75835285691417E-12),(0.17673045900502438,-0.9842592874135726,2.7156952122309812E-12),(-0.02516421475162521,-0.9996833310083421,2.7583528569141667E-12),(-0.02516421475162521,-0.9996833310083421,2.7583528569141667E-12),(-0.27808054138022675,-0.9605577611500935,2.6504769381158146E-12),(-0.02516421475156609,-0.9996833310083435,2.75835285691417E-12),(-0.2780805413802557,-0.9605577611500851,2.650476938115791E-12),(-0.27808054138022675,-0.9605577611500935,2.6504769381158146E-12),(-0.5377928463665643,-0.8430770156972309,2.326409322907207E-12),(-0.5377928463666088,-0.8430770156972025,2.3264093229071292E-12),(-0.2780805413802557,-0.9605577611500851,2.650476938115791E-12),(-0.5377928463666088,-0.8430770156972025,2.3264093229071292E-12),(-0.7340598172506592,-0.6790848140681169,1.8739802377297448E-12),(-0.7340598172506781,-0.6790848140680965,1.8739802377296882E-12),(-0.5377928463665643,-0.8430770156972309,2.326409322907207E-12),(-0.7340598172506592,-0.6790848140681169,1.8739802377297448E-12),(-0.8575399153398935,-0.5144174312742993,1.419675058550427E-12),(-0.7340598172506781,-0.6790848140680965,1.8739802377296882E-12),(-0.857539915339897,-0.5144174312742935,1.419675058550411E-12),(-0.857539915339897,-0.5144174312742935,1.419675058550411E-12),(-0.931215481170937,-0.3644691038038483,1.0061138544372103E-12),(-0.8575399153398935,-0.5144174312742993,1.419675058550427E-12),(-0.9312154811709294,-0.36446910380386777,1.006113854437264E-12),(-0.9312154811709294,-0.36446910380386777,1.006113854437264E-12),(-0.9739593803592153,-0.22672257366723225,6.260453961385096E-13),(-0.931215481170937,-0.3644691038038483,1.0061138544372103E-12),(-0.9739593803592121,-0.22672257366724605,6.260453961385477E-13),(-0.9739593803592121,-0.22672257366724605,6.260453961385477E-13),(-0.9944387604173459,-0.10531643641717323,2.910151513761047E-13),(-0.9739593803592153,-0.22672257366723225,6.260453961385096E-13),(-0.9944387604173455,-0.10531643641717783,2.9101515137611737E-13),(-0.9944387604173455,-0.10531643641717783,2.9101515137611737E-13),(-0.9999739448500035,-0.007218699406564806,2.034293870276816E-14),(-0.9944387604173459,-0.10531643641717323,2.910151513761047E-13),(-0.9999739448500035,-0.007218699406560452,2.0342938702756153E-14),(-0.9999739448500035,-0.007218699406560452,2.0342938702756153E-14),(-0.9974002311185112,0.07206093924409047,-1.984999386097171E-13),(-0.9999739448500035,-0.007218699406564806,2.034293870276816E-14),(-0.9974002311185115,0.07206093924408564,-1.9849993860970374E-13),(-0.9974002311185115,0.07206093924408564,-1.9849993860970374E-13),(-0.9886899396079466,0.14997400880831008,-4.134539467007185E-13),(-0.9974002311185112,0.07206093924409047,-1.984999386097171E-13),(-0.988689939607947,0.14997400880830747,-4.1345394670071135E-13),(-0.988689939607947,0.14997400880830747,-4.1345394670071135E-13),(-0.9722499433165867,0.2339445398398823,-6.450617742782046E-13),(-0.9886899396079466,0.14997400880831008,-4.134539467007185E-13),(-0.9722499433165831,0.23394453983989724,-6.450617742782459E-13),(-0.9722499433165831,0.23394453983989724,-6.450617742782459E-13),(-0.9453117550981344,0.3261681861759126,-8.99496373379007E-13),(-0.9722499433165867,0.2339445398398823,-6.450617742782046E-13),(-0.9453117550981349,0.32616818617591115,-8.994963733790029E-13),(-0.9453117550981349,0.32616818617591115,-8.994963733790029E-13),(-0.9018682894200392,0.432011097703025,-1.1915667525932248E-12),(-0.9453117550981344,0.3261681861759126,-8.99496373379007E-13),(-0.9018682894200535,0.43201109770299506,-1.1915667525931426E-12),(-0.9018682894200535,0.43201109770299506,-1.1915667525931426E-12),(-0.8335120349581517,0.5525013009757722,-1.5241161818881252E-12),(-0.9018682894200392,0.432011097703025,-1.1915667525932248E-12),(-0.8335120349581778,0.5525013009757331,-1.5241161818880176E-12),(-0.8335120349581778,0.5525013009757331,-1.5241161818880176E-12),(-0.732142370758794,0.6811516343221183,-1.8792003361675232E-12),(-0.8335120349581517,0.5525013009757722,-1.5241161818881252E-12),(-0.7321423707587661,0.6811516343221482,-1.8792003361676056E-12),(-0.732142370758794,0.6811516343221183,-1.8792003361675232E-12),(-0.5698568764936294,0.821743962748084,-2.2671821938941462E-12),(-0.56985687649368,0.821743962748049,-2.2671821938940493E-12),(-0.7321423707587661,0.6811516343221482,-1.8792003361676056E-12),(-0.56985687649368,0.821743962748049,-2.2671821938940493E-12),(-0.3161638639264402,0.9487045963560542,-2.617568109569353E-12),(-0.31616386392637214,0.9487045963560767,-2.6175681095694157E-12),(-0.5698568764936294,0.821743962748084,-2.2671821938941462E-12),(-0.31616386392637214,0.9487045963560767,-2.6175681095694157E-12),(-0.01445616326355981,0.9998955042121639,-2.758913785080831E-12),(-0.01445616326357933,0.9998955042121637,-2.758913785080831E-12),(-0.3161638639264402,0.9487045963560542,-2.617568109569353E-12),(-0.005246717485677339,-0.9999862358830873,2.7591811654112063E-12),(0.31925976024100283,-0.9476672440740248,2.6146941629409988E-12),(-0.005246717485740675,-0.9999862358830871,2.7591811654112067E-12),(0.31925976024109226,-0.9476672440739948,2.614694162940916E-12),(0.31925976024109226,-0.9476672440739948,2.614694162940916E-12),(0.59706336092566,-0.8021940806563927,2.213152056478129E-12),(0.31925976024100283,-0.9476672440740248,2.6146941629409988E-12),(0.5970633609257284,-0.802194080656342,2.213152056477989E-12),(0.59706336092566,-0.8021940806563927,2.213152056478129E-12),(0.784978946319045,-0.6195224401390494,1.709124450020857E-12),(0.7849789463190372,-0.6195224401390592,1.709124450020884E-12),(0.5970633609257284,-0.802194080656342,2.213152056477989E-12),(0.7849789463190372,-0.6195224401390592,1.709124450020884E-12),(0.8892699765686355,-0.4573826721396635,1.261690697605806E-12),(0.8892699765686456,-0.4573826721396436,1.2616906976057508E-12),(0.784978946319045,-0.6195224401390494,1.709124450020857E-12),(0.8892699765686456,-0.4573826721396436,1.2616906976057508E-12),(0.9460355692139014,-0.3240628053049744,8.937319740081945E-13),(0.946035569213902,-0.3240628053049727,8.937319740081899E-13),(0.8892699765686355,-0.4573826721396635,1.261690697605806E-12),(0.946035569213902,-0.3240628053049727,8.937319740081899E-13),(0.9789776170751959,-0.20396770642866793,5.624216153874339E-13),(0.9789776170751897,-0.20396770642869805,5.624216153875169E-13),(0.9460355692139014,-0.3240628053049744,8.937319740081945E-13),(0.9789776170751897,-0.20396770642869805,5.624216153875169E-13),(0.9953832851063591,-0.09597976729953485,2.6439955426439955E-13),(0.9953832851063574,-0.0959797672995527,2.6439955426444877E-13),(0.9789776170751959,-0.20396770642866793,5.624216153874339E-13),(0.9953832851063574,-0.0959797672995527,2.6439955426444877E-13),(1.,-6.809851204870718E-16,-4.525170897943959E-16),(1.,6.45609270072475E-16,-4.525170897980481E-16),(0.9953832851063591,-0.09597976729953485,2.6439955426439955E-13),(1.,6.45609270072475E-16,-4.525170897980481E-16),(0.9953832851063579,0.09597976729954767,-2.6522137368170437E-13),(0.9953832851063568,0.09597976729955957,-2.652213736817371E-13),(1.,-6.809851204870718E-16,-4.525170897943959E-16),(0.9953832851063568,0.09597976729955957,-2.652213736817371E-13),(0.9789776170751958,0.20396770642866877,-5.631601035863392E-13),(0.9789776170751952,0.20396770642867176,-5.631601035863475E-13),(0.9953832851063579,0.09597976729954767,-2.6522137368170437E-13),(0.9789776170751952,0.20396770642867176,-5.631601035863475E-13),(0.9460355692139023,0.32406280530497167,-8.945537301089409E-13),(0.9460355692139127,0.32406280530494147,-8.945537301088576E-13),(0.9789776170751958,0.20396770642866877,-5.631601035863392E-13),(0.9460355692139127,0.32406280530494147,-8.945537301088576E-13),(0.8891109963042099,0.4576916388256785,-1.2632152945178187E-12),(0.8891109963042216,0.45769163882565606,-1.2632152945177571E-12),(0.9460355692139023,0.32406280530497167,-8.945537301089409E-13),(0.8891109963042216,0.45769163882565606,-1.2632152945177571E-12),(0.7841350649780974,0.6205902028487036,-1.7126206373848539E-12),(0.784135064978063,0.620590202848747,-1.7126206373849734E-12),(0.8891109963042099,0.4576916388256785,-1.2632152945178187E-12),(0.784135064978063,0.620590202848747,-1.7126206373849734E-12),(0.5952527509857987,0.8035385257993787,-2.2173910198098846E-12),(0.595252750985843,0.803538525799346,-2.217391019809794E-12),(0.7841350649780974,0.6205902028487036,-1.7126206373848539E-12),(0.5952527509857987,0.8035385257993787,-2.2173910198098846E-12),(0.3175291106517308,0.9482485243272045,-2.6165570140899435E-12),(0.595252750985843,0.803538525799346,-2.217391019809794E-12),(0.31752911065161143,0.9482485243272446,-2.6165570140900538E-12),(0.31752911065161143,0.9482485243272446,-2.6165570140900538E-12),(-1.4062582279334822E-14,1.,-2.759214319657624E-12),(0.3175291106517308,0.9482485243272045,-2.6165570140899435E-12),(1.4796126647609E-14,1.,-2.7592143196576233E-12),(-1.4062582279334822E-14,1.,-2.759214319657624E-12),(-0.31752911065161,0.9482485243272449,-2.6162846178245698E-12),(-0.31752911065167166,0.9482485243272244,-2.616284617824512E-12),(1.4796126647609E-14,1.,-2.7592143196576233E-12),(-0.31752911065167166,0.9482485243272244,-2.616284617824512E-12),(-0.5952527509858165,0.8035385257993655,-2.2168061762331715E-12),(-0.5952527509858213,0.8035385257993619,-2.216806176233162E-12),(-0.31752911065161,0.9482485243272449,-2.6162846178245698E-12),(-0.5952527509858165,0.8035385257993655,-2.2168061762331715E-12),(-0.7841350649781005,0.6205902028486996,-1.7119934651762036E-12),(-0.5952527509858213,0.8035385257993619,-2.216806176233162E-12),(-0.7841350649780668,0.6205902028487421,-1.7119934651763207E-12),(-0.7841350649780668,0.6205902028487421,-1.7119934651763207E-12),(-0.8886633336049228,0.4585602245138429,-1.2649968737252393E-12),(-0.7841350649781005,0.6205902028486996,-1.7119934651762036E-12),(-0.8886633336049196,0.4585602245138489,-1.2649968737252559E-12),(-0.8886633336049196,0.4585602245138489,-1.2649968737252559E-12),(-0.945101558421973,0.32677674988952066,-9.012993827747226E-13),(-0.8886633336049228,0.4585602245138429,-1.2649968737252393E-12),(-0.9451015584219759,0.32677674988951194,-9.012993827746986E-13),(-0.9451015584219759,0.32677674988951194,-9.012993827746986E-13),(-0.9782446517648234,0.2074545764583652,-5.720211817209838E-13),(-0.945101558421973,0.32677674988952066,-9.012993827747226E-13),(-0.9782446517648219,0.2074545764583723,-5.720211817210033E-13),(-0.9782446517648219,0.2074545764583723,-5.720211817210033E-13),(-0.9951552549714545,0.09831591174728377,-2.70860967962034E-13),(-0.9782446517648234,0.2074545764583652,-5.720211817209838E-13),(-0.9951552549714534,0.09831591174729407,-2.708609679620625E-13),(-0.9951552549714534,0.09831591174729407,-2.708609679620625E-13),(-0.9999987530813137,0.0015791883415384137,-3.881767300413944E-15),(-0.9951552549714545,0.09831591174728377,-2.70860967962034E-13),(-0.9999987530813137,0.0015791883415576212,-3.8817673004669485E-15),(-0.9999987530813137,0.0015791883415576212,-3.8817673004669485E-15),(-0.9956491772094714,-0.09318109208472854,2.5753789101582247E-13),(-0.9999987530813137,0.0015791883415384137,-3.881767300413944E-15),(-0.995649177209472,-0.09318109208472376,2.575378910158094E-13),(-0.995649177209472,-0.09318109208472376,2.575378910158094E-13),(-0.979613746822012,-0.20089028607013118,5.54646634047343E-13),(-0.9956491772094714,-0.09318109208472854,2.5753789101582247E-13),(-0.9796137468220057,-0.2008902860701619,5.546466340474279E-13),(-0.9796137468220057,-0.2008902860701619,5.546466340474279E-13),(-0.9457986610955139,-0.3247535876167244,8.963892105851795E-13),(-0.979613746822012,-0.20089028607013118,5.54646634047343E-13),(-0.9457986610955131,-0.32475358761672657,8.963892105851855E-13),(-0.9457986610955131,-0.32475358761672657,8.963892105851855E-13),(-0.886378063178809,-0.46296212492533734,1.277733118846325E-12),(-0.9457986610955139,-0.3247535876167244,8.963892105851795E-13),(-0.8863780631788213,-0.46296212492531347,1.2777331188462595E-12),(-0.8863780631788213,-0.46296212492531347,1.2777331188462595E-12),(-0.7799875144674657,-0.6257950761030844,1.727005113735537E-12),(-0.886378063178809,-0.46296212492533734,1.277733118846325E-12),(-0.7799875144674742,-0.6257950761030739,1.7270051137355083E-12),(-0.7799875144674657,-0.6257950761030844,1.727005113735537E-12),(-0.59377879419472,-0.8046283263499144,2.2203827950139866E-12),(-0.593778794194671,-0.8046283263499506,2.2203827950140867E-12),(-0.7799875144674742,-0.6257950761030739,1.7270051137355083E-12),(-0.593778794194671,-0.8046283263499506,2.2203827950140867E-12),(-0.3238558108248667,-0.946106449505006,2.6106452447762887E-12),(-0.32385581082476506,-0.9461064495050407,2.6106452447763844E-12),(-0.59377879419472,-0.8046283263499144,2.2203827950139866E-12),(-0.3238558108248667,-0.946106449505006,2.6106452447762887E-12),(-0.005246717485740675,-0.9999862358830871,2.7591811654112067E-12),(-0.32385581082476506,-0.9461064495050407,2.6106452447763844E-12),(-0.005246717485677339,-0.9999862358830873,2.7591811654112063E-12),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.20007400713152548,0.9797807875593062,-2.703361393957792E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.2000740071318276,0.9797807875592447,-2.7033613939576216E-12),(-0.2000740071318276,0.9797807875592447,-2.7033613939576216E-12),(-0.39205733655535346,0.9199407833404945,-2.5381887537922687E-12),(-0.20007400713152548,0.9797807875593062,-2.703361393957792E-12),(-0.39205733655535346,0.9199407833404945,-2.5381887537922687E-12),(-0.9250216907185411,0.3799142952038156,-1.047987650707536E-12),(-0.958982326684027,0.28346586585987765,-7.818185808813192E-13),(-0.9250216907185411,0.3799142952038156,-1.047987650707536E-12),(-0.9589823266839906,0.2834658658600011,-7.818185808816598E-13),(-0.9589823266839906,0.2834658658600011,-7.818185808816598E-13),(-0.9829162037139707,0.18405362391573823,-5.074751096891442E-13),(-0.958982326684027,0.28346586585987765,-7.818185808813192E-13),(-0.9829162037139707,0.18405362391573823,-5.074751096891442E-13),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.9826489702535564,-0.1854750691053259,5.120426916940078E-13),(-0.9589087450177696,-0.2837146783803166,7.831340757246276E-13),(-0.9826489702535564,-0.1854750691053259,5.120426916940078E-13),(-0.9589087450177659,-0.28371467838032877,7.831340757246613E-13),(-0.9589087450177659,-0.28371467838032877,7.831340757246613E-13),(-0.8038585012002755,-0.5948205696241909,1.6415065801186948E-12),(-0.9589087450177696,-0.2837146783803166,7.831340757246276E-13),(-0.8038585012004971,-0.5948205696238914,1.6415065801178692E-12),(-0.8038585012002755,-0.5948205696241909,1.6415065801186948E-12),(-0.41828292848593485,-0.9083167904080769,2.5063823965658246E-12),(-0.41828292848583404,-0.9083167904081234,2.5063823965659527E-12),(-0.8038585012004971,-0.5948205696238914,1.6415065801178692E-12),(-0.41828292848593485,-0.9083167904080769,2.5063823965658246E-12),(-0.08869355101094167,-0.9960589611107715,2.748380895914657E-12),(-0.41828292848583404,-0.9083167904081234,2.5063823965659527E-12),(-0.08869355101079608,-0.9960589611107846,2.7483808959146937E-12),(-0.08869355101094167,-0.9960589611107715,2.748380895914657E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(-0.08869355101079608,-0.9960589611107846,2.7483808959146937E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-0.5954279130339785,0.8034087380530542,-2.216611033634046E-12),(-0.7353424654422698,0.6776956975791453,-1.8697394994571508E-12),(-0.7353424654422304,0.677695697579188,-1.8697394994572687E-12),(-0.5954279130339785,0.8034087380530542,-2.216611033634046E-12),(-0.7353424654422698,0.6776956975791453,-1.8697394994571508E-12),(-0.9279729502400419,0.3726475595288301,-1.0279126771964274E-12),(-0.7353424654422304,0.677695697579188,-1.8697394994572687E-12),(-0.9279729502400574,0.37264755952879125,-1.02791267719632E-12),(-0.9279729502400574,0.37264755952879125,-1.02791267719632E-12),(-0.9919380594528869,0.12672366080902567,-3.492308184295855E-13),(-0.9279729502400419,0.3726475595288301,-1.0279126771964274E-12),(-0.9919380594528845,0.12672366080904565,-3.492308184296405E-13),(-0.9919380594528845,0.12672366080904565,-3.492308184296405E-13),(-0.9997278626286517,0.023328109309328878,-6.395828495308953E-14),(-0.9919380594528869,0.12672366080902567,-3.492308184295855E-13),(-0.9997278626286515,0.023328109309333333,-6.395828495310183E-14),(-0.9997278626286515,0.023328109309333333,-6.395828495310183E-14),(-0.9997372811223784,-0.022920923498727593,6.369599145660812E-14),(-0.9997278626286517,0.023328109309328878,-6.395828495308953E-14),(-0.9997372811223789,-0.022920923498710125,6.369599145655989E-14),(-0.9997372811223789,-0.022920923498710125,6.369599145655989E-14),(-0.9919210150229036,-0.12685700593949403,3.5038740485908853E-13),(-0.9997372811223784,-0.022920923498727593,6.369599145660812E-14),(-0.9919210150229122,-0.12685700593942653,3.503874048589024E-13),(-0.9919210150229122,-0.12685700593942653,3.503874048589024E-13),(-0.9257138949175249,-0.3782245163347108,1.043840848107773E-12),(-0.9919210150229036,-0.12685700593949403,3.5038740485908853E-13),(-0.9257138949175149,-0.37822451633473536,1.0438408481078407E-12),(-0.9257138949175149,-0.37822451633473536,1.0438408481078407E-12),(-0.7298956734503225,-0.6835585606796979,1.8863305718565594E-12),(-0.9257138949175249,-0.3782245163347108,1.043840848107773E-12),(-0.7298956734502887,-0.6835585606797341,1.8863305718566596E-12),(-0.7298956734502887,-0.6835585606797341,1.8863305718566596E-12),(-0.5913596447695503,-0.806407943002815,2.2252802331604026E-12),(-0.7298956734503225,-0.6835585606796979,1.8863305718565594E-12),(-0.5913596447695503,-0.806407943002815,2.2252802331604026E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.5913596447695502,-0.806407943002815,2.2248822275958436E-12),(0.7298956734503304,-0.6835585606796896,1.8858671011931336E-12),(0.5913596447695502,-0.806407943002815,2.2248822275958436E-12),(0.7298956734502946,-0.6835585606797276,1.8858671011932386E-12),(0.7298956734503304,-0.6835585606796896,1.8858671011931336E-12),(0.9257138949175322,-0.3782245163346928,1.0432901401311892E-12),(0.9257138949175271,-0.37822451633470505,1.0432901401312231E-12),(0.7298956734502946,-0.6835585606797276,1.8858671011932386E-12),(0.9257138949175271,-0.37822451633470505,1.0432901401312231E-12),(0.9919210150229029,-0.1268570059394997,3.4967539959254504E-13),(0.9919210150229099,-0.1268570059394458,3.4967539959239635E-13),(0.9257138949175322,-0.3782245163346928,1.0432901401311892E-12),(0.9919210150229099,-0.1268570059394458,3.4967539959239635E-13),(0.9997372811223789,-0.022920923498710073,6.287493034555779E-14),(0.9997372811223788,-0.02292092349871427,6.28749303455694E-14),(0.9919210150229029,-0.1268570059394997,3.4967539959254504E-13),(0.9997372811223788,-0.02292092349871427,6.28749303455694E-14),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.9997372811223789,-0.022920923498710073,6.287493034555779E-14),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(-0.9985580220656759,0.05368311250556469,-1.4775374954813683E-13),(-0.9985580220656763,-0.053683112505556796,1.484923557101551E-13),(-0.998558022065675,0.05368311250558329,-1.4775374954818813E-13),(-0.9985580220656761,-0.05368311250556282,1.4849235571017176E-13),(-0.9985580220656761,-0.05368311250556282,1.4849235571017176E-13),(-0.994236246863431,-0.10721140528376129,2.961599169183224E-13),(-0.9985580220656763,-0.053683112505556796,1.484923557101551E-13),(-0.994236246863431,-0.10721140528376129,2.961599169183224E-13),(-0.8507772826193604,-0.5255264173938519,1.4502356074986453E-12),(-0.7331764133483573,-0.6800384892854513,1.8766050604378702E-12),(-0.8507772826193604,-0.5255264173938519,1.4502356074986453E-12),(-0.7331764133483956,-0.68003848928541,1.876605060437756E-12),(-0.7331764133483956,-0.68003848928541,1.876605060437756E-12),(-0.5879319010498538,-0.8089104275059785,2.2322190997416186E-12),(-0.7331764133483573,-0.6800384892854513,1.8766050604378702E-12),(-0.5879319010498538,-0.8089104275059785,2.2322190997416186E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(0.06586923201172726,0.9978282639182884,-2.7532464852802105E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(0.06586923201174096,0.9978282639182874,-2.7532464852802073E-12),(0.06586923201174096,0.9978282639182874,-2.7532464852802073E-12),(0.26363297317792694,0.9646230639236067,-2.6616378653424102E-12),(0.06586923201172726,0.9978282639182884,-2.7532464852802105E-12),(0.26363297317782863,0.9646230639236335,-2.661637865342485E-12),(0.26363297317782863,0.9646230639236335,-2.661637865342485E-12),(0.4941723067129574,0.8693639808952259,-2.3988851555265642E-12),(0.26363297317792694,0.9646230639236067,-2.6616378653424102E-12),(0.49417230671293877,0.8693639808952366,-2.3988851555265937E-12),(0.49417230671293877,0.8693639808952366,-2.3988851555265937E-12),(0.6822341669074508,0.7311337370851497,-2.017537193202276E-12),(0.4941723067129574,0.8693639808952259,-2.3988851555265642E-12),(0.6822341669074938,0.7311337370851094,-2.0175371932021646E-12),(0.6822341669074508,0.7311337370851497,-2.017537193202276E-12),(0.8170818871976416,0.5765216297881117,-1.59088486856297E-12),(0.8170818871976462,0.5765216297881053,-1.5908848685629521E-12),(0.6822341669074938,0.7311337370851094,-2.0175371932021646E-12),(0.8170818871976462,0.5765216297881053,-1.5908848685629521E-12),(0.8956698069729665,0.44471968348276353,-1.2273543762353944E-12),(0.8956698069729655,0.44471968348276525,-1.227354376235399E-12),(0.8170818871976416,0.5765216297881117,-1.59088486856297E-12),(0.8956698069729655,0.44471968348276525,-1.227354376235399E-12),(0.9418989444488495,0.33589638051956316,-9.272983605090954E-13),(0.9418989444488512,0.3358963805195581,-9.272983605090814E-13),(0.8956698069729665,0.44471968348276353,-1.2273543762353944E-12),(0.9418989444488512,0.3358963805195581,-9.272983605090814E-13),(0.9719072033706481,0.23536437291197268,-6.498918762814914E-13),(0.9719072033706505,0.23536437291196244,-6.498918762814632E-13),(0.9418989444488495,0.33589638051956316,-9.272983605090954E-13),(0.9719072033706505,0.23536437291196244,-6.498918762814632E-13),(0.9926609702408182,0.12093055098095644,-3.340670894605737E-13),(0.9926609702408176,0.12093055098096052,-3.34067089460585E-13),(0.9719072033706481,0.23536437291197268,-6.498918762814914E-13),(0.9926609702408176,0.12093055098096052,-3.34067089460585E-13),(0.9999176960541967,0.012829696709872374,-3.5849862972500346E-14),(0.9999176960541967,0.012829696709878598,-3.584986297251749E-14),(0.9926609702408182,0.12093055098095644,-3.340670894605737E-13),(0.9999176960541967,0.012829696709878598,-3.584986297251749E-14),(0.9977259706298166,-0.06740094606747518,1.8553885613034147E-13),(0.9977259706298175,-0.0674009460674604,1.8553885613030068E-13),(0.9999176960541967,0.012829696709872374,-3.5849862972500346E-14),(0.9977259706298175,-0.0674009460674604,1.8553885613030068E-13),(0.9902871124897815,-0.1390375303170006,3.8325816578756883E-13),(0.9902871124897834,-0.1390375303169881,3.832581657875344E-13),(0.9977259706298166,-0.06740094606747518,1.8553885613034147E-13),(0.9902871124897834,-0.1390375303169881,3.832581657875344E-13),(0.9766392563350035,-0.2148854648072119,5.925703604599339E-13),(0.9766392563350028,-0.21488546480721524,5.92570360459943E-13),(0.9902871124897815,-0.1390375303170006,3.8325816578756883E-13),(0.9766392563350028,-0.21488546480721524,5.92570360459943E-13),(0.956192572857882,-0.2927383876628142,8.073506602852786E-13),(0.9561925728578783,-0.2927383876628269,8.073506602853137E-13),(0.9766392563350035,-0.2148854648072119,5.925703604599339E-13),(0.9561925728578783,-0.2927383876628269,8.073506602853137E-13),(0.9254680870270003,-0.37882557977858955,1.0449165609791505E-12),(0.925468087026997,-0.3788255797785978,1.044916560979173E-12),(0.956192572857882,-0.2927383876628142,8.073506602852786E-13),(0.925468087026997,-0.3788255797785978,1.044916560979173E-12),(0.8749146921521967,-0.48427707095858563,1.3360305909515945E-12),(0.8749146921522147,-0.48427707095855305,1.3360305909515049E-12),(0.9254680870270003,-0.37882557977858955,1.0449165609791505E-12),(0.8749146921522147,-0.48427707095855305,1.3360305909515049E-12),(0.7908353863491634,-0.6120289141028957,1.688499798773447E-12),(0.7908353863492028,-0.6120289141028448,1.6884997987733065E-12),(0.8749146921521967,-0.48427707095858563,1.3360305909515945E-12),(0.7908353863492028,-0.6120289141028448,1.6884997987733065E-12),(0.6577139687329254,-0.7532677713360533,2.078186457948582E-12),(0.6577139687329435,-0.7532677713360374,2.0781864579485385E-12),(0.7908353863491634,-0.6120289141028957,1.688499798773447E-12),(0.6577139687329254,-0.7532677713360533,2.078186457948582E-12),(0.48381045391931793,-0.8751728084660673,2.4146336213589463E-12),(0.6577139687329435,-0.7532677713360374,2.0781864579485385E-12),(0.4838104539193804,-0.8751728084660328,2.4146336213588514E-12),(0.4838104539193804,-0.8751728084660328,2.4146336213588514E-12),(0.26498333539704805,-0.9642529916789763,2.6604965808153724E-12),(0.48381045391931793,-0.8751728084660673,2.4146336213589463E-12),(0.26498333539706426,-0.9642529916789718,2.66049658081536E-12),(0.26498333539706426,-0.9642529916789718,2.66049658081536E-12),(0.06820622469696762,-0.9976712439038158,2.7527676235146555E-12),(0.26498333539704805,-0.9642529916789763,2.6604965808153724E-12),(0.06820622469692826,-0.9976712439038183,2.752767623514662E-12),(0.06820622469696762,-0.9976712439038158,2.7527676235146555E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(0.06820622469692826,-0.9976712439038183,2.752767623514662E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-0.587931901049856,0.808910427505977,-2.231765637671211E-12),(-0.733176413348437,0.6800384892853655,-1.8760841722953543E-12),(-0.7331764133484753,0.6800384892853242,-1.8760841722952404E-12),(-0.587931901049856,0.808910427505977,-2.231765637671211E-12),(-0.733176413348437,0.6800384892853655,-1.8760841722953543E-12),(-0.8507772826193596,0.5255264173938535,-1.449666932822264E-12),(-0.7331764133484753,0.6800384892853242,-1.8760841722952404E-12),(-0.8507772826193596,0.5255264173938535,-1.449666932822264E-12),(-0.9942362468634309,0.10721140528376116,-2.954779329044235E-13),(-0.998558022065675,0.05368311250558329,-1.4775374954818813E-13),(-0.9942362468634309,0.10721140528376116,-2.954779329044235E-13),(-0.9985580220656759,0.05368311250556469,-1.4775374954813683E-13),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.07695947056770674,0.9970342220254721,-2.7510082988628757E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.0769594705677078,0.9970342220254721,-2.7510082988628753E-12),(-0.07695947056770674,0.9970342220254721,-2.7510082988628757E-12),(-0.30631458433137615,0.9519303416878236,-2.6264807897756227E-12),(-0.3063145843315041,0.9519303416877822,-2.6264807897755084E-12),(-0.0769594705677078,0.9970342220254721,-2.7510082988628753E-12),(-0.3063145843315041,0.9519303416877822,-2.6264807897755084E-12),(-0.5625785556331592,0.82674383501887,-2.280966606630998E-12),(-0.5625785556331618,0.8267438350188683,-2.280966606630993E-12),(-0.30631458433137615,0.9519303416878236,-2.6264807897756227E-12),(-0.5625785556331618,0.8267438350188683,-2.280966606630993E-12),(-0.7436990877465491,0.6685145225684711,-1.8442811135909136E-12),(-0.7436990877464648,0.6685145225685648,-1.8442811135911725E-12),(-0.5625785556331592,0.82674383501887,-2.280966606630998E-12),(-0.7436990877465491,0.6685145225684711,-1.8442811135909136E-12),(-0.8582582522446103,0.5132180554637833,-1.4157710495612677E-12),(-0.7436990877464648,0.6685145225685648,-1.8442811135911725E-12),(-0.8582582522446274,0.5132180554637548,-1.415771049561189E-12),(-0.8582582522446274,0.5132180554637548,-1.415771049561189E-12),(-0.9228983961102781,0.38504356955684416,-1.06205482241479E-12),(-0.8582582522446103,0.5132180554637833,-1.4157710495612677E-12),(-0.9228983961102676,0.38504356955686964,-1.0620548224148605E-12),(-0.9228983961102676,0.38504356955686964,-1.0620548224148605E-12),(-0.9598249214871282,0.2805995725089912,-7.738872824411204E-13),(-0.9228983961102781,0.38504356955684416,-1.06205482241479E-12),(-0.959824921487124,0.2805995725090049,-7.738872824411583E-13),(-0.959824921487124,0.2805995725090049,-7.738872824411583E-13),(-0.9825437042969424,0.18603190357151872,-5.130037687554117E-13),(-0.9598249214871282,0.2805995725089912,-7.738872824411204E-13),(-0.9825437042969416,0.18603190357152283,-5.13003768755423E-13),(-0.9825437042969416,0.18603190357152283,-5.13003768755423E-13),(-0.9959333498749684,0.09009307746338743,-2.481895387279436E-13),(-0.9825437042969424,0.18603190357151872,-5.130037687554117E-13),(-0.9959333498749663,0.09009307746340967,-2.48189538728005E-13),(-0.9959333498749663,0.09009307746340967,-2.48189538728005E-13),(-0.9999913518233414,0.004158879479668723,-1.0991243088378882E-14),(-0.9959333498749684,0.09009307746338743,-2.481895387279436E-13),(-0.9999913518233414,0.004158879479666016,-1.0991243088371415E-14),(-0.9999913518233414,0.004158879479666016,-1.0991243088371415E-14),(-0.997280073697995,-0.07370518709644312,2.038673491122472E-13),(-0.9999913518233414,0.004158879479668723,-1.0991243088378882E-14),(-0.997280073697995,-0.07370518709644484,2.038673491122519E-13),(-0.997280073697995,-0.07370518709644484,2.038673491122519E-13),(-0.9867686117938449,-0.1621348413464799,4.4777765945619103E-13),(-0.997280073697995,-0.07370518709644312,2.038673491122472E-13),(-0.9867686117938491,-0.16213484134645498,4.4777765945612226E-13),(-0.9867686117938491,-0.16213484134645498,4.4777765945612226E-13),(-0.9628292628321741,-0.2701107377244606,7.45731749111812E-13),(-0.9867686117938449,-0.1621348413464799,4.4777765945619103E-13),(-0.9628292628321742,-0.2701107377244601,7.457317491118106E-13),(-0.9628292628321742,-0.2701107377244601,7.457317491118106E-13),(-0.9101427787757594,-0.41429472871657336,1.1435487231159596E-12),(-0.9628292628321741,-0.2701107377244606,7.45731749111812E-13),(-0.9101427787757602,-0.41429472871657175,1.1435487231159554E-12),(-0.9101427787757602,-0.41429472871657175,1.1435487231159554E-12),(-0.7869835626918029,-0.6169739638371438,1.7026555015269114E-12),(-0.9101427787757594,-0.41429472871657336,1.1435487231159596E-12),(-0.7869835626917597,-0.6169739638371992,1.7026555015270646E-12),(-0.7869835626918029,-0.6169739638371438,1.7026555015269114E-12),(-0.5449321183150416,-0.8384801646006192,2.313750575802711E-12),(-0.5449321183150387,-0.8384801646006211,2.313750575802717E-12),(-0.7869835626917597,-0.6169739638371992,1.7026555015270646E-12),(-0.5449321183150387,-0.8384801646006211,2.313750575802717E-12),(-0.24629616144207656,-0.969194614542868,2.6743073381634536E-12),(-0.24629616144210634,-0.9691946145428606,2.674307338163433E-12),(-0.5449321183150416,-0.8384801646006192,2.313750575802711E-12),(-0.24629616144207656,-0.969194614542868,2.6743073381634536E-12),(-0.05277084790588199,-0.9986066480908758,2.7553875787746354E-12),(-0.24629616144210634,-0.9691946145428606,2.674307338163433E-12),(-0.05277084790586261,-0.998606648090877,2.7553875787746386E-12),(-0.05277084790586261,-0.998606648090877,2.7553875787746386E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.05277084790588199,-0.9986066480908758,2.7553875787746354E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.20007400713181706,0.9797807875592468,-2.7033613939576313E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.20007400713174242,0.9797807875592619,-2.7033613939576733E-12),(-0.20007400713181706,0.9797807875592468,-2.7033613939576313E-12),(-0.39205733655535935,0.9199407833404918,-2.5381887537922687E-12),(-0.39205733655535935,0.9199407833404918,-2.5381887537922687E-12),(-0.20007400713174242,0.9797807875592619,-2.7033613939576733E-12),(-0.9271481171496561,0.374695034482508,-1.0336102455888043E-12),(-0.9613689058329938,0.2752631956827363,-7.592249637672097E-13),(-0.9271481171496561,0.374695034482508,-1.0336102455888043E-12),(-0.9613689058329786,0.27526319568278984,-7.592249637673574E-13),(-0.9613689058329786,0.27526319568278984,-7.592249637673574E-13),(-0.9849591146664011,0.1727875644703044,-4.764443598667407E-13),(-0.9613689058329938,0.2752631956827363,-7.592249637672097E-13),(-0.9849591146664011,0.1727875644703044,-4.764443598667407E-13),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.9850568535010445,-0.1722294846146325,4.755718845284114E-13),(-0.9627290187837241,-0.2704678102690373,7.466747295903115E-13),(-0.9850568535010445,-0.1722294846146325,4.755718845284114E-13),(-0.9627290187837233,-0.2704678102690403,7.466747295903199E-13),(-0.9627290187837233,-0.2704678102690403,7.466747295903199E-13),(-0.8103422277042358,-0.5859568874920209,1.6171129406161433E-12),(-0.9627290187837241,-0.2704678102690373,7.466747295903115E-13),(-0.8103422277044423,-0.5859568874917351,1.617112940615355E-12),(-0.8103422277042358,-0.5859568874920209,1.6171129406161433E-12),(-0.4221218672865516,-0.9065390941148183,2.5014815424853392E-12),(-0.4221218672861895,-0.9065390941149867,2.5014815424858045E-12),(-0.8103422277044423,-0.5859568874917351,1.617112940615355E-12),(-0.4221218672861895,-0.9065390941149867,2.5014815424858045E-12),(-0.0889963508540526,-0.9960319520651245,2.748302161356421E-12),(-0.08899635085414635,-0.9960319520651162,2.7483021613563985E-12),(-0.4221218672865516,-0.9065390941148183,2.5014815424853392E-12),(-0.0889963508540526,-0.9960319520651245,2.748302161356421E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.08899635085414635,-0.9960319520651162,2.7483021613563985E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-0.5879319010498686,0.8089104275059679,-2.2317101265199796E-12),(-0.7331764133483359,0.6800384892854743,-1.876112461172377E-12),(-0.5879319010498686,0.8089104275059679,-2.2317101265199796E-12),(-0.7331764133483462,0.6800384892854633,-1.8761124611723464E-12),(-0.7331764133483462,0.6800384892854633,-1.8761124611723464E-12),(-0.8507772826193463,0.5255264173938747,-1.4497779551247261E-12),(-0.7331764133483359,0.6800384892854743,-1.876112461172377E-12),(-0.8507772826193463,0.5255264173938747,-1.4497779551247261E-12),(-0.9942362468634309,0.10721140528376116,-2.954779329044235E-13),(-0.9985580220656761,0.05368311250556237,-1.4775374954813045E-13),(-0.9942362468634309,0.10721140528376116,-2.954779329044235E-13),(-0.9985580220656766,0.05368311250555518,-1.4775374954811053E-13),(-0.9985580220656766,0.05368311250555518,-1.4775374954811053E-13),(-0.9997372811223788,-0.022920923498714715,6.369599145657258E-14),(-0.9985580220656761,0.05368311250556237,-1.4775374954813045E-13),(-0.9997372811223786,-0.02292092349872411,6.369599145659852E-14),(-0.9997372811223786,-0.02292092349872411,6.369599145659852E-14),(-0.9919210150229094,-0.12685700593944943,3.504152525380329E-13),(-0.9997372811223788,-0.022920923498714715,6.369599145657258E-14),(-0.9919210150229099,-0.12685700593944513,3.504152525380211E-13),(-0.9919210150229099,-0.12685700593944513,3.504152525380211E-13),(-0.9257138949175179,-0.3782245163347276,1.0438408481077892E-12),(-0.9919210150229094,-0.12685700593944943,3.504152525380329E-13),(-0.9257138949175853,-0.3782245163345627,1.0438408481073344E-12),(-0.9257138949175853,-0.3782245163345627,1.0438408481073344E-12),(-0.7298956734503028,-0.683558560679719,1.8863023321938568E-12),(-0.9257138949175179,-0.3782245163347276,1.0438408481077892E-12),(-0.7298956734503935,-0.6835585606796221,1.8863023321935886E-12),(-0.7298956734503935,-0.6835585606796221,1.8863023321935886E-12),(-0.5913596447695699,-0.8064079430028008,2.225280233160403E-12),(-0.7298956734503028,-0.683558560679719,1.8863023321938568E-12),(-0.5913596447695699,-0.8064079430028008,2.225280233160403E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.3916449267378769E-27,1.,-2.75921435746603E-12),(-0.08899635085414426,0.9960319520651163,-2.7482310771943903E-12),(-1.3916449267378769E-27,1.,-2.75921435746603E-12),(-0.08899635085419927,0.9960319520651114,-2.748231077194377E-12),(-0.08899635085419927,0.9960319520651114,-2.748231077194377E-12),(-0.42212186728681367,0.9065390941146961,-2.50111603409203E-12),(-0.08899635085414426,0.9960319520651163,-2.7482310771943903E-12),(-0.422121867286689,0.9065390941147541,-2.5011160340921902E-12),(-0.42212186728681367,0.9065390941146961,-2.50111603409203E-12),(-0.8086796863924085,0.5882492369874152,-1.6227465604144224E-12),(-0.8086796863925371,0.5882492369872385,-1.622746560413935E-12),(-0.422121867286689,0.9065390941147541,-2.5011160340921902E-12),(-0.8086796863924085,0.5882492369874152,-1.6227465604144224E-12),(-0.9603664303895799,0.27874059514318394,-7.687239805834092E-13),(-0.8086796863925371,0.5882492369872385,-1.622746560413935E-12),(-0.9603664303895832,0.278740595143172,-7.687239805833762E-13),(-0.9603664303895832,0.278740595143172,-7.687239805833762E-13),(-0.9830031215351334,0.18358884239567475,-5.061428413667684E-13),(-0.9603664303895799,0.27874059514318394,-7.687239805834092E-13),(-0.9830031215351334,0.18358884239567475,-5.061428413667684E-13),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.9832650394637042,-0.1821808501693859,5.031054012564891E-13),(-0.9604389766296882,-0.27849052438192123,7.688003569519442E-13),(-0.9832650394637042,-0.1821808501693859,5.031054012564891E-13),(-0.9604389766296882,-0.27849052438192123,7.688003569519443E-13),(-0.9604389766296882,-0.27849052438192123,7.688003569519443E-13),(-0.8061306092177407,-0.5917376453144033,1.633059011257657E-12),(-0.9604389766296882,-0.27849052438192123,7.688003569519442E-13),(-0.8061306092175928,-0.5917376453146048,1.6330590112582136E-12),(-0.8061306092175928,-0.5917376453146048,1.6330590112582136E-12),(-0.4173761927597633,-0.9087337969490104,2.507572658333842E-12),(-0.8061306092177407,-0.5917376453144033,1.633059011257657E-12),(-0.41737619275943794,-0.9087337969491598,2.5075726583342545E-12),(-0.41737619275943794,-0.9087337969491598,2.5075726583342545E-12),(-0.0876379036952092,-0.9961523968931206,2.7486246286271526E-12),(-0.4173761927597633,-0.9087337969490104,2.507572658333842E-12),(-0.08763790369517202,-0.996152396893124,2.748624628627162E-12),(-0.0876379036952092,-0.9961523968931206,2.7486246286271526E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.08763790369517202,-0.996152396893124,2.748624628627162E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.08899635085417186,0.996031952065114,-2.7482241106569274E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.08899635085428885,0.9960319520651035,-2.7482241106568983E-12),(-0.08899635085428885,0.9960319520651035,-2.7482241106568983E-12),(-0.42212186728673545,0.9065390941147324,-2.5011088585143298E-12),(-0.08899635085417186,0.996031952065114,-2.7482241106569274E-12),(-0.4221218672863759,0.9065390941149,-2.5011088585147922E-12),(-0.42212186728673545,0.9065390941147324,-2.5011088585143298E-12),(-0.8086796863921236,0.5882492369878068,-1.622746560415468E-12),(-0.8086796863926936,0.588249236987023,-1.622746560413305E-12),(-0.4221218672863759,0.9065390941149,-2.5011088585147922E-12),(-0.8086796863921236,0.5882492369878068,-1.622746560415468E-12),(-0.9603664303895966,0.2787405951431262,-7.687518695556553E-13),(-0.8086796863926936,0.588249236987023,-1.622746560413305E-12),(-0.9603664303895936,0.2787405951431366,-7.687518695556838E-13),(-0.9603664303895936,0.2787405951431366,-7.687518695556838E-13),(-0.9830031215351365,0.18358884239565865,-5.061983525179996E-13),(-0.9603664303895966,0.2787405951431262,-7.687518695556553E-13),(-0.9830031215351365,0.18358884239565865,-5.061983525179996E-13),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.9829162037139707,-0.18405362391573804,5.082124243891802E-13),(-0.9589823266839971,-0.2834658658599789,7.82503503598075E-13),(-0.9829162037139707,-0.18405362391573804,5.082124243891802E-13),(-0.9589823266839956,-0.283465865859984,7.825035035980891E-13),(-0.9589823266839956,-0.283465865859984,7.825035035980891E-13),(-0.9250216907185411,-0.3799142952038155,1.0486130201458409E-12),(-0.9589823266839971,-0.2834658658599789,7.82503503598075E-13),(-0.9250216907185411,-0.3799142952038155,1.0486130201458409E-12),(-0.39770665703451996,-0.9175126238643406,2.5317835110675614E-12),(-0.20308542061863116,-0.9791610245164756,2.7018017139449943E-12),(-0.39770665703451996,-0.9175126238643406,2.5317835110675614E-12),(-0.20308542061867696,-0.979161024516466,2.7018017139449676E-12),(-0.20308542061863116,-0.9791610245164756,2.7018017139449943E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.20308542061867696,-0.979161024516466,2.7018017139449676E-12),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(0.7352884309046378,0.677754323761786,-1.8703430794502378E-12),(0.8219126130549742,0.5696136028055726,-1.5721017478755859E-12),(0.821912613054971,0.569613602805577,-1.5721017478755982E-12),(0.7352884309046378,0.677754323761786,-1.8703430794502378E-12),(0.821912613054971,0.569613602805577,-1.5721017478755982E-12),(0.9379792061057557,0.34669151837507706,-9.5702450409585E-13),(0.937979206105743,0.3466915183751111,-9.570245040959436E-13),(0.8219126130549742,0.5696136028055726,-1.5721017478755859E-12),(0.937979206105743,0.3466915183751111,-9.570245040959436E-13),(0.98805711892142,0.15408805842343215,-4.2551953193247875E-13),(0.9880571189214249,0.15408805842340023,-4.255195319323907E-13),(0.9379792061057557,0.34669151837507706,-9.5702450409585E-13),(0.9880571189214249,0.15408805842340023,-4.255195319323907E-13),(0.9999397421523021,0.01097779870410655,-3.0673429705229644E-14),(0.9999397421523019,0.010977798704114703,-3.067342970525215E-14),(0.98805711892142,0.15408805842343215,-4.2551953193247875E-13),(0.9999397421523019,0.010977798704114703,-3.067342970525215E-14),(0.9948858286649289,-0.10100588062928692,2.783210139511392E-13),(0.9948858286649307,-0.10100588062926952,2.783210139510912E-13),(0.9999397421523021,0.01097779870410655,-3.0673429705229644E-14),(0.9948858286649307,-0.10100588062926952,2.783210139510912E-13),(0.9754732549000814,-0.22011798875748684,6.069252054581283E-13),(0.9754732549000839,-0.22011798875747546,6.06925205458097E-13),(0.9948858286649289,-0.10100588062928692,2.783210139511392E-13),(0.9754732549000839,-0.22011798875747546,6.06925205458097E-13),(0.9331889358875146,-0.359386157130639,9.912385437337467E-13),(0.9331889358875224,-0.35938615713061894,9.912385437336915E-13),(0.9754732549000814,-0.22011798875748684,6.069252054581283E-13),(0.9331889358875224,-0.35938615713061894,9.912385437336915E-13),(0.8533260584412695,-0.521377634718912,1.4383339432275474E-12),(0.8533260584412645,-0.5213776347189203,1.4383339432275709E-12),(0.9331889358875146,-0.359386157130639,9.912385437337467E-13),(0.8533260584412645,-0.5213776347189203,1.4383339432275709E-12),(0.7046792499668371,-0.7095260070400352,1.957537500314869E-12),(0.7046792499668799,-0.7095260070399927,1.9575375003147522E-12),(0.8533260584412695,-0.521377634718912,1.4383339432275474E-12),(0.7046792499668371,-0.7095260070400352,1.957537500314869E-12),(0.46309034133606747,-0.886311082950701,2.445353233631711E-12),(0.7046792499668799,-0.7095260070399927,1.9575375003147522E-12),(0.46309034133616733,-0.8863110829506489,2.4453532336315672E-12),(0.46309034133616733,-0.8863110829506489,2.4453532336315672E-12),(0.20131673991194704,-0.9795261968070204,2.702639683361123E-12),(0.46309034133606747,-0.886311082950701,2.445353233631711E-12),(0.2013167399120235,-0.9795261968070046,2.7026396833610795E-12),(0.2013167399120235,-0.9795261968070046,2.7026396833610795E-12),(0.04276298507064453,-0.9990852451657206,2.7566817751602393E-12),(0.20131673991194704,-0.9795261968070204,2.702639683361123E-12),(0.04276298507064104,-0.9990852451657207,2.7566817751602393E-12),(0.04276298507064104,-0.9990852451657207,2.7566817751602393E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(0.04276298507064453,-0.9990852451657206,2.7566817751602393E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-0.595427913033985,0.8034087380530496,-2.216611033634046E-12),(-0.7353424654422723,0.6776956975791426,-1.869711244045398E-12),(-0.7353424654423132,0.6776956975790981,-1.869711244045275E-12),(-0.595427913033985,0.8034087380530496,-2.216611033634046E-12),(-0.7353424654422723,0.6776956975791426,-1.869711244045398E-12),(-0.9279729502400482,0.37264755952881395,-1.0279408602379238E-12),(-0.7353424654423132,0.6776956975790981,-1.869711244045275E-12),(-0.9279729502401372,0.37264755952859296,-1.0279408602373137E-12),(-0.9279729502401372,0.37264755952859296,-1.0279408602373137E-12),(-0.9919380594528827,0.12672366080905945,-3.492865095037186E-13),(-0.9279729502400482,0.37264755952881395,-1.0279408602379238E-12),(-0.9919380594528854,0.12672366080903733,-3.492865095036575E-13),(-0.9919380594528854,0.12672366080903733,-3.492865095036575E-13),(-0.9997278626286517,0.023328109309328406,-6.395828495308825E-14),(-0.9919380594528827,0.12672366080905945,-3.492865095037186E-13),(-0.9997278626286514,0.023328109309333794,-6.395828495310311E-14),(-0.9997278626286514,0.023328109309333794,-6.395828495310311E-14),(-0.9997372811223784,-0.022920923498728103,6.369599145660952E-14),(-0.9997278626286517,0.023328109309328406,-6.395828495308825E-14),(-0.9997372811223787,-0.022920923498716585,6.369599145657773E-14),(-0.9997372811223787,-0.022920923498716585,6.369599145657773E-14),(-0.9919210150229141,-0.12685700593941257,3.504987955752085E-13),(-0.9997372811223784,-0.022920923498728103,6.369599145660952E-14),(-0.9919210150229048,-0.1268570059394845,3.504987955754068E-13),(-0.9919210150229048,-0.1268570059394845,3.504987955754068E-13),(-0.9257138949175897,-0.3782245163345522,1.0439254718178507E-12),(-0.9919210150229141,-0.12685700593941257,3.504987955752085E-13),(-0.9257138949175633,-0.3782245163346167,1.0439254718180288E-12),(-0.9257138949175633,-0.3782245163346167,1.0439254718180288E-12),(-0.7298956734501725,-0.6835585606798581,1.886330571856993E-12),(-0.9257138949175897,-0.3782245163345522,1.0439254718178507E-12),(-0.7298956734503791,-0.6835585606796375,1.8863305718563845E-12),(-0.7298956734501725,-0.6835585606798581,1.886330571856993E-12),(-0.5913596447695568,-0.8064079430028104,2.225335744311634E-12),(-0.5913596447695568,-0.8064079430028104,2.225335744311634E-12),(-0.7298956734503791,-0.6835585606796375,1.8863305718563845E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(0.07795967280676985,0.9969565133022913,-2.7508620397410175E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(0.07795967280676629,0.9969565133022915,-2.7508620397410187E-12),(0.07795967280676629,0.9969565133022915,-2.7508620397410187E-12),(0.33819741169692114,0.941075188665339,-2.596806097504851E-12),(0.07795967280676985,0.9969565133022913,-2.7508620397410175E-12),(0.3381974116971664,0.941075188665251,-2.5968060975046084E-12),(0.3381974116971664,0.941075188665251,-2.5968060975046084E-12),(0.6202213981854017,0.7844268080789601,-2.1646529439995266E-12),(0.33819741169692114,0.941075188665339,-2.596806097504851E-12),(0.6202213981854617,0.7844268080789125,-2.164652943999395E-12),(0.6202213981854017,0.7844268080789601,-2.1646529439995266E-12),(0.7950566191211772,0.6065352194156605,-1.6737547511034223E-12),(0.7950566191211507,0.6065352194156955,-1.6737547511035186E-12),(0.6202213981854617,0.7844268080789125,-2.164652943999395E-12),(0.7950566191211507,0.6065352194156955,-1.6737547511035186E-12),(0.9071364246607834,0.4208366750339745,-1.16149497737446E-12),(0.9071364246607592,0.4208366750340265,-1.1614949773746037E-12),(0.7950566191211772,0.6065352194156605,-1.6737547511034223E-12),(0.9071364246607592,0.4208366750340265,-1.1614949773746037E-12),(0.9665120711748036,0.2566211532071962,-7.084697348497172E-13),(0.9665120711748055,0.25662115320718937,-7.084697348496985E-13),(0.9071364246607834,0.4208366750339745,-1.16149497737446E-12),(0.9665120711748055,0.25662115320718937,-7.084697348496985E-13),(0.9924147561708995,0.12293474583800236,-3.395385107567115E-13),(0.9924147561708991,0.12293474583800497,-3.3953851075671866E-13),(0.9665120711748036,0.2566211532071962,-7.084697348497172E-13),(0.9924147561708991,0.12293474583800497,-3.3953851075671866E-13),(0.9999871034548478,-0.005078673447265601,1.3676259828426392E-14),(0.9999871034548478,-0.005078673447250062,1.3676259828383508E-14),(0.9924147561708995,0.12293474583800236,-3.395385107567115E-13),(0.9999871034548478,-0.005078673447250062,1.3676259828383508E-14),(0.9883938693820078,-0.15191299802209976,4.188740989501347E-13),(0.9883938693820004,-0.151912998022149,4.1887409895027065E-13),(0.9999871034548478,-0.005078673447265601,1.3676259828426392E-14),(0.9883938693820004,-0.151912998022149,4.1887409895027065E-13),(0.9438486732585091,-0.3303780894492741,9.11301320291192E-13),(0.9438486732585174,-0.3303780894492497,9.11301320291125E-13),(0.9883938693820078,-0.15191299802209976,4.188740989501347E-13),(0.9438486732585174,-0.3303780894492497,9.11301320291125E-13),(0.8505249238695582,-0.5259347429830835,1.4508903366675617E-12),(0.8505249238695977,-0.52593474298302,1.4508903366673869E-12),(0.9438486732585091,-0.3303780894492741,9.11301320291192E-13),(0.8505249238695977,-0.52593474298302,1.4508903366673869E-12),(0.7840634204835987,-0.6206807171642756,1.7123462322276183E-12),(0.7840634204835987,-0.6206807171642756,1.7123462322276183E-12),(0.8505249238695582,-0.5259347429830835,1.4508903366675617E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.04985214699043369,0.9987566087092712,-2.7557650654860607E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.04985214699045902,0.99875660870927,-2.7557650654860566E-12),(-0.04985214699043369,0.9987566087092712,-2.7557650654860607E-12),(-0.34263505180297543,0.9394685845072056,-2.592034860337486E-12),(-0.34263505180298326,0.9394685845072027,-2.592034860337478E-12),(-0.04985214699045902,0.99875660870927,-2.7557650654860566E-12),(-0.34263505180298326,0.9394685845072027,-2.592034860337478E-12),(-0.7067512124899926,0.7074621711751983,-1.951851651745764E-12),(-0.7067512124899772,0.7074621711752135,-1.9518516517458064E-12),(-0.34263505180297543,0.9394685845072056,-2.592034860337486E-12),(-0.7067512124899926,0.7074621711751983,-1.951851651745764E-12),(-0.8848347895576633,0.465904920760069,-1.2852825927870465E-12),(-0.7067512124899772,0.7074621711752135,-1.9518516517458064E-12),(-0.8848347895576638,0.4659049207600676,-1.285282592787043E-12),(-0.8848347895576638,0.4659049207600676,-1.285282592787043E-12),(-0.9613660408982533,0.27527320139748107,-7.591924390049658E-13),(-0.8848347895576633,0.465904920760069,-1.2852825927870465E-12),(-0.9613660408982357,0.27527320139754213,-7.591924390051342E-13),(-0.9613660408982357,0.27527320139754213,-7.591924390051342E-13),(-0.9926019629217055,0.12141393331894552,-3.346797808282442E-13),(-0.9613660408982533,0.27527320139748107,-7.591924390049658E-13),(-0.9926019629217047,0.12141393331895171,-3.3467978082826125E-13),(-0.9926019629217047,0.12141393331895171,-3.3467978082826125E-13),(-0.9999995995077935,-0.0008949772360086743,2.8989525562264857E-15),(-0.9926019629217055,0.12141393331894552,-3.346797808282442E-13),(-0.9999995995077935,-0.0008949772360261393,2.8989525562746953E-15),(-0.9999995995077935,-0.0008949772360261393,2.8989525562746953E-15),(-0.9922297490278524,-0.12441915103441759,3.4368224515205704E-13),(-0.9999995995077935,-0.0008949772360086743,2.8989525562264857E-15),(-0.9922297490278514,-0.1244191510344244,3.4368224515207587E-13),(-0.9922297490278514,-0.1244191510344244,3.4368224515207587E-13),(-0.9603398875491048,-0.2788320289747448,7.697029101492304E-13),(-0.9922297490278524,-0.12441915103441759,3.4368224515205704E-13),(-0.9603398875491099,-0.2788320289747272,7.697029101491818E-13),(-0.9603398875491099,-0.2788320289747272,7.697029101491818E-13),(-0.8853076919779572,-0.46500568870139897,1.2833725361852385E-12),(-0.9603398875491048,-0.2788320289747448,7.697029101492304E-13),(-0.8853076919779543,-0.4650056887014047,1.2833725361852544E-12),(-0.8853076919779543,-0.4650056887014047,1.2833725361852544E-12),(-0.7047839328151388,-0.7094220239361236,1.9576643936850626E-12),(-0.8853076919779572,-0.46500568870139897,1.2833725361852385E-12),(-0.7047839328151851,-0.7094220239360776,1.9576643936849353E-12),(-0.7047839328151388,-0.7094220239361236,1.9576643936850626E-12),(-0.3382277690985446,-0.9410642784691285,2.5967273155220337E-12),(-0.33822776909836216,-0.9410642784691942,2.5967273155222155E-12),(-0.7047839328151851,-0.7094220239360776,1.9576643936849353E-12),(-0.33822776909836216,-0.9410642784691942,2.5967273155222155E-12),(-0.05052755331290805,-0.9987226673888058,2.755713616424053E-12),(-0.050527553312888905,-0.9987226673888068,2.7557136164240562E-12),(-0.3382277690985446,-0.9410642784691285,2.5967273155220337E-12),(-0.05052755331290805,-0.9987226673888058,2.755713616424053E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.050527553312888905,-0.9987226673888068,2.7557136164240562E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.0537500230457373,0.9985544226643749,-2.7552007646744913E-12),(-0.05375002304574732,0.9985544226643743,-2.7552007646744893E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.0537500230457373,0.9985544226643749,-2.7552007646744913E-12),(-0.29184427840924615,0.9564658473567085,-2.638956438852391E-12),(-0.05375002304574732,0.9985544226643743,-2.7552007646744893E-12),(-0.2918442784093408,0.9564658473566796,-2.6389564388523117E-12),(-0.2918442784093408,0.9564658473566796,-2.6389564388523117E-12),(-0.5877775740479074,0.8090225728904954,-2.2320760398588142E-12),(-0.29184427840924615,0.9564658473567085,-2.638956438852391E-12),(-0.5877775740478249,0.8090225728905553,-2.2320760398589794E-12),(-0.5877775740479074,0.8090225728904954,-2.2320760398588142E-12),(-0.7805286589002669,0.6251199985885519,-1.7246255382442248E-12),(-0.7805286589003659,0.6251199985884281,-1.724625538243883E-12),(-0.5877775740478249,0.8090225728905553,-2.2320760398589794E-12),(-0.7805286589002669,0.6251199985885519,-1.7246255382442248E-12),(-0.9023997685575124,0.4308998232853527,-1.1885423006069361E-12),(-0.7805286589003659,0.6251199985884281,-1.724625538243883E-12),(-0.9023997685575618,0.43089982328524945,-1.1885423006066512E-12),(-0.9023997685575618,0.43089982328524945,-1.1885423006066512E-12),(-0.9670946829224584,0.254416733457353,-7.015460290354858E-13),(-0.9023997685575124,0.4308998232853527,-1.1885423006069361E-12),(-0.9670946829224693,0.254416733457312,-7.015460290353728E-13),(-0.9670946829224693,0.254416733457312,-7.015460290353728E-13),(-0.9936360937840041,0.11263797374627356,-3.103735740987131E-13),(-0.9670946829224584,0.254416733457353,-7.015460290354858E-13),(-0.9936360937840051,0.11263797374626337,-3.1037357409868495E-13),(-0.9936360937840051,0.11263797374626337,-3.1037357409868495E-13),(-0.9999995871945382,-0.0009086312527777199,2.981763256113333E-15),(-0.9936360937840041,0.11263797374627356,-3.103735740987131E-13),(-0.9999995871945381,-0.0009086312527694739,2.9817632560905856E-15),(-0.9999995871945381,-0.0009086312527694739,2.9817632560905856E-15),(-0.99317464071528,-0.11663675681394135,3.222257708872512E-13),(-0.9999995871945382,-0.0009086312527777199,2.981763256113333E-15),(-0.9931746407152823,-0.11663675681392228,3.222257708871987E-13),(-0.9931746407152823,-0.11663675681392228,3.222257708871987E-13),(-0.9647953651843898,-0.2630017173303625,7.260629147970616E-13),(-0.99317464071528,-0.11663675681394135,3.222257708872512E-13),(-0.9647953651843933,-0.2630017173303498,7.260629147970266E-13),(-0.9647953651843933,-0.2630017173303498,7.260629147970266E-13),(-0.8962309242385643,-0.4435877933831011,1.2242887093769435E-12),(-0.9647953651843898,-0.2630017173303625,7.260629147970616E-13),(-0.8962309242385652,-0.44358779338309967,1.2242887093769393E-12),(-0.8962309242385652,-0.44358779338309967,1.2242887093769393E-12),(-0.7748453025522769,-0.6321508974229733,1.7445139127428749E-12),(-0.8962309242385643,-0.4435877933831011,1.2242887093769435E-12),(-0.7748453025522536,-0.632150897423002,1.7445139127429547E-12),(-0.7748453025522769,-0.6321508974229733,1.7445139127428749E-12),(-0.5881877933364362,-0.8087243781227408,2.231710478120548E-12),(-0.5881877933364911,-0.8087243781227011,2.2317104781204386E-12),(-0.7748453025522536,-0.632150897423002,1.7445139127429547E-12),(-0.5881877933364362,-0.8087243781227408,2.231710478120548E-12),(-0.2965226979440034,-0.9550258057267402,2.63525234392335E-12),(-0.5881877933364911,-0.8087243781227011,2.2317104781204386E-12),(-0.2965226979439802,-0.9550258057267476,2.63525234392337E-12),(-0.2965226979440034,-0.9550258057267402,2.63525234392335E-12),(-0.05742883068678888,-0.9983496027975112,2.754682646815557E-12),(-0.05742883068676342,-0.9983496027975126,2.7546826468155615E-12),(-0.2965226979439802,-0.9550258057267476,2.63525234392337E-12),(-0.05742883068678888,-0.9983496027975112,2.754682646815557E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.05742883068676342,-0.9983496027975126,2.7546826468155615E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.9997278626286515,0.02332810930933182,-6.477935349908243E-14),(0.9997278626286512,0.023328109309348012,-6.477935349912714E-14),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.9997278626286512,0.023328109309348012,-6.477935349912714E-14),(0.991938059452877,0.1267236608091028,-3.500263070273772E-13),(0.9919380594528837,0.1267236608090516,-3.50026307027236E-13),(0.9997278626286515,0.02332810930933182,-6.477935349908243E-14),(0.9919380594528837,0.1267236608090516,-3.50026307027236E-13),(0.9279729502401031,0.3726475595286776,-1.02851931489232E-12),(0.9279729502400951,0.3726475595286975,-1.028519314892375E-12),(0.991938059452877,0.1267236608091028,-3.500263070273772E-13),(0.9279729502400951,0.3726475595286975,-1.028519314892375E-12),(0.7353424654422643,0.6776956975791512,-1.870175053525581E-12),(0.7353424654422448,0.6776956975791725,-1.8701750535256392E-12),(0.9279729502401031,0.3726475595286776,-1.02851931489232E-12),(0.7353424654422643,0.6776956975791512,-1.870175053525581E-12),(0.595427913033985,0.8034087380530496,-2.2170091040552856E-12),(0.7353424654422448,0.6776956975791725,-1.8701750535256392E-12),(0.595427913033985,0.8034087380530496,-2.2170091040552856E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-0.587931901049856,0.808910427505977,-2.231765637671211E-12),(-0.7331764133481704,0.6800384892856528,-1.8761407500496556E-12),(-0.587931901049856,0.808910427505977,-2.231765637671211E-12),(-0.7331764133483906,0.6800384892854153,-1.876140750049E-12),(-0.7331764133483906,0.6800384892854153,-1.876140750049E-12),(-0.8507772826193725,0.5255264173938323,-1.4497779551247261E-12),(-0.7331764133481704,0.6800384892856528,-1.8761407500496556E-12),(-0.8507772826193725,0.5255264173938323,-1.4497779551247261E-12),(-0.99423624686343,0.10721140528377023,-2.9547793290442356E-13),(-0.9985580220656779,0.053683112505529824,-1.4775374954802806E-13),(-0.99423624686343,0.10721140528377023,-2.9547793290442356E-13),(-0.9985580220656758,0.05368311250557031,-1.4775374954813979E-13),(-0.9985580220656758,0.05368311250557031,-1.4775374954813979E-13),(-0.9997372811223786,-0.022920923498727014,6.366822858718168E-14),(-0.9985580220656779,0.053683112505529824,-1.4775374954802806E-13),(-0.9997372811223788,-0.022920923498716328,6.366822858715219E-14),(-0.9997372811223788,-0.022920923498716328,6.366822858715219E-14),(-0.9919210150229154,-0.12685700593940089,3.5038740485883726E-13),(-0.9997372811223786,-0.022920923498727014,6.366822858718168E-14),(-0.9919210150229056,-0.12685700593947852,3.503874048590514E-13),(-0.9919210150229056,-0.12685700593947852,3.503874048590514E-13),(-0.9257138949176099,-0.3782245163345029,1.043840848107169E-12),(-0.9919210150229154,-0.12685700593940089,3.5038740485883726E-13),(-0.9257138949176389,-0.3782245163344319,1.0438408481069733E-12),(-0.9257138949176389,-0.3782245163344319,1.0438408481069733E-12),(-0.7298956734501645,-0.6835585606798666,1.8863305718570166E-12),(-0.9257138949176099,-0.3782245163345029,1.043840848107169E-12),(-0.7298956734503237,-0.6835585606796967,1.8863305718565477E-12),(-0.7298956734501645,-0.6835585606798666,1.8863305718570166E-12),(-0.5913596447695568,-0.8064079430028104,2.225335744311634E-12),(-0.5913596447695568,-0.8064079430028104,2.225335744311634E-12),(-0.7298956734503237,-0.6835585606796967,1.8863305718565477E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(0.03853104078009802,0.9992574037235865,-2.7571761791017205E-12),(0.03853104078008816,0.9992574037235867,-2.75717617910172E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(0.03853104078009802,0.9992574037235865,-2.7571761791017205E-12),(0.17889663461281743,0.9838678743226695,-2.7147694446288916E-12),(0.03853104078008816,0.9992574037235867,-2.75717617910172E-12),(0.17889663461278768,0.9838678743226749,-2.7147694446289065E-12),(0.17889663461278768,0.9838678743226749,-2.7147694446289065E-12),(0.41226168019314996,0.9110654790103296,-2.513994557938067E-12),(0.17889663461281743,0.9838678743226695,-2.7147694446288916E-12),(0.41226168019310827,0.9110654790103483,-2.5139945579381188E-12),(0.41226168019310827,0.9110654790103483,-2.5139945579381188E-12),(0.6473041242886012,0.7622318352568118,-2.103482114709203E-12),(0.41226168019314996,0.9110654790103296,-2.513994557938067E-12),(0.6473041242885218,0.762231835256879,-2.1034821147093888E-12),(0.6473041242886012,0.7622318352568118,-2.103482114709203E-12),(0.8137975087381796,0.5811485307316305,-1.6039445772309967E-12),(0.8137975087381611,0.5811485307316561,-1.6039445772310668E-12),(0.6473041242885218,0.762231835256879,-2.1034821147093888E-12),(0.8137975087381611,0.5811485307316561,-1.6039445772310668E-12),(0.915097394613651,0.4032328835441228,-1.1130602868494841E-12),(0.9150973946136156,0.4032328835442033,-1.1130602868497065E-12),(0.8137975087381796,0.5811485307316305,-1.6039445772309967E-12),(0.9150973946136156,0.4032328835442033,-1.1130602868497065E-12),(0.9704191606545896,0.241426288200855,-6.665346135693012E-13),(0.9704191606545819,0.24142628820088544,-6.665346135693852E-13),(0.915097394613651,0.4032328835441228,-1.1130602868494841E-12),(0.9704191606545819,0.24142628820088544,-6.665346135693852E-13),(0.9941110589328176,0.10836605791239322,-2.9943478790801956E-13),(0.9941110589328194,0.10836605791237704,-2.9943478790797493E-13),(0.9704191606545896,0.241426288200855,-6.665346135693012E-13),(0.9941110589328194,0.10836605791237704,-2.9943478790797493E-13),(0.9999930758042374,0.0037213362628470636,-1.0704945796881422E-14),(0.9999930758042371,0.00372133626285637,-1.070494579690712E-14),(0.9941110589328176,0.10836605791239322,-2.9943478790801956E-13),(0.9999930758042371,0.00372133626285637,-1.070494579690712E-14),(0.9958593468083936,-0.09090743299840695,2.5048441902257877E-13),(0.9958593468083943,-0.09090743299839879,2.5048441902255625E-13),(0.9999930758042374,0.0037213362628470636,-1.0704945796881422E-14),(0.9958593468083943,-0.09090743299839879,2.5048441902255625E-13),(0.9797523183883908,-0.20021337271164855,5.520884800545914E-13),(0.9797523183883889,-0.20021337271165762,5.520884800546164E-13),(0.9958593468083936,-0.09090743299840695,2.5048441902257877E-13),(0.9797523183883889,-0.20021337271165762,5.520884800546164E-13),(0.9432066145957844,-0.33220668593928016,9.163068641326958E-13),(0.9432066145957768,-0.3322066859393016,9.163068641327547E-13),(0.9797523183883908,-0.20021337271164855,5.520884800545914E-13),(0.9432066145957768,-0.3322066859393016,9.163068641327547E-13),(0.87462096294249,-0.48480735471066383,1.3373847120019882E-12),(0.8746209629424875,-0.4848073547106688,1.337384712002002E-12),(0.9432066145957844,-0.33220668593928016,9.163068641326958E-13),(0.8746209629424875,-0.4848073547106688,1.337384712002002E-12),(0.7610063543191211,-0.6487444247821482,1.7897585953456524E-12),(0.7610063543191802,-0.6487444247820788,1.7897585953454604E-12),(0.87462096294249,-0.48480735471066383,1.3373847120019882E-12),(0.7610063543191211,-0.6487444247821482,1.7897585953456524E-12),(0.5967658568195328,-0.8024154236643568,2.213794387390773E-12),(0.7610063543191802,-0.6487444247820788,1.7897585953454604E-12),(0.5967658568194558,-0.802415423664414,2.2137943873909306E-12),(0.5967658568194558,-0.802415423664414,2.2137943873909306E-12),(0.3962631411435402,-0.9181369848617662,2.533170491717513E-12),(0.5967658568195328,-0.8024154236643568,2.213794387390773E-12),(0.39626314114354483,-0.918136984861764,2.533170491717507E-12),(0.39626314114354483,-0.918136984861764,2.533170491717507E-12),(0.2886029626037723,-0.9574488654629686,2.6417039976899873E-12),(0.3962631411435402,-0.9181369848617662,2.533170491717513E-12),(0.2886029626037723,-0.9574488654629686,2.6417039976899873E-12),(0.9529875987463974,0.30300930123607694,-8.364496230574201E-13),(0.9296841404730456,0.36835770516292254,-1.0167820259694811E-12),(0.929684140473054,0.36835770516290123,-1.0167820259694226E-12),(0.9529875987463974,0.30300930123607694,-8.364496230574201E-13),(0.929684140473054,0.36835770516290123,-1.0167820259694226E-12),(0.9019056800696664,0.43193303214511475,-1.1922201841223972E-12),(0.9019056800696664,0.43193303214511475,-1.1922201841223972E-12),(0.9296841404730456,0.36835770516292254,-1.0167820259694811E-12),(0.444982586999434,0.8955392215125428,-2.471165710761484E-12),(0.444982586999434,0.8955392215125428,-2.471165710761484E-12),(0.444982586999434,0.8955392215125428,-2.471165710761484E-12),(0.444982586999434,0.8955392215125428,-2.471165710761484E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-0.5702090938650628,0.8214995978535741,-2.26646024846E-12),(-0.5702090938650628,0.8214995978535741,-2.26646024846E-12),(-0.5702090938650628,0.8214995978535741,-2.26646024846E-12),(-0.5702090938650628,0.8214995978535741,-2.26646024846E-12),(-0.9485728622037648,0.3165588809219502,-8.729608031479869E-13),(-0.9485728622037648,0.3165588809219502,-8.729608031479869E-13),(-0.9485728622037648,0.3165588809219502,-8.729608031479869E-13),(-0.9485728622037648,0.3165588809219502,-8.729608031479869E-13),(-0.9719489691963694,-0.23519183931020027,6.492661722475118E-13),(-0.9628838370128916,-0.2699161284905579,7.452251826243758E-13),(-0.9719489691963694,-0.23519183931020027,6.492661722475118E-13),(-0.9628838370128899,-0.2699161284905638,7.45225182624392E-13),(-0.9628838370128899,-0.2699161284905638,7.45225182624392E-13),(-0.952578555817858,-0.3042927784157289,8.402243780806469E-13),(-0.9628838370128916,-0.2699161284905579,7.452251826243758E-13),(-0.952578555817858,-0.3042927784157289,8.402243780806469E-13),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.04792972972070176,0.9988507100707795,-2.7560264769904614E-12),(-0.04792972972066793,0.9988507100707813,-2.756026476990467E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.04792972972070176,0.9988507100707795,-2.7560264769904614E-12),(-0.3206778121135941,0.9471883343971453,-2.6133766833301963E-12),(-0.04792972972066793,0.9988507100707813,-2.756026476990467E-12),(-0.32067781211367463,0.9471883343971181,-2.6133766833301216E-12),(-0.3206778121135941,0.9471883343971453,-2.6133766833301963E-12),(-0.6954181980173404,0.718605267073875,-1.9826402546313037E-12),(-0.6954181980174247,0.7186052670737935,-1.9826402546310784E-12),(-0.32067781211367463,0.9471883343971181,-2.6133766833301216E-12),(-0.6954181980173404,0.718605267073875,-1.9826402546313037E-12),(-0.8917373201927142,0.45255336898040777,-1.24841996041939E-12),(-0.6954181980174247,0.7186052670737935,-1.9826402546310784E-12),(-0.8917373201926667,0.4525533689805009,-1.2484199604196472E-12),(-0.8917373201926667,0.4525533689805009,-1.2484199604196472E-12),(-0.9658311636130653,0.2591720729435028,-7.147001971163186E-13),(-0.8917373201927142,0.45255336898040777,-1.24841996041939E-12),(-0.9658311636130642,0.25917207294350686,-7.147001971163298E-13),(-0.9658311636130642,0.25917207294350686,-7.147001971163298E-13),(-0.9937219264957836,0.11187820521222491,-3.082693727011143E-13),(-0.9658311636130653,0.2591720729435028,-7.147001971163186E-13),(-0.9937219264957871,0.11187820521219376,-3.0826937270102834E-13),(-0.9937219264957871,0.11187820521219376,-3.0826937270102834E-13),(-0.9999994968635364,0.0010031314340942707,-2.242862013379963E-15),(-0.9937219264957836,0.11187820521222491,-3.082693727011143E-13),(-0.9999994968635365,0.0010031314340779212,-2.242862013334839E-15),(-0.9999994968635365,0.0010031314340779212,-2.242862013334839E-15),(-0.9945078930900839,-0.1046616003199005,2.892271194187216E-13),(-0.9999994968635364,0.0010031314340942707,-2.242862013379963E-15),(-0.9945078930900895,-0.1046616003198478,2.8922711941857623E-13),(-0.9945078930900895,-0.1046616003198478,2.8922711941857623E-13),(-0.9720690082233135,-0.2346952135254229,6.480131334238823E-13),(-0.9945078930900839,-0.1046616003199005,2.892271194187216E-13),(-0.9720690082233349,-0.23469521352533462,6.480131334236385E-13),(-0.9720690082233349,-0.23469521352533462,6.480131334236385E-13),(-0.9183762991966798,-0.39570819182045036,1.0923524363631377E-12),(-0.9720690082233135,-0.2346952135254229,6.480131334238823E-13),(-0.9183762991966443,-0.3957081918205334,1.0923524363633669E-12),(-0.9183762991966443,-0.3957081918205334,1.0923524363633669E-12),(-0.8089731333683899,-0.587845617052751,1.6224777891367228E-12),(-0.9183762991966798,-0.39570819182045036,1.0923524363631377E-12),(-0.8089731333682966,-0.5878456170528793,1.6224777891370768E-12),(-0.8089731333682966,-0.5878456170528793,1.6224777891370768E-12),(-0.6233369684433753,-0.7819533386154335,2.1579478012261644E-12),(-0.8089731333683899,-0.587845617052751,1.6224777891367228E-12),(-0.6233369684433545,-0.7819533386154501,2.1579478012262105E-12),(-0.6233369684433545,-0.7819533386154501,2.1579478012262105E-12),(-0.3440068091234996,-0.9389671534599432,2.590952577950487E-12),(-0.6233369684433753,-0.7819533386154335,2.1579478012261644E-12),(-0.34400680912364484,-0.9389671534598899,2.5909525779503402E-12),(-0.3440068091234996,-0.9389671534599432,2.590952577950487E-12),(-0.08618514690951971,-0.9962791378184052,2.748971433754574E-12),(-0.086185146909493,-0.9962791378184075,2.748971433754581E-12),(-0.34400680912364484,-0.9389671534598899,2.5909525779503402E-12),(-0.08618514690951971,-0.9962791378184052,2.748971433754574E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.086185146909493,-0.9962791378184075,2.748971433754581E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(0.9852620991274315,-0.17105144262182528,4.715705581245371E-13),(0.9985580220656768,0.053683112505551744,-1.4849235571012884E-13),(0.998558022065676,0.05368311250556627,-1.4849235571016893E-13),(0.9852620991274349,-0.17105144262180608,4.715705581244843E-13),(0.998558022065676,0.05368311250556627,-1.4849235571016893E-13),(0.99423624686343,0.1072114052837702,-2.961599169183224E-13),(0.99423624686343,0.1072114052837702,-2.961599169183224E-13),(0.9985580220656768,0.053683112505551744,-1.4849235571012884E-13),(0.8507772826193725,0.5255264173938323,-1.4503466298011078E-12),(0.7331764133483752,0.6800384892854321,-1.876661638191326E-12),(0.733176413348323,0.6800384892854884,-1.8766616381914813E-12),(0.8507772826193725,0.5255264173938323,-1.4503466298011078E-12),(0.7331764133483752,0.6800384892854321,-1.876661638191326E-12),(0.587931901049856,0.808910427505977,-2.2322190997416186E-12),(0.733176413348323,0.6800384892854884,-1.8766616381914813E-12),(0.587931901049856,0.808910427505977,-2.2322190997416186E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-0.595427913033985,0.8034087380530496,-2.216611033634046E-12),(-0.7353424654422683,0.6776956975791468,-1.86971124404541E-12),(-0.7353424654421585,0.6776956975792661,-1.869711244045739E-12),(-0.595427913033985,0.8034087380530496,-2.216611033634046E-12),(-0.7353424654422683,0.6776956975791468,-1.86971124404541E-12),(-0.9279729502400907,0.3726475595287086,-1.0279408602376025E-12),(-0.7353424654421585,0.6776956975792661,-1.869711244045739E-12),(-0.9279729502400598,0.37264755952878564,-1.027940860237815E-12),(-0.9279729502400598,0.37264755952878564,-1.027940860237815E-12),(-0.9919380594528906,0.1267236608089965,-3.492865095035361E-13),(-0.9279729502400907,0.3726475595287086,-1.0279408602376025E-12),(-0.9919380594528778,0.12672366080909672,-3.4928650950381265E-13),(-0.9919380594528778,0.12672366080909672,-3.4928650950381265E-13),(-0.9997278626286514,0.023328109309335668,-6.395828495312939E-14),(-0.9919380594528906,0.1267236608089965,-3.492865095035361E-13),(-0.9997278626286514,0.023328109309338194,-6.395828495313637E-14),(-0.9997278626286514,0.023328109309338194,-6.395828495313637E-14),(-1.,1.0761972206014589E-42,3.9654910130298924E-16),(-0.9997278626286514,0.023328109309335668,-6.395828495312939E-14),(-1.,1.0761972206014589E-42,3.9654910130298924E-16),(-0.9325271362086448,-0.3610999033986354,9.968211758733037E-13),(-0.9262080086179268,-0.3770128973550036,1.0406609377887307E-12),(-0.9325271362086448,-0.3610999033986354,9.968211758733037E-13),(-0.9262080086179288,-0.37701289735499893,1.0406609377887176E-12),(-0.9262080086179288,-0.37701289735499893,1.0406609377887176E-12),(-0.8723365420137861,-0.48890587792276585,1.3493381025518505E-12),(-0.9262080086179268,-0.3770128973550036,1.0406609377887307E-12),(-0.8723365420137832,-0.4889058779227708,1.3493381025518642E-12),(-0.8723365420137832,-0.4889058779227708,1.3493381025518642E-12),(-0.730188377765645,-0.6832458803212618,1.885524926795876E-12),(-0.8723365420137861,-0.48890587792276585,1.3493381025518505E-12),(-0.7301883777656969,-0.6832458803212063,1.8855249267957225E-12),(-0.730188377765645,-0.6832458803212618,1.885524926795876E-12),(-0.6321911971634502,-0.7748124226088815,2.138128051197375E-12),(-0.6321911971634502,-0.7748124226088815,2.138128051197375E-12),(-0.7301883777656969,-0.6832458803212063,1.8855249267957225E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.6156006345831257,-0.7880582838222391,2.174311375598203E-12),(0.6156006345831257,-0.7880582838222391,2.174311375598203E-12),(0.6156006345831257,-0.7880582838222391,2.174311375598203E-12),(0.6156006345831257,-0.7880582838222391,2.174311375598203E-12),(0.9762553099163308,-0.21662310555471498,5.972922054755883E-13),(0.998637758841438,-0.052178794698135106,1.4360652223348502E-13),(0.9986377588414385,-0.05217879469812459,1.4360652223345601E-13),(0.9762553099163308,-0.21662310555471498,5.972922054755883E-13),(0.9986377588414385,-0.05217879469812459,1.4360652223345601E-13),(0.9788258497336725,0.20469478716653747,-5.652083920622373E-13),(0.9788258497336696,0.2046947871665516,-5.652083920622761E-13),(0.998637758841438,-0.052178794698135106,1.4360652223348502E-13),(0.9788258497336696,0.2046947871665516,-5.652083920622761E-13),(0.9450084045283325,0.3270460447258393,-9.028886248170379E-13),(0.9450084045283396,0.3270460447258185,-9.028886248169806E-13),(0.9788258497336725,0.20469478716653747,-5.652083920622373E-13),(0.9450084045283396,0.3270460447258185,-9.028886248169806E-13),(0.9330496485399467,0.3597476245362602,-9.931019329057775E-13),(0.9330496485399467,0.3597476245362602,-9.931019329057775E-13),(0.9450084045283325,0.3270460447258393,-9.028886248170379E-13),(-0.941482093321121,0.33706300294704605,-9.295267227734603E-13),(-0.9606480611335356,0.2777684334844022,-7.660069593965703E-13),(-0.941482093321121,0.33706300294704605,-9.295267227734603E-13),(-0.9606480611335216,0.2777684334844508,-7.660069593967046E-13),(-0.9606480611335216,0.2777684334844508,-7.660069593967046E-13),(-0.9760836593293745,0.21739523911571249,-5.995126528930727E-13),(-0.9606480611335356,0.2777684334844022,-7.660069593965703E-13),(-0.9760836593293745,0.21739523911571249,-5.995126528930727E-13),(-0.9792141269629987,-0.20282922263838732,5.599487878273007E-13),(-0.9792141269629987,-0.20282922263838732,5.599487878273007E-13),(-0.9792141269629987,-0.20282922263838732,5.599487878273007E-13),(-0.9792141269629987,-0.20282922263838732,5.599487878273007E-13),(-0.6124868691939012,-0.7904807619828917,2.1813155697912543E-12),(-0.6124868691939012,-0.7904807619828917,2.1813155697912543E-12),(-0.6124868691939012,-0.7904807619828917,2.1813155697912543E-12),(-0.6124868691939012,-0.7904807619828917,2.1813155697912543E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.6823833044151579,-0.7309945457084137,2.0167701960763817E-12),(0.7673233100206696,-0.6412604290761467,1.769205868830639E-12),(0.6823833044151579,-0.7309945457084137,2.0167701960763817E-12),(0.7673233100207348,-0.6412604290760685,1.7692058688304233E-12),(0.7673233100206696,-0.6412604290761467,1.769205868830639E-12),(0.8868360880342167,-0.46208414056334735,1.2746923341527137E-12),(0.8868360880342113,-0.46208414056335717,1.2746923341527408E-12),(0.7673233100207348,-0.6412604290760685,1.7692058688304233E-12),(0.8868360880342113,-0.46208414056335717,1.2746923341527408E-12),(0.9337699395388017,-0.35787386047838504,9.870296751829441E-13),(0.9337699395388005,-0.35787386047838804,9.870296751829524E-13),(0.8868360880342167,-0.46208414056334735,1.2746923341527137E-12),(0.9337699395388005,-0.35787386047838804,9.870296751829524E-13),(0.9852620991274349,-0.17105144262180608,4.715705581244843E-13),(0.9852620991274315,-0.17105144262182528,4.715705581245371E-13),(0.9337699395388017,-0.35787386047838504,9.870296751829441E-13),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(0.9536861696258785,-0.3008034073349574,8.294400198242891E-13),(0.9536861696258785,-0.3008034073349574,8.294400198242891E-13),(0.9536861696258785,-0.3008034073349574,8.294400198242891E-13),(0.9536861696258785,-0.3008034073349574,8.294400198242891E-13),(-0.7700417988451072,-0.6379934388623381,1.760597810486621E-12),(-0.7700417988451072,-0.6379934388623381,1.760597810486621E-12),(-0.7700417988451072,-0.6379934388623381,1.760597810486621E-12),(-0.7700417988451072,-0.6379934388623381,1.760597810486621E-12),(-0.994302470776474,0.10659548117907772,-2.937570866883809E-13),(-0.994302470776474,0.10659548117907772,-2.937570866883809E-13),(-0.994302470776474,0.10659548117907772,-2.937570866883809E-13),(-0.994302470776474,0.10659548117907772,-2.937570866883809E-13),(-0.9408175538277588,-0.33891345563366515,9.356479532997303E-13),(-0.8797598194001592,-0.4754184053746753,1.3121960159391853E-12),(-0.9408175538277588,-0.33891345563366515,9.356479532997303E-13),(-0.8797598194001869,-0.4754184053746245,1.3121960159390451E-12),(-0.8797598194001869,-0.4754184053746245,1.3121960159390451E-12),(-0.7490764788486547,-0.6624835309920549,1.828168369929896E-12),(-0.8797598194001592,-0.4754184053746753,1.3121960159391853E-12),(-0.7490764788486777,-0.662483530992029,1.828168369929824E-12),(-0.7490764788486547,-0.6624835309920549,1.828168369929896E-12),(-0.6277478308059733,-0.7784167655686737,2.147989206409143E-12),(-0.6277478308059808,-0.7784167655686675,2.147989206409126E-12),(-0.7490764788486777,-0.662483530992029,1.828168369929824E-12),(-0.6277478308059733,-0.7784167655686737,2.147989206409143E-12),(-0.46242915451716665,-0.8866562338654922,2.4466554506201037E-12),(-0.6277478308059808,-0.7784167655686675,2.147989206409126E-12),(-0.46242915451719524,-0.8866562338654773,2.446655450620062E-12),(-0.46242915451716665,-0.8866562338654922,2.4466554506201037E-12),(-0.24619523010030192,-0.9692202580816496,2.6744039908328136E-12),(-0.2461952301003007,-0.9692202580816499,2.6744039908328144E-12),(-0.46242915451719524,-0.8866562338654773,2.446655450620062E-12),(-0.24619523010030192,-0.9692202580816496,2.6744039908328136E-12),(0.01107595437302213,-0.9999386597360495,2.7590419468208774E-12),(-0.2461952301003007,-0.9692202580816499,2.6744039908328144E-12),(0.01107595437300701,-0.9999386597360496,2.7590419468208778E-12),(0.01107595437300701,-0.9999386597360496,2.7590419468208778E-12),(0.29728615576795203,-0.9547884276575168,2.6343201922843526E-12),(0.01107595437302213,-0.9999386597360495,2.7590419468208774E-12),(0.29728615576786194,-0.9547884276575449,2.6343201922844306E-12),(0.29728615576795203,-0.9547884276575168,2.6343201922843526E-12),(0.5611488072511259,-0.8277149365093267,2.2835888378609073E-12),(0.5611488072510544,-0.8277149365093752,2.2835888378610414E-12),(0.29728615576786194,-0.9547884276575449,2.6343201922844306E-12),(0.5611488072511259,-0.8277149365093267,2.2835888378609073E-12),(0.7489939741665258,-0.6625768081228272,1.8278695292240633E-12),(0.5611488072510544,-0.8277149365093752,2.2835888378610414E-12),(0.7489939741665401,-0.662576808122811,1.8278695292240193E-12),(0.7489939741665258,-0.6625768081228272,1.8278695292240633E-12),(0.8635495158077536,-0.5042640516120445,1.3909755350698391E-12),(0.8635495158077526,-0.5042640516120462,1.390975535069844E-12),(0.7489939741665401,-0.662576808122811,1.8278695292240193E-12),(0.8635495158077526,-0.5042640516120462,1.390975535069844E-12),(0.9334175416532469,-0.35879199117874594,9.895274242005562E-13),(0.9334175416532348,-0.3587919911787773,9.895274242006427E-13),(0.8635495158077536,-0.5042640516120445,1.3909755350698391E-12),(0.9334175416532348,-0.3587919911787773,9.895274242006427E-13),(0.9749062702748591,-0.22261573210077437,6.138028527188822E-13),(0.9749062702748557,-0.22261573210078947,6.138028527189238E-13),(0.9334175416532469,-0.35879199117874594,9.895274242005562E-13),(0.9749062702748557,-0.22261573210078947,6.138028527189238E-13),(0.9946566839741976,-0.10323798247473452,2.8439370604538895E-13),(0.9946566839741967,-0.10323798247474142,2.8439370604540803E-13),(0.9749062702748591,-0.22261573210077437,6.138028527188822E-13),(0.9946566839741967,-0.10323798247474142,2.8439370604540803E-13),(0.9999996706240923,-0.0008116352057429888,1.7425911648356128E-15),(0.9999996706240923,-0.0008116352057321722,1.7425911648057617E-15),(0.9946566839741976,-0.10323798247473452,2.8439370604538895E-13),(0.9999996706240923,-0.0008116352057321722,1.7425911648057617E-15),(0.9950173309235021,0.0997021121234151,-2.7551307335992245E-13),(0.9950173309235023,0.09970211212341235,-2.7551307335991487E-13),(0.9999996706240923,-0.0008116352057429888,1.7425911648356128E-15),(0.9950173309235023,0.09970211212341235,-2.7551307335991487E-13),(0.9766138235826096,0.21500102229374587,-5.93646314924594E-13),(0.9766138235826148,0.21500102229372134,-5.936463149245263E-13),(0.9950173309235021,0.0997021121234151,-2.7551307335992245E-13),(0.9766138235826148,0.21500102229372134,-5.936463149245263E-13),(0.937885089864574,0.34694604509883137,-9.57679771845211E-13),(0.9378850898645769,0.34694604509882304,-9.576797718451876E-13),(0.9766138235826096,0.21500102229374587,-5.93646314924594E-13),(0.9378850898645769,0.34694604509882304,-9.576797718451876E-13),(0.8712497287927936,0.49084000456206067,-1.3546055391051063E-12),(0.8712497287927798,0.4908400045620854,-1.3546055391051743E-12),(0.937885089864574,0.34694604509883137,-9.57679771845211E-13),(0.8712497287927798,0.4908400045620854,-1.3546055391051743E-12),(0.7558037417969682,0.6547982161595295,-1.8070185736433633E-12),(0.7558037417969727,0.6547982161595243,-1.8070185736433486E-12),(0.8712497287927936,0.49084000456206067,-1.3546055391051063E-12),(0.7558037417969682,0.6547982161595295,-1.8070185736433633E-12),(0.5617419259877942,0.8273125217156595,-2.283036568390268E-12),(0.7558037417969727,0.6547982161595243,-1.8070185736433486E-12),(0.56174192598777,0.827312521715676,-2.283036568390313E-12),(0.56174192598777,0.827312521715676,-2.283036568390313E-12),(0.29396712482546045,0.9558155311156291,-2.6374679504786755E-12),(0.5617419259877942,0.8273125217156595,-2.283036568390268E-12),(0.2939671248254585,0.9558155311156297,-2.6374679504786768E-12),(0.2939671248254585,0.9558155311156297,-2.6374679504786768E-12),(-0.002695267450449311,0.9999963677600887,-2.7592105568615006E-12),(0.29396712482546045,0.9558155311156291,-2.6374679504786755E-12),(-0.0026952674504793607,0.9999963677600887,-2.7592105568615006E-12),(-0.0026952674504793607,0.9999963677600887,-2.7592105568615006E-12),(-0.2926144101614126,0.9562305197837437,-2.6383433107107014E-12),(-0.002695267450449311,0.9999963677600887,-2.7592105568615006E-12),(-0.2926144101613252,0.9562305197837706,-2.638343310710775E-12),(-0.2926144101614126,0.9562305197837437,-2.6383433107107014E-12),(-0.5408366900001049,0.8411276209646967,-2.3206388243616018E-12),(-0.5408366900001452,0.841127620964671,-2.32063882436153E-12),(-0.2926144101613252,0.9562305197837706,-2.638343310710775E-12),(-0.5408366900001452,0.841127620964671,-2.32063882436153E-12),(-0.7259710978950735,0.6877252104009433,-1.8972968987721564E-12),(-0.7259710978950947,0.6877252104009208,-1.897296898772095E-12),(-0.5408366900001049,0.8411276209646967,-2.3206388243616018E-12),(-0.7259710978950735,0.6877252104009433,-1.8972968987721564E-12),(-0.799321709095357,0.6009033244781372,-1.657723137791591E-12),(-0.7259710978950947,0.6877252104009208,-1.897296898772095E-12),(-0.799321709095357,0.6009033244781372,-1.657723137791591E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(0.08869355101080907,-0.9960589611107835,2.7483028521204306E-12),(0.08869355101079084,-0.9960589611107851,2.748302852120435E-12),(1.3916449267378769E-27,-1.,2.75921435746603E-12),(0.08869355101080907,-0.9960589611107835,2.7483028521204306E-12),(0.41828292848581383,-0.9083167904081326,2.5060101202615643E-12),(0.08869355101079084,-0.9960589611107851,2.748302852120435E-12),(0.41828292848587684,-0.9083167904081038,2.5060101202614844E-12),(0.41828292848587684,-0.9083167904081038,2.5060101202614844E-12),(0.8055283032698622,-0.5925572990278469,1.6346483154361601E-12),(0.41828292848581383,-0.9083167904081326,2.5060101202615643E-12),(0.8055283032698332,-0.5925572990278865,1.6346483154362688E-12),(0.8055283032698622,-0.5925572990278469,1.6346483154361601E-12),(0.9613077859588501,-0.2754765700652123,7.597481191493585E-13),(0.9613077859588718,-0.2754765700651368,7.597481191491504E-13),(0.8055283032698332,-0.5925572990278865,1.6346483154362688E-12),(0.9613077859588718,-0.2754765700651368,7.597481191491504E-13),(0.9847230941359341,-0.17412761950751132,4.800525865781023E-13),(0.9847230941359341,-0.17412761950751132,4.800525865781023E-13),(0.9613077859588501,-0.2754765700652123,7.597481191493585E-13),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(0.9850106999604984,0.1724932490369674,-4.762380179752947E-13),(0.9614949837727648,0.27482248121252945,-7.58641408575883E-13),(0.9614949837727732,0.2748224812124999,-7.586414085758014E-13),(0.9850106999604984,0.1724932490369674,-4.762380179752947E-13),(0.9614949837727732,0.2748224812124999,-7.586414085758014E-13),(0.9273794962553974,0.37412199871844704,-1.0326813385366386E-12),(0.9273794962553974,0.37412199871844704,-1.0326813385366386E-12),(0.9614949837727648,0.27482248121252945,-7.58641408575883E-13),(0.3926681168676969,0.9196802433430745,-2.537750919662503E-12),(0.200399297225422,0.9797143061482553,-2.703321388637086E-12),(0.3926681168676969,0.9196802433430745,-2.537750919662503E-12),(0.20039929722539637,0.9797143061482605,-2.703321388637101E-12),(0.20039929722539637,0.9797143061482605,-2.703321388637101E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(0.200399297225422,0.9797143061482553,-2.703321388637086E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.5672614750584217,-0.8235377458954407,2.272039142654336E-12),(0.7214044108111449,-0.6925140258956672,1.910524191002451E-12),(0.5672614750584217,-0.8235377458954407,2.272039142654336E-12),(0.7214044108113933,-0.6925140258954087,1.9105241910017373E-12),(0.7214044108111449,-0.6925140258956672,1.910524191002451E-12),(0.8460222407894988,-0.5331476044113067,1.4708167193440143E-12),(0.8460222407894988,-0.5331476044113067,1.4708167193440143E-12),(0.7214044108113933,-0.6925140258954087,1.9105241910017373E-12),(0.9941612242434783,-0.10790486648297537,2.9736531264429485E-13),(0.9985392391497387,-0.054031360137064166,1.4870159924605098E-13),(0.99853923914974,-0.05403136013704105,1.4870159924598724E-13),(0.9941612242434783,-0.10790486648297537,2.9736531264429485E-13),(0.99853923914974,-0.05403136013704105,1.4870159924598724E-13),(0.9985392391497393,0.054031360137051426,-1.494402187026451E-13),(0.9985392391497397,0.05403136013704346,-1.494402187026231E-13),(0.9985392391497387,-0.054031360137064166,1.4870159924605098E-13),(0.9985392391497397,0.05403136013704346,-1.494402187026231E-13),(0.9941612242434782,0.1079048664829755,-2.9804729546217666E-13),(0.9941612242434782,0.1079048664829755,-2.9804729546217666E-13),(0.9985392391497393,0.054031360137051426,-1.494402187026451E-13),(0.8460222407894984,0.5331476044113076,-1.471385318215113E-12),(0.7214044108112283,0.6925140258955805,-1.911102400116686E-12),(0.7214044108113113,0.692514025895494,-1.911102400116447E-12),(0.8460222407894984,0.5331476044113076,-1.471385318215113E-12),(0.7214044108112283,0.6925140258955805,-1.911102400116686E-12),(0.5672614750584241,0.8235377458954392,-2.2726032974975106E-12),(0.7214044108113113,0.692514025895494,-1.911102400116447E-12),(0.5672614750584241,0.8235377458954392,-2.2726032974975106E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.8194722387884859,-0.5731188793391708,1.5810620773204915E-12),(0.7574045442264162,-0.6529459061707751,1.8013529499047649E-12),(0.7574045442264307,-0.6529459061707586,1.8013529499047194E-12),(0.8194722387884859,-0.5731188793391708,1.5810620773204915E-12),(0.7574045442264162,-0.6529459061707751,1.8013529499047649E-12),(0.5831639704137637,-0.8123544691889466,2.2412359231033616E-12),(0.7574045442264307,-0.6529459061707586,1.8013529499047194E-12),(0.5831639704137174,-0.8123544691889798,2.241235923103454E-12),(0.5831639704137174,-0.8123544691889798,2.241235923103454E-12),(0.3197400203626559,-0.9475053136412948,2.614235653341075E-12),(0.5831639704137637,-0.8123544691889466,2.2412359231033616E-12),(0.31974002036271576,-0.9475053136412748,2.6142356533410195E-12),(0.31974002036271576,-0.9475053136412748,2.6142356533410195E-12),(0.012699053705120382,-0.9999193637663962,2.7589903187976175E-12),(0.3197400203626559,-0.9475053136412948,2.614235653341075E-12),(0.012699053705104884,-0.9999193637663965,2.758990318797619E-12),(0.012699053705120382,-0.9999193637663962,2.7589903187976175E-12),(-0.2815655603975249,-0.9595419924099351,2.647674154753329E-12),(-0.28156556039741143,-0.9595419924099683,2.64767415475342E-12),(0.012699053705104884,-0.9999193637663965,2.758990318797619E-12),(-0.2815655603975249,-0.9595419924099351,2.647674154753329E-12),(-0.5404333018571977,-0.8413868588489645,2.3217731900452282E-12),(-0.28156556039741143,-0.9595419924099683,2.64767415475342E-12),(-0.540433301857118,-0.8413868588490157,2.321773190045369E-12),(-0.5404333018571977,-0.8413868588489645,2.3217731900452282E-12),(-0.7333107949378584,-0.6798935784573981,1.876320377318748E-12),(-0.7333107949378527,-0.6798935784574043,1.8763203773187654E-12),(-0.540433301857118,-0.8413868588490157,2.321773190045369E-12),(-0.7333107949378584,-0.6798935784573981,1.876320377318748E-12),(-0.857100934324648,-0.515148510994466,1.4218195712968403E-12),(-0.7333107949378527,-0.6798935784574043,1.8763203773187654E-12),(-0.8571009343246425,-0.5151485109944751,1.4218195712968653E-12),(-0.8571009343246425,-0.5151485109944751,1.4218195712968653E-12),(-0.930947415719256,-0.3651532680473211,1.008009055862335E-12),(-0.857100934324648,-0.515148510994466,1.4218195712968403E-12),(-0.9309474157192436,-0.3651532680473529,1.0080090558624228E-12),(-0.9309474157192436,-0.3651532680473529,1.0080090558624228E-12),(-0.9717468331379525,-0.23602561786035084,6.516953275380645E-13),(-0.930947415719256,-0.3651532680473211,1.008009055862335E-12),(-0.9717468331379511,-0.23602561786035728,6.51695327538082E-13),(-0.9717468331379511,-0.23602561786035728,6.51695327538082E-13),(-0.9931098274040339,-0.1171873317109414,3.2380273428995555E-13),(-0.9717468331379525,-0.23602561786035084,6.516953275380645E-13),(-0.9931098274040338,-0.11718733171094246,3.238027342899586E-13),(-0.9931098274040338,-0.11718733171094246,3.238027342899586E-13),(-0.9999579620805333,-0.009169191444562432,2.5823088857616624E-14),(-0.9931098274040339,-0.1171873317109414,3.2380273428995555E-13),(-0.9999579620805331,-0.009169191444566668,2.5823088857628312E-14),(-0.9999579620805331,-0.009169191444566668,2.5823088857628312E-14),(-0.9967023029360896,0.08114505112386929,-2.2351088494305778E-13),(-0.9999579620805333,-0.009169191444562432,2.5823088857616624E-14),(-0.9967023029360891,0.08114505112387725,-2.2351088494307985E-13),(-0.9967023029360891,0.08114505112387725,-2.2351088494307985E-13),(-0.9857538147747108,0.16819457974948349,-4.637729747766518E-13),(-0.9967023029360896,0.08114505112386929,-2.2351088494305778E-13),(-0.9857538147747129,0.16819457974947152,-4.637729747766187E-13),(-0.9857538147747129,0.16819457974947152,-4.637729747766187E-13),(-0.9654101412336251,0.2607359952198245,-7.190330014675737E-13),(-0.9857538147747108,0.16819457974948349,-4.637729747766518E-13),(-0.9654101412336293,0.26073599521980817,-7.190330014675287E-13),(-0.9654101412336293,0.26073599521980817,-7.190330014675287E-13),(-0.933824740070632,0.3577308413207013,-9.86672760144965E-13),(-0.9654101412336251,0.2607359952198245,-7.190330014675737E-13),(-0.933824740070634,0.357730841320696,-9.866727601449504E-13),(-0.933824740070634,0.357730841320696,-9.866727601449504E-13),(-0.887595750904099,0.4606232549242262,-1.2707549509252001E-12),(-0.933824740070632,0.3577308413207013,-9.86672760144965E-13),(-0.8875957509041004,0.4606232549242236,-1.2707549509251933E-12),(-0.8875957509041004,0.4606232549242236,-1.2707549509251933E-12),(-0.819804938826555,0.5726428749889312,-1.5798979487019313E-12),(-0.887595750904099,0.4606232549242262,-1.2707549509252001E-12),(-0.8198049388265481,0.5726428749889407,-1.5798979487019573E-12),(-0.8198049388265481,0.5726428749889407,-1.5798979487019573E-12),(-0.7226711292766403,0.6911920419897972,-1.9069208338852633E-12),(-0.819804938826555,0.5726428749889312,-1.5798979487019313E-12),(-0.7226711292765956,0.6911920419898439,-1.9069208338853926E-12),(-0.7226711292766403,0.6911920419897972,-1.9069208338852633E-12),(-0.5715761942912734,0.8205489955630344,-2.263850065452386E-12),(-0.571576194291267,0.8205489955630387,-2.2638500654523978E-12),(-0.7226711292765956,0.6911920419898439,-1.9069208338853926E-12),(-0.5715761942912734,0.8205489955630344,-2.263850065452386E-12),(-0.3225397005865454,0.9465559368286386,-2.6116084446300165E-12),(-0.571576194291267,0.8205489955630387,-2.2638500654523978E-12),(-0.32253970058654396,0.9465559368286391,-2.6116084446300177E-12),(-0.3225397005865454,0.9465559368286386,-2.6116084446300165E-12),(-0.02037212465314542,0.9997924667335301,-2.7586326171023326E-12),(-0.020372124653092762,0.9997924667335312,-2.758632617102336E-12),(-0.32253970058654396,0.9465559368286391,-2.6116084446300177E-12),(-0.02037212465314542,0.9997924667335301,-2.7586326171023326E-12),(0.25541347674785303,0.9668319170856814,-2.667790131660265E-12),(-0.020372124653092762,0.9997924667335312,-2.758632617102336E-12),(0.25541347674790693,0.9668319170856672,-2.6677901316602256E-12),(0.25541347674790693,0.9668319170856672,-2.6677901316602256E-12),(0.4905585459951927,0.8714082355309036,-2.404565621405352E-12),(0.25541347674785303,0.9668319170856814,-2.667790131660265E-12),(0.4905585459951778,0.871408235530912,-2.404565621405375E-12),(0.4905585459951778,0.871408235530912,-2.404565621405375E-12),(0.6462378453519254,0.7631360607617106,-2.105850363204575E-12),(0.4905585459951927,0.8714082355309036,-2.404565621405352E-12),(0.6462378453519061,0.763136060761727,-2.1058503632046203E-12),(0.6462378453519061,0.763136060761727,-2.1058503632046203E-12),(0.6427392629565352,0.7660850082426167,-2.113998224350665E-12),(0.6462378453519254,0.7631360607617106,-2.105850363204575E-12),(0.6427392629565662,0.7660850082425907,-2.113998224350593E-12),(0.6427392629565662,0.7660850082425907,-2.113998224350593E-12),(0.5846038255640311,0.8113189059401364,-2.2388249002099063E-12),(0.6427392629565352,0.7660850082426167,-2.113998224350665E-12),(0.5846038255640311,0.8113189059401364,-2.2388249002099063E-12),(-0.8601478920980523,0.5100447075691285,-1.4070898051343613E-12),(-0.8601478920980523,0.5100447075691285,-1.4070898051343613E-12),(-0.8601478920980523,0.5100447075691285,-1.4070898051343613E-12),(-0.8601478920980523,0.5100447075691285,-1.4070898051343613E-12),(0.8094388435365364,0.587204188144324,-1.6206545122681444E-12),(0.8094388435365364,0.587204188144324,-1.6206545122681444E-12),(0.8094388435365364,0.587204188144324,-1.6206545122681444E-12),(0.8094388435365364,0.587204188144324,-1.6206545122681444E-12),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(0.9536861696258785,-0.3008034073349574,8.294400198242891E-13),(0.9536861696258785,-0.3008034073349574,8.294400198242891E-13),(0.9536861696258785,-0.3008034073349574,8.294400198242891E-13),(0.9536861696258785,-0.3008034073349574,8.294400198242891E-13),(-0.770041798845136,-0.637993438862303,1.7605422993353893E-12),(-0.770041798845136,-0.637993438862303,1.7605422993353893E-12),(-0.770041798845136,-0.637993438862303,1.7605422993353893E-12),(-0.770041798845136,-0.637993438862303,1.7605422993353893E-12),(-0.994302470776474,0.10659548117907772,-2.937570866883809E-13),(-0.994302470776474,0.10659548117907772,-2.937570866883809E-13),(-0.994302470776474,0.10659548117907772,-2.937570866883809E-13),(-0.994302470776474,0.10659548117907772,-2.937570866883809E-13),(-0.9408175538277588,-0.33891345563366515,9.356479532997303E-13),(-0.8797598194001714,-0.4754184053746529,1.3121679465243017E-12),(-0.9408175538277588,-0.33891345563366515,9.356479532997303E-13),(-0.8797598194001328,-0.4754184053747243,1.3121679465244988E-12),(-0.8797598194001328,-0.4754184053747243,1.3121679465244988E-12),(-0.7490764788486469,-0.6624835309920637,1.8281405274907243E-12),(-0.8797598194001714,-0.4754184053746529,1.3121679465243017E-12),(-0.7490764788486561,-0.6624835309920533,1.8281405274906956E-12),(-0.7490764788486469,-0.6624835309920637,1.8281405274907243E-12),(-0.6277478308059852,-0.778416765568664,2.1479892064091254E-12),(-0.6277478308059492,-0.7784167655686931,2.1479892064092058E-12),(-0.7490764788486561,-0.6624835309920533,1.8281405274906956E-12),(-0.6277478308059492,-0.7784167655686931,2.1479892064092058E-12),(-0.4624291545171812,-0.8866562338654849,2.446655450620092E-12),(-0.4624291545172642,-0.8866562338654415,2.4466554506199725E-12),(-0.6277478308059852,-0.778416765568664,2.1479892064091254E-12),(-0.4624291545171812,-0.8866562338654849,2.446655450620092E-12),(-0.24619523010037206,-0.9692202580816319,2.6744039908327643E-12),(-0.4624291545172642,-0.8866562338654415,2.4466554506199725E-12),(-0.2461952301003438,-0.9692202580816389,2.6744039908327837E-12),(-0.2461952301003438,-0.9692202580816389,2.6744039908327837E-12),(0.011075954373054989,-0.9999386597360491,2.7590349425139276E-12),(-0.24619523010037206,-0.9692202580816319,2.6744039908327643E-12),(0.0110759543730961,-0.9999386597360487,2.7590349425139256E-12),(0.011075954373054989,-0.9999386597360491,2.7590349425139276E-12),(0.29728615576782064,-0.9547884276575576,2.634313170289269E-12),(0.2972861557679879,-0.9547884276575057,2.6343131702891258E-12),(0.0110759543730961,-0.9999386597360487,2.7590349425139256E-12),(0.29728615576782064,-0.9547884276575576,2.634313170289269E-12),(0.5611488072510459,-0.8277149365093812,2.2835888378610523E-12),(0.2972861557679879,-0.9547884276575057,2.6343131702891258E-12),(0.5611488072509848,-0.8277149365094224,2.2835888378611662E-12),(0.5611488072509848,-0.8277149365094224,2.2835888378611662E-12),(0.7489939741665427,-0.6625768081228082,1.8278695292240116E-12),(0.5611488072510459,-0.8277149365093812,2.2835888378610523E-12),(0.7489939741665566,-0.6625768081227924,1.8278695292239676E-12),(0.7489939741665427,-0.6625768081228082,1.8278695292240116E-12),(0.8635495158077704,-0.5042640516120157,1.3909755350697596E-12),(0.8635495158077656,-0.5042640516120236,1.3909755350697818E-12),(0.7489939741665566,-0.6625768081227924,1.8278695292239676E-12),(0.8635495158077656,-0.5042640516120236,1.3909755350697818E-12),(0.9334175416532352,-0.35879199117877647,9.895274242006407E-13),(0.9334175416532393,-0.3587919911787656,9.895274242006102E-13),(0.8635495158077704,-0.5042640516120157,1.3909755350697596E-12),(0.9334175416532393,-0.3587919911787656,9.895274242006102E-13),(0.9749062702748574,-0.2226157321007812,6.13802852718901E-13),(0.9749062702748587,-0.22261573210077576,6.13802852718886E-13),(0.9334175416532352,-0.35879199117877647,9.895274242006407E-13),(0.9749062702748587,-0.22261573210077576,6.13802852718886E-13),(0.9946566839741972,-0.1032379824747367,2.84393706045395E-13),(0.994656683974197,-0.10323798247473812,2.843937060453989E-13),(0.9749062702748574,-0.2226157321007812,6.13802852718901E-13),(0.994656683974197,-0.10323798247473812,2.843937060453989E-13),(0.9999996706240923,-0.0008116352057429553,1.7425911648202075E-15),(0.9999996706240923,-0.0008116352057480785,1.742591164834336E-15),(0.9946566839741972,-0.1032379824747367,2.84393706045395E-13),(0.9999996706240923,-0.0008116352057480785,1.742591164834336E-15),(0.9950173309235023,0.09970211212341352,-2.755130733599334E-13),(0.9950173309235034,0.09970211212340235,-2.7551307335990255E-13),(0.9999996706240923,-0.0008116352057429553,1.7425911648202075E-15),(0.9950173309235034,0.09970211212340235,-2.7551307335990255E-13),(0.9766138235826098,0.2150010222937444,-5.937019381178544E-13),(0.9766138235826136,0.21500102229372753,-5.937019381178077E-13),(0.9950173309235023,0.09970211212341352,-2.755130733599334E-13),(0.9766138235826136,0.21500102229372753,-5.937019381178077E-13),(0.9378850898645635,0.3469460450988595,-9.577354359038564E-13),(0.9378850898645755,0.34694604509882676,-9.57735435903766E-13),(0.9766138235826098,0.2150010222937444,-5.937019381178544E-13),(0.9378850898645755,0.34694604509882676,-9.57735435903766E-13),(0.8712497287927936,0.4908400045620607,-1.3546055391050911E-12),(0.8712497287927745,0.4908400045620945,-1.3546055391051842E-12),(0.9378850898645635,0.3469460450988595,-9.577354359038564E-13),(0.8712497287927745,0.4908400045620945,-1.3546055391051842E-12),(0.7558037417969744,0.6547982161595223,-1.8070185736433278E-12),(0.7558037417969822,0.6547982161595135,-1.8070185736433035E-12),(0.8712497287927936,0.4908400045620607,-1.3546055391050911E-12),(0.7558037417969744,0.6547982161595223,-1.8070185736433278E-12),(0.5617419259878124,0.8273125217156473,-2.283036568390234E-12),(0.7558037417969822,0.6547982161595135,-1.8070185736433035E-12),(0.5617419259877519,0.8273125217156883,-2.2830365683903475E-12),(0.5617419259877519,0.8273125217156883,-2.2830365683903475E-12),(0.29396712482546045,0.9558155311156291,-2.6374679504786755E-12),(0.5617419259878124,0.8273125217156473,-2.283036568390234E-12),(0.2939671248254585,0.9558155311156297,-2.6374679504786768E-12),(0.2939671248254585,0.9558155311156297,-2.6374679504786768E-12),(-0.002695267450516672,0.9999963677600887,-2.759210556861501E-12),(0.29396712482546045,0.9558155311156291,-2.6374679504786755E-12),(-0.002695267450412,0.9999963677600888,-2.7592105568615014E-12),(-0.002695267450412,0.9999963677600888,-2.7592105568615014E-12),(-0.2926144101614269,0.9562305197837393,-2.6383433107106885E-12),(-0.002695267450516672,0.9999963677600887,-2.759210556861501E-12),(-0.29261441016138784,0.9562305197837514,-2.6383433107107224E-12),(-0.2926144101614269,0.9562305197837393,-2.6383433107106885E-12),(-0.5408366900001067,0.8411276209646955,-2.3206108423864756E-12),(-0.5408366900001648,0.8411276209646582,-2.320610842386373E-12),(-0.29261441016138784,0.9562305197837514,-2.6383433107107224E-12),(-0.5408366900001648,0.8411276209646582,-2.320610842386373E-12),(-0.7259710978950983,0.6877252104009172,-1.89729689877209E-12),(-0.7259710978950612,0.6877252104009562,-1.8972968987721976E-12),(-0.5408366900001067,0.8411276209646955,-2.3206108423864756E-12),(-0.7259710978950983,0.6877252104009172,-1.89729689877209E-12),(-0.7993217090953496,0.6009033244781474,-1.6577786489428226E-12),(-0.7259710978950612,0.6877252104009562,-1.8972968987721976E-12),(-0.7993217090953496,0.6009033244781474,-1.6577786489428226E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(0.08869355101086293,-0.9960589611107787,2.748302852120414E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(0.08869355101077159,-0.9960589611107867,2.7483028521204362E-12),(0.08869355101077159,-0.9960589611107867,2.7483028521204362E-12),(0.4182829284859115,-0.9083167904080877,2.5060674705363426E-12),(0.08869355101086293,-0.9960589611107787,2.748302852120414E-12),(0.41828292848561616,-0.9083167904082237,2.5060674705367178E-12),(0.41828292848561616,-0.9083167904082237,2.5060674705367178E-12),(0.8055283032698752,-0.5925572990278292,1.6347056234832802E-12),(0.4182829284859115,-0.9083167904080877,2.5060674705363426E-12),(0.8055283032697906,-0.592557299027944,1.634705623483597E-12),(0.8055283032698752,-0.5925572990278292,1.6347056234832802E-12),(0.9613077859588944,-0.27547657006505755,7.597481191488865E-13),(0.9613077859588679,-0.2754765700651501,7.597481191491419E-13),(0.8055283032697906,-0.592557299027944,1.634705623483597E-12),(0.9613077859588679,-0.2754765700651501,7.597481191491419E-13),(0.9847230941359283,-0.17412761950754374,4.800525865781023E-13),(0.9847230941359283,-0.17412761950754374,4.800525865781023E-13),(0.9613077859588944,-0.27547657006505755,7.597481191488865E-13),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(0.9850106999604984,0.1724932490369674,-4.762380179752947E-13),(0.961494983772804,0.2748224812123921,-7.586414085754417E-13),(0.961494983772787,0.2748224812124512,-7.586414085756047E-13),(0.9850106999604984,0.1724932490369674,-4.762380179752947E-13),(0.961494983772787,0.2748224812124512,-7.586414085756047E-13),(0.9273794962553793,0.3741219987184919,-1.0326813385366384E-12),(0.9273794962553793,0.3741219987184919,-1.0326813385366384E-12),(0.961494983772804,0.2748224812123921,-7.586414085754417E-13),(0.3926681168676969,0.9196802433430745,-2.537750919662503E-12),(0.20039929722533362,0.9797143061482733,-2.7033213886371365E-12),(0.3926681168676969,0.9196802433430745,-2.537750919662503E-12),(0.2003992972254554,0.9797143061482484,-2.7033213886370674E-12),(0.2003992972254554,0.9797143061482484,-2.7033213886370674E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(0.20039929722533362,0.9797143061482733,-2.7033213886371365E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.5672614750584476,-0.8235377458954231,2.2720391426543365E-12),(0.7214044108111475,-0.6925140258956647,1.9105525264235976E-12),(0.5672614750584476,-0.8235377458954231,2.2720391426543365E-12),(0.7214044108112989,-0.6925140258955069,1.9105525264231622E-12),(0.7214044108111475,-0.6925140258956647,1.9105525264235976E-12),(0.8460222407894723,-0.5331476044113491,1.4708722304952456E-12),(0.8460222407894723,-0.5331476044113491,1.4708722304952456E-12),(0.7214044108112989,-0.6925140258955069,1.9105525264231622E-12),(0.9941612242434783,-0.10790486648297537,2.9736531264429485E-13),(0.9985392391497385,-0.054031360137068975,1.4870159924606428E-13),(0.9985392391497395,-0.054031360137050524,1.4870159924601336E-13),(0.9941612242434783,-0.10790486648297537,2.9736531264429485E-13),(0.9985392391497395,-0.054031360137050524,1.4870159924601336E-13),(0.9985392391497385,0.05403136013706628,-1.4944021870268608E-13),(0.9985392391497392,0.05403136013705365,-1.494402187026512E-13),(0.9985392391497385,-0.054031360137068975,1.4870159924606428E-13),(0.9985392391497392,0.05403136013705365,-1.494402187026512E-13),(0.9941612242434782,0.1079048664829755,-2.9804729546217666E-13),(0.9941612242434782,0.1079048664829755,-2.9804729546217666E-13),(0.9985392391497385,0.05403136013706628,-1.4944021870268608E-13),(0.8460222407894719,0.53314760441135,-1.4712742959126509E-12),(0.7214044108113185,0.6925140258954865,-1.9109890584316378E-12),(0.7214044108112997,0.6925140258955061,-1.910989058431692E-12),(0.8460222407894719,0.53314760441135,-1.4712742959126509E-12),(0.7214044108113185,0.6925140258954865,-1.9109890584316378E-12),(0.5672614750584498,0.8235377458954214,-2.2724922751950477E-12),(0.7214044108112997,0.6925140258955061,-1.910989058431692E-12),(0.5672614750584498,0.8235377458954214,-2.2724922751950477E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(0.8194722387884859,-0.5731188793391708,1.5810620773204915E-12),(0.757404544226434,-0.6529459061707545,1.8013808481064406E-12),(0.7574045442264348,-0.6529459061707538,1.8013808481064384E-12),(0.8194722387884859,-0.5731188793391708,1.5810620773204915E-12),(0.757404544226434,-0.6529459061707545,1.8013808481064406E-12),(0.583163970413716,-0.8123544691889808,2.2412779418996795E-12),(0.7574045442264348,-0.6529459061707538,1.8013808481064384E-12),(0.5831639704137412,-0.8123544691889628,2.2412779418996294E-12),(0.5831639704137412,-0.8123544691889628,2.2412779418996294E-12),(0.3197400203626799,-0.9475053136412869,2.6142497143572983E-12),(0.583163970413716,-0.8123544691889808,2.2412779418996795E-12),(0.3197400203626479,-0.9475053136412975,2.614249714357328E-12),(0.3197400203626479,-0.9475053136412975,2.614249714357328E-12),(0.012699053705094217,-0.9999193637663966,2.7589868093416184E-12),(0.3197400203626799,-0.9475053136412869,2.6142497143572983E-12),(0.012699053705109459,-0.9999193637663963,2.758986809341618E-12),(0.012699053705094217,-0.9999193637663966,2.7589868093416184E-12),(-0.28156556039750363,-0.9595419924099412,2.6476706474896948E-12),(-0.2815655603974348,-0.9595419924099615,2.647670647489751E-12),(0.012699053705109459,-0.9999193637663963,2.758986809341618E-12),(-0.2815655603974348,-0.9595419924099615,2.647670647489751E-12),(-0.540433301857153,-0.8413868588489932,2.3217731900452892E-12),(-0.5404333018571272,-0.8413868588490098,2.321773190045335E-12),(-0.28156556039750363,-0.9595419924099412,2.6476706474896948E-12),(-0.5404333018571272,-0.8413868588490098,2.321773190045335E-12),(-0.7333107949378317,-0.6798935784574272,1.8762924414216722E-12),(-0.73331079493784,-0.679893578457418,1.876292441421648E-12),(-0.540433301857153,-0.8413868588489932,2.3217731900452892E-12),(-0.7333107949378317,-0.6798935784574272,1.8762924414216722E-12),(-0.85710093432464,-0.5151485109944794,1.4217916958951858E-12),(-0.73331079493784,-0.679893578457418,1.876292441421648E-12),(-0.8571009343246485,-0.5151485109944652,1.4217916958951466E-12),(-0.8571009343246485,-0.5151485109944652,1.4217916958951466E-12),(-0.9309474157192527,-0.36515326804732995,1.0079255567209507E-12),(-0.85710093432464,-0.5151485109944794,1.4217916958951858E-12),(-0.930947415719251,-0.3651532680473342,1.0079255567209626E-12),(-0.930947415719251,-0.3651532680473342,1.0079255567209626E-12),(-0.9717468331379574,-0.23602561786033083,6.516119061885976E-13),(-0.9309474157192527,-0.36515326804732995,1.0079255567209507E-12),(-0.9717468331379546,-0.23602561786034235,6.516119061886293E-13),(-0.9717468331379546,-0.23602561786034235,6.516119061886293E-13),(-0.9931098274040329,-0.11718733171094989,3.237749288096606E-13),(-0.9717468331379574,-0.23602561786033083,6.516119061885976E-13),(-0.9931098274040345,-0.11718733171093668,3.237749288096242E-13),(-0.9931098274040345,-0.11718733171093668,3.237749288096242E-13),(-0.9999579620805331,-0.009169191444583459,2.5795300786440865E-14),(-0.9931098274040329,-0.11718733171094989,3.237749288096606E-13),(-0.999957962080533,-0.009169191444587096,2.579530078645091E-14),(-0.999957962080533,-0.009169191444587096,2.579530078645091E-14),(-0.9967023029360895,0.08114505112387327,-2.235108849430851E-13),(-0.9999579620805331,-0.009169191444583459,2.5795300786440865E-14),(-0.99670230293609,0.08114505112386673,-2.23510884943067E-13),(-0.99670230293609,0.08114505112386673,-2.23510884943067E-13),(-0.9857538147747091,0.16819457974949253,-4.637729747766431E-13),(-0.9967023029360895,0.08114505112387327,-2.235108849430851E-13),(-0.9857538147747111,0.168194579749481,-4.637729747766111E-13),(-0.9857538147747111,0.168194579749481,-4.637729747766111E-13),(-0.9654101412336203,0.26073599521984153,-7.19033001467587E-13),(-0.9857538147747091,0.16819457974949253,-4.637729747766431E-13),(-0.965410141233624,0.26073599521982815,-7.1903300146755E-13),(-0.965410141233624,0.26073599521982815,-7.1903300146755E-13),(-0.933824740070633,0.3577308413206985,-9.866727601449934E-13),(-0.9654101412336203,0.26073599521984153,-7.19033001467587E-13),(-0.9338247400706331,0.3577308413206983,-9.86672760144993E-13),(-0.9338247400706331,0.3577308413206983,-9.86672760144993E-13),(-0.8875957509041146,0.46062325492419626,-1.2707549509251539E-12),(-0.933824740070633,0.3577308413206985,-9.866727601449934E-13),(-0.8875957509041126,0.4606232549242003,-1.2707549509251648E-12),(-0.8875957509041126,0.4606232549242003,-1.2707549509251648E-12),(-0.8198049388265566,0.572642874988929,-1.579897948701925E-12),(-0.8875957509041146,0.46062325492419626,-1.2707549509251539E-12),(-0.8198049388265604,0.5726428749889236,-1.5798979487019103E-12),(-0.8198049388265604,0.5726428749889236,-1.5798979487019103E-12),(-0.722671129276619,0.6911920419898193,-1.9069208338853126E-12),(-0.8198049388265566,0.572642874988929,-1.579897948701925E-12),(-0.7226711292766199,0.6911920419898184,-1.9069208338853106E-12),(-0.722671129276619,0.6911920419898193,-1.9069208338853126E-12),(-0.5715761942912858,0.8205489955630256,-2.2638500654523445E-12),(-0.5715761942912485,0.8205489955630518,-2.2638500654524163E-12),(-0.7226711292766199,0.6911920419898184,-1.9069208338853106E-12),(-0.5715761942912485,0.8205489955630518,-2.2638500654524163E-12),(-0.32253970058651305,0.9465559368286498,-2.6116084446300423E-12),(-0.32253970058652687,0.9465559368286449,-2.6116084446300294E-12),(-0.5715761942912858,0.8205489955630256,-2.2638500654523445E-12),(-0.32253970058651305,0.9465559368286498,-2.6116084446300423E-12),(-0.020372124653166204,0.9997924667335297,-2.758632617102332E-12),(-0.32253970058652687,0.9465559368286449,-2.6116084446300294E-12),(-0.02037212465307671,0.9997924667335314,-2.758632617102337E-12),(-0.02037212465307671,0.9997924667335314,-2.758632617102337E-12),(0.25541347674785186,0.9668319170856817,-2.667790131660265E-12),(-0.020372124653166204,0.9997924667335297,-2.758632617102332E-12),(0.25541347674788184,0.966831917085674,-2.6677901316602438E-12),(0.25541347674788184,0.966831917085674,-2.6677901316602438E-12),(0.4905585459952011,0.8714082355308989,-2.4045656214053384E-12),(0.25541347674785186,0.9668319170856817,-2.667790131660265E-12),(0.4905585459951661,0.8714082355309185,-2.4045656214053926E-12),(0.4905585459951661,0.8714082355309185,-2.4045656214053926E-12),(0.6462378453519136,0.7631360607617204,-2.10585036320461E-12),(0.4905585459952011,0.8714082355308989,-2.4045656214053384E-12),(0.646237845351932,0.7631360607617048,-2.1058503632045666E-12),(0.646237845351932,0.7631360607617048,-2.1058503632045666E-12),(0.6427392629565304,0.7660850082426208,-2.1140260554296896E-12),(0.6462378453519136,0.7631360607617204,-2.10585036320461E-12),(0.6427392629565537,0.7660850082426012,-2.1140260554296363E-12),(0.6427392629565537,0.7660850082426012,-2.1140260554296363E-12),(0.5846038255640063,0.8113189059401544,-2.2388804113611376E-12),(0.6427392629565304,0.7660850082426208,-2.1140260554296896E-12),(0.5846038255640063,0.8113189059401544,-2.2388804113611376E-12),(-0.8601478920980623,0.5100447075691116,-1.4072008274368238E-12),(-0.8601478920980623,0.5100447075691116,-1.4072008274368238E-12),(-0.8601478920980623,0.5100447075691116,-1.4072008274368238E-12),(-0.8601478920980623,0.5100447075691116,-1.4072008274368238E-12),(0.8094388435365364,0.587204188144324,-1.6206545122681444E-12),(0.8094388435365364,0.587204188144324,-1.6206545122681444E-12),(0.8094388435365364,0.587204188144324,-1.6206545122681444E-12),(0.8094388435365364,0.587204188144324,-1.6206545122681444E-12),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.20007400713178172,0.9797807875592539,-2.7033613939576515E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.20007400713178403,0.9797807875592535,-2.7033613939576495E-12),(-0.20007400713178172,0.9797807875592539,-2.7033613939576515E-12),(-0.39205733655535935,0.9199407833404918,-2.5381887537922687E-12),(-0.39205733655535935,0.9199407833404918,-2.5381887537922687E-12),(-0.20007400713178403,0.9797807875592535,-2.7033613939576495E-12),(-0.9271481171496652,0.37469503448248564,-1.0336102455888045E-12),(-0.9613689058329687,0.27526319568282365,-7.592249637674819E-13),(-0.9271481171496652,0.37469503448248564,-1.0336102455888045E-12),(-0.9613689058329601,0.27526319568285385,-7.592249637675653E-13),(-0.9613689058329601,0.27526319568285385,-7.592249637675653E-13),(-0.9849591146664011,0.1727875644703044,-4.764443598667407E-13),(-0.9613689058329687,0.27526319568282365,-7.592249637674819E-13),(-0.9849591146664011,0.1727875644703044,-4.764443598667407E-13),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.9850568535010445,-0.1722294846146325,4.755718845284114E-13),(-0.9627290187837485,-0.2704678102689502,7.466747295901026E-13),(-0.9850568535010445,-0.1722294846146325,4.755718845284114E-13),(-0.9627290187837382,-0.2704678102689871,7.46674729590204E-13),(-0.9627290187837382,-0.2704678102689871,7.46674729590204E-13),(-0.8103422277042295,-0.5859568874920293,1.6171129406161576E-12),(-0.9627290187837485,-0.2704678102689502,7.466747295901026E-13),(-0.8103422277044079,-0.5859568874917827,1.6171129406154769E-12),(-0.8103422277042295,-0.5859568874920293,1.6171129406161576E-12),(-0.4221218672866537,-0.9065390941147706,2.501474366907366E-12),(-0.4221218672864478,-0.9065390941148664,2.5014743669076302E-12),(-0.8103422277044079,-0.5859568874917827,1.6171129406154769E-12),(-0.4221218672866537,-0.9065390941147706,2.501474366907366E-12),(-0.08899635085419964,-0.9960319520651113,2.748295194818928E-12),(-0.4221218672864478,-0.9065390941148664,2.5014743669076302E-12),(-0.08899635085420729,-0.9960319520651107,2.7482951948189263E-12),(-0.08899635085420729,-0.9960319520651107,2.7482951948189263E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.08899635085419964,-0.9960319520651113,2.748295194818928E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-0.587931901049856,0.808910427505977,-2.231765637671211E-12),(-0.7331764133481863,0.6800384892856357,-1.876140750049548E-12),(-0.587931901049856,0.808910427505977,-2.231765637671211E-12),(-0.7331764133483407,0.6800384892854691,-1.8761407500490886E-12),(-0.7331764133483407,0.6800384892854691,-1.8761407500490886E-12),(-0.8507772826193463,0.5255264173938747,-1.4497779551247261E-12),(-0.7331764133481863,0.6800384892856357,-1.876140750049548E-12),(-0.8507772826193463,0.5255264173938747,-1.4497779551247261E-12),(-0.994236246863432,0.1072114052837521,-2.955889552068861E-13),(-0.9985580220656773,0.05368311250553952,-1.4780934086075738E-13),(-0.994236246863432,0.1072114052837521,-2.955889552068861E-13),(-0.9985580220656758,0.053683112505568904,-1.478093408608385E-13),(-0.9985580220656758,0.053683112505568904,-1.478093408608385E-13),(-0.9997372811223786,-0.022920923498721792,6.369599145657129E-14),(-0.9985580220656773,0.05368311250553952,-1.4780934086075738E-13),(-0.9997372811223787,-0.022920923498718167,6.369599145656128E-14),(-0.9997372811223787,-0.022920923498718167,6.369599145656128E-14),(-0.9919210150229111,-0.12685700593943589,3.504152525380346E-13),(-0.9997372811223786,-0.022920923498721792,6.369599145657129E-14),(-0.9919210150229133,-0.12685700593941754,3.5041525253798406E-13),(-0.9919210150229133,-0.12685700593941754,3.5041525253798406E-13),(-0.9257138949175407,-0.37822451633467224,1.043869056011262E-12),(-0.9919210150229111,-0.12685700593943589,3.504152525380346E-13),(-0.9257138949176085,-0.37822451633450627,1.043869056010804E-12),(-0.9257138949176085,-0.37822451633450627,1.043869056010804E-12),(-0.7298956734501632,-0.6835585606798681,1.8863588115198206E-12),(-0.9257138949175407,-0.37822451633467224,1.043869056011262E-12),(-0.729895673450331,-0.6835585606796888,1.886358811519326E-12),(-0.7298956734501632,-0.6835585606798681,1.8863588115198206E-12),(-0.5913596447695311,-0.8064079430028291,2.225335744311634E-12),(-0.5913596447695311,-0.8064079430028291,2.225335744311634E-12),(-0.729895673450331,-0.6835585606796888,1.886358811519326E-12),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(1.,-1.0761972206014589E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.9832650394637132,-0.18218085016933794,5.029388678027954E-13),(-0.9604389766296769,-0.27849052438196026,7.686887881531223E-13),(-0.9832650394637132,-0.18218085016933794,5.029388678027954E-13),(-0.9604389766296849,-0.27849052438193206,7.686887881530445E-13),(-0.9604389766296849,-0.27849052438193206,7.686887881530445E-13),(-0.8061306092176249,-0.5917376453145607,1.633030350653497E-12),(-0.9604389766296769,-0.27849052438196026,7.686887881531223E-13),(-0.8061306092174902,-0.5917376453147445,1.633030350654004E-12),(-0.8061306092176249,-0.5917376453145607,1.633030350653497E-12),(-0.4173761927595571,-0.9087337969491049,2.5075654874579747E-12),(-0.41737619275961,-0.9087337969490807,2.507565487457907E-12),(-0.8061306092174902,-0.5917376453147445,1.633030350654004E-12),(-0.4173761927595571,-0.9087337969491049,2.5075654874579747E-12),(-0.0876379036952066,-0.996152396893121,2.7486176629320176E-12),(-0.41737619275961,-0.9087337969490807,2.507565487457907E-12),(-0.0876379036952242,-0.9961523968931193,2.7486176629320128E-12),(-0.0876379036952066,-0.996152396893121,2.7486176629320176E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.0876379036952242,-0.9961523968931193,2.7486176629320128E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.08899635085425409,0.9960319520651065,-2.7482241106569056E-12),(-0.08899635085416184,0.9960319520651149,-2.7482241106569282E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-0.08899635085425409,0.9960319520651065,-2.7482241106569056E-12),(-0.422121867286659,0.9065390941147681,-2.5011088585144275E-12),(-0.08899635085416184,0.9960319520651149,-2.7482241106569282E-12),(-0.422121867286817,0.9065390941146945,-2.501108858514224E-12),(-0.422121867286659,0.9065390941147681,-2.5011088585144275E-12),(-0.8086796863923623,0.5882492369874787,-1.6228038316918226E-12),(-0.8086796863925251,0.5882492369872546,-1.6228038316912042E-12),(-0.422121867286817,0.9065390941146945,-2.501108858514224E-12),(-0.8086796863923623,0.5882492369874787,-1.6228038316918226E-12),(-0.9603664303895912,0.2787405951431447,-7.687797585281369E-13),(-0.8086796863925251,0.5882492369872546,-1.6228038316912042E-12),(-0.9603664303895675,0.27874059514322663,-7.687797585283631E-13),(-0.9603664303895675,0.27874059514322663,-7.687797585283631E-13),(-0.9830031215351425,0.1835888423956264,-5.061428413667685E-13),(-0.9603664303895912,0.2787405951431447,-7.687797585281369E-13),(-0.9830031215351425,0.1835888423956264,-5.061428413667685E-13),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(1.,-1.0761972206014592E-42,-3.9654910130298924E-16),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.9829162037139707,-0.18405362391573804,5.082124243891802E-13),(-0.9589823266839851,-0.2834658658600195,7.825035035981868E-13),(-0.9829162037139707,-0.18405362391573804,5.082124243891802E-13),(-0.958982326683998,-0.2834658658599764,7.825035035980681E-13),(-0.958982326683998,-0.2834658658599764,7.825035035980681E-13),(-0.9250216907185411,-0.3799142952038155,1.0486130201458409E-12),(-0.9589823266839851,-0.2834658658600195,7.825035035981868E-13),(-0.9250216907185411,-0.3799142952038155,1.0486130201458409E-12),(-0.39770665703451996,-0.9175126238643406,2.5317835110675614E-12),(-0.20308542061848583,-0.9791610245165054,2.7018017139450767E-12),(-0.2030854206186462,-0.9791610245164724,2.7018017139449854E-12),(-0.39770665703451996,-0.9175126238643406,2.5317835110675614E-12),(-0.20308542061848583,-0.9791610245165054,2.7018017139450767E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(-0.2030854206186462,-0.9791610245164724,2.7018017139449854E-12),(9.877481432647188E-28,-1.,2.7592143574660292E-12),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-1.,1.0761972206014592E-42,3.9654910130298924E-16),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-9.877481432647188E-28,1.,-2.7592143574660292E-12),(-1.3916449267378769E-27,1.,-2.75921435746603E-12),(-0.08899635085414169,0.9960319520651166,-2.748224110656932E-12),(-1.3916449267378769E-27,1.,-2.75921435746603E-12),(-0.08899635085414813,0.9960319520651161,-2.7482241106569294E-12),(-0.9603664303895796,0.2787405951431853,-7.687797585282521E-13),(-0.9830031215351425,0.1835888423956264,-5.061428413667685E-13),(-0.960366430389585,0.2787405951431662,-7.68779758528199E-13),(-0.9830031215351425,0.1835888423956264,-5.061428413667685E-13),(-0.08899635085414813,0.9960319520651161,-2.7482241106569294E-12),(-0.4221218672867728,0.9065390941147151,-2.501108858514279E-12),(-0.08899635085414169,0.9960319520651166,-2.748224110656932E-12),(-0.4221218672867537,0.906539094114724,-2.5011088585143035E-12),(-0.4221218672867728,0.9065390941147151,-2.501108858514279E-12),(-0.8086796863926495,0.5882492369870835,-1.6228038316907357E-12),(-0.8086796863925304,0.5882492369872474,-1.6228038316911875E-12),(-0.4221218672867537,0.906539094114724,-2.5011088585143035E-12),(-0.8086796863926495,0.5882492369870835,-1.6228038316907357E-12),(-0.960366430389585,0.2787405951431662,-7.68779758528199E-13),(-0.8086796863925304,0.5882492369872474,-1.6228038316911875E-12),(-0.9603664303895796,0.2787405951431853,-7.687797585282521E-13),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(2.8945509067095913E-15,-2.753816448777958E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(7.55748761013525E-15,-2.762882014836081E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(1.3441669640648579E-14,-2.7681850473853533E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(6.185937062280205E-16,-2.7588738478177244E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(1.1332245893860785E-14,-2.7463497837929584E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(2.855267988404736E-16,-2.75749174968622E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.000777542147953E-15,-2.7643353439559525E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(9.666911356923052E-15,-2.7461948200471406E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.1649327244501143E-14,-2.7571002251900776E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(3.2276178140971382E-15,-2.768257652314093E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(2.4210832979512598E-14,-2.7527431704243738E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(1.7843278820844347E-15,-2.7562066450224008E-12,-1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.),(6.581627720909095E-16,2.759214357466027E-12,1.)),$,((1,2,3),(2,1,4),(3,2,5),(3,5,6),(7,8,9),(8,7,10),(8,10,6),(8,6,11),(11,6,5),(8,11,12),(8,12,13),(14,15,16),(15,14,17),(17,14,18),(18,14,19),(19,14,20),(20,14,21),(20,21,22),(22,21,4),(22,4,1),(21,14,23),(23,14,24),(25,26,27),(26,25,22),(26,22,28),(28,22,1),(29,30,31),(30,29,32),(32,29,33),(32,33,25),(32,25,34),(34,25,27),(32,34,35),(36,37,38),(37,36,39),(40,41,42),(41,40,43),(44,45,46),(45,44,47),(48,49,50),(49,48,51),(52,53,54),(53,52,55),(56,57,58),(57,56,59),(60,61,62),(61,60,63),(64,65,66),(65,64,67),(68,69,70),(69,68,71),(72,73,74),(73,72,75),(76,77,78),(77,76,79),(80,81,82),(81,80,83),(84,85,86),(85,84,87),(88,89,90),(89,88,91),(92,93,94),(93,92,95),(96,97,98),(97,96,99),(100,101,102),(101,100,103),(104,105,106),(105,104,107),(108,109,110),(109,108,111),(112,113,114),(113,112,115),(116,117,118),(117,116,119),(120,121,122),(121,120,123),(124,125,126),(125,124,127),(128,129,130),(129,128,131),(132,133,134),(133,132,135),(136,137,138),(137,136,139),(140,141,142),(141,140,143),(144,145,146),(145,144,147),(148,149,150),(149,148,151),(152,153,154),(153,152,155),(156,157,158),(157,156,159),(160,161,162),(161,160,163),(164,165,166),(165,164,167),(168,169,170),(169,168,171),(172,173,174),(173,172,175),(176,177,178),(177,176,179),(180,181,182),(181,180,183),(184,185,186),(185,184,187),(188,189,190),(189,188,191),(192,193,194),(193,192,195),(196,197,198),(197,196,199),(200,201,202),(201,200,203),(204,205,206),(205,204,207),(208,209,210),(209,208,211),(212,213,214),(213,212,215),(216,217,218),(217,216,219),(220,221,222),(221,220,223),(224,225,226),(225,224,227),(228,229,230),(229,228,231),(232,233,234),(233,232,235),(236,237,238),(237,236,239),(240,241,242),(241,240,243),(244,245,246),(245,244,247),(248,249,250),(249,248,251),(252,253,254),(253,252,255),(256,257,258),(257,256,259),(260,261,262),(261,260,263),(264,265,266),(265,264,267),(268,269,270),(269,268,271),(272,273,274),(273,272,275),(276,277,278),(277,276,279),(280,281,282),(281,280,283),(284,285,286),(285,284,287),(288,289,290),(289,288,291),(292,293,294),(293,292,295),(296,297,298),(297,296,299),(300,301,302),(301,300,303),(304,305,306),(305,304,307),(308,309,310),(309,308,311),(312,313,314),(313,312,315),(316,317,318),(317,316,319),(320,321,322),(321,320,323),(324,325,326),(325,324,327),(328,329,330),(329,328,331),(332,333,334),(333,332,335),(336,337,338),(337,336,339),(340,341,342),(341,340,343),(344,345,346),(345,344,347),(348,349,350),(349,348,351),(352,353,354),(353,352,355),(356,357,358),(357,356,359),(360,361,362),(361,360,363),(364,365,366),(365,364,367),(368,369,370),(369,368,371),(372,373,374),(373,372,375),(373,375,376),(376,375,377),(377,375,378),(377,378,379),(379,378,380),(380,378,381),(380,381,382),(382,381,383),(382,383,384),(384,383,385),(384,385,386),(386,385,387),(387,385,388),(387,388,389),(387,389,390),(390,389,391),(390,391,392),(392,391,393),(392,393,394),(394,393,395),(394,395,396),(396,395,397),(396,397,398),(398,397,399),(398,399,400),(400,399,401),(402,403,404),(403,402,405),(405,402,406),(405,406,407),(407,406,372),(407,372,408),(408,372,409),(409,372,374),(409,374,410),(409,410,411),(411,410,412),(411,412,413),(411,413,414),(414,413,415),(414,415,416),(414,416,417),(417,416,418),(417,418,419),(419,418,420),(419,420,421),(421,420,422),(421,422,423),(421,423,424),(424,423,425),(424,425,426),(426,425,427),(426,427,428),(428,427,429),(428,429,430),(430,429,431),(430,431,432),(430,432,433),(433,432,434),(433,434,401),(433,401,399),(433,399,435),(433,435,436),(436,435,437),(436,437,438),(436,438,439),(439,438,440),(439,440,441),(442,443,444),(443,442,445),(446,447,448),(447,446,449),(450,451,452),(451,450,453),(454,455,456),(455,454,457),(458,459,460),(459,458,461),(462,463,464),(463,462,465),(466,467,468),(467,466,469),(470,471,472),(471,470,473),(474,475,476),(475,474,477),(478,479,480),(479,478,481),(482,483,484),(483,482,485),(486,487,488),(487,486,489),(490,491,492),(491,490,493),(494,495,496),(495,494,497),(498,499,500),(499,498,501),(502,503,504),(503,502,505),(506,507,508),(507,506,509),(510,511,512),(511,510,513),(514,515,516),(515,514,517),(518,519,520),(519,518,521),(522,523,524),(523,522,525),(526,527,528),(527,526,529),(530,531,532),(531,530,533),(534,535,536),(535,534,537),(538,539,540),(539,538,541),(542,543,544),(543,542,545),(546,547,548),(547,546,549),(550,551,552),(551,550,553),(554,555,556),(555,554,557),(558,559,560),(559,558,561),(562,563,564),(563,562,565),(566,567,568),(567,566,569),(570,571,572),(571,570,573),(574,575,576),(575,574,577),(578,579,580),(579,578,581),(582,583,584),(583,582,585),(586,587,588),(587,586,589),(590,591,592),(591,590,593),(594,595,596),(595,594,597),(598,599,600),(599,598,601),(602,603,604),(603,602,605),(606,607,608),(607,606,609),(610,611,612),(611,610,613),(614,615,616),(615,614,617),(618,619,620),(619,618,621),(622,623,624),(623,622,625),(626,627,628),(627,626,629),(630,631,632),(631,630,633),(634,635,636),(635,634,637),(638,639,640),(639,638,641),(642,643,644),(643,642,645),(646,647,648),(647,646,649),(650,651,652),(651,650,653),(654,655,656),(655,654,657),(658,659,660),(659,658,661),(662,663,664),(663,662,665),(666,667,668),(667,666,669),(670,671,672),(671,670,673),(674,675,676),(675,674,677),(678,679,680),(679,678,681),(682,683,684),(683,682,685),(686,687,688),(687,686,689),(690,691,692),(691,690,693),(694,695,696),(695,694,697),(698,699,700),(699,698,701),(702,703,704),(703,702,705),(706,707,708),(707,706,709),(710,711,712),(711,710,713),(714,715,716),(715,714,717),(718,719,720),(719,718,721),(722,723,724),(723,722,725),(725,722,726),(726,722,727),(727,722,728),(728,722,729),(728,729,730),(730,729,731),(729,722,732),(732,722,733),(732,733,734),(734,733,735),(734,735,736),(736,735,737),(736,737,738),(736,738,739),(739,738,740),(739,740,741),(742,743,744),(743,742,745),(745,742,746),(745,746,747),(745,747,730),(745,730,748),(748,730,749),(749,730,731),(745,748,750),(745,750,751),(752,753,754),(753,752,755),(756,757,758),(757,756,759),(760,761,762),(761,760,763),(764,765,766),(765,764,767),(768,769,770),(769,768,771),(772,773,774),(773,772,775),(776,777,778),(777,776,779),(780,781,782),(781,780,783),(784,785,786),(785,784,787),(788,789,790),(789,788,791),(792,793,794),(793,792,795),(796,797,798),(797,796,799),(800,801,802),(801,800,803),(804,805,806),(805,804,807),(808,809,810),(809,808,811),(812,813,814),(813,812,815),(816,817,818),(817,816,819),(820,821,822),(821,820,823),(824,825,826),(825,824,827),(828,829,830),(829,828,831),(832,833,834),(833,832,835),(836,837,838),(837,836,839),(840,841,842),(841,840,843),(844,845,846),(845,844,847),(848,849,850),(849,848,851),(852,853,854),(853,852,855),(856,857,858),(857,856,859),(860,861,862),(861,860,863),(864,865,866),(865,864,867),(868,869,870),(869,868,871),(872,873,874),(873,872,875),(873,875,876),(876,875,877),(877,875,878),(878,875,879),(879,875,880),(880,875,881),(880,881,882),(882,881,883),(882,883,884),(884,883,885),(884,885,886),(886,885,887),(887,885,888),(887,888,889),(889,888,890),(889,890,891),(891,890,892),(892,890,893),(892,893,894),(895,896,897),(896,895,898),(896,898,899),(896,899,900),(896,900,901),(901,900,877),(901,877,878),(896,901,902),(896,902,903),(896,903,904),(904,903,905),(904,905,906),(906,905,907),(906,907,908),(908,907,909),(908,909,910),(910,909,911),(910,911,912),(912,911,913),(912,913,914),(912,914,915),(915,914,894),(915,894,893),(915,893,916),(915,916,917),(917,916,918),(917,918,919),(919,918,920),(919,920,921),(919,921,922),(923,924,925),(924,923,926),(927,928,929),(928,927,930),(931,932,933),(932,931,934),(935,936,937),(936,935,938),(939,940,941),(940,939,942),(943,944,945),(944,943,946),(947,948,949),(948,947,950),(951,952,953),(952,951,954),(955,956,957),(956,955,958),(959,960,961),(960,959,962),(963,964,965),(964,963,966),(967,968,969),(968,967,970),(971,972,973),(972,971,974),(975,976,977),(976,975,978),(979,980,981),(980,979,982),(983,984,985),(984,983,986),(987,988,989),(988,987,990),(991,992,993),(992,991,994),(995,996,997),(996,995,998),(999,1000,1001),(1000,999,1002),(1003,1004,1005),(1004,1003,1006),(1007,1008,1009),(1008,1007,1010),(1011,1012,1013),(1012,1011,1014),(1015,1016,1017),(1016,1015,1018),(1019,1020,1021),(1020,1019,1022),(1023,1024,1025),(1024,1023,1026),(1027,1028,1029),(1028,1027,1030),(1031,1032,1033),(1032,1031,1034),(1035,1036,1037),(1036,1035,1038),(1039,1040,1041),(1040,1039,1042),(1043,1044,1045),(1044,1043,1046),(1047,1048,1049),(1048,1047,1050),(1051,1052,1053),(1052,1051,1054),(1055,1056,1057),(1056,1055,1058),(1059,1060,1061),(1060,1059,1062),(1063,1064,1065),(1064,1063,1066),(1067,1068,1069),(1068,1067,1070),(1071,1072,1073),(1072,1071,1074),(1075,1076,1077),(1076,1075,1078),(1079,1080,1081),(1080,1079,1082),(1083,1084,1085),(1084,1083,1086),(1087,1088,1089),(1088,1087,1090),(1091,1092,1093),(1092,1091,1094),(1095,1096,1097),(1096,1095,1098),(1099,1100,1101),(1100,1099,1102),(1103,1104,1105),(1104,1103,1106),(1107,1108,1109),(1108,1107,1110),(1111,1112,1113),(1112,1111,1114),(1115,1116,1117),(1116,1115,1118),(1119,1120,1121),(1120,1119,1122),(1123,1124,1125),(1124,1123,1126),(1127,1128,1129),(1128,1127,1130),(1130,1127,1131),(1131,1127,1132),(1132,1127,1133),(1132,1133,1134),(1133,1127,1135),(1135,1127,1136),(1136,1127,1137),(1136,1137,1138),(1136,1138,1139),(1139,1138,1140),(1139,1140,1141),(1141,1140,1142),(1141,1142,1143),(1143,1142,1144),(1145,1146,1133),(1146,1145,1147),(1147,1145,1148),(1147,1148,1149),(1147,1149,1150),(1150,1149,1151),(1151,1149,1152),(1151,1152,1153),(1153,1152,1154),(1153,1154,1155),(1155,1154,1156),(1155,1156,1157),(1158,1159,1160),(1159,1158,1161),(1159,1161,1162),(1159,1162,1163),(1159,1163,1134),(1159,1134,1164),(1164,1134,1133),(1164,1133,1146),(1159,1164,1165),(1159,1165,1166),(1159,1166,1167),(1167,1166,1168),(1168,1166,1169),(1168,1169,1170),(1170,1169,1171),(1170,1171,1172),(1172,1171,1173),(1172,1173,1174),(1172,1174,1175),(1176,1177,1178),(1177,1176,1179),(1180,1181,1182),(1181,1180,1183),(1184,1185,1186),(1185,1184,1187),(1188,1189,1190),(1189,1188,1191),(1192,1193,1194),(1193,1192,1195),(1196,1197,1198),(1197,1196,1199),(1200,1201,1202),(1201,1200,1203),(1204,1205,1206),(1205,1204,1207),(1208,1209,1210),(1209,1208,1211),(1212,1213,1214),(1213,1212,1215),(1216,1217,1218),(1217,1216,1219),(1220,1221,1222),(1221,1220,1223),(1224,1225,1226),(1225,1224,1227),(1228,1229,1230),(1229,1228,1231),(1232,1233,1234),(1233,1232,1235),(1236,1237,1238),(1237,1236,1239),(1240,1241,1242),(1241,1240,1243),(1244,1245,1246),(1245,1244,1247),(1248,1249,1250),(1249,1248,1251),(1252,1253,1254),(1253,1252,1255),(1256,1257,1258),(1257,1256,1259),(1260,1261,1262),(1261,1260,1263),(1264,1265,1266),(1265,1264,1267),(1268,1269,1270),(1269,1268,1271),(1272,1273,1274),(1273,1272,1275),(1276,1277,1278),(1277,1276,1279),(1280,1281,1282),(1281,1280,1283),(1284,1285,1286),(1285,1284,1287),(1288,1289,1290),(1289,1288,1291),(1292,1293,1294),(1293,1292,1295),(1296,1297,1298),(1297,1296,1299),(1300,1301,1302),(1301,1300,1303),(1304,1305,1306),(1305,1304,1307),(1308,1309,1310),(1309,1308,1311),(1312,1313,1314),(1313,1312,1315),(1316,1317,1318),(1317,1316,1319),(1320,1321,1322),(1321,1320,1323),(1324,1325,1326),(1325,1324,1327),(1328,1329,1330),(1329,1328,1331),(1332,1333,1334),(1333,1332,1335),(1336,1337,1338),(1337,1336,1339),(1340,1341,1342),(1341,1340,1343),(1344,1345,1346),(1345,1344,1347),(1348,1349,1350),(1349,1348,1351),(1352,1353,1354),(1353,1352,1355),(1356,1357,1358),(1357,1356,1359),(1360,1361,1362),(1361,1360,1363),(1364,1365,1366),(1365,1364,1367),(1368,1369,1370),(1369,1368,1371),(1372,1373,1374),(1373,1372,1375),(1375,1372,1376),(1376,1372,1377),(1377,1372,1378),(1378,1372,1379),(1378,1379,1380),(1380,1379,1381),(1379,1372,1382),(1382,1372,1383),(1383,1372,1384),(1383,1384,1385),(1383,1385,1386),(1386,1385,1387),(1387,1385,1388),(1387,1388,1389),(1389,1388,1390),(1390,1388,1391),(1390,1391,1392),(1392,1391,1393),(1393,1391,1394),(1394,1391,1395),(1395,1391,1396),(1395,1396,1397),(1395,1397,1398),(1398,1397,1399),(1398,1399,1400),(1401,1402,1381),(1402,1401,1403),(1403,1401,1404),(1404,1401,1405),(1404,1405,1406),(1406,1405,1407),(1406,1407,1408),(1406,1408,1409),(1409,1408,1410),(1409,1410,1411),(1411,1410,1394),(1394,1410,1412),(1394,1412,1413),(1394,1413,1393),(1411,1414,1409),(1414,1411,1415),(1414,1415,1416),(1416,1415,1417),(1417,1415,1418),(1418,1415,1419),(1419,1415,1420),(1419,1420,1421),(1421,1420,1422),(1421,1422,1423),(1423,1422,1424),(1425,1426,1427),(1426,1425,1428),(1428,1425,1429),(1428,1429,1430),(1428,1430,1380),(1428,1380,1431),(1431,1380,1381),(1431,1381,1402),(1428,1431,1432),(1428,1432,1433),(1428,1433,1434),(1434,1433,1435),(1434,1435,1436),(1436,1435,1437),(1436,1437,1438),(1436,1438,1418),(1418,1438,1439),(1418,1439,1417),(1440,1441,1442),(1441,1440,1443),(1444,1445,1446),(1445,1444,1447),(1448,1449,1450),(1449,1448,1451),(1452,1453,1454),(1453,1452,1455),(1456,1457,1458),(1457,1456,1459),(1460,1461,1462),(1461,1460,1463),(1464,1465,1466),(1465,1464,1467),(1468,1469,1470),(1469,1468,1471),(1472,1473,1474),(1473,1472,1475),(1476,1477,1478),(1477,1476,1479),(1480,1481,1482),(1481,1480,1483),(1484,1485,1486),(1485,1484,1487),(1488,1489,1490),(1489,1488,1491),(1492,1493,1494),(1493,1492,1495),(1496,1497,1498),(1497,1496,1499),(1500,1501,1502),(1501,1500,1503),(1504,1505,1506),(1505,1504,1507),(1508,1509,1510),(1509,1508,1511),(1512,1513,1514),(1513,1512,1515),(1516,1517,1518),(1517,1516,1519),(1520,1521,1522),(1521,1520,1523),(1524,1525,1526),(1525,1524,1527),(1528,1529,1530),(1529,1528,1531),(1532,1533,1534),(1533,1532,1535),(1536,1537,1538),(1537,1536,1539),(1540,1541,1542),(1541,1540,1543),(1544,1545,1546),(1545,1544,1547),(1548,1549,1550),(1549,1548,1551),(1552,1553,1554),(1553,1552,1555),(1556,1557,1558),(1557,1556,1559),(1560,1561,1562),(1561,1560,1563),(1564,1565,1566),(1565,1564,1567),(1568,1569,1570),(1569,1568,1571),(1572,1573,1574),(1573,1572,1575),(1576,1577,1578),(1577,1576,1579),(1580,1581,1582),(1581,1580,1583),(1584,1585,1586),(1585,1584,1587),(1588,1589,1590),(1589,1588,1591),(1592,1593,1594),(1593,1592,1595),(1596,1597,1598),(1597,1596,1599),(1600,1601,1602),(1601,1600,1603),(1604,1605,1606),(1605,1604,1607),(1608,1609,1610),(1609,1608,1611),(1612,1613,1614),(1613,1612,1615),(1616,1617,1618),(1617,1616,1619),(1620,1621,1622),(1621,1620,1623),(1624,1625,1626),(1625,1624,1627),(1628,1629,1630),(1629,1628,1631),(1632,1633,1634),(1633,1632,1635),(1636,1637,1638),(1637,1636,1639),(1640,1641,1642),(1641,1640,1643),(1644,1645,1646),(1645,1644,1647),(1648,1649,1650),(1649,1648,1651),(1652,1653,1654),(1653,1652,1655),(1656,1657,1658),(1657,1656,1659),(1660,1661,1662),(1661,1660,1663),(1664,1665,1666),(1665,1664,1667),(1668,1669,1670),(1669,1668,1671),(1672,1673,1674),(1673,1672,1675),(1676,1677,1678),(1677,1676,1679),(1680,1681,1682),(1681,1680,1683),(1684,1685,1686),(1685,1684,1687),(1688,1689,1690),(1689,1688,1691),(1692,1693,1694),(1693,1692,1695),(1696,1697,1698),(1697,1696,1699),(1700,1701,1702),(1701,1700,1703),(1704,1705,1706),(1705,1704,1707),(1708,1709,1710),(1709,1708,1711),(1712,1713,1714),(1713,1712,1715),(1715,1712,1716),(1716,1712,1717),(1717,1712,1718),(1717,1718,1719),(1717,1719,1720),(1720,1719,1721),(1720,1721,1722),(1718,1712,1723),(1723,1712,1724),(1725,1726,1727),(1726,1725,1728),(1726,1728,1729),(1729,1728,1730),(1729,1730,1731),(1730,1728,1732),(1722,1733,1734),(1733,1722,1721),(1734,1733,1735),(1734,1735,1736),(1734,1736,1737),(1737,1736,1731),(1731,1736,1729),(1737,1738,1734),(1738,1737,1739),(1738,1739,1740),(1740,1739,1741),(1740,1741,1742),(1742,1741,1743),(1742,1743,1744),(1744,1743,1745),(1745,1743,1746),(1747,1748,1749),(1748,1747,1750),(1748,1750,1751),(1748,1751,1752),(1748,1752,1720),(1748,1720,1753),(1753,1720,1722),(1748,1753,1754),(1748,1754,1755),(1748,1755,1756),(1756,1755,1757),(1757,1755,1758),(1757,1758,1759),(1757,1759,1760),(1760,1759,1761),(1760,1761,1762),(1760,1762,1763),(1763,1762,1764),(1763,1764,1746),(1763,1746,1743),(1763,1743,1765),(1763,1765,1766),(1766,1765,1767),(1766,1767,1768),(1768,1767,1769),(1768,1769,1770),(1770,1769,1771),(1770,1771,1772),(1773,1774,1775),(1774,1773,1776),(1777,1778,1779),(1778,1777,1780),(1781,1782,1783),(1782,1781,1784),(1785,1786,1787),(1786,1785,1788),(1789,1790,1791),(1790,1789,1792),(1793,1794,1795),(1794,1793,1796),(1797,1798,1799),(1798,1797,1800),(1801,1802,1803),(1802,1801,1804),(1805,1806,1807),(1806,1805,1808),(1809,1810,1811),(1810,1809,1812),(1813,1814,1815),(1814,1813,1816),(1817,1818,1819),(1818,1817,1820),(1821,1822,1823),(1822,1821,1824),(1825,1826,1827),(1826,1825,1828),(1829,1830,1831),(1830,1829,1832),(1833,1834,1835),(1834,1833,1836),(1837,1838,1839),(1838,1837,1840),(1841,1842,1843),(1842,1841,1844),(1845,1846,1847),(1846,1845,1848),(1849,1850,1851),(1850,1849,1852),(1853,1854,1855),(1854,1853,1856),(1857,1858,1859),(1858,1857,1860),(1861,1862,1863),(1862,1861,1864),(1865,1866,1867),(1866,1865,1868),(1869,1870,1871),(1870,1869,1872),(1873,1874,1875),(1874,1873,1876),(1877,1878,1879),(1878,1877,1880),(1881,1882,1883),(1882,1881,1884),(1885,1886,1887),(1886,1885,1888),(1889,1890,1891),(1890,1889,1892),(1893,1894,1895),(1894,1893,1896),(1897,1898,1899),(1898,1897,1900),(1901,1902,1903),(1902,1901,1904),(1905,1906,1907),(1906,1905,1908),(1909,1910,1911),(1910,1909,1912),(1913,1914,1915),(1914,1913,1916),(1917,1918,1919),(1918,1917,1920),(1921,1922,1923),(1922,1921,1924),(1925,1926,1927),(1926,1925,1928),(1929,1930,1931),(1930,1929,1932),(1933,1934,1935),(1934,1933,1936),(1937,1938,1939),(1938,1937,1940),(1941,1942,1943),(1942,1941,1944),(1945,1946,1947),(1946,1945,1948),(1949,1950,1951),(1950,1949,1952),(1953,1954,1955),(1954,1953,1956),(1957,1958,1959),(1958,1957,1960),(1961,1962,1963),(1962,1961,1964),(1965,1966,1967),(1966,1965,1968),(1969,1970,1971),(1970,1969,1972),(1973,1974,1975),(1974,1973,1976),(1977,1978,1979),(1978,1977,1980),(1981,1982,1983),(1982,1981,1984),(1985,1986,1987),(1986,1985,1988),(1989,1990,1991),(1990,1989,1992),(1993,1994,1995),(1994,1993,1996),(1997,1998,1999),(1998,1997,2000),(2001,2002,2003),(2002,2001,2004),(2005,2006,2007),(2006,2005,2008),(2009,2010,2011),(2010,2009,2012),(2013,2014,2015),(2014,2013,2016),(2017,2018,2019),(2018,2017,2020),(2018,2020,2021),(2021,2020,2022),(2023,2024,2025),(2024,2023,2026),(2026,2023,2027),(2026,2027,2017),(2026,2017,2028),(2028,2017,2019),(2026,2028,2029),(2030,2031,2032),(2031,2030,2033),(2033,2030,2034),(2034,2030,2035),(2035,2030,2036),(2036,2030,2037),(2036,2037,2020),(2020,2037,2038),(2020,2038,2022),(2022,2038,2039),(2037,2030,2040),(2040,2030,2041),(2039,2042,2022),(2042,2039,2043),(2042,2043,2044),(2045,2046,2047),(2046,2045,2048),(2046,2048,2044),(2046,2044,2049),(2049,2044,2043),(2046,2049,2050),(2046,2050,2051),(2052,2053,2054),(2053,2052,2055),(2056,2057,2058),(2057,2056,2059),(2060,2061,2062),(2061,2060,2063),(2064,2065,2066),(2065,2064,2067),(2068,2069,2070),(2069,2068,2071),(2072,2073,2074),(2073,2072,2075),(2076,2077,2078),(2077,2076,2079),(2080,2081,2082),(2081,2080,2083),(2084,2085,2086),(2085,2084,2087),(2088,2089,2090),(2089,2088,2091),(2092,2093,2094),(2093,2092,2095),(2096,2097,2098),(2097,2096,2099),(2100,2101,2102),(2101,2100,2103),(2104,2105,2106),(2105,2104,2107),(2108,2109,2110),(2109,2108,2111),(2112,2113,2114),(2113,2112,2115),(2116,2117,2118),(2117,2116,2119),(2120,2121,2122),(2121,2120,2123),(2124,2125,2126),(2125,2124,2127),(2128,2129,2130),(2129,2128,2131),(2132,2133,2134),(2133,2132,2135),(2136,2137,2138),(2137,2136,2139),(2140,2141,2142),(2141,2140,2143),(2144,2145,2146),(2145,2144,2147),(2148,2149,2150),(2149,2148,2151),(2152,2153,2154),(2153,2152,2155),(2156,2157,2158),(2157,2156,2159),(2160,2161,2162),(2161,2160,2163),(2164,2165,2166),(2165,2164,2167),(2168,2169,2170),(2169,2168,2171),(2172,2173,2174),(2173,2172,2175),(2176,2177,2178),(2177,2176,2179),(2180,2181,2182),(2181,2180,2183),(2184,2185,2186),(2185,2184,2187),(2188,2189,2190),(2189,2188,2191),(2192,2193,2194),(2193,2192,2195),(2193,2195,2196),(2196,2195,2197),(2197,2195,2198),(2197,2198,2199),(2199,2198,2200),(2200,2198,2201),(2200,2201,2202),(2202,2201,2203),(2202,2203,2204),(2204,2203,2205),(2204,2205,2206),(2206,2205,2207),(2206,2207,2208),(2208,2207,2209),(2209,2207,2210),(2209,2210,2211),(2211,2210,2212),(2211,2212,2213),(2213,2212,2214),(2212,2215,2216),(2215,2212,2217),(2217,2212,2218),(2217,2218,2219),(2219,2218,2220),(2221,2222,2223),(2222,2221,2224),(2224,2221,2225),(2224,2225,2226),(2226,2225,2227),(2227,2225,2228),(2227,2228,2229),(2229,2228,2230),(2229,2230,2231),(2229,2231,2232),(2232,2231,2214),(2232,2214,2233),(2233,2214,2212),(2233,2212,2216),(2232,2233,2234),(2232,2234,2235),(2236,2237,2238),(2239,2240,2241),(2240,2239,2242),(2242,2239,2243),(2242,2243,2244),(2244,2243,2192),(2244,2192,2245),(2245,2192,2246),(2246,2192,2194),(2246,2194,2247),(2246,2247,2248),(2246,2248,2249),(2249,2248,2250),(2249,2250,2251),(2251,2250,2252),(2251,2252,2253),(2253,2252,2254),(2253,2254,2255),(2253,2255,2256),(2256,2255,2257),(2256,2257,2258),(2258,2257,2259),(2258,2259,2260),(2260,2259,2261),(2260,2261,2262),(2260,2262,2263),(2263,2262,2264),(2263,2264,2265),(2265,2264,2266),(2265,2266,2267),(2265,2267,2268),(2268,2267,2237),(2268,2237,2236),(2268,2236,2269),(2269,2236,2270),(2269,2270,2271),(2272,2273,2274),(2273,2272,2275),(2276,2277,2278),(2277,2276,2279),(2280,2281,2282),(2281,2280,2283),(2284,2285,2286),(2285,2284,2287),(2288,2289,2290),(2289,2288,2291),(2292,2293,2294),(2293,2292,2295),(2296,2297,2298),(2297,2296,2299),(2300,2301,2302),(2301,2300,2303),(2304,2305,2306),(2305,2304,2307),(2308,2309,2310),(2309,2308,2311),(2312,2313,2314),(2313,2312,2315),(2316,2317,2318),(2317,2316,2319),(2320,2321,2322),(2321,2320,2323),(2324,2325,2326),(2325,2324,2327),(2328,2329,2330),(2329,2328,2331),(2332,2333,2334),(2333,2332,2335),(2336,2337,2338),(2337,2336,2339),(2340,2341,2342),(2341,2340,2343),(2344,2345,2346),(2345,2344,2347),(2348,2349,2350),(2349,2348,2351),(2352,2353,2354),(2353,2352,2355),(2356,2357,2358),(2357,2356,2359),(2360,2361,2362),(2361,2360,2363),(2364,2365,2366),(2365,2364,2367),(2368,2369,2370),(2369,2368,2371),(2372,2373,2374),(2373,2372,2375),(2376,2377,2378),(2377,2376,2379),(2380,2381,2382),(2381,2380,2383),(2384,2385,2386),(2385,2384,2387),(2388,2389,2390),(2389,2388,2391),(2392,2393,2394),(2393,2392,2395),(2396,2397,2398),(2397,2396,2399),(2400,2401,2402),(2401,2400,2403),(2404,2405,2406),(2405,2404,2407),(2408,2409,2410),(2409,2408,2411),(2412,2413,2414),(2413,2412,2415),(2416,2417,2418),(2417,2416,2419),(2420,2421,2422),(2421,2420,2423),(2424,2425,2426),(2425,2424,2427),(2428,2429,2430),(2429,2428,2431),(2432,2433,2434),(2433,2432,2435),(2436,2437,2438),(2437,2436,2439),(2440,2441,2442),(2441,2440,2443),(2444,2445,2446),(2445,2444,2447),(2448,2449,2450),(2449,2448,2451),(2452,2453,2454),(2453,2452,2455),(2456,2457,2458),(2457,2456,2459),(2460,2461,2462),(2461,2460,2463),(2464,2465,2466),(2465,2464,2467),(2468,2469,2470),(2469,2468,2471),(2472,2473,2474),(2473,2472,2475),(2476,2477,2478),(2477,2476,2479),(2480,2481,2482),(2481,2480,2483),(2484,2485,2486),(2485,2484,2487),(2488,2489,2490),(2489,2488,2491),(2492,2493,2494),(2493,2492,2495),(2496,2497,2498),(2497,2496,2499),(2500,2501,2502),(2501,2500,2503),(2504,2505,2506),(2505,2504,2507),(2508,2509,2510),(2509,2508,2511),(2512,2513,2514),(2513,2512,2515),(2516,2517,2518),(2517,2516,2519),(2520,2521,2522),(2521,2520,2523),(2524,2525,2526),(2525,2524,2527),(2528,2529,2530),(2529,2528,2531),(2532,2533,2534),(2533,2532,2535),(2536,2537,2538),(2537,2536,2539),(2540,2541,2542),(2541,2540,2543),(2544,2545,2546),(2545,2544,2547),(2548,2549,2550),(2549,2548,2551),(2552,2553,2554),(2553,2552,2555),(2556,2557,2558),(2557,2556,2559),(2560,2561,2562),(2561,2560,2563),(2564,2565,2566),(2565,2564,2567),(2568,2569,2570),(2569,2568,2571),(2572,2573,2574),(2573,2572,2575),(2576,2577,2578),(2577,2576,2579),(2580,2581,2582),(2581,2580,2583),(2584,2585,2586),(2585,2584,2587),(2588,2589,2590),(2589,2588,2591),(2592,2593,2594),(2593,2592,2595),(2593,2595,2596),(2596,2595,2597),(2597,2595,2598),(2597,2598,2599),(2599,2598,2600),(2600,2598,2601),(2600,2601,2602),(2602,2601,2603),(2602,2603,2604),(2604,2603,2605),(2604,2605,2606),(2606,2605,2607),(2606,2607,2608),(2608,2607,2609),(2609,2607,2610),(2609,2610,2611),(2611,2610,2612),(2611,2612,2613),(2613,2612,2614),(2612,2615,2616),(2615,2612,2617),(2615,2617,2618),(2618,2617,2619),(2620,2621,2622),(2621,2620,2623),(2623,2620,2624),(2624,2620,2625),(2624,2625,2626),(2626,2625,2627),(2626,2627,2628),(2628,2627,2629),(2628,2629,2630),(2628,2630,2631),(2631,2630,2614),(2631,2614,2632),(2632,2614,2612),(2632,2612,2633),(2633,2612,2616),(2631,2632,2634),(2631,2634,2635),(2636,2637,2638),(2639,2640,2641),(2640,2639,2642),(2642,2639,2643),(2642,2643,2644),(2644,2643,2592),(2644,2592,2645),(2645,2592,2646),(2646,2592,2594),(2646,2594,2647),(2646,2647,2648),(2646,2648,2649),(2649,2648,2650),(2649,2650,2651),(2651,2650,2652),(2651,2652,2653),(2653,2652,2654),(2653,2654,2655),(2653,2655,2656),(2656,2655,2657),(2656,2657,2658),(2658,2657,2659),(2658,2659,2660),(2660,2659,2661),(2660,2661,2662),(2660,2662,2663),(2663,2662,2664),(2663,2664,2665),(2665,2664,2666),(2665,2666,2667),(2665,2667,2668),(2668,2667,2637),(2668,2637,2636),(2668,2636,2669),(2669,2636,2670),(2669,2670,2671),(2672,2673,2674),(2673,2672,2675),(2676,2677,2678),(2677,2676,2679),(2680,2681,2682),(2681,2680,2683),(2684,2685,2686),(2685,2684,2687),(2688,2689,2690),(2689,2688,2691),(2692,2693,2694),(2693,2692,2695),(2696,2697,2698),(2697,2696,2699),(2700,2701,2702),(2701,2700,2703),(2704,2705,2706),(2705,2704,2707),(2708,2709,2710),(2709,2708,2711),(2712,2713,2714),(2713,2712,2715),(2716,2717,2718),(2717,2716,2719),(2720,2721,2722),(2721,2720,2723),(2724,2725,2726),(2725,2724,2727),(2728,2729,2730),(2729,2728,2731),(2732,2733,2734),(2733,2732,2735),(2736,2737,2738),(2737,2736,2739),(2740,2741,2742),(2741,2740,2743),(2744,2745,2746),(2745,2744,2747),(2748,2749,2750),(2749,2748,2751),(2752,2753,2754),(2753,2752,2755),(2756,2757,2758),(2757,2756,2759),(2760,2761,2762),(2761,2760,2763),(2764,2765,2766),(2765,2764,2767),(2768,2769,2770),(2769,2768,2771),(2772,2773,2774),(2773,2772,2775),(2776,2777,2778),(2777,2776,2779),(2780,2781,2782),(2781,2780,2783),(2784,2785,2786),(2785,2784,2787),(2788,2789,2790),(2789,2788,2791),(2792,2793,2794),(2793,2792,2795),(2796,2797,2798),(2797,2796,2799),(2800,2801,2802),(2801,2800,2803),(2804,2805,2806),(2805,2804,2807),(2808,2809,2810),(2809,2808,2811),(2812,2813,2814),(2813,2812,2815),(2816,2817,2818),(2817,2816,2819),(2820,2821,2822),(2821,2820,2823),(2824,2825,2826),(2825,2824,2827),(2828,2829,2830),(2829,2828,2831),(2832,2833,2834),(2833,2832,2835),(2836,2837,2838),(2837,2836,2839),(2840,2841,2842),(2841,2840,2843),(2844,2845,2846),(2845,2844,2847),(2848,2849,2850),(2849,2848,2851),(2852,2853,2854),(2853,2852,2855),(2856,2857,2858),(2857,2856,2859),(2860,2861,2862),(2861,2860,2863),(2864,2865,2866),(2865,2864,2867),(2868,2869,2870),(2869,2868,2871),(2872,2873,2874),(2873,2872,2875),(2876,2877,2878),(2877,2876,2879),(2880,2881,2882),(2881,2880,2883),(2884,2885,2886),(2885,2884,2887),(2888,2889,2890),(2889,2888,2891),(2892,2893,2894),(2893,2892,2895),(2896,2897,2898),(2897,2896,2899),(2900,2901,2902),(2901,2900,2903),(2904,2905,2906),(2905,2904,2907),(2908,2909,2910),(2909,2908,2911),(2912,2913,2914),(2913,2912,2915),(2916,2917,2918),(2917,2916,2919),(2920,2921,2922),(2921,2920,2923),(2924,2925,2926),(2925,2924,2927),(2928,2929,2930),(2929,2928,2931),(2932,2933,2934),(2933,2932,2935),(2936,2937,2938),(2937,2936,2939),(2940,2941,2942),(2941,2940,2943),(2944,2945,2946),(2945,2944,2947),(2948,2949,2950),(2949,2948,2951),(2952,2953,2954),(2953,2952,2955),(2956,2957,2958),(2957,2956,2959),(2960,2961,2962),(2961,2960,2963),(2964,2965,2966),(2965,2964,2967),(2968,2969,2970),(2969,2968,2971),(2972,2973,2974),(2973,2972,2975),(2976,2977,2978),(2977,2976,2979),(2980,2981,2982),(2981,2980,2983),(2984,2985,2986),(2985,2984,2987),(2988,2989,2990),(2989,2988,2991),(2992,2993,2994),(2993,2992,2995),(2996,2997,2998),(2997,2996,2999),(3000,3001,3002),(3001,3000,3003),(3004,3005,3006),(3005,3004,3007),(3008,3009,3010),(3009,3008,3011),(3012,3013,3014),(3013,3012,3015),(3016,3017,3018),(3017,3016,3019),(3020,3021,3022),(3021,3020,3023),(3024,3025,3026),(3025,3024,3027),(3028,3029,3030),(3029,3028,3031),(3032,3033,3034),(3033,3032,3035),(3036,3037,3038),(3037,3036,3039),(3040,3041,3042),(3041,3040,3043),(3044,3045,3046),(3045,3044,3047),(3048,3049,3050),(3049,3048,3051),(3052,3053,3054),(3053,3052,3055),(3056,3057,3058),(3057,3056,3059),(3060,3061,3062),(3061,3060,3063),(3064,3065,3066),(3065,3064,3067),(3068,3069,3070),(3069,3068,3071),(3072,3073,3074),(3073,3072,3075),(3076,3077,3078),(3077,3076,3079),(3080,3081,3082),(3081,3080,3083),(3084,3085,3086),(3085,3084,3087),(3088,3089,3090),(3089,3088,3091),(3092,3093,3094),(3093,3092,3095),(3096,3097,3098),(3097,3096,3099),(3100,3101,3102),(3101,3100,3103),(3104,3105,3106),(3105,3104,3107),(3108,3109,3110),(3109,3108,3111),(3112,3113,3114),(3113,3112,3115),(3116,3117,3118),(3117,3116,3119),(3120,3121,3122),(3121,3120,3123),(3124,3125,3126),(3125,3124,3127),(3128,3129,3130),(3129,3128,3131),(3132,3133,3134),(3133,3132,3135),(3136,3137,3138),(3137,3136,3139),(3140,3141,3142),(3141,3140,3143),(3144,3145,3146),(3145,3144,3147),(3148,3149,3150),(3149,3148,3151),(3152,3153,3154),(3153,3152,3155),(3156,3157,3158),(3157,3156,3159),(3160,3161,3162),(3161,3160,3163),(3163,3160,3164),(3164,3160,3165),(3165,3160,3166),(3165,3166,3167),(3166,3160,3168),(3168,3160,3169),(3169,3160,3170),(3169,3170,3171),(3169,3171,3172),(3172,3171,3173),(3172,3173,3174),(3174,3173,3175),(3174,3175,3176),(3174,3176,3177),(3178,3179,3166),(3179,3178,3180),(3180,3178,3181),(3180,3181,3182),(3180,3182,3183),(3183,3182,3184),(3184,3182,3185),(3184,3185,3186),(3186,3185,3187),(3186,3187,3188),(3188,3187,3189),(3188,3189,3190),(3191,3192,3193),(3192,3191,3194),(3194,3191,3195),(3194,3195,3196),(3194,3196,3167),(3194,3167,3197),(3197,3167,3179),(3179,3167,3166),(3194,3197,3198),(3194,3198,3199),(3194,3199,3200),(3200,3199,3201),(3201,3199,3202),(3201,3202,3203),(3203,3202,3204),(3203,3204,3205),(3203,3205,3206),(3206,3205,3207),(3206,3207,3208),(3209,3210,3211),(3210,3209,3212),(3213,3214,3215),(3214,3213,3216),(3217,3218,3219),(3218,3217,3220),(3221,3222,3223),(3222,3221,3224),(3225,3226,3227),(3226,3225,3228),(3229,3230,3231),(3230,3229,3232),(3233,3234,3235),(3234,3233,3236),(3237,3238,3239),(3238,3237,3240),(3240,3237,3241),(3241,3237,3242),(3242,3237,3243),(3243,3237,3244),(3243,3244,3245),(3245,3244,3246),(3244,3237,3247),(3247,3237,3248),(3247,3248,3249),(3249,3248,3250),(3249,3250,3251),(3251,3250,3252),(3251,3252,3253),(3253,3252,3254),(3253,3254,3255),(3255,3254,3256),(3256,3254,3257),(3246,3258,3259),(3258,3246,3260),(3258,3260,3261),(3261,3260,3262),(3261,3262,3263),(3263,3262,3264),(3263,3264,3265),(3265,3264,3266),(3265,3266,3267),(3267,3266,3268),(3267,3268,3269),(3267,3269,3270),(3271,3272,3273),(3272,3271,3274),(3274,3271,3275),(3274,3275,3245),(3274,3245,3259),(3259,3245,3246),(3274,3259,3276),(3274,3276,3277),(3274,3277,3278),(3278,3277,3279),(3279,3277,3280),(3279,3280,3281),(3281,3280,3282),(3281,3282,3283),(3283,3282,3284),(3284,3282,3285),(3286,3287,3288),(3287,3286,3289),(3287,3289,3290),(3290,3289,3291),(3290,3291,3292),(3292,3291,3293),(3292,3293,3294),(3292,3294,3295),(3295,3294,3296),(3296,3294,3297),(3297,3294,3298),(3297,3298,3299),(3299,3298,3300),(3299,3300,3301),(3301,3300,3302),(3301,3302,3303),(3303,3302,3304),(3304,3302,3305),(3304,3305,3306),(3306,3305,3307),(3306,3307,3308),(3308,3307,3309),(3308,3309,3310),(3310,3309,3311),(3311,3309,3312),(3311,3312,3313),(3313,3312,3314),(3313,3314,3315),(3315,3314,3316),(3316,3314,3317),(3316,3317,3318),(3318,3317,3319),(3319,3317,3320),(3319,3320,3321),(3321,3320,3322),(3319,3323,3318),(3324,3325,3326),(3325,3324,3327),(3327,3324,3328),(3327,3328,3329),(3329,3328,3330),(3329,3330,3331),(3331,3330,3332),(3331,3332,3333),(3333,3332,3334),(3334,3332,3335),(3334,3335,3336),(3336,3335,3337),(3336,3337,3338),(3338,3337,3339),(3339,3337,3340),(3339,3340,3341),(3337,3335,3342),(3342,3335,3343),(3339,3344,3345),(3344,3339,3341),(3345,3344,3346),(3345,3346,3347),(3292,3348,3349),(3348,3292,3295),(3349,3348,3350),(3349,3350,3351),(3349,3351,3352),(3352,3351,3353),(3352,3353,3354),(3352,3354,3355),(3355,3354,3356),(3355,3356,3357),(3357,3356,3358),(3357,3358,3359),(3359,3358,3360),(3359,3360,3361),(3361,3360,3362),(3361,3362,3363),(3361,3363,3364),(3364,3363,3365),(3364,3365,3339),(3339,3365,3338),(3366,3367,3368),(3367,3366,3369),(3367,3369,3370),(3370,3369,3371),(3370,3371,3372),(3372,3371,3373),(3372,3373,3374),(3372,3374,3375),(3375,3374,3376),(3376,3374,3377),(3377,3374,3378),(3377,3378,3379),(3379,3378,3380),(3379,3380,3381),(3381,3380,3382),(3381,3382,3383),(3383,3382,3384),(3384,3382,3385),(3384,3385,3386),(3386,3385,3387),(3386,3387,3388),(3388,3387,3389),(3388,3389,3390),(3390,3389,3391),(3391,3389,3392),(3391,3392,3393),(3393,3392,3394),(3393,3394,3395),(3395,3394,3396),(3396,3394,3397),(3396,3397,3398),(3398,3397,3399),(3399,3397,3400),(3399,3400,3401),(3401,3400,3402),(3399,3403,3398),(3404,3405,3406),(3405,3404,3407),(3405,3407,3408),(3405,3408,3409),(3409,3408,3410),(3409,3410,3411),(3411,3410,3412),(3411,3412,3413),(3413,3412,3414),(3414,3412,3415),(3414,3415,3416),(3416,3415,3417),(3416,3417,3418),(3418,3417,3419),(3419,3417,3420),(3417,3415,3421),(3421,3415,3422),(3419,3423,3424),(3423,3419,3425),(3425,3419,3420),(3424,3423,3426),(3424,3426,3427),(3372,3428,3429),(3428,3372,3375),(3429,3428,3430),(3429,3430,3431),(3429,3431,3432),(3432,3431,3433),(3432,3433,3434),(3432,3434,3435),(3435,3434,3436),(3435,3436,3437),(3437,3436,3438),(3437,3438,3439),(3439,3438,3440),(3439,3440,3441),(3441,3440,3442),(3441,3442,3443),(3441,3443,3444),(3444,3443,3445),(3444,3445,3419),(3419,3445,3418),(3446,3447,3448),(3447,3446,3449),(3449,3446,3450),(3450,3446,3451),(3451,3446,3452),(3451,3452,3453),(3452,3446,3454),(3451,3455,3456),(3455,3451,3453),(3456,3455,3457),(3456,3457,3458),(3456,3458,3459),(3460,3461,3462),(3461,3460,3463),(3463,3460,3464),(3464,3460,3465),(3464,3465,3466),(3465,3460,3467),(3467,3460,3468),(3469,3470,3458),(3470,3469,3466),(3466,3469,3464),(3471,3472,3473),(3472,3471,3474),(3472,3474,3475),(3472,3475,3476),(3472,3476,3459),(3472,3459,3477),(3477,3459,3478),(3478,3459,3458),(3478,3458,3470),(3472,3477,3479),(3472,3479,3480),(3481,3482,3483),(3482,3481,3484),(3484,3481,3485),(3485,3481,3486),(3486,3481,3487),(3487,3481,3488),(3487,3488,3489),(3489,3488,3490),(3488,3481,3491),(3491,3481,3492),(3492,3481,3493),(3492,3493,3494),(3492,3494,3495),(3495,3494,3496),(3496,3494,3497),(3496,3497,3498),(3498,3497,3499),(3499,3497,3500),(3499,3500,3501),(3501,3500,3502),(3502,3500,3503),(3503,3500,3504),(3504,3500,3505),(3504,3505,3506),(3506,3505,3507),(3506,3507,3508),(3508,3507,3509),(3508,3509,3510),(3510,3509,3511),(3512,3513,3514),(3513,3512,3515),(3515,3512,3516),(3515,3516,3517),(3517,3516,3518),(3517,3518,3503),(3503,3518,3519),(3503,3519,3520),(3503,3520,3502),(3490,3521,3522),(3521,3490,3488),(3522,3521,3514),(3522,3514,3523),(3523,3514,3513),(3523,3513,3524),(3523,3524,3525),(3526,3527,3528),(3527,3526,3529),(3527,3529,3525),(3527,3525,3530),(3530,3525,3524),(3527,3530,3531),(3532,3533,3534),(3533,3532,3535),(3535,3532,3536),(3535,3536,3537),(3535,3537,3538),(3538,3537,3539),(3539,3537,3487),(3539,3487,3489),(3535,3538,3540),(3535,3540,3541),(3542,3543,3544),(3543,3542,3545),(3543,3545,3546),(3546,3545,3547),(3547,3545,3548),(3548,3545,3549),(3548,3549,3550),(3549,3545,3551),(3551,3545,3552),(3552,3545,3553),(3552,3553,3554),(3554,3553,3555),(3554,3555,3556),(3556,3555,3557),(3557,3555,3558),(3557,3558,3559),(3559,3558,3560),(3561,3562,3563),(3562,3561,3564),(3564,3561,3565),(3564,3565,3560),(3564,3560,3558),(3564,3558,3566),(3564,3566,3567),(3567,3566,3568),(3567,3568,3569),(3569,3568,3570),(3569,3570,3571),(3550,3572,3573),(3572,3550,3574),(3572,3574,3575),(3575,3574,3576),(3575,3576,3577),(3577,3576,3578),(3577,3578,3579),(3579,3578,3580),(3580,3578,3563),(3580,3563,3581),(3581,3563,3562),(3581,3562,3582),(3581,3582,3583),(3583,3582,3584),(3584,3582,3585),(3586,3587,3588),(3587,3586,3589),(3587,3589,3590),(3587,3590,3591),(3587,3591,3592),(3587,3592,3573),(3573,3592,3548),(3573,3548,3550),(3587,3573,3593),(3587,3593,3594),(3587,3594,3595),(3595,3594,3596),(3596,3594,3597),(3596,3597,3598),(3596,3598,3599),(3599,3598,3600),(3599,3600,3601),(3599,3601,3602),(3602,3601,3603),(3602,3603,3585),(3602,3585,3582),(3602,3582,3604),(3602,3604,3605),(3605,3604,3606),(3606,3604,3607),(3606,3607,3608),(3608,3607,3609),(3610,3611,3612),(3611,3610,3613),(3613,3610,3614),(3614,3610,3615),(3615,3610,3616),(3616,3610,3617),(3617,3610,3618),(3618,3610,3619),(3618,3619,3620),(3620,3619,3621),(3621,3619,3622),(3621,3622,3623),(3621,3623,3624),(3624,3623,3625),(3624,3625,3626),(3626,3625,3627),(3626,3627,3628),(3629,3630,3617),(3630,3629,3631),(3631,3629,3632),(3631,3632,3633),(3633,3632,3634),(3633,3634,3635),(3633,3635,3636),(3636,3635,3637),(3636,3637,3638),(3638,3637,3639),(3638,3639,3640),(3640,3639,3641),(3642,3643,3644),(3643,3642,3645),(3643,3645,3646),(3643,3646,3647),(3643,3647,3648),(3648,3647,3616),(3648,3616,3617),(3648,3617,3630),(3643,3648,3649),(3643,3649,3650),(3643,3650,3651),(3651,3650,3652),(3652,3650,3653),(3652,3653,3654),(3654,3653,3655),(3654,3655,3656),(3656,3655,3657),(3657,3655,3658),(3659,3660,3661),(3660,3659,3662),(3662,3659,3663),(3663,3659,3664),(3664,3659,3665),(3664,3665,3666),(3665,3659,3667),(3667,3659,3668),(3668,3659,3669),(3668,3669,3670),(3670,3669,3671),(3670,3671,3672),(3672,3671,3673),(3672,3673,3674),(3674,3673,3675),(3674,3675,3676),(3676,3675,3677),(3676,3677,3678),(3678,3677,3679),(3679,3677,3680),(3679,3680,3681),(3681,3680,3682),(3682,3680,3683),(3683,3680,3684),(3683,3684,3685),(3685,3684,3686),(3685,3686,3687),(3687,3686,3688),(3688,3686,3689),(3690,3691,3692),(3691,3690,3693),(3691,3693,3694),(3691,3694,3695),(3691,3695,3666),(3666,3695,3664),(3691,3666,3696),(3691,3696,3697),(3691,3697,3698),(3698,3697,3699),(3698,3699,3700),(3700,3699,3701),(3700,3701,3702),(3702,3701,3703),(3702,3703,3704),(3702,3704,3705),(3705,3704,3706),(3705,3706,3707),(3707,3706,3708),(3707,3708,3709),(3707,3709,3682),(3682,3709,3681),(3710,3711,3712),(3711,3710,3713),(3713,3710,3714),(3714,3710,3715),(3715,3710,3716),(3716,3710,3717),(3716,3717,3718),(3716,3718,3719),(3719,3718,3720),(3717,3710,3721),(3721,3710,3722),(3723,3724,3725),(3724,3723,3726),(3726,3723,3727),(3726,3727,3728),(3726,3728,3719),(3726,3719,3729),(3729,3719,3720),(3726,3729,3730),(3726,3730,3731),(3726,3731,3732),(3732,3731,3733),(3733,3731,3734),(3734,3731,3735),(3734,3735,3736),(3736,3735,3737),(3736,3737,3738),(3738,3737,3739),(3740,3741,3742),(3741,3740,3743),(3741,3743,3744),(3744,3743,3745),(3744,3745,3746),(3746,3745,3747),(3746,3747,3748),(3746,3748,3749),(3749,3748,3750),(3750,3748,3751),(3750,3751,3752),(3752,3751,3753),(3753,3751,3754),(3753,3754,3755),(3755,3754,3756),(3756,3754,3757),(3756,3757,3758),(3758,3757,3759),(3758,3759,3760),(3760,3759,3761),(3760,3761,3762),(3762,3761,3763),(3762,3763,3764),(3764,3763,3765),(3765,3763,3766),(3765,3766,3767),(3767,3766,3768),(3767,3768,3769),(3769,3768,3770),(3769,3770,3771),(3771,3770,3772),(3772,3770,3773),(3772,3773,3774),(3774,3773,3775),(3775,3773,3776),(3776,3773,3777),(3777,3773,3778),(3777,3778,3779),(3779,3778,3780),(3780,3778,3781),(3780,3781,3782),(3782,3781,3783),(3746,3784,3785),(3784,3746,3749),(3785,3784,3786),(3785,3786,3787),(3785,3787,3788),(3788,3787,3789),(3788,3789,3790),(3788,3790,3791),(3791,3790,3792),(3791,3792,3793),(3793,3792,3794),(3793,3794,3795),(3795,3794,3796),(3795,3796,3797),(3795,3797,3798),(3798,3797,3799),(3799,3797,3800),(3799,3800,3801),(3801,3800,3802),(3801,3802,3803),(3803,3802,3804),(3803,3804,3805),(3805,3804,3806),(3805,3806,3807),(3807,3806,3808),(3807,3808,3776),(3776,3808,3809),(3776,3809,3775),(3810,3811,3812),(3811,3810,3813),(3813,3810,3814),(3814,3810,3815),(3815,3810,3816),(3816,3810,3817),(3816,3817,3818),(3817,3810,3819),(3819,3810,3820),(3820,3810,3821),(3820,3821,3822),(3820,3822,3823),(3823,3822,3824),(3824,3822,3825),(3824,3825,3826),(3824,3826,3827),(3827,3826,3828),(3828,3826,3829),(3830,3831,3832),(3831,3830,3833),(3833,3830,3834),(3833,3834,3835),(3835,3834,3836),(3835,3836,3837),(3837,3836,3838),(3837,3838,3839),(3839,3838,3840),(3839,3840,3841),(3841,3840,3842),(3843,3844,3845),(3844,3843,3846),(3844,3846,3847),(3844,3847,3818),(3844,3818,3848),(3848,3818,3832),(3832,3818,3817),(3848,3832,3831),(3844,3848,3849),(3844,3849,3850),(3844,3850,3851),(3851,3850,3852),(3852,3850,3853),(3852,3853,3854),(3854,3853,3855),(3854,3855,3856),(3856,3855,3857),(3857,3855,3858),(3859,3860,3861),(3860,3859,3862),(3862,3859,3863),(3863,3859,3864),(3864,3859,3865),(3864,3865,3866),(3865,3859,3867),(3864,3868,3869),(3868,3864,3866),(3869,3868,3870),(3869,3870,3871),(3872,3873,3874),(3873,3872,3875),(3873,3875,3876),(3876,3875,3877),(3876,3877,3878),(3877,3875,3879),(3879,3875,3880),(3881,3882,3871),(3882,3881,3878),(3878,3881,3876),(3883,3884,3885),(3884,3883,3886),(3886,3883,3887),(3886,3887,3888),(3886,3888,3889),(3886,3889,3890),(3890,3889,3869),(3890,3869,3891),(3891,3869,3871),(3891,3871,3882),(3886,3890,3892),(3886,3892,3893),(3894,3895,3896),(3895,3894,3897),(3897,3894,3898),(3898,3894,3899),(3899,3894,3900),(3899,3900,3901),(3901,3900,3902),(3902,3900,3903),(3900,3894,3904),(3904,3894,3905),(3905,3894,3906),(3905,3906,3907),(3905,3907,3908),(3908,3907,3909),(3908,3909,3910),(3910,3909,3911),(3910,3911,3912),(3910,3912,3913),(3903,3914,3902),(3914,3903,3915),(3914,3915,3916),(3916,3915,3917),(3916,3917,3918),(3918,3917,3919),(3918,3919,3920),(3920,3919,3921),(3920,3921,3922),(3922,3921,3923),(3922,3923,3924),(3925,3926,3927),(3926,3925,3928),(3928,3925,3929),(3928,3929,3930),(3928,3930,3901),(3928,3901,3931),(3931,3901,3902),(3928,3931,3932),(3928,3932,3933),(3933,3932,3934),(3933,3934,3935),(3935,3934,3936),(3935,3936,3937),(3935,3937,3938),(3938,3937,3939),(3938,3939,3940),(3940,3939,3941),(3941,3939,3942)),$); +#789=IFCCARTESIANPOINTLIST3D(((-649.364,207.683,50.),(-644.419,188.936,50.),(-626.045,272.817,50.),(-644.419,124.493,50.),(-619.101,259.655,50.),(-623.715,283.277,50.),(-627.494,290.034,50.),(-603.16,294.595,50.),(-627.494,294.595,50.),(-624.66,287.838,50.),(-610.236,281.334,50.),(-606.847,286.592,50.),(-603.16,290.034,50.),(-638.964,105.405,50.),(-662.065,109.966,50.),(-662.065,105.405,50.),(-659.359,111.972,50.),(-657.718,114.611,50.),(-656.887,118.56,50.),(-656.61,124.493,50.),(-643.354,114.611,50.),(-656.61,188.936,50.),(-641.723,111.972,50.),(-638.964,109.966,50.),(-686.02,264.886,50.),(-676.266,278.593,50.),(-676.841,283.615,50.),(-674.542,272.986,50.),(-696.739,287.373,50.),(-700.,294.595,50.),(-700.,290.034,50.),(-673.093,294.595,50.),(-693.948,283.446,50.),(-675.904,287.838,50.),(-673.093,290.034,50.),(-644.419,188.936,30.),(-644.419,124.493,50.),(-644.419,124.493,30.),(-644.419,188.936,50.),(-644.419,124.493,30.),(-643.354,114.611,50.),(-643.354,114.611,30.),(-644.419,124.493,50.),(-643.354,114.611,30.),(-641.723,111.972,50.),(-641.723,111.972,30.),(-643.354,114.611,50.),(-641.723,111.972,50.),(-638.964,109.966,30.),(-641.723,111.972,30.),(-638.964,109.966,50.),(-638.964,109.966,30.),(-638.964,105.405,50.),(-638.964,105.405,30.),(-638.964,109.966,50.),(-638.964,105.405,50.),(-662.065,105.405,30.),(-638.964,105.405,30.),(-662.065,105.405,50.),(-662.065,105.405,50.),(-662.065,109.966,30.),(-662.065,105.405,30.),(-662.065,109.966,50.),(-662.065,109.966,50.),(-659.359,111.972,30.),(-662.065,109.966,30.),(-659.359,111.972,50.),(-659.359,111.972,50.),(-657.718,114.611,30.),(-659.359,111.972,30.),(-657.718,114.611,50.),(-657.718,114.611,50.),(-656.887,118.56,30.),(-657.718,114.611,30.),(-656.887,118.56,50.),(-656.887,118.56,50.),(-656.61,124.493,30.),(-656.887,118.56,30.),(-656.61,124.493,50.),(-656.61,124.493,50.),(-656.61,188.936,30.),(-656.61,124.493,30.),(-656.61,188.936,50.),(-656.61,188.936,50.),(-686.02,264.886,30.),(-656.61,188.936,30.),(-686.02,264.886,50.),(-686.02,264.886,50.),(-693.948,283.446,30.),(-686.02,264.886,30.),(-693.948,283.446,50.),(-693.948,283.446,50.),(-696.739,287.373,30.),(-693.948,283.446,30.),(-696.739,287.373,50.),(-696.739,287.373,30.),(-700.,290.034,50.),(-700.,290.034,30.),(-696.739,287.373,50.),(-700.,290.034,50.),(-700.,294.595,30.),(-700.,290.034,30.),(-700.,294.595,50.),(-700.,294.595,30.),(-673.093,294.595,50.),(-673.093,294.595,30.),(-700.,294.595,50.),(-673.093,294.595,30.),(-673.093,290.034,50.),(-673.093,290.034,30.),(-673.093,294.595,50.),(-673.093,290.034,50.),(-675.904,287.838,30.),(-673.093,290.034,30.),(-675.904,287.838,50.),(-675.904,287.838,30.),(-676.841,283.615,50.),(-676.841,283.615,30.),(-675.904,287.838,50.),(-676.841,283.615,30.),(-676.266,278.593,50.),(-676.266,278.593,30.),(-676.841,283.615,50.),(-676.266,278.593,30.),(-674.542,272.986,50.),(-674.542,272.986,30.),(-676.266,278.593,50.),(-674.542,272.986,30.),(-649.364,207.683,50.),(-649.364,207.683,30.),(-674.542,272.986,50.),(-649.364,207.683,50.),(-626.045,272.817,30.),(-649.364,207.683,30.),(-626.045,272.817,50.),(-626.045,272.817,50.),(-623.715,283.277,30.),(-626.045,272.817,30.),(-623.715,283.277,50.),(-623.715,283.277,50.),(-624.66,287.838,30.),(-623.715,283.277,30.),(-624.66,287.838,50.),(-624.66,287.838,50.),(-627.494,290.034,30.),(-624.66,287.838,30.),(-627.494,290.034,50.),(-627.494,290.034,50.),(-627.494,294.595,30.),(-627.494,290.034,30.),(-627.494,294.595,50.),(-627.494,294.595,50.),(-603.16,294.595,30.),(-627.494,294.595,30.),(-603.16,294.595,50.),(-603.16,294.595,30.),(-603.16,290.034,50.),(-603.16,290.034,30.),(-603.16,294.595,50.),(-603.16,290.034,50.),(-606.847,286.592,30.),(-603.16,290.034,30.),(-606.847,286.592,50.),(-606.847,286.592,30.),(-610.236,281.334,50.),(-610.236,281.334,30.),(-606.847,286.592,50.),(-610.236,281.334,30.),(-619.101,259.655,50.),(-619.101,259.655,30.),(-610.236,281.334,50.),(-619.101,259.655,30.),(-644.419,188.936,50.),(-644.419,188.936,30.),(-619.101,259.655,50.),(-576.137,193.919,30.),(-576.137,123.818,50.),(-576.137,123.818,30.),(-576.137,193.919,50.),(-576.137,123.818,50.),(-517.147,123.818,30.),(-576.137,123.818,30.),(-517.147,123.818,50.),(-517.147,123.818,30.),(-512.075,125.979,50.),(-512.075,125.979,30.),(-517.147,123.818,50.),(-512.075,125.979,50.),(-510.764,129.222,30.),(-512.075,125.979,30.),(-510.764,129.222,50.),(-510.764,129.222,50.),(-509.816,134.628,30.),(-510.764,129.222,30.),(-509.816,134.628,50.),(-509.816,134.628,50.),(-507.429,134.628,30.),(-509.816,134.628,30.),(-507.429,134.628,50.),(-507.429,134.628,30.),(-507.429,94.595,50.),(-507.429,94.595,30.),(-507.429,134.628,50.),(-507.429,94.595,50.),(-509.816,94.595,30.),(-507.429,94.595,30.),(-509.816,94.595,50.),(-509.816,94.595,50.),(-510.753,99.958,30.),(-509.816,94.595,30.),(-510.753,99.958,50.),(-510.753,99.958,50.),(-512.032,103.209,30.),(-510.753,99.958,30.),(-512.032,103.209,50.),(-512.032,103.209,30.),(-514.014,104.856,50.),(-514.014,104.856,30.),(-512.032,103.209,50.),(-514.014,104.856,50.),(-517.061,105.405,30.),(-514.014,104.856,30.),(-517.061,105.405,50.),(-517.061,105.405,30.),(-593.783,105.405,50.),(-593.783,105.405,30.),(-517.061,105.405,50.),(-593.783,105.405,50.),(-593.783,109.966,30.),(-593.783,105.405,30.),(-593.783,109.966,50.),(-593.783,109.966,30.),(-591.023,111.972,50.),(-591.023,111.972,30.),(-593.783,109.966,50.),(-591.023,111.972,50.),(-589.393,114.611,30.),(-591.023,111.972,30.),(-589.393,114.611,50.),(-589.393,114.611,50.),(-588.327,124.493,30.),(-589.393,114.611,30.),(-588.327,124.493,50.),(-588.327,124.493,50.),(-588.327,275.507,30.),(-588.327,124.493,30.),(-588.327,275.507,50.),(-588.327,275.507,50.),(-588.604,281.546,30.),(-588.327,275.507,30.),(-588.604,281.546,50.),(-588.604,281.546,50.),(-589.436,285.473,30.),(-588.604,281.546,30.),(-589.436,285.473,50.),(-589.436,285.473,50.),(-591.077,288.049,30.),(-589.436,285.473,30.),(-591.077,288.049,50.),(-591.077,288.049,50.),(-593.783,290.034,30.),(-591.077,288.049,30.),(-593.783,290.034,50.),(-593.783,290.034,50.),(-593.783,294.595,30.),(-593.783,290.034,30.),(-593.783,294.595,50.),(-593.783,294.595,50.),(-517.658,294.595,30.),(-593.783,294.595,30.),(-517.658,294.595,50.),(-517.658,294.595,30.),(-514.611,295.144,50.),(-514.611,295.144,30.),(-517.658,294.595,50.),(-514.611,295.144,50.),(-512.629,296.791,30.),(-514.611,295.144,30.),(-512.629,296.791,50.),(-512.629,296.791,50.),(-511.329,300.042,30.),(-512.629,296.791,30.),(-511.329,300.042,50.),(-511.329,300.042,50.),(-510.327,305.405,30.),(-511.329,300.042,30.),(-510.327,305.405,50.),(-510.327,305.405,50.),(-508.025,305.405,30.),(-510.327,305.405,30.),(-508.025,305.405,50.),(-508.025,305.405,30.),(-508.025,265.372,50.),(-508.025,265.372,30.),(-508.025,305.405,50.),(-508.025,265.372,50.),(-510.327,265.372,30.),(-508.025,265.372,30.),(-510.327,265.372,50.),(-510.327,265.372,50.),(-511.329,270.778,30.),(-510.327,265.372,30.),(-511.329,270.778,50.),(-511.329,270.778,50.),(-512.629,274.021,30.),(-511.329,270.778,30.),(-512.629,274.021,50.),(-512.629,274.021,50.),(-514.611,275.642,30.),(-512.629,274.021,30.),(-514.611,275.642,50.),(-514.611,275.642,30.),(-517.658,276.182,50.),(-517.658,276.182,30.),(-514.611,275.642,50.),(-517.658,276.182,50.),(-576.137,276.182,30.),(-517.658,276.182,30.),(-576.137,276.182,50.),(-576.137,276.182,30.),(-576.137,212.331,50.),(-576.137,212.331,30.),(-576.137,276.182,50.),(-576.137,212.331,50.),(-538.884,212.331,30.),(-576.137,212.331,30.),(-538.884,212.331,50.),(-538.884,212.331,50.),(-535.837,212.88,30.),(-538.884,212.331,30.),(-535.837,212.88,50.),(-535.837,212.88,30.),(-533.855,214.527,50.),(-533.855,214.527,30.),(-535.837,212.88,50.),(-533.855,214.527,50.),(-532.555,217.779,30.),(-533.855,214.527,30.),(-532.555,217.779,50.),(-532.555,217.779,50.),(-531.553,223.142,30.),(-532.555,217.779,30.),(-531.553,223.142,50.),(-531.553,223.142,50.),(-529.252,223.142,30.),(-531.553,223.142,30.),(-529.252,223.142,50.),(-529.252,223.142,30.),(-529.252,183.108,50.),(-529.252,183.108,30.),(-529.252,223.142,50.),(-529.252,183.108,30.),(-531.553,183.108,50.),(-531.553,183.108,30.),(-529.252,183.108,50.),(-531.553,183.108,50.),(-532.566,188.514,30.),(-531.553,183.108,30.),(-532.566,188.514,50.),(-532.566,188.514,50.),(-533.898,191.757,30.),(-532.566,188.514,30.),(-533.898,191.757,50.),(-533.898,191.757,30.),(-538.884,193.919,50.),(-538.884,193.919,30.),(-533.898,191.757,50.),(-538.884,193.919,30.),(-576.137,193.919,50.),(-576.137,193.919,30.),(-538.884,193.919,50.),(-439.002,142.736,50.),(-434.873,184.734,50.),(-435.566,200.,50.),(-431.73,127.703,50.),(-432.795,170.693,50.),(-429.332,157.876,50.),(-423.322,116.174,50.),(-424.484,146.284,50.),(-417.616,135.198,50.),(-413.7,107.939,50.),(-409.715,127.28,50.),(-402.863,102.998,50.),(-400.78,122.53,50.),(-390.812,101.351,50.),(-390.812,120.946,50.),(-380.843,122.53,50.),(-382.619,102.053,50.),(-375.004,104.16,50.),(-371.908,127.28,50.),(-367.967,107.67,50.),(-364.007,135.198,50.),(-361.508,112.584,50.),(-357.139,146.284,50.),(-355.628,118.903,50.),(-352.291,157.813,50.),(-350.325,126.626,50.),(-348.828,170.439,50.),(-345.6,135.753,50.),(-346.75,184.164,50.),(-346.057,198.986,50.),(-447.314,178.885,50.),(-447.847,214.569,50.),(-448.353,200.,50.),(-446.328,228.378,50.),(-444.197,159.797,50.),(-443.798,241.427,50.),(-440.255,253.716,50.),(-435.518,265.446,50.),(-434.873,215.266,50.),(-429.918,275.465,50.),(-432.795,229.307,50.),(-429.332,242.124,50.),(-423.456,283.773,50.),(-424.484,253.716,50.),(-417.627,264.802,50.),(-416.13,290.372,50.),(-409.758,272.72,50.),(-404.515,296.41,50.),(-400.876,277.47,50.),(-390.982,298.649,50.),(-390.982,279.054,50.),(-380.971,277.344,50.),(-378.856,297.002,50.),(-371.994,272.551,50.),(-367.966,292.061,50.),(-364.05,264.675,50.),(-358.312,283.826,50.),(-357.139,253.716,50.),(-349.893,272.297,50.),(-352.291,242.251,50.),(-348.828,229.307,50.),(-342.621,257.242,50.),(-346.75,214.886,50.),(-341.454,146.284,50.),(-337.426,239.949,50.),(-337.874,158.488,50.),(-335.316,171.284,50.),(-334.309,220.418,50.),(-333.782,184.671,50.),(-333.27,198.649,50.),(-390.982,298.649,50.),(-378.856,297.002,30.),(-390.982,298.649,30.),(-378.856,297.002,50.),(-378.856,297.002,50.),(-367.966,292.061,30.),(-378.856,297.002,30.),(-367.966,292.061,50.),(-367.966,292.061,50.),(-358.312,283.826,30.),(-367.966,292.061,30.),(-358.312,283.826,50.),(-358.312,283.826,30.),(-349.893,272.297,50.),(-349.893,272.297,30.),(-358.312,283.826,50.),(-349.893,272.297,30.),(-342.621,257.242,50.),(-342.621,257.242,30.),(-349.893,272.297,50.),(-342.621,257.242,30.),(-337.426,239.949,50.),(-337.426,239.949,30.),(-342.621,257.242,50.),(-337.426,239.949,30.),(-334.309,220.418,50.),(-334.309,220.418,30.),(-337.426,239.949,50.),(-334.309,220.418,30.),(-333.27,198.649,50.),(-333.27,198.649,30.),(-334.309,220.418,50.),(-333.27,198.649,30.),(-333.782,184.671,50.),(-333.782,184.671,30.),(-333.27,198.649,50.),(-333.782,184.671,30.),(-335.316,171.284,50.),(-335.316,171.284,30.),(-333.782,184.671,50.),(-335.316,171.284,30.),(-337.874,158.488,50.),(-337.874,158.488,30.),(-335.316,171.284,50.),(-337.874,158.488,30.),(-341.454,146.284,50.),(-341.454,146.284,30.),(-337.874,158.488,50.),(-341.454,146.284,30.),(-345.6,135.753,50.),(-345.6,135.753,30.),(-341.454,146.284,50.),(-345.6,135.753,30.),(-350.325,126.626,50.),(-350.325,126.626,30.),(-345.6,135.753,50.),(-350.325,126.626,30.),(-355.628,118.903,50.),(-355.628,118.903,30.),(-350.325,126.626,50.),(-355.628,118.903,30.),(-361.508,112.584,50.),(-361.508,112.584,30.),(-355.628,118.903,50.),(-361.508,112.584,50.),(-367.967,107.67,30.),(-361.508,112.584,30.),(-367.967,107.67,50.),(-367.967,107.67,50.),(-375.004,104.16,30.),(-367.967,107.67,30.),(-375.004,104.16,50.),(-375.004,104.16,50.),(-382.619,102.053,30.),(-375.004,104.16,30.),(-382.619,102.053,50.),(-382.619,102.053,50.),(-390.812,101.351,30.),(-382.619,102.053,30.),(-390.812,101.351,50.),(-390.812,101.351,50.),(-402.863,102.998,30.),(-390.812,101.351,30.),(-402.863,102.998,50.),(-402.863,102.998,30.),(-413.7,107.939,50.),(-413.7,107.939,30.),(-402.863,102.998,50.),(-413.7,107.939,30.),(-423.322,116.174,50.),(-423.322,116.174,30.),(-413.7,107.939,50.),(-423.322,116.174,50.),(-431.73,127.703,30.),(-423.322,116.174,30.),(-431.73,127.703,50.),(-431.73,127.703,50.),(-439.002,142.736,30.),(-431.73,127.703,30.),(-439.002,142.736,50.),(-439.002,142.736,50.),(-444.197,159.797,30.),(-439.002,142.736,30.),(-444.197,159.797,50.),(-444.197,159.797,50.),(-447.314,178.885,30.),(-444.197,159.797,30.),(-447.314,178.885,50.),(-447.314,178.885,50.),(-448.353,200.,30.),(-447.314,178.885,30.),(-448.353,200.,50.),(-448.353,200.,50.),(-447.847,214.569,30.),(-448.353,200.,30.),(-447.847,214.569,50.),(-447.847,214.569,50.),(-446.328,228.378,30.),(-447.847,214.569,30.),(-446.328,228.378,50.),(-446.328,228.378,50.),(-443.798,241.427,30.),(-446.328,228.378,30.),(-443.798,241.427,50.),(-443.798,241.427,50.),(-440.255,253.716,30.),(-443.798,241.427,30.),(-440.255,253.716,50.),(-440.255,253.716,50.),(-435.518,265.446,30.),(-440.255,253.716,30.),(-435.518,265.446,50.),(-435.518,265.446,50.),(-429.918,275.465,30.),(-435.518,265.446,30.),(-429.918,275.465,50.),(-429.918,275.465,50.),(-423.456,283.773,30.),(-429.918,275.465,30.),(-423.456,283.773,50.),(-423.456,283.773,30.),(-416.13,290.372,50.),(-416.13,290.372,30.),(-423.456,283.773,50.),(-416.13,290.372,30.),(-404.515,296.41,50.),(-404.515,296.41,30.),(-416.13,290.372,50.),(-404.515,296.41,30.),(-390.982,298.649,50.),(-390.982,298.649,30.),(-404.515,296.41,50.),(-390.982,279.054,50.),(-400.876,277.47,30.),(-390.982,279.054,30.),(-400.876,277.47,50.),(-400.876,277.47,50.),(-409.758,272.72,30.),(-400.876,277.47,30.),(-409.758,272.72,50.),(-409.758,272.72,30.),(-417.627,264.802,50.),(-417.627,264.802,30.),(-409.758,272.72,50.),(-417.627,264.802,30.),(-424.484,253.716,50.),(-424.484,253.716,30.),(-417.627,264.802,50.),(-424.484,253.716,30.),(-429.332,242.124,50.),(-429.332,242.124,30.),(-424.484,253.716,50.),(-429.332,242.124,30.),(-432.795,229.307,50.),(-432.795,229.307,30.),(-429.332,242.124,50.),(-432.795,229.307,30.),(-434.873,215.266,50.),(-434.873,215.266,30.),(-432.795,229.307,50.),(-434.873,215.266,30.),(-435.566,200.,50.),(-435.566,200.,30.),(-434.873,215.266,50.),(-435.566,200.,30.),(-434.873,184.734,50.),(-434.873,184.734,30.),(-435.566,200.,50.),(-434.873,184.734,30.),(-432.795,170.693,50.),(-432.795,170.693,30.),(-434.873,184.734,50.),(-432.795,170.693,30.),(-429.332,157.876,50.),(-429.332,157.876,30.),(-432.795,170.693,50.),(-429.332,157.876,30.),(-424.484,146.284,50.),(-424.484,146.284,30.),(-429.332,157.876,50.),(-424.484,146.284,30.),(-417.616,135.198,50.),(-417.616,135.198,30.),(-424.484,146.284,50.),(-417.616,135.198,30.),(-409.715,127.28,50.),(-409.715,127.28,30.),(-417.616,135.198,50.),(-409.715,127.28,50.),(-400.78,122.53,30.),(-409.715,127.28,30.),(-400.78,122.53,50.),(-400.78,122.53,50.),(-390.812,120.946,30.),(-400.78,122.53,30.),(-390.812,120.946,50.),(-390.812,120.946,30.),(-380.843,122.53,50.),(-380.843,122.53,30.),(-390.812,120.946,50.),(-380.843,122.53,30.),(-371.908,127.28,50.),(-371.908,127.28,30.),(-380.843,122.53,50.),(-371.908,127.28,50.),(-364.007,135.198,30.),(-371.908,127.28,30.),(-364.007,135.198,50.),(-364.007,135.198,50.),(-357.139,146.284,30.),(-364.007,135.198,30.),(-357.139,146.284,50.),(-357.139,146.284,50.),(-352.291,157.813,30.),(-357.139,146.284,30.),(-352.291,157.813,50.),(-352.291,157.813,50.),(-348.828,170.439,30.),(-352.291,157.813,30.),(-348.828,170.439,50.),(-348.828,170.439,50.),(-346.75,184.164,30.),(-348.828,170.439,30.),(-346.75,184.164,50.),(-346.75,184.164,50.),(-346.057,198.986,30.),(-346.75,184.164,30.),(-346.057,198.986,50.),(-346.057,198.986,50.),(-346.75,214.886,30.),(-346.057,198.986,30.),(-346.75,214.886,50.),(-346.75,214.886,50.),(-348.828,229.307,30.),(-346.75,214.886,30.),(-348.828,229.307,50.),(-348.828,229.307,50.),(-352.291,242.251,30.),(-348.828,229.307,30.),(-352.291,242.251,50.),(-352.291,242.251,50.),(-357.139,253.716,30.),(-352.291,242.251,30.),(-357.139,253.716,50.),(-357.139,253.716,50.),(-364.05,264.675,30.),(-357.139,253.716,30.),(-364.05,264.675,50.),(-364.05,264.675,30.),(-371.994,272.551,50.),(-371.994,272.551,30.),(-364.05,264.675,50.),(-371.994,272.551,30.),(-380.971,277.344,50.),(-380.971,277.344,30.),(-371.994,272.551,50.),(-380.971,277.344,50.),(-390.982,279.054,30.),(-380.971,277.344,30.),(-390.982,279.054,50.),(-239.244,105.405,50.),(-315.113,109.966,50.),(-315.113,105.405,50.),(-312.406,111.972,50.),(-310.765,114.611,50.),(-309.934,118.56,50.),(-309.657,124.493,50.),(-297.467,123.818,50.),(-309.657,275.507,50.),(-297.467,275.507,50.),(-239.244,123.818,50.),(-236.186,104.856,50.),(-234.172,125.979,50.),(-234.172,103.209,50.),(-232.84,129.222,50.),(-232.84,99.958,50.),(-231.827,94.595,50.),(-231.827,134.628,50.),(-229.526,94.595,50.),(-229.526,134.628,50.),(-312.406,288.049,50.),(-315.113,294.595,50.),(-315.113,290.034,50.),(-292.011,294.595,50.),(-310.765,285.473,50.),(-309.934,281.546,50.),(-296.359,285.473,50.),(-297.19,281.546,50.),(-294.718,288.049,50.),(-292.011,290.034,50.),(-297.467,123.818,50.),(-239.244,123.818,30.),(-297.467,123.818,30.),(-239.244,123.818,50.),(-239.244,123.818,50.),(-234.172,125.979,30.),(-239.244,123.818,30.),(-234.172,125.979,50.),(-234.172,125.979,50.),(-232.84,129.222,30.),(-234.172,125.979,30.),(-232.84,129.222,50.),(-232.84,129.222,50.),(-231.827,134.628,30.),(-232.84,129.222,30.),(-231.827,134.628,50.),(-231.827,134.628,50.),(-229.526,134.628,30.),(-231.827,134.628,30.),(-229.526,134.628,50.),(-229.526,134.628,30.),(-229.526,94.595,50.),(-229.526,94.595,30.),(-229.526,134.628,50.),(-229.526,94.595,50.),(-231.827,94.595,30.),(-229.526,94.595,30.),(-231.827,94.595,50.),(-231.827,94.595,50.),(-232.84,99.958,30.),(-231.827,94.595,30.),(-232.84,99.958,50.),(-232.84,99.958,50.),(-234.172,103.209,30.),(-232.84,99.958,30.),(-234.172,103.209,50.),(-234.172,103.209,30.),(-236.186,104.856,50.),(-236.186,104.856,30.),(-234.172,103.209,50.),(-236.186,104.856,50.),(-239.244,105.405,30.),(-236.186,104.856,30.),(-239.244,105.405,50.),(-239.244,105.405,30.),(-315.113,105.405,50.),(-315.113,105.405,30.),(-239.244,105.405,50.),(-315.113,105.405,50.),(-315.113,109.966,30.),(-315.113,105.405,30.),(-315.113,109.966,50.),(-315.113,109.966,30.),(-312.406,111.972,50.),(-312.406,111.972,30.),(-315.113,109.966,50.),(-312.406,111.972,50.),(-310.765,114.611,30.),(-312.406,111.972,30.),(-310.765,114.611,50.),(-310.765,114.611,50.),(-309.934,118.56,30.),(-310.765,114.611,30.),(-309.934,118.56,50.),(-309.934,118.56,50.),(-309.657,124.493,30.),(-309.934,118.56,30.),(-309.657,124.493,50.),(-309.657,124.493,50.),(-309.657,275.507,30.),(-309.657,124.493,30.),(-309.657,275.507,50.),(-309.657,275.507,50.),(-309.934,281.546,30.),(-309.657,275.507,30.),(-309.934,281.546,50.),(-309.934,281.546,50.),(-310.765,285.473,30.),(-309.934,281.546,30.),(-310.765,285.473,50.),(-310.765,285.473,50.),(-312.406,288.049,30.),(-310.765,285.473,30.),(-312.406,288.049,50.),(-312.406,288.049,50.),(-315.113,290.034,30.),(-312.406,288.049,30.),(-315.113,290.034,50.),(-315.113,290.034,50.),(-315.113,294.595,30.),(-315.113,290.034,30.),(-315.113,294.595,50.),(-315.113,294.595,50.),(-292.011,294.595,30.),(-315.113,294.595,30.),(-292.011,294.595,50.),(-292.011,294.595,30.),(-292.011,290.034,50.),(-292.011,290.034,30.),(-292.011,294.595,50.),(-292.011,290.034,50.),(-294.718,288.049,30.),(-292.011,290.034,30.),(-294.718,288.049,50.),(-294.718,288.049,30.),(-296.359,285.473,50.),(-296.359,285.473,30.),(-294.718,288.049,50.),(-296.359,285.473,30.),(-297.19,281.546,50.),(-297.19,281.546,30.),(-296.359,285.473,50.),(-297.19,281.546,30.),(-297.467,275.507,50.),(-297.467,275.507,30.),(-297.19,281.546,50.),(-297.467,275.507,30.),(-297.467,123.818,50.),(-297.467,123.818,30.),(-297.467,275.507,50.),(-217.421,105.405,50.),(-214.661,111.972,50.),(-217.421,109.966,50.),(-169.171,105.405,50.),(-213.031,114.611,50.),(-211.965,124.493,50.),(-199.775,123.818,50.),(-169.853,123.818,50.),(-155.17,126.098,50.),(-152.879,107.644,50.),(-149.538,128.948,50.),(-146.259,110.441,50.),(-145.047,132.939,50.),(-140.656,114.358,50.),(-140.976,138.64,50.),(-137.46,145.777,50.),(-135.784,119.637,50.),(-134.497,154.35,50.),(-131.354,126.52,50.),(-132.089,164.358,50.),(-129.724,181.377,50.),(-127.366,135.008,50.),(-128.935,200.,50.),(-217.421,290.034,50.),(-169.171,294.595,50.),(-217.421,294.595,50.),(-214.661,288.028,50.),(-213.031,285.389,50.),(-211.965,275.507,50.),(-199.775,276.182,50.),(-169.853,276.182,50.),(-158.697,275.,50.),(-152.293,292.356,50.),(-150.119,271.453,50.),(-145.707,289.559,50.),(-143.416,265.076,50.),(-140.358,285.642,50.),(-137.886,255.405,50.),(-134.796,279.054,50.),(-133.97,244.151,50.),(-129.873,270.608,50.),(-131.173,231.166,50.),(-129.494,216.448,50.),(-125.589,260.304,50.),(-123.82,145.101,50.),(-121.945,248.142,50.),(-120.464,157.908,50.),(-117.597,224.789,50.),(-118.066,171.326,50.),(-116.628,185.357,50.),(-116.148,200.,50.),(-211.965,124.493,50.),(-211.965,275.507,30.),(-211.965,124.493,30.),(-211.965,275.507,50.),(-211.965,275.507,50.),(-213.031,285.389,30.),(-211.965,275.507,30.),(-213.031,285.389,50.),(-213.031,285.389,50.),(-214.661,288.028,30.),(-213.031,285.389,30.),(-214.661,288.028,50.),(-214.661,288.028,50.),(-217.421,290.034,30.),(-214.661,288.028,30.),(-217.421,290.034,50.),(-217.421,290.034,50.),(-217.421,294.595,30.),(-217.421,290.034,30.),(-217.421,294.595,50.),(-217.421,294.595,50.),(-169.171,294.595,30.),(-217.421,294.595,30.),(-169.171,294.595,50.),(-169.171,294.595,50.),(-152.293,292.356,30.),(-169.171,294.595,30.),(-152.293,292.356,50.),(-152.293,292.356,50.),(-145.707,289.559,30.),(-152.293,292.356,30.),(-145.707,289.559,50.),(-145.707,289.559,50.),(-140.358,285.642,30.),(-145.707,289.559,30.),(-140.358,285.642,50.),(-140.358,285.642,30.),(-134.796,279.054,50.),(-134.796,279.054,30.),(-140.358,285.642,50.),(-134.796,279.054,30.),(-129.873,270.608,50.),(-129.873,270.608,30.),(-134.796,279.054,50.),(-129.873,270.608,30.),(-125.589,260.304,50.),(-125.589,260.304,30.),(-129.873,270.608,50.),(-125.589,260.304,30.),(-121.945,248.142,50.),(-121.945,248.142,30.),(-125.589,260.304,50.),(-121.945,248.142,30.),(-117.597,224.789,50.),(-117.597,224.789,30.),(-121.945,248.142,50.),(-117.597,224.789,30.),(-116.148,200.,50.),(-116.148,200.,30.),(-117.597,224.789,50.),(-116.148,200.,30.),(-116.628,185.357,50.),(-116.628,185.357,30.),(-116.148,200.,50.),(-116.628,185.357,30.),(-118.066,171.326,50.),(-118.066,171.326,30.),(-116.628,185.357,50.),(-118.066,171.326,30.),(-120.464,157.908,50.),(-120.464,157.908,30.),(-118.066,171.326,50.),(-120.464,157.908,30.),(-123.82,145.101,50.),(-123.82,145.101,30.),(-120.464,157.908,50.),(-123.82,145.101,30.),(-127.366,135.008,50.),(-127.366,135.008,30.),(-123.82,145.101,50.),(-127.366,135.008,30.),(-131.354,126.52,50.),(-131.354,126.52,30.),(-127.366,135.008,50.),(-131.354,126.52,30.),(-135.784,119.637,50.),(-135.784,119.637,30.),(-131.354,126.52,50.),(-135.784,119.637,30.),(-140.656,114.358,50.),(-140.656,114.358,30.),(-135.784,119.637,50.),(-140.656,114.358,50.),(-146.259,110.441,30.),(-140.656,114.358,30.),(-146.259,110.441,50.),(-146.259,110.441,50.),(-152.879,107.644,30.),(-146.259,110.441,30.),(-152.879,107.644,50.),(-152.879,107.644,50.),(-169.171,105.405,30.),(-152.879,107.644,30.),(-169.171,105.405,50.),(-169.171,105.405,30.),(-217.421,105.405,50.),(-217.421,105.405,30.),(-169.171,105.405,50.),(-217.421,105.405,50.),(-217.421,109.966,30.),(-217.421,105.405,30.),(-217.421,109.966,50.),(-217.421,109.966,30.),(-214.661,111.972,50.),(-214.661,111.972,30.),(-217.421,109.966,50.),(-214.661,111.972,50.),(-213.031,114.611,30.),(-214.661,111.972,30.),(-213.031,114.611,50.),(-213.031,114.611,50.),(-211.965,124.493,30.),(-213.031,114.611,30.),(-211.965,124.493,50.),(-199.775,123.818,50.),(-169.853,123.818,30.),(-199.775,123.818,30.),(-169.853,123.818,50.),(-169.853,123.818,30.),(-155.17,126.098,50.),(-155.17,126.098,30.),(-169.853,123.818,50.),(-155.17,126.098,30.),(-149.538,128.948,50.),(-149.538,128.948,30.),(-155.17,126.098,50.),(-149.538,128.948,30.),(-145.047,132.939,50.),(-145.047,132.939,30.),(-149.538,128.948,50.),(-145.047,132.939,50.),(-140.976,138.64,30.),(-145.047,132.939,30.),(-140.976,138.64,50.),(-140.976,138.64,50.),(-137.46,145.777,30.),(-140.976,138.64,30.),(-137.46,145.777,50.),(-137.46,145.777,50.),(-134.497,154.35,30.),(-137.46,145.777,30.),(-134.497,154.35,50.),(-134.497,154.35,50.),(-132.089,164.358,30.),(-134.497,154.35,30.),(-132.089,164.358,50.),(-132.089,164.358,50.),(-129.724,181.377,30.),(-132.089,164.358,30.),(-129.724,181.377,50.),(-129.724,181.377,50.),(-128.935,200.,30.),(-129.724,181.377,30.),(-128.935,200.,50.),(-128.935,200.,50.),(-129.494,216.448,30.),(-128.935,200.,30.),(-129.494,216.448,50.),(-129.494,216.448,50.),(-131.173,231.166,30.),(-129.494,216.448,30.),(-131.173,231.166,50.),(-131.173,231.166,50.),(-133.97,244.151,30.),(-131.173,231.166,30.),(-133.97,244.151,50.),(-133.97,244.151,50.),(-137.886,255.405,30.),(-133.97,244.151,30.),(-137.886,255.405,50.),(-137.886,255.405,50.),(-143.416,265.076,30.),(-137.886,255.405,30.),(-143.416,265.076,50.),(-143.416,265.076,30.),(-150.119,271.453,50.),(-150.119,271.453,30.),(-143.416,265.076,50.),(-150.119,271.453,30.),(-158.697,275.,50.),(-158.697,275.,30.),(-150.119,271.453,50.),(-158.697,275.,50.),(-169.853,276.182,30.),(-158.697,275.,30.),(-169.853,276.182,50.),(-169.853,276.182,50.),(-199.775,276.182,30.),(-169.853,276.182,30.),(-199.775,276.182,50.),(-199.775,276.182,30.),(-199.775,123.818,50.),(-199.775,123.818,30.),(-199.775,276.182,50.),(-21.269,105.405,50.),(-97.991,109.966,50.),(-97.991,105.405,50.),(-95.231,111.972,50.),(-93.6,114.611,50.),(-92.535,124.493,50.),(-80.345,123.818,50.),(-92.535,275.507,50.),(-21.354,123.818,50.),(-16.282,125.979,50.),(-18.221,104.856,50.),(-16.239,103.209,50.),(-14.971,129.222,50.),(-14.961,99.958,50.),(-14.023,134.628,50.),(-14.023,94.595,50.),(-11.636,134.628,50.),(-11.636,94.595,50.),(-80.345,193.919,50.),(-80.345,212.331,50.),(-43.092,212.331,50.),(-43.092,193.919,50.),(-38.105,191.757,50.),(-40.044,212.88,50.),(-38.062,214.527,50.),(-36.773,188.514,50.),(-36.762,217.779,50.),(-35.761,183.108,50.),(-35.761,223.142,50.),(-33.459,183.108,50.),(-33.459,223.142,50.),(-97.991,290.034,50.),(-21.866,294.595,50.),(-97.991,294.595,50.),(-95.284,288.049,50.),(-93.643,285.473,50.),(-92.812,281.546,50.),(-80.345,276.182,50.),(-21.866,276.182,50.),(-18.818,275.642,50.),(-18.818,295.144,50.),(-16.836,296.791,50.),(-16.836,274.021,50.),(-15.536,300.042,50.),(-15.536,270.778,50.),(-14.534,305.405,50.),(-14.534,265.372,50.),(-12.233,265.372,50.),(-12.233,305.405,50.),(-80.345,193.919,30.),(-80.345,123.818,50.),(-80.345,123.818,30.),(-80.345,193.919,50.),(-80.345,123.818,50.),(-21.354,123.818,30.),(-80.345,123.818,30.),(-21.354,123.818,50.),(-21.354,123.818,30.),(-16.282,125.979,50.),(-16.282,125.979,30.),(-21.354,123.818,50.),(-16.282,125.979,50.),(-14.971,129.222,30.),(-16.282,125.979,30.),(-14.971,129.222,50.),(-14.971,129.222,50.),(-14.023,134.628,30.),(-14.971,129.222,30.),(-14.023,134.628,50.),(-14.023,134.628,50.),(-11.636,134.628,30.),(-14.023,134.628,30.),(-11.636,134.628,50.),(-11.636,134.628,30.),(-11.636,94.595,50.),(-11.636,94.595,30.),(-11.636,134.628,50.),(-11.636,94.595,50.),(-14.023,94.595,30.),(-11.636,94.595,30.),(-14.023,94.595,50.),(-14.023,94.595,50.),(-14.961,99.958,30.),(-14.023,94.595,30.),(-14.961,99.958,50.),(-14.961,99.958,50.),(-16.239,103.209,30.),(-14.961,99.958,30.),(-16.239,103.209,50.),(-16.239,103.209,30.),(-18.221,104.856,50.),(-18.221,104.856,30.),(-16.239,103.209,50.),(-18.221,104.856,30.),(-21.269,105.405,50.),(-21.269,105.405,30.),(-18.221,104.856,50.),(-21.269,105.405,50.),(-97.991,105.405,30.),(-21.269,105.405,30.),(-97.991,105.405,50.),(-97.991,105.405,50.),(-97.991,109.966,30.),(-97.991,105.405,30.),(-97.991,109.966,50.),(-97.991,109.966,50.),(-95.231,111.972,30.),(-97.991,109.966,30.),(-95.231,111.972,50.),(-95.231,111.972,50.),(-93.6,114.611,30.),(-95.231,111.972,30.),(-93.6,114.611,50.),(-93.6,114.611,50.),(-92.535,124.493,30.),(-93.6,114.611,30.),(-92.535,124.493,50.),(-92.535,124.493,50.),(-92.535,275.507,30.),(-92.535,124.493,30.),(-92.535,275.507,50.),(-92.535,275.507,50.),(-92.812,281.546,30.),(-92.535,275.507,30.),(-92.812,281.546,50.),(-92.812,281.546,50.),(-93.643,285.473,30.),(-92.812,281.546,30.),(-93.643,285.473,50.),(-93.643,285.473,50.),(-95.284,288.049,30.),(-93.643,285.473,30.),(-95.284,288.049,50.),(-95.284,288.049,50.),(-97.991,290.034,30.),(-95.284,288.049,30.),(-97.991,290.034,50.),(-97.991,290.034,50.),(-97.991,294.595,30.),(-97.991,290.034,30.),(-97.991,294.595,50.),(-97.991,294.595,50.),(-21.866,294.595,30.),(-97.991,294.595,30.),(-21.866,294.595,50.),(-21.866,294.595,50.),(-18.818,295.144,30.),(-21.866,294.595,30.),(-18.818,295.144,50.),(-18.818,295.144,30.),(-16.836,296.791,50.),(-16.836,296.791,30.),(-18.818,295.144,50.),(-16.836,296.791,50.),(-15.536,300.042,30.),(-16.836,296.791,30.),(-15.536,300.042,50.),(-15.536,300.042,50.),(-14.534,305.405,30.),(-15.536,300.042,30.),(-14.534,305.405,50.),(-14.534,305.405,50.),(-12.233,305.405,30.),(-14.534,305.405,30.),(-12.233,305.405,50.),(-12.233,305.405,30.),(-12.233,265.372,50.),(-12.233,265.372,30.),(-12.233,305.405,50.),(-12.233,265.372,50.),(-14.534,265.372,30.),(-12.233,265.372,30.),(-14.534,265.372,50.),(-14.534,265.372,50.),(-15.536,270.778,30.),(-14.534,265.372,30.),(-15.536,270.778,50.),(-15.536,270.778,50.),(-16.836,274.021,30.),(-15.536,270.778,30.),(-16.836,274.021,50.),(-16.836,274.021,50.),(-18.818,275.642,30.),(-16.836,274.021,30.),(-18.818,275.642,50.),(-18.818,275.642,50.),(-21.866,276.182,30.),(-18.818,275.642,30.),(-21.866,276.182,50.),(-21.866,276.182,30.),(-80.345,276.182,50.),(-80.345,276.182,30.),(-21.866,276.182,50.),(-80.345,276.182,30.),(-80.345,212.331,50.),(-80.345,212.331,30.),(-80.345,276.182,50.),(-80.345,212.331,50.),(-43.092,212.331,30.),(-80.345,212.331,30.),(-43.092,212.331,50.),(-43.092,212.331,50.),(-40.044,212.88,30.),(-43.092,212.331,30.),(-40.044,212.88,50.),(-40.044,212.88,30.),(-38.062,214.527,50.),(-38.062,214.527,30.),(-40.044,212.88,50.),(-38.062,214.527,50.),(-36.762,217.779,30.),(-38.062,214.527,30.),(-36.762,217.779,50.),(-36.762,217.779,50.),(-35.761,223.142,30.),(-36.762,217.779,30.),(-35.761,223.142,50.),(-35.761,223.142,50.),(-33.459,223.142,30.),(-35.761,223.142,30.),(-33.459,223.142,50.),(-33.459,223.142,30.),(-33.459,183.108,50.),(-33.459,183.108,30.),(-33.459,223.142,50.),(-33.459,183.108,30.),(-35.761,183.108,50.),(-35.761,183.108,30.),(-33.459,183.108,50.),(-35.761,183.108,50.),(-36.773,188.514,30.),(-35.761,183.108,30.),(-36.773,188.514,50.),(-36.773,188.514,50.),(-38.105,191.757,30.),(-36.773,188.514,30.),(-38.105,191.757,50.),(-38.105,191.757,50.),(-43.092,193.919,30.),(-38.105,191.757,30.),(-43.092,193.919,50.),(-43.092,193.919,30.),(-80.345,193.919,50.),(-80.345,193.919,30.),(-43.092,193.919,50.),(108.817,105.405,50.),(49.741,109.966,50.),(49.741,105.405,50.),(52.448,111.972,50.),(54.089,114.611,50.),(54.92,118.56,50.),(55.197,124.493,50.),(67.387,123.818,50.),(55.197,275.507,50.),(67.387,195.101,50.),(105.407,123.818,50.),(118.705,125.253,50.),(118.173,106.208,50.),(125.44,108.615,50.),(122.755,127.386,50.),(126.378,130.912,50.),(131.301,113.007,50.),(129.399,135.821,50.),(131.556,141.934,50.),(136.437,119.764,50.),(132.851,149.25,50.),(133.283,157.77,50.),(135.515,196.59,50.),(140.763,186.191,50.),(140.166,127.544,50.),(142.83,136.529,50.),(143.912,173.364,50.),(144.429,146.717,50.),(144.961,158.108,50.),(104.299,195.101,50.),(67.387,213.514,50.),(103.617,213.514,50.),(116.276,214.78,50.),(117.469,193.581,50.),(123.565,219.764,50.),(121.615,191.385,50.),(125.269,187.838,50.),(126.436,223.955,50.),(128.775,182.348,50.),(128.168,204.561,50.),(131.279,175.507,50.),(132.782,167.314,50.),(128.487,229.265,50.),(134.135,212.099,50.),(129.718,235.695,50.),(130.128,243.243,50.),(131.151,284.628,50.),(135.574,277.196,50.),(138.397,221.199,50.),(138.951,267.399,50.),(140.955,231.862,50.),(141.093,256.081,50.),(141.807,244.088,50.),(52.448,288.049,50.),(49.741,294.595,50.),(49.741,290.034,50.),(107.027,294.595,50.),(54.089,285.473,50.),(54.92,281.546,50.),(67.387,276.182,50.),(102.594,276.182,50.),(115.083,274.916,50.),(121.519,292.314,50.),(122.542,269.932,50.),(126.697,289.253,50.),(125.861,265.034,50.),(128.232,258.953,50.),(129.654,251.689,50.),(128.168,204.561,30.),(135.515,196.59,50.),(135.515,196.59,30.),(128.168,204.561,50.),(135.515,196.59,30.),(140.763,186.191,50.),(140.763,186.191,30.),(135.515,196.59,50.),(140.763,186.191,30.),(143.912,173.364,50.),(143.912,173.364,30.),(140.763,186.191,50.),(143.912,173.364,30.),(144.961,158.108,50.),(144.961,158.108,30.),(143.912,173.364,50.),(144.961,158.108,30.),(144.429,146.717,50.),(144.429,146.717,30.),(144.961,158.108,50.),(144.429,146.717,30.),(142.83,136.529,50.),(142.83,136.529,30.),(144.429,146.717,50.),(142.83,136.529,30.),(140.166,127.544,50.),(140.166,127.544,30.),(142.83,136.529,50.),(140.166,127.544,30.),(136.437,119.764,50.),(136.437,119.764,30.),(140.166,127.544,50.),(136.437,119.764,30.),(131.301,113.007,50.),(131.301,113.007,30.),(136.437,119.764,50.),(131.301,113.007,50.),(125.44,108.615,30.),(131.301,113.007,30.),(125.44,108.615,50.),(125.44,108.615,50.),(118.173,106.208,30.),(125.44,108.615,30.),(118.173,106.208,50.),(118.173,106.208,50.),(108.817,105.405,30.),(118.173,106.208,30.),(108.817,105.405,50.),(108.817,105.405,50.),(49.741,105.405,30.),(108.817,105.405,30.),(49.741,105.405,50.),(49.741,105.405,50.),(49.741,109.966,30.),(49.741,105.405,30.),(49.741,109.966,50.),(49.741,109.966,30.),(52.448,111.972,50.),(52.448,111.972,30.),(49.741,109.966,50.),(52.448,111.972,50.),(54.089,114.611,30.),(52.448,111.972,30.),(54.089,114.611,50.),(54.089,114.611,50.),(54.92,118.56,30.),(54.089,114.611,30.),(54.92,118.56,50.),(54.92,118.56,50.),(55.197,124.493,30.),(54.92,118.56,30.),(55.197,124.493,50.),(55.197,124.493,50.),(55.197,275.507,30.),(55.197,124.493,30.),(55.197,275.507,50.),(55.197,275.507,50.),(54.92,281.546,30.),(55.197,275.507,30.),(54.92,281.546,50.),(54.92,281.546,50.),(54.089,285.473,30.),(54.92,281.546,30.),(54.089,285.473,50.),(54.089,285.473,50.),(52.448,288.049,30.),(54.089,285.473,30.),(52.448,288.049,50.),(52.448,288.049,30.),(49.741,290.034,50.),(49.741,290.034,30.),(52.448,288.049,50.),(49.741,290.034,50.),(49.741,294.595,30.),(49.741,290.034,30.),(49.741,294.595,50.),(49.741,294.595,50.),(107.027,294.595,30.),(49.741,294.595,30.),(107.027,294.595,50.),(107.027,294.595,50.),(121.519,292.314,30.),(107.027,294.595,30.),(121.519,292.314,50.),(121.519,292.314,50.),(126.697,289.253,30.),(121.519,292.314,30.),(126.697,289.253,50.),(126.697,289.253,30.),(131.151,284.628,50.),(131.151,284.628,30.),(126.697,289.253,50.),(131.151,284.628,30.),(135.574,277.196,50.),(135.574,277.196,30.),(131.151,284.628,50.),(135.574,277.196,30.),(138.951,267.399,50.),(138.951,267.399,30.),(135.574,277.196,50.),(138.951,267.399,30.),(141.093,256.081,50.),(141.093,256.081,30.),(138.951,267.399,50.),(141.093,256.081,30.),(141.807,244.088,50.),(141.807,244.088,30.),(141.093,256.081,50.),(141.807,244.088,30.),(140.955,231.862,50.),(140.955,231.862,30.),(141.807,244.088,50.),(140.955,231.862,30.),(138.397,221.199,50.),(138.397,221.199,30.),(140.955,231.862,50.),(138.397,221.199,30.),(134.135,212.099,50.),(134.135,212.099,30.),(138.397,221.199,50.),(134.135,212.099,30.),(128.168,204.561,50.),(128.168,204.561,30.),(134.135,212.099,50.),(67.387,213.514,50.),(103.617,213.514,30.),(67.387,213.514,30.),(103.617,213.514,50.),(103.617,213.514,30.),(116.276,214.78,50.),(116.276,214.78,30.),(103.617,213.514,50.),(116.276,214.78,30.),(123.565,219.764,50.),(123.565,219.764,30.),(116.276,214.78,50.),(123.565,219.764,50.),(126.436,223.955,30.),(123.565,219.764,30.),(126.436,223.955,50.),(126.436,223.955,50.),(128.487,229.265,30.),(126.436,223.955,30.),(128.487,229.265,50.),(128.487,229.265,50.),(129.718,235.695,30.),(128.487,229.265,30.),(129.718,235.695,50.),(129.718,235.695,50.),(130.128,243.243,30.),(129.718,235.695,30.),(130.128,243.243,50.),(130.128,243.243,50.),(129.654,251.689,30.),(130.128,243.243,30.),(129.654,251.689,50.),(129.654,251.689,50.),(128.232,258.953,30.),(129.654,251.689,30.),(128.232,258.953,50.),(128.232,258.953,50.),(125.861,265.034,30.),(128.232,258.953,30.),(125.861,265.034,50.),(125.861,265.034,50.),(122.542,269.932,30.),(125.861,265.034,30.),(122.542,269.932,50.),(122.542,269.932,30.),(115.083,274.916,50.),(115.083,274.916,30.),(122.542,269.932,50.),(115.083,274.916,30.),(102.594,276.182,50.),(102.594,276.182,30.),(115.083,274.916,50.),(102.594,276.182,50.),(67.387,276.182,30.),(102.594,276.182,30.),(67.387,276.182,50.),(67.387,276.182,30.),(67.387,213.514,50.),(67.387,213.514,30.),(67.387,276.182,50.),(67.387,123.818,30.),(105.407,123.818,50.),(105.407,123.818,30.),(67.387,123.818,50.),(105.407,123.818,50.),(118.705,125.253,30.),(105.407,123.818,30.),(118.705,125.253,50.),(118.705,125.253,50.),(122.755,127.386,30.),(118.705,125.253,30.),(122.755,127.386,50.),(122.755,127.386,30.),(126.378,130.912,50.),(126.378,130.912,30.),(122.755,127.386,50.),(126.378,130.912,50.),(129.399,135.821,30.),(126.378,130.912,30.),(129.399,135.821,50.),(129.399,135.821,50.),(131.556,141.934,30.),(129.399,135.821,30.),(131.556,141.934,50.),(131.556,141.934,50.),(132.851,149.25,30.),(131.556,141.934,30.),(132.851,149.25,50.),(132.851,149.25,50.),(133.283,157.77,30.),(132.851,149.25,30.),(133.283,157.77,50.),(133.283,157.77,50.),(132.782,167.314,30.),(133.283,157.77,30.),(132.782,167.314,50.),(132.782,167.314,50.),(131.279,175.507,30.),(132.782,167.314,30.),(131.279,175.507,50.),(131.279,175.507,50.),(128.775,182.348,30.),(131.279,175.507,30.),(128.775,182.348,50.),(128.775,182.348,50.),(125.269,187.838,30.),(128.775,182.348,30.),(125.269,187.838,50.),(125.269,187.838,30.),(121.615,191.385,50.),(121.615,191.385,30.),(125.269,187.838,50.),(121.615,191.385,50.),(117.469,193.581,30.),(121.615,191.385,30.),(117.469,193.581,50.),(117.469,193.581,30.),(104.299,195.101,50.),(104.299,195.101,30.),(117.469,193.581,50.),(104.299,195.101,50.),(67.387,195.101,30.),(104.299,195.101,30.),(67.387,195.101,50.),(67.387,195.101,30.),(67.387,123.818,50.),(67.387,123.818,30.),(67.387,195.101,50.),(185.794,105.405,50.),(162.693,109.966,50.),(162.693,105.405,50.),(165.452,111.972,50.),(167.083,114.611,50.),(168.148,124.493,50.),(181.447,114.611,50.),(180.616,118.56,50.),(168.148,275.507,50.),(180.339,124.493,50.),(180.339,209.459,50.),(183.088,111.972,50.),(185.794,109.966,50.),(235.647,105.405,50.),(238.142,111.698,50.),(235.647,109.966,50.),(259.277,105.405,50.),(238.973,114.189,50.),(254.886,112.148,50.),(252.372,117.399,50.),(259.277,109.966,50.),(180.339,191.047,50.),(216.653,209.459,50.),(215.05,191.047,50.),(237.011,122.297,50.),(228.417,192.736,50.),(229.824,210.726,50.),(234.704,194.632,50.),(237.283,215.372,50.),(240.181,197.783,50.),(240.229,219.774,50.),(244.849,202.191,50.),(242.334,225.549,50.),(243.597,232.696,50.),(244.018,241.216,50.),(162.693,290.034,50.),(219.381,294.595,50.),(162.693,294.595,50.),(165.399,288.049,50.),(167.04,285.473,50.),(167.871,281.546,50.),(180.339,276.182,50.),(218.017,276.182,50.),(229.888,274.113,50.),(228.13,293.919,50.),(235.109,291.892,50.),(234.305,271.527,50.),(237.709,267.905,50.),(240.81,288.26,50.),(240.469,262.88,50.),(242.44,256.757,50.),(245.722,282.77,50.),(243.623,249.535,50.),(248.706,207.855,50.),(250.049,275.042,50.),(251.727,214.722,50.),(253.139,265.709,50.),(253.885,222.741,50.),(254.993,254.772,50.),(255.179,231.91,50.),(255.611,242.23,50.),(180.339,191.047,30.),(180.339,124.493,50.),(180.339,124.493,30.),(180.339,191.047,50.),(180.339,124.493,30.),(180.616,118.56,50.),(180.616,118.56,30.),(180.339,124.493,50.),(180.616,118.56,30.),(181.447,114.611,50.),(181.447,114.611,30.),(180.616,118.56,50.),(181.447,114.611,30.),(183.088,111.972,50.),(183.088,111.972,30.),(181.447,114.611,50.),(183.088,111.972,50.),(185.794,109.966,30.),(183.088,111.972,30.),(185.794,109.966,50.),(185.794,109.966,30.),(185.794,105.405,50.),(185.794,105.405,30.),(185.794,109.966,50.),(185.794,105.405,50.),(162.693,105.405,30.),(185.794,105.405,30.),(162.693,105.405,50.),(162.693,105.405,50.),(162.693,109.966,30.),(162.693,105.405,30.),(162.693,109.966,50.),(162.693,109.966,50.),(165.452,111.972,30.),(162.693,109.966,30.),(165.452,111.972,50.),(165.452,111.972,50.),(167.083,114.611,30.),(165.452,111.972,30.),(167.083,114.611,50.),(167.083,114.611,50.),(168.148,124.493,30.),(167.083,114.611,30.),(168.148,124.493,50.),(168.148,124.493,50.),(168.148,275.507,30.),(168.148,124.493,30.),(168.148,275.507,50.),(168.148,275.507,50.),(167.871,281.546,30.),(168.148,275.507,30.),(167.871,281.546,50.),(167.871,281.546,50.),(167.04,285.473,30.),(167.871,281.546,30.),(167.04,285.473,50.),(167.04,285.473,50.),(165.399,288.049,30.),(167.04,285.473,30.),(165.399,288.049,50.),(165.399,288.049,30.),(162.693,290.034,50.),(162.693,290.034,30.),(165.399,288.049,50.),(162.693,290.034,50.),(162.693,294.595,30.),(162.693,290.034,30.),(162.693,294.595,50.),(162.693,294.595,30.),(219.381,294.595,50.),(219.381,294.595,30.),(162.693,294.595,50.),(219.381,294.595,50.),(228.13,293.919,30.),(219.381,294.595,30.),(228.13,293.919,50.),(228.13,293.919,50.),(235.109,291.892,30.),(228.13,293.919,30.),(235.109,291.892,50.),(235.109,291.892,50.),(240.81,288.26,30.),(235.109,291.892,30.),(240.81,288.26,50.),(240.81,288.26,30.),(245.722,282.77,50.),(245.722,282.77,30.),(240.81,288.26,50.),(245.722,282.77,30.),(250.049,275.042,50.),(250.049,275.042,30.),(245.722,282.77,50.),(250.049,275.042,30.),(253.139,265.709,50.),(253.139,265.709,30.),(250.049,275.042,50.),(253.139,265.709,30.),(254.993,254.772,50.),(254.993,254.772,30.),(253.139,265.709,50.),(254.993,254.772,30.),(255.611,242.23,50.),(255.611,242.23,30.),(254.993,254.772,50.),(255.611,242.23,30.),(255.179,231.91,50.),(255.179,231.91,30.),(255.611,242.23,50.),(255.179,231.91,30.),(253.885,222.741,50.),(253.885,222.741,30.),(255.179,231.91,50.),(253.885,222.741,30.),(251.727,214.722,50.),(251.727,214.722,30.),(253.885,222.741,50.),(251.727,214.722,30.),(248.706,207.855,50.),(248.706,207.855,30.),(251.727,214.722,50.),(248.706,207.855,30.),(244.849,202.191,50.),(244.849,202.191,30.),(248.706,207.855,50.),(244.849,202.191,50.),(240.181,197.783,30.),(244.849,202.191,30.),(240.181,197.783,50.),(240.181,197.783,50.),(234.704,194.632,30.),(240.181,197.783,30.),(234.704,194.632,50.),(234.704,194.632,50.),(228.417,192.736,30.),(234.704,194.632,30.),(228.417,192.736,50.),(228.417,192.736,30.),(252.372,117.399,50.),(252.372,117.399,30.),(228.417,192.736,50.),(252.372,117.399,30.),(254.886,112.148,50.),(254.886,112.148,30.),(252.372,117.399,50.),(254.886,112.148,50.),(259.277,109.966,30.),(254.886,112.148,30.),(259.277,109.966,50.),(259.277,109.966,30.),(259.277,105.405,50.),(259.277,105.405,30.),(259.277,109.966,50.),(259.277,105.405,50.),(235.647,105.405,30.),(259.277,105.405,30.),(235.647,105.405,50.),(235.647,105.405,50.),(235.647,109.966,30.),(235.647,105.405,30.),(235.647,109.966,50.),(235.647,109.966,50.),(238.142,111.698,30.),(235.647,109.966,30.),(238.142,111.698,50.),(238.142,111.698,50.),(238.973,114.189,30.),(238.142,111.698,30.),(238.973,114.189,50.),(238.973,114.189,50.),(237.011,122.297,30.),(238.973,114.189,30.),(237.011,122.297,50.),(237.011,122.297,50.),(215.05,191.047,30.),(237.011,122.297,30.),(215.05,191.047,50.),(215.05,191.047,50.),(180.339,191.047,30.),(215.05,191.047,30.),(180.339,191.047,50.),(180.339,209.459,30.),(216.653,209.459,50.),(216.653,209.459,30.),(180.339,209.459,50.),(216.653,209.459,50.),(229.824,210.726,30.),(216.653,209.459,30.),(229.824,210.726,50.),(229.824,210.726,30.),(237.283,215.372,50.),(237.283,215.372,30.),(229.824,210.726,50.),(237.283,215.372,50.),(240.229,219.774,30.),(237.283,215.372,30.),(240.229,219.774,50.),(240.229,219.774,50.),(242.334,225.549,30.),(240.229,219.774,30.),(242.334,225.549,50.),(242.334,225.549,50.),(243.597,232.696,30.),(242.334,225.549,30.),(243.597,232.696,50.),(243.597,232.696,50.),(244.018,241.216,30.),(243.597,232.696,30.),(244.018,241.216,50.),(244.018,241.216,50.),(243.623,249.535,30.),(244.018,241.216,30.),(243.623,249.535,50.),(243.623,249.535,50.),(242.44,256.757,30.),(243.623,249.535,30.),(242.44,256.757,50.),(242.44,256.757,50.),(240.469,262.88,30.),(242.44,256.757,30.),(240.469,262.88,50.),(240.469,262.88,50.),(237.709,267.905,30.),(240.469,262.88,30.),(237.709,267.905,50.),(237.709,267.905,50.),(234.305,271.527,30.),(237.709,267.905,30.),(234.305,271.527,50.),(234.305,271.527,50.),(229.888,274.113,30.),(234.305,271.527,30.),(229.888,274.113,50.),(229.888,274.113,30.),(218.017,276.182,50.),(218.017,276.182,30.),(229.888,274.113,50.),(218.017,276.182,50.),(180.339,276.182,30.),(218.017,276.182,30.),(180.339,276.182,50.),(180.339,276.182,30.),(180.339,209.459,50.),(180.339,209.459,30.),(180.339,276.182,50.),(276.923,264.886,50.),(286.676,278.593,50.),(286.101,283.615,50.),(306.333,188.936,50.),(288.4,272.986,50.),(313.579,207.683,50.),(266.203,287.373,50.),(262.942,294.595,50.),(262.942,290.034,50.),(289.849,294.595,50.),(268.995,283.446,50.),(287.038,287.838,50.),(289.849,290.034,50.),(323.979,105.405,50.),(300.877,109.966,50.),(300.877,105.405,50.),(303.583,111.972,50.),(305.224,114.611,50.),(306.056,118.56,50.),(306.333,124.493,50.),(319.588,114.611,50.),(318.523,124.493,50.),(318.523,188.936,50.),(321.219,111.972,50.),(323.979,109.966,50.),(336.897,272.817,50.),(343.841,259.655,50.),(339.227,283.277,50.),(335.448,290.034,50.),(359.782,294.595,50.),(335.448,294.595,50.),(338.282,287.838,50.),(352.707,281.334,50.),(356.095,286.592,50.),(359.782,290.034,50.),(318.523,188.936,30.),(318.523,124.493,50.),(318.523,124.493,30.),(318.523,188.936,50.),(318.523,124.493,30.),(319.588,114.611,50.),(319.588,114.611,30.),(318.523,124.493,50.),(319.588,114.611,30.),(321.219,111.972,50.),(321.219,111.972,30.),(319.588,114.611,50.),(321.219,111.972,50.),(323.979,109.966,30.),(321.219,111.972,30.),(323.979,109.966,50.),(323.979,109.966,30.),(323.979,105.405,50.),(323.979,105.405,30.),(323.979,109.966,50.),(323.979,105.405,50.),(300.877,105.405,30.),(323.979,105.405,30.),(300.877,105.405,50.),(300.877,105.405,50.),(300.877,109.966,30.),(300.877,105.405,30.),(300.877,109.966,50.),(300.877,109.966,30.),(303.583,111.972,50.),(303.583,111.972,30.),(300.877,109.966,50.),(303.583,111.972,50.),(305.224,114.611,30.),(303.583,111.972,30.),(305.224,114.611,50.),(305.224,114.611,50.),(306.056,118.56,30.),(305.224,114.611,30.),(306.056,118.56,50.),(306.056,118.56,50.),(306.333,124.493,30.),(306.056,118.56,30.),(306.333,124.493,50.),(306.333,124.493,50.),(306.333,188.936,30.),(306.333,124.493,30.),(306.333,188.936,50.),(306.333,188.936,50.),(276.923,264.886,30.),(306.333,188.936,30.),(276.923,264.886,50.),(276.923,264.886,50.),(268.995,283.446,30.),(276.923,264.886,30.),(268.995,283.446,50.),(268.995,283.446,50.),(266.203,287.373,30.),(268.995,283.446,30.),(266.203,287.373,50.),(266.203,287.373,30.),(262.942,290.034,50.),(262.942,290.034,30.),(266.203,287.373,50.),(262.942,290.034,50.),(262.942,294.595,30.),(262.942,290.034,30.),(262.942,294.595,50.),(262.942,294.595,50.),(289.849,294.595,30.),(262.942,294.595,30.),(289.849,294.595,50.),(289.849,294.595,30.),(289.849,290.034,50.),(289.849,290.034,30.),(289.849,294.595,50.),(289.849,290.034,50.),(287.038,287.838,30.),(289.849,290.034,30.),(287.038,287.838,50.),(287.038,287.838,30.),(286.101,283.615,50.),(286.101,283.615,30.),(287.038,287.838,50.),(286.101,283.615,30.),(286.676,278.593,50.),(286.676,278.593,30.),(286.101,283.615,50.),(286.676,278.593,30.),(288.4,272.986,50.),(288.4,272.986,30.),(286.676,278.593,50.),(288.4,272.986,30.),(313.579,207.683,50.),(313.579,207.683,30.),(288.4,272.986,50.),(313.579,207.683,50.),(336.897,272.817,30.),(313.579,207.683,30.),(336.897,272.817,50.),(336.897,272.817,50.),(339.227,283.277,30.),(336.897,272.817,30.),(339.227,283.277,50.),(339.227,283.277,50.),(338.282,287.838,30.),(339.227,283.277,30.),(338.282,287.838,50.),(338.282,287.838,30.),(335.448,290.034,50.),(335.448,290.034,30.),(338.282,287.838,50.),(335.448,290.034,50.),(335.448,294.595,30.),(335.448,290.034,30.),(335.448,294.595,50.),(335.448,294.595,30.),(359.782,294.595,50.),(359.782,294.595,30.),(335.448,294.595,50.),(359.782,294.595,30.),(359.782,290.034,50.),(359.782,290.034,30.),(359.782,294.595,50.),(359.782,290.034,50.),(356.095,286.592,30.),(359.782,290.034,30.),(356.095,286.592,50.),(356.095,286.592,30.),(352.707,281.334,50.),(352.707,281.334,30.),(356.095,286.592,50.),(352.707,281.334,30.),(343.841,259.655,50.),(343.841,259.655,30.),(352.707,281.334,50.),(343.841,259.655,30.),(318.523,188.936,50.),(318.523,188.936,30.),(343.841,259.655,50.),(377.079,140.709,50.),(380.406,182.454,50.),(379.644,198.818,50.),(384.149,126.014,50.),(382.692,167.652,50.),(386.501,154.413,50.),(392.081,115.224,50.),(391.835,142.736,50.),(398.324,133.203,50.),(401.057,107.517,50.),(405.772,126.394,50.),(411.076,102.893,50.),(414.18,122.308,50.),(422.138,101.351,50.),(423.546,120.946,50.),(436.379,103.706,50.),(433.2,122.403,50.),(442.386,126.774,50.),(449.715,110.769,50.),(450.655,133.72,50.),(462.145,122.54,50.),(457.56,142.905,50.),(457.56,177.703,50.),(468.215,157.432,50.),(468.215,177.027,50.),(469.306,147.382,50.),(473.671,139.02,50.),(470.943,144.785,50.),(473.671,142.905,50.),(428.746,166.892,50.),(426.445,206.926,50.),(426.445,166.892,50.),(428.746,206.926,50.),(429.695,172.255,50.),(429.693,201.52,50.),(431.001,198.276,50.),(431.005,175.507,50.),(436.064,196.115,50.),(433.019,177.154,50.),(436.077,177.703,50.),(473.671,196.115,50.),(469.306,187.078,50.),(470.943,189.675,50.),(473.671,191.554,50.),(459.989,239.696,50.),(458.881,250.,50.),(458.03,242.061,50.),(368.071,178.421,50.),(367.465,214.981,50.),(366.857,199.493,50.),(369.287,229.688,50.),(371.712,158.108,50.),(372.324,243.613,50.),(376.576,256.757,50.),(381.28,267.325,50.),(380.475,216.058,50.),(382.967,231.63,50.),(386.699,276.394,50.),(387.121,245.534,50.),(392.831,283.963,50.),(392.936,257.77,50.),(399.677,290.034,50.),(399.284,266.786,50.),(406.398,273.226,50.),(410.802,295.988,50.),(414.279,277.09,50.),(422.694,297.973,50.),(422.927,278.378,50.),(432.806,296.706,50.),(430.196,277.46,50.),(437.262,274.704,50.),(442.002,292.905,50.),(444.126,270.112,50.),(451.603,285.853,50.),(450.788,263.682,50.),(456.858,255.617,50.),(462.93,274.831,50.),(465.743,272.804,50.),(471.71,276.858,50.),(469.75,279.561,50.),(471.71,276.858,30.),(459.989,239.696,50.),(459.989,239.696,30.),(471.71,276.858,50.),(459.989,239.696,50.),(458.03,242.061,30.),(459.989,239.696,30.),(458.03,242.061,50.),(458.03,242.061,50.),(458.881,250.,30.),(458.03,242.061,30.),(458.881,250.,50.),(458.881,250.,50.),(456.858,255.617,30.),(458.881,250.,30.),(456.858,255.617,50.),(456.858,255.617,50.),(450.788,263.682,30.),(456.858,255.617,30.),(450.788,263.682,50.),(450.788,263.682,30.),(444.126,270.112,50.),(444.126,270.112,30.),(450.788,263.682,50.),(444.126,270.112,50.),(437.262,274.704,30.),(444.126,270.112,30.),(437.262,274.704,50.),(437.262,274.704,30.),(430.196,277.46,50.),(430.196,277.46,30.),(437.262,274.704,50.),(430.196,277.46,50.),(422.927,278.378,30.),(430.196,277.46,30.),(422.927,278.378,50.),(422.927,278.378,50.),(414.279,277.09,30.),(422.927,278.378,30.),(414.279,277.09,50.),(414.279,277.09,30.),(406.398,273.226,50.),(406.398,273.226,30.),(414.279,277.09,50.),(406.398,273.226,50.),(399.284,266.786,30.),(406.398,273.226,30.),(399.284,266.786,50.),(399.284,266.786,30.),(392.936,257.77,50.),(392.936,257.77,30.),(399.284,266.786,50.),(392.936,257.77,30.),(387.121,245.534,50.),(387.121,245.534,30.),(392.936,257.77,50.),(387.121,245.534,30.),(382.967,231.63,50.),(382.967,231.63,30.),(387.121,245.534,50.),(382.967,231.63,30.),(380.475,216.058,50.),(380.475,216.058,30.),(382.967,231.63,50.),(380.475,216.058,30.),(379.644,198.818,50.),(379.644,198.818,30.),(380.475,216.058,50.),(379.644,198.818,30.),(380.406,182.454,50.),(380.406,182.454,30.),(379.644,198.818,50.),(380.406,182.454,30.),(382.692,167.652,50.),(382.692,167.652,30.),(380.406,182.454,50.),(382.692,167.652,30.),(386.501,154.413,50.),(386.501,154.413,30.),(382.692,167.652,50.),(386.501,154.413,30.),(391.835,142.736,50.),(391.835,142.736,30.),(386.501,154.413,50.),(391.835,142.736,30.),(398.324,133.203,50.),(398.324,133.203,30.),(391.835,142.736,50.),(398.324,133.203,50.),(405.772,126.394,30.),(398.324,133.203,30.),(405.772,126.394,50.),(405.772,126.394,50.),(414.18,122.308,30.),(405.772,126.394,30.),(414.18,122.308,50.),(414.18,122.308,50.),(423.546,120.946,30.),(414.18,122.308,30.),(423.546,120.946,50.),(423.546,120.946,50.),(433.2,122.403,30.),(423.546,120.946,30.),(433.2,122.403,50.),(433.2,122.403,30.),(442.386,126.774,50.),(442.386,126.774,30.),(433.2,122.403,50.),(442.386,126.774,30.),(450.655,133.72,50.),(450.655,133.72,30.),(442.386,126.774,50.),(450.655,133.72,50.),(457.56,142.905,30.),(450.655,133.72,30.),(457.56,142.905,50.),(457.56,142.905,50.),(457.56,177.703,30.),(457.56,142.905,30.),(457.56,177.703,50.),(457.56,177.703,30.),(436.077,177.703,50.),(436.077,177.703,30.),(457.56,177.703,50.),(436.077,177.703,50.),(433.019,177.154,30.),(436.077,177.703,30.),(433.019,177.154,50.),(433.019,177.154,50.),(431.005,175.507,30.),(433.019,177.154,30.),(431.005,175.507,50.),(431.005,175.507,30.),(429.695,172.255,50.),(429.695,172.255,30.),(431.005,175.507,50.),(429.695,172.255,30.),(428.746,166.892,50.),(428.746,166.892,30.),(429.695,172.255,50.),(428.746,166.892,50.),(426.445,166.892,30.),(428.746,166.892,30.),(426.445,166.892,50.),(426.445,166.892,50.),(426.445,206.926,30.),(426.445,166.892,30.),(426.445,206.926,50.),(426.445,206.926,50.),(428.746,206.926,30.),(426.445,206.926,30.),(428.746,206.926,50.),(428.746,206.926,30.),(429.693,201.52,50.),(429.693,201.52,30.),(428.746,206.926,50.),(429.693,201.52,30.),(431.001,198.276,50.),(431.001,198.276,30.),(429.693,201.52,50.),(431.001,198.276,50.),(436.064,196.115,30.),(431.001,198.276,30.),(436.064,196.115,50.),(436.064,196.115,50.),(473.671,196.115,30.),(436.064,196.115,30.),(473.671,196.115,50.),(473.671,196.115,30.),(473.671,191.554,50.),(473.671,191.554,30.),(473.671,196.115,50.),(473.671,191.554,50.),(470.943,189.675,30.),(473.671,191.554,30.),(470.943,189.675,50.),(470.943,189.675,30.),(469.306,187.078,50.),(469.306,187.078,30.),(470.943,189.675,50.),(469.306,187.078,30.),(468.215,177.027,50.),(468.215,177.027,30.),(469.306,187.078,50.),(468.215,177.027,30.),(468.215,157.432,50.),(468.215,157.432,30.),(468.215,177.027,50.),(468.215,157.432,30.),(469.306,147.382,50.),(469.306,147.382,30.),(468.215,157.432,50.),(469.306,147.382,30.),(470.943,144.785,50.),(470.943,144.785,30.),(469.306,147.382,50.),(470.943,144.785,50.),(473.671,142.905,30.),(470.943,144.785,30.),(473.671,142.905,50.),(473.671,142.905,30.),(473.671,139.02,50.),(473.671,139.02,30.),(473.671,142.905,50.),(473.671,139.02,30.),(462.145,122.54,50.),(462.145,122.54,30.),(473.671,139.02,50.),(462.145,122.54,50.),(449.715,110.769,30.),(462.145,122.54,30.),(449.715,110.769,50.),(449.715,110.769,50.),(436.379,103.706,30.),(449.715,110.769,30.),(436.379,103.706,50.),(436.379,103.706,50.),(422.138,101.351,30.),(436.379,103.706,30.),(422.138,101.351,50.),(422.138,101.351,30.),(411.076,102.893,50.),(411.076,102.893,30.),(422.138,101.351,50.),(411.076,102.893,50.),(401.057,107.517,30.),(411.076,102.893,30.),(401.057,107.517,50.),(401.057,107.517,30.),(392.081,115.224,50.),(392.081,115.224,30.),(401.057,107.517,50.),(392.081,115.224,50.),(384.149,126.014,30.),(392.081,115.224,30.),(384.149,126.014,50.),(384.149,126.014,50.),(377.079,140.709,30.),(384.149,126.014,30.),(377.079,140.709,50.),(377.079,140.709,50.),(371.712,158.108,30.),(377.079,140.709,30.),(371.712,158.108,50.),(371.712,158.108,50.),(368.071,178.421,30.),(371.712,158.108,30.),(368.071,178.421,50.),(368.071,178.421,50.),(366.857,199.493,30.),(368.071,178.421,30.),(366.857,199.493,50.),(366.857,199.493,50.),(367.465,214.981,30.),(366.857,199.493,30.),(367.465,214.981,50.),(367.465,214.981,50.),(369.287,229.688,30.),(367.465,214.981,30.),(369.287,229.688,50.),(369.287,229.688,50.),(372.324,243.613,30.),(369.287,229.688,30.),(372.324,243.613,50.),(372.324,243.613,50.),(376.576,256.757,30.),(372.324,243.613,30.),(376.576,256.757,50.),(376.576,256.757,50.),(381.28,267.325,30.),(376.576,256.757,30.),(381.28,267.325,50.),(381.28,267.325,50.),(386.699,276.394,30.),(381.28,267.325,30.),(386.699,276.394,50.),(386.699,276.394,50.),(392.831,283.963,30.),(386.699,276.394,30.),(392.831,283.963,50.),(392.831,283.963,30.),(399.677,290.034,50.),(399.677,290.034,30.),(392.831,283.963,50.),(399.677,290.034,50.),(410.802,295.988,30.),(399.677,290.034,30.),(410.802,295.988,50.),(410.802,295.988,30.),(422.694,297.973,50.),(422.694,297.973,30.),(410.802,295.988,50.),(422.694,297.973,50.),(432.806,296.706,30.),(422.694,297.973,30.),(432.806,296.706,50.),(432.806,296.706,50.),(442.002,292.905,30.),(432.806,296.706,30.),(442.002,292.905,50.),(442.002,292.905,50.),(451.603,285.853,30.),(442.002,292.905,30.),(451.603,285.853,50.),(451.603,285.853,50.),(462.93,274.831,30.),(451.603,285.853,30.),(462.93,274.831,50.),(462.93,274.831,50.),(465.743,272.804,30.),(462.93,274.831,30.),(465.743,272.804,50.),(465.743,272.804,50.),(469.75,279.561,30.),(465.743,272.804,30.),(469.75,279.561,50.),(469.75,279.561,30.),(471.71,276.858,50.),(471.71,276.858,30.),(469.75,279.561,50.),(499.322,140.709,50.),(502.649,182.454,50.),(501.888,198.818,50.),(506.392,126.014,50.),(504.935,167.652,50.),(508.745,154.413,50.),(514.324,115.224,50.),(514.078,142.736,50.),(520.567,133.203,50.),(523.3,107.517,50.),(528.016,126.394,50.),(533.319,102.893,50.),(536.423,122.308,50.),(544.382,101.351,50.),(545.789,120.946,50.),(558.622,103.706,50.),(555.444,122.403,50.),(564.629,126.774,50.),(571.958,110.769,50.),(572.898,133.72,50.),(584.388,122.54,50.),(579.803,142.905,50.),(579.803,177.703,50.),(591.549,147.382,50.),(590.459,157.432,50.),(595.914,139.02,50.),(593.186,144.785,50.),(595.914,142.905,50.),(550.989,166.892,50.),(548.688,206.926,50.),(548.688,166.892,50.),(550.989,206.926,50.),(551.936,201.52,50.),(551.938,172.255,50.),(553.244,198.276,50.),(553.248,175.507,50.),(558.307,196.115,50.),(555.262,177.154,50.),(558.321,177.703,50.),(595.914,196.115,50.),(591.549,187.078,50.),(590.459,177.027,50.),(593.186,189.675,50.),(595.914,191.554,50.),(582.232,239.696,50.),(581.124,250.,50.),(580.273,242.061,50.),(490.314,178.421,50.),(489.708,214.981,50.),(489.101,199.493,50.),(491.53,229.688,50.),(493.956,158.108,50.),(494.567,243.613,50.),(498.819,256.757,50.),(503.523,267.325,50.),(502.718,216.058,50.),(505.211,231.63,50.),(508.942,276.394,50.),(509.364,245.534,50.),(515.074,283.963,50.),(515.179,257.77,50.),(521.92,290.034,50.),(521.527,266.786,50.),(528.641,273.226,50.),(533.045,295.988,50.),(536.522,277.09,50.),(544.937,297.973,50.),(545.17,278.378,50.),(555.049,296.706,50.),(552.439,277.46,50.),(559.505,274.704,50.),(564.245,292.905,50.),(566.369,270.112,50.),(573.846,285.853,50.),(573.031,263.682,50.),(579.101,255.617,50.),(585.173,274.831,50.),(587.986,272.804,50.),(593.954,276.858,50.),(591.993,279.561,50.),(593.954,276.858,30.),(582.232,239.696,50.),(582.232,239.696,30.),(593.954,276.858,50.),(582.232,239.696,50.),(580.273,242.061,30.),(582.232,239.696,30.),(580.273,242.061,50.),(580.273,242.061,50.),(581.124,250.,30.),(580.273,242.061,30.),(581.124,250.,50.),(581.124,250.,50.),(579.101,255.617,30.),(581.124,250.,30.),(579.101,255.617,50.),(579.101,255.617,50.),(573.031,263.682,30.),(579.101,255.617,30.),(573.031,263.682,50.),(573.031,263.682,30.),(566.369,270.112,50.),(566.369,270.112,30.),(573.031,263.682,50.),(566.369,270.112,30.),(559.505,274.704,50.),(559.505,274.704,30.),(566.369,270.112,50.),(559.505,274.704,50.),(552.439,277.46,30.),(559.505,274.704,30.),(552.439,277.46,50.),(552.439,277.46,50.),(545.17,278.378,30.),(552.439,277.46,30.),(545.17,278.378,50.),(545.17,278.378,30.),(536.522,277.09,50.),(536.522,277.09,30.),(545.17,278.378,50.),(536.522,277.09,50.),(528.641,273.226,30.),(536.522,277.09,30.),(528.641,273.226,50.),(528.641,273.226,50.),(521.527,266.786,30.),(528.641,273.226,30.),(521.527,266.786,50.),(521.527,266.786,30.),(515.179,257.77,50.),(515.179,257.77,30.),(521.527,266.786,50.),(515.179,257.77,30.),(509.364,245.534,50.),(509.364,245.534,30.),(515.179,257.77,50.),(509.364,245.534,30.),(505.211,231.63,50.),(505.211,231.63,30.),(509.364,245.534,50.),(505.211,231.63,30.),(502.718,216.058,50.),(502.718,216.058,30.),(505.211,231.63,50.),(502.718,216.058,30.),(501.888,198.818,50.),(501.888,198.818,30.),(502.718,216.058,50.),(501.888,198.818,30.),(502.649,182.454,50.),(502.649,182.454,30.),(501.888,198.818,50.),(502.649,182.454,30.),(504.935,167.652,50.),(504.935,167.652,30.),(502.649,182.454,50.),(504.935,167.652,30.),(508.745,154.413,50.),(508.745,154.413,30.),(504.935,167.652,50.),(508.745,154.413,30.),(514.078,142.736,50.),(514.078,142.736,30.),(508.745,154.413,50.),(514.078,142.736,30.),(520.567,133.203,50.),(520.567,133.203,30.),(514.078,142.736,50.),(520.567,133.203,50.),(528.016,126.394,30.),(520.567,133.203,30.),(528.016,126.394,50.),(528.016,126.394,50.),(536.423,122.308,30.),(528.016,126.394,30.),(536.423,122.308,50.),(536.423,122.308,50.),(545.789,120.946,30.),(536.423,122.308,30.),(545.789,120.946,50.),(545.789,120.946,50.),(555.444,122.403,30.),(545.789,120.946,30.),(555.444,122.403,50.),(555.444,122.403,30.),(564.629,126.774,50.),(564.629,126.774,30.),(555.444,122.403,50.),(564.629,126.774,30.),(572.898,133.72,50.),(572.898,133.72,30.),(564.629,126.774,50.),(572.898,133.72,50.),(579.803,142.905,30.),(572.898,133.72,30.),(579.803,142.905,50.),(579.803,142.905,50.),(579.803,177.703,30.),(579.803,142.905,30.),(579.803,177.703,50.),(579.803,177.703,50.),(558.321,177.703,30.),(579.803,177.703,30.),(558.321,177.703,50.),(558.321,177.703,50.),(555.262,177.154,30.),(558.321,177.703,30.),(555.262,177.154,50.),(555.262,177.154,50.),(553.248,175.507,30.),(555.262,177.154,30.),(553.248,175.507,50.),(553.248,175.507,30.),(551.938,172.255,50.),(551.938,172.255,30.),(553.248,175.507,50.),(551.938,172.255,30.),(550.989,166.892,50.),(550.989,166.892,30.),(551.938,172.255,50.),(550.989,166.892,50.),(548.688,166.892,30.),(550.989,166.892,30.),(548.688,166.892,50.),(548.688,166.892,50.),(548.688,206.926,30.),(548.688,166.892,30.),(548.688,206.926,50.),(548.688,206.926,30.),(550.989,206.926,50.),(550.989,206.926,30.),(548.688,206.926,50.),(550.989,206.926,30.),(551.936,201.52,50.),(551.936,201.52,30.),(550.989,206.926,50.),(551.936,201.52,30.),(553.244,198.276,50.),(553.244,198.276,30.),(551.936,201.52,50.),(553.244,198.276,50.),(558.307,196.115,30.),(553.244,198.276,30.),(558.307,196.115,50.),(558.307,196.115,50.),(595.914,196.115,30.),(558.307,196.115,30.),(595.914,196.115,50.),(595.914,196.115,30.),(595.914,191.554,50.),(595.914,191.554,30.),(595.914,196.115,50.),(595.914,191.554,50.),(593.186,189.675,30.),(595.914,191.554,30.),(593.186,189.675,50.),(593.186,189.675,30.),(591.549,187.078,50.),(591.549,187.078,30.),(593.186,189.675,50.),(591.549,187.078,30.),(590.459,177.027,50.),(590.459,177.027,30.),(591.549,187.078,50.),(590.459,177.027,30.),(590.459,157.432,50.),(590.459,157.432,30.),(590.459,177.027,50.),(590.459,157.432,30.),(591.549,147.382,50.),(591.549,147.382,30.),(590.459,157.432,50.),(591.549,147.382,30.),(593.186,144.785,50.),(593.186,144.785,30.),(591.549,147.382,50.),(593.186,144.785,50.),(595.914,142.905,30.),(593.186,144.785,30.),(595.914,142.905,50.),(595.914,142.905,30.),(595.914,139.02,50.),(595.914,139.02,30.),(595.914,142.905,50.),(595.914,139.02,30.),(584.388,122.54,50.),(584.388,122.54,30.),(595.914,139.02,50.),(584.388,122.54,50.),(571.958,110.769,30.),(584.388,122.54,30.),(571.958,110.769,50.),(571.958,110.769,50.),(558.622,103.706,30.),(571.958,110.769,30.),(558.622,103.706,50.),(558.622,103.706,50.),(544.382,101.351,30.),(558.622,103.706,30.),(544.382,101.351,50.),(544.382,101.351,30.),(533.319,102.893,50.),(533.319,102.893,30.),(544.382,101.351,50.),(533.319,102.893,30.),(523.3,107.517,50.),(523.3,107.517,30.),(533.319,102.893,50.),(523.3,107.517,30.),(514.324,115.224,50.),(514.324,115.224,30.),(523.3,107.517,50.),(514.324,115.224,50.),(506.392,126.014,30.),(514.324,115.224,30.),(506.392,126.014,50.),(506.392,126.014,50.),(499.322,140.709,30.),(506.392,126.014,30.),(499.322,140.709,50.),(499.322,140.709,50.),(493.956,158.108,30.),(499.322,140.709,30.),(493.956,158.108,50.),(493.956,158.108,50.),(490.314,178.421,30.),(493.956,158.108,30.),(490.314,178.421,50.),(490.314,178.421,50.),(489.101,199.493,30.),(490.314,178.421,30.),(489.101,199.493,50.),(489.101,199.493,50.),(489.708,214.981,30.),(489.101,199.493,30.),(489.708,214.981,50.),(489.708,214.981,50.),(491.53,229.688,30.),(489.708,214.981,30.),(491.53,229.688,50.),(491.53,229.688,50.),(494.567,243.613,30.),(491.53,229.688,30.),(494.567,243.613,50.),(494.567,243.613,50.),(498.819,256.757,30.),(494.567,243.613,30.),(498.819,256.757,50.),(498.819,256.757,50.),(503.523,267.325,30.),(498.819,256.757,30.),(503.523,267.325,50.),(503.523,267.325,50.),(508.942,276.394,30.),(503.523,267.325,30.),(508.942,276.394,50.),(508.942,276.394,50.),(515.074,283.963,30.),(508.942,276.394,30.),(515.074,283.963,50.),(515.074,283.963,30.),(521.92,290.034,50.),(521.92,290.034,30.),(515.074,283.963,50.),(521.92,290.034,30.),(533.045,295.988,50.),(533.045,295.988,30.),(521.92,290.034,50.),(533.045,295.988,50.),(544.937,297.973,30.),(533.045,295.988,30.),(544.937,297.973,50.),(544.937,297.973,50.),(555.049,296.706,30.),(544.937,297.973,30.),(555.049,296.706,50.),(555.049,296.706,50.),(564.245,292.905,30.),(555.049,296.706,30.),(564.245,292.905,50.),(564.245,292.905,50.),(573.846,285.853,30.),(564.245,292.905,30.),(573.846,285.853,50.),(573.846,285.853,50.),(585.173,274.831,30.),(573.846,285.853,30.),(585.173,274.831,50.),(585.173,274.831,50.),(587.986,272.804,30.),(585.173,274.831,30.),(587.986,272.804,50.),(587.986,272.804,50.),(591.993,279.561,30.),(587.986,272.804,30.),(591.993,279.561,50.),(591.993,279.561,30.),(593.954,276.858,50.),(593.954,276.858,30.),(591.993,279.561,50.),(631.291,193.919,30.),(631.291,123.818,50.),(631.291,123.818,30.),(631.291,193.919,50.),(631.291,123.818,50.),(690.282,123.818,30.),(631.291,123.818,30.),(690.282,123.818,50.),(690.282,123.818,30.),(695.354,125.979,50.),(695.354,125.979,30.),(690.282,123.818,50.),(695.354,125.979,50.),(696.665,129.222,30.),(695.354,125.979,30.),(696.665,129.222,50.),(696.665,129.222,50.),(697.613,134.628,30.),(696.665,129.222,30.),(697.613,134.628,50.),(697.613,134.628,30.),(700.,134.628,50.),(700.,134.628,30.),(697.613,134.628,50.),(700.,134.628,30.),(700.,94.595,50.),(700.,94.595,30.),(700.,134.628,50.),(700.,94.595,50.),(697.613,94.595,30.),(700.,94.595,30.),(697.613,94.595,50.),(697.613,94.595,50.),(696.675,99.958,30.),(697.613,94.595,30.),(696.675,99.958,50.),(696.675,99.958,50.),(695.397,103.209,30.),(696.675,99.958,30.),(695.397,103.209,50.),(695.397,103.209,30.),(693.415,104.856,50.),(693.415,104.856,30.),(695.397,103.209,50.),(693.415,104.856,50.),(690.367,105.405,30.),(693.415,104.856,30.),(690.367,105.405,50.),(690.367,105.405,50.),(613.645,105.405,30.),(690.367,105.405,30.),(613.645,105.405,50.),(613.645,105.405,50.),(613.645,109.966,30.),(613.645,105.405,30.),(613.645,109.966,50.),(613.645,109.966,50.),(616.405,111.972,30.),(613.645,109.966,30.),(616.405,111.972,50.),(616.405,111.972,50.),(618.036,114.611,30.),(616.405,111.972,30.),(618.036,114.611,50.),(618.036,114.611,50.),(619.101,124.493,30.),(618.036,114.611,30.),(619.101,124.493,50.),(619.101,124.493,50.),(619.101,275.507,30.),(619.101,124.493,30.),(619.101,275.507,50.),(619.101,275.507,50.),(618.824,281.546,30.),(619.101,275.507,30.),(618.824,281.546,50.),(618.824,281.546,50.),(617.993,285.473,30.),(618.824,281.546,30.),(617.993,285.473,50.),(617.993,285.473,50.),(616.352,288.049,30.),(617.993,285.473,30.),(616.352,288.049,50.),(616.352,288.049,30.),(613.645,290.034,50.),(613.645,290.034,30.),(616.352,288.049,50.),(699.403,305.405,30.),(699.403,265.372,50.),(699.403,265.372,30.),(699.403,305.405,50.),(699.403,265.372,50.),(697.102,265.372,30.),(699.403,265.372,30.),(697.102,265.372,50.),(697.102,265.372,50.),(696.1,270.778,30.),(697.102,265.372,30.),(696.1,270.778,50.),(696.1,270.778,50.),(694.8,274.021,30.),(696.1,270.778,30.),(694.8,274.021,50.),(694.8,274.021,30.),(692.818,275.642,50.),(692.818,275.642,30.),(694.8,274.021,50.),(692.818,275.642,50.),(689.77,276.182,30.),(692.818,275.642,30.),(689.77,276.182,50.),(689.77,276.182,30.),(631.291,276.182,50.),(631.291,276.182,30.),(689.77,276.182,50.),(631.291,276.182,30.),(631.291,212.331,50.),(631.291,212.331,30.),(631.291,276.182,50.),(631.291,212.331,30.),(668.544,212.331,50.),(668.544,212.331,30.),(631.291,212.331,50.),(668.544,212.331,50.),(671.592,212.88,30.),(668.544,212.331,30.),(671.592,212.88,50.),(671.592,212.88,30.),(673.574,214.527,50.),(673.574,214.527,30.),(671.592,212.88,50.),(673.574,214.527,50.),(674.874,217.779,30.),(673.574,214.527,30.),(674.874,217.779,50.),(674.874,217.779,50.),(675.875,223.142,30.),(674.874,217.779,30.),(675.875,223.142,50.),(675.875,223.142,30.),(678.177,223.142,50.),(678.177,223.142,30.),(675.875,223.142,50.),(678.177,223.142,30.),(678.177,183.108,50.),(678.177,183.108,30.),(678.177,223.142,50.),(678.177,183.108,50.),(675.875,183.108,30.),(678.177,183.108,30.),(675.875,183.108,50.),(675.875,183.108,50.),(674.863,188.514,30.),(675.875,183.108,30.),(674.863,188.514,50.),(674.863,188.514,50.),(673.531,191.757,30.),(674.863,188.514,30.),(673.531,191.757,50.),(673.531,191.757,30.),(668.544,193.919,50.),(668.544,193.919,30.),(673.531,191.757,50.),(668.544,193.919,50.),(631.291,193.919,30.),(668.544,193.919,30.),(631.291,193.919,50.),(690.367,105.405,50.),(613.645,109.966,50.),(613.645,105.405,50.),(616.405,111.972,50.),(618.036,114.611,50.),(619.101,124.493,50.),(631.291,123.818,50.),(619.101,275.507,50.),(690.282,123.818,50.),(695.354,125.979,50.),(693.415,104.856,50.),(695.397,103.209,50.),(696.665,129.222,50.),(696.675,99.958,50.),(697.613,134.628,50.),(697.613,94.595,50.),(700.,94.595,50.),(700.,134.628,50.),(631.291,193.919,50.),(631.291,212.331,50.),(668.544,212.331,50.),(668.544,193.919,50.),(673.531,191.757,50.),(671.592,212.88,50.),(673.574,214.527,50.),(674.863,188.514,50.),(674.874,217.779,50.),(675.875,183.108,50.),(675.875,223.142,50.),(678.177,183.108,50.),(678.177,223.142,50.),(616.352,288.049,50.),(613.645,294.595,50.),(613.645,290.034,50.),(689.77,294.595,50.),(617.993,285.473,50.),(618.824,281.546,50.),(631.291,276.182,50.),(689.77,276.182,50.),(692.818,275.642,50.),(692.818,295.144,50.),(694.8,296.791,50.),(694.8,274.021,50.),(696.1,300.042,50.),(696.1,270.778,50.),(697.102,265.372,50.),(697.102,305.405,50.),(699.403,265.372,50.),(699.403,305.405,50.),(613.645,290.034,50.),(613.645,294.595,30.),(613.645,290.034,30.),(613.645,294.595,50.),(697.102,305.405,50.),(699.403,305.405,30.),(697.102,305.405,30.),(699.403,305.405,50.),(613.645,294.595,50.),(689.77,294.595,30.),(613.645,294.595,30.),(689.77,294.595,50.),(696.1,300.042,50.),(697.102,305.405,30.),(696.1,300.042,30.),(697.102,305.405,50.),(689.77,294.595,50.),(692.818,295.144,30.),(689.77,294.595,30.),(692.818,295.144,50.),(692.818,295.144,30.),(694.8,296.791,50.),(694.8,296.791,30.),(692.818,295.144,50.),(694.8,296.791,50.),(696.1,300.042,30.),(694.8,296.791,30.),(696.1,300.042,50.),(689.77,294.595,30.),(613.645,290.034,30.),(613.645,294.595,30.),(616.352,288.049,30.),(617.993,285.473,30.),(618.824,281.546,30.),(619.101,275.507,30.),(631.291,276.182,30.),(619.101,124.493,30.),(631.291,212.331,30.),(689.77,276.182,30.),(692.818,295.144,30.),(692.818,275.642,30.),(694.8,296.791,30.),(694.8,274.021,30.),(696.1,300.042,30.),(696.1,270.778,30.),(697.102,305.405,30.),(697.102,265.372,30.),(699.403,265.372,30.),(699.403,305.405,30.),(631.291,193.919,30.),(631.291,123.818,30.),(668.544,212.331,30.),(668.544,193.919,30.),(671.592,212.88,30.),(673.531,191.757,30.),(673.574,214.527,30.),(674.863,188.514,30.),(674.874,217.779,30.),(675.875,183.108,30.),(675.875,223.142,30.),(678.177,223.142,30.),(678.177,183.108,30.),(616.405,111.972,30.),(613.645,105.405,30.),(613.645,109.966,30.),(690.367,105.405,30.),(618.036,114.611,30.),(690.282,123.818,30.),(695.354,125.979,30.),(693.415,104.856,30.),(695.397,103.209,30.),(696.665,129.222,30.),(696.675,99.958,30.),(697.613,134.628,30.),(697.613,94.595,30.),(700.,94.595,30.),(700.,134.628,30.),(489.708,214.981,30.),(490.314,178.421,30.),(489.101,199.493,30.),(491.53,229.688,30.),(493.956,158.108,30.),(494.567,243.613,30.),(499.322,140.709,30.),(498.819,256.757,30.),(503.523,267.325,30.),(501.888,198.818,30.),(502.718,216.058,30.),(505.211,231.63,30.),(508.942,276.394,30.),(509.364,245.534,30.),(515.074,283.963,30.),(515.179,257.77,30.),(521.92,290.034,30.),(521.527,266.786,30.),(528.641,273.226,30.),(533.045,295.988,30.),(536.522,277.09,30.),(544.937,297.973,30.),(545.17,278.378,30.),(555.049,296.706,30.),(552.439,277.46,30.),(559.505,274.704,30.),(564.245,292.905,30.),(566.369,270.112,30.),(573.846,285.853,30.),(573.031,263.682,30.),(579.101,255.617,30.),(585.173,274.831,30.),(581.124,250.,30.),(582.232,239.696,30.),(587.986,272.804,30.),(593.954,276.858,30.),(591.993,279.561,30.),(580.273,242.061,30.),(550.989,206.926,30.),(548.688,166.892,30.),(548.688,206.926,30.),(550.989,166.892,30.),(551.936,201.52,30.),(551.938,172.255,30.),(553.244,198.276,30.),(553.248,175.507,30.),(558.307,196.115,30.),(555.262,177.154,30.),(558.321,177.703,30.),(595.914,196.115,30.),(579.803,177.703,30.),(591.549,187.078,30.),(579.803,142.905,30.),(584.388,122.54,30.),(590.459,177.027,30.),(590.459,157.432,30.),(593.186,189.675,30.),(595.914,191.554,30.),(591.549,147.382,30.),(595.914,139.02,30.),(593.186,144.785,30.),(595.914,142.905,30.),(502.649,182.454,30.),(506.392,126.014,30.),(504.935,167.652,30.),(508.745,154.413,30.),(514.324,115.224,30.),(514.078,142.736,30.),(520.567,133.203,30.),(523.3,107.517,30.),(528.016,126.394,30.),(533.319,102.893,30.),(536.423,122.308,30.),(544.382,101.351,30.),(545.789,120.946,30.),(558.622,103.706,30.),(555.444,122.403,30.),(564.629,126.774,30.),(571.958,110.769,30.),(572.898,133.72,30.),(367.465,214.981,30.),(368.071,178.421,30.),(366.857,199.493,30.),(369.287,229.688,30.),(371.712,158.108,30.),(372.324,243.613,30.),(377.079,140.709,30.),(376.576,256.757,30.),(381.28,267.325,30.),(379.644,198.818,30.),(380.475,216.058,30.),(382.967,231.63,30.),(386.699,276.394,30.),(387.121,245.534,30.),(392.831,283.963,30.),(392.936,257.77,30.),(399.677,290.034,30.),(399.284,266.786,30.),(406.398,273.226,30.),(410.802,295.988,30.),(414.279,277.09,30.),(422.694,297.973,30.),(422.927,278.378,30.),(432.806,296.706,30.),(430.196,277.46,30.),(437.262,274.704,30.),(442.002,292.905,30.),(444.126,270.112,30.),(451.603,285.853,30.),(450.788,263.682,30.),(456.858,255.617,30.),(462.93,274.831,30.),(458.881,250.,30.),(459.989,239.696,30.),(465.743,272.804,30.),(471.71,276.858,30.),(469.75,279.561,30.),(458.03,242.061,30.),(426.445,206.926,30.),(428.746,166.892,30.),(426.445,166.892,30.),(428.746,206.926,30.),(429.693,201.52,30.),(429.695,172.255,30.),(431.001,198.276,30.),(431.005,175.507,30.),(436.064,196.115,30.),(433.019,177.154,30.),(436.077,177.703,30.),(473.671,196.115,30.),(457.56,177.703,30.),(469.306,187.078,30.),(457.56,142.905,30.),(462.145,122.54,30.),(468.215,177.027,30.),(470.943,189.675,30.),(473.671,191.554,30.),(469.306,147.382,30.),(473.671,139.02,30.),(468.215,157.432,30.),(470.943,144.785,30.),(473.671,142.905,30.),(380.406,182.454,30.),(384.149,126.014,30.),(382.692,167.652,30.),(386.501,154.413,30.),(392.081,115.224,30.),(391.835,142.736,30.),(398.324,133.203,30.),(401.057,107.517,30.),(405.772,126.394,30.),(411.076,102.893,30.),(414.18,122.308,30.),(422.138,101.351,30.),(423.546,120.946,30.),(436.379,103.706,30.),(433.2,122.403,30.),(442.386,126.774,30.),(449.715,110.769,30.),(450.655,133.72,30.),(289.849,294.595,30.),(262.942,290.034,30.),(262.942,294.595,30.),(266.203,287.373,30.),(268.995,283.446,30.),(276.923,264.886,30.),(287.038,287.838,30.),(286.101,283.615,30.),(289.849,290.034,30.),(286.676,278.593,30.),(306.333,188.936,30.),(288.4,272.986,30.),(313.579,207.683,30.),(306.333,124.493,30.),(359.782,294.595,30.),(335.448,290.034,30.),(335.448,294.595,30.),(338.282,287.838,30.),(339.227,283.277,30.),(352.707,281.334,30.),(343.841,259.655,30.),(356.095,286.592,30.),(359.782,290.034,30.),(336.897,272.817,30.),(318.523,188.936,30.),(300.877,109.966,30.),(323.979,105.405,30.),(300.877,105.405,30.),(303.583,111.972,30.),(305.224,114.611,30.),(306.056,118.56,30.),(319.588,114.611,30.),(318.523,124.493,30.),(321.219,111.972,30.),(323.979,109.966,30.),(219.381,294.595,30.),(162.693,290.034,30.),(162.693,294.595,30.),(165.399,288.049,30.),(167.04,285.473,30.),(167.871,281.546,30.),(168.148,275.507,30.),(180.339,276.182,30.),(180.339,124.493,30.),(180.339,191.047,30.),(218.017,276.182,30.),(229.888,274.113,30.),(228.13,293.919,30.),(235.109,291.892,30.),(234.305,271.527,30.),(237.709,267.905,30.),(240.81,288.26,30.),(240.469,262.88,30.),(242.44,256.757,30.),(245.722,282.77,30.),(243.623,249.535,30.),(244.018,241.216,30.),(244.849,202.191,30.),(248.706,207.855,30.),(250.049,275.042,30.),(251.727,214.722,30.),(253.139,265.709,30.),(253.885,222.741,30.),(254.993,254.772,30.),(255.179,231.91,30.),(255.611,242.23,30.),(229.824,210.726,30.),(228.417,192.736,30.),(216.653,209.459,30.),(234.704,194.632,30.),(237.283,215.372,30.),(240.181,197.783,30.),(240.229,219.774,30.),(242.334,225.549,30.),(243.597,232.696,30.),(180.339,209.459,30.),(215.05,191.047,30.),(237.011,122.297,30.),(252.372,117.399,30.),(238.973,114.189,30.),(235.647,109.966,30.),(259.277,105.405,30.),(235.647,105.405,30.),(238.142,111.698,30.),(254.886,112.148,30.),(259.277,109.966,30.),(165.452,111.972,30.),(162.693,105.405,30.),(162.693,109.966,30.),(185.794,105.405,30.),(167.083,114.611,30.),(168.148,124.493,30.),(181.447,114.611,30.),(180.616,118.56,30.),(183.088,111.972,30.),(185.794,109.966,30.),(49.741,294.595,30.),(52.448,288.049,30.),(49.741,290.034,30.),(107.027,294.595,30.),(54.089,285.473,30.),(54.92,281.546,30.),(55.197,275.507,30.),(67.387,276.182,30.),(67.387,213.514,30.),(102.594,276.182,30.),(115.083,274.916,30.),(121.519,292.314,30.),(122.542,269.932,30.),(126.697,289.253,30.),(125.861,265.034,30.),(128.232,258.953,30.),(131.151,284.628,30.),(129.654,251.689,30.),(130.128,243.243,30.),(128.487,229.265,30.),(128.168,204.561,30.),(126.436,223.955,30.),(134.135,212.099,30.),(129.718,235.695,30.),(135.574,277.196,30.),(138.397,221.199,30.),(138.951,267.399,30.),(140.955,231.862,30.),(141.093,256.081,30.),(141.807,244.088,30.),(67.387,195.101,30.),(67.387,123.818,30.),(103.617,213.514,30.),(104.299,195.101,30.),(116.276,214.78,30.),(117.469,193.581,30.),(123.565,219.764,30.),(121.615,191.385,30.),(125.269,187.838,30.),(128.775,182.348,30.),(135.515,196.59,30.),(131.279,175.507,30.),(132.782,167.314,30.),(133.283,157.77,30.),(49.741,109.966,30.),(108.817,105.405,30.),(49.741,105.405,30.),(52.448,111.972,30.),(54.089,114.611,30.),(54.92,118.56,30.),(55.197,124.493,30.),(105.407,123.818,30.),(118.705,125.253,30.),(118.173,106.208,30.),(125.44,108.615,30.),(122.755,127.386,30.),(126.378,130.912,30.),(131.301,113.007,30.),(129.399,135.821,30.),(131.556,141.934,30.),(136.437,119.764,30.),(132.851,149.25,30.),(140.763,186.191,30.),(140.166,127.544,30.),(142.83,136.529,30.),(143.912,173.364,30.),(144.429,146.717,30.),(144.961,158.108,30.),(-21.866,294.595,30.),(-97.991,290.034,30.),(-97.991,294.595,30.),(-95.284,288.049,30.),(-93.643,285.473,30.),(-92.812,281.546,30.),(-92.535,275.507,30.),(-80.345,276.182,30.),(-21.866,276.182,30.),(-18.818,295.144,30.),(-18.818,275.642,30.),(-16.836,274.021,30.),(-16.836,296.791,30.),(-15.536,300.042,30.),(-15.536,270.778,30.),(-14.534,305.405,30.),(-14.534,265.372,30.),(-12.233,305.405,30.),(-12.233,265.372,30.),(-80.345,212.331,30.),(-80.345,193.919,30.),(-43.092,193.919,30.),(-43.092,212.331,30.),(-38.105,191.757,30.),(-40.044,212.88,30.),(-38.062,214.527,30.),(-36.773,188.514,30.),(-36.762,217.779,30.),(-35.761,183.108,30.),(-35.761,223.142,30.),(-33.459,183.108,30.),(-33.459,223.142,30.),(-97.991,109.966,30.),(-21.269,105.405,30.),(-97.991,105.405,30.),(-95.231,111.972,30.),(-93.6,114.611,30.),(-92.535,124.493,30.),(-80.345,123.818,30.),(-21.354,123.818,30.),(-16.282,125.979,30.),(-18.221,104.856,30.),(-16.239,103.209,30.),(-14.971,129.222,30.),(-14.961,99.958,30.),(-14.023,134.628,30.),(-14.023,94.595,30.),(-11.636,94.595,30.),(-11.636,134.628,30.),(-169.171,294.595,30.),(-217.421,290.034,30.),(-217.421,294.595,30.),(-214.661,288.028,30.),(-213.031,285.389,30.),(-211.965,275.507,30.),(-199.775,276.182,30.),(-199.775,123.818,30.),(-169.853,276.182,30.),(-158.697,275.,30.),(-152.293,292.356,30.),(-150.119,271.453,30.),(-145.707,289.559,30.),(-143.416,265.076,30.),(-140.358,285.642,30.),(-137.886,255.405,30.),(-134.796,279.054,30.),(-133.97,244.151,30.),(-129.873,270.608,30.),(-131.173,231.166,30.),(-129.494,216.448,30.),(-125.589,260.304,30.),(-128.935,200.,30.),(-127.366,135.008,30.),(-123.82,145.101,30.),(-121.945,248.142,30.),(-120.464,157.908,30.),(-117.597,224.789,30.),(-118.066,171.326,30.),(-116.628,185.357,30.),(-116.148,200.,30.),(-217.421,109.966,30.),(-169.171,105.405,30.),(-217.421,105.405,30.),(-214.661,111.972,30.),(-213.031,114.611,30.),(-211.965,124.493,30.),(-169.853,123.818,30.),(-155.17,126.098,30.),(-152.879,107.644,30.),(-149.538,128.948,30.),(-146.259,110.441,30.),(-145.047,132.939,30.),(-140.656,114.358,30.),(-140.976,138.64,30.),(-137.46,145.777,30.),(-135.784,119.637,30.),(-134.497,154.35,30.),(-131.354,126.52,30.),(-132.089,164.358,30.),(-129.724,181.377,30.),(-292.011,294.595,30.),(-315.113,290.034,30.),(-315.113,294.595,30.),(-312.406,288.049,30.),(-310.765,285.473,30.),(-309.934,281.546,30.),(-309.657,275.507,30.),(-296.359,285.473,30.),(-297.19,281.546,30.),(-309.657,124.493,30.),(-297.467,275.507,30.),(-294.718,288.049,30.),(-292.011,290.034,30.),(-312.406,111.972,30.),(-315.113,105.405,30.),(-315.113,109.966,30.),(-239.244,105.405,30.),(-310.765,114.611,30.),(-309.934,118.56,30.),(-297.467,123.818,30.),(-239.244,123.818,30.),(-234.172,125.979,30.),(-236.186,104.856,30.),(-234.172,103.209,30.),(-232.84,99.958,30.),(-232.84,129.222,30.),(-231.827,94.595,30.),(-231.827,134.628,30.),(-229.526,94.595,30.),(-229.526,134.628,30.),(-447.847,214.569,30.),(-447.314,178.885,30.),(-448.353,200.,30.),(-446.328,228.378,30.),(-444.197,159.797,30.),(-443.798,241.427,30.),(-439.002,142.736,30.),(-440.255,253.716,30.),(-435.518,265.446,30.),(-435.566,200.,30.),(-434.873,215.266,30.),(-429.918,275.465,30.),(-432.795,229.307,30.),(-429.332,242.124,30.),(-423.456,283.773,30.),(-424.484,253.716,30.),(-417.627,264.802,30.),(-416.13,290.372,30.),(-409.758,272.72,30.),(-404.515,296.41,30.),(-400.876,277.47,30.),(-390.982,298.649,30.),(-390.982,279.054,30.),(-378.856,297.002,30.),(-380.971,277.344,30.),(-371.994,272.551,30.),(-367.966,292.061,30.),(-364.05,264.675,30.),(-358.312,283.826,30.),(-357.139,253.716,30.),(-349.893,272.297,30.),(-352.291,242.251,30.),(-348.828,229.307,30.),(-342.621,257.242,30.),(-346.75,214.886,30.),(-346.057,198.986,30.),(-345.6,135.753,30.),(-341.454,146.284,30.),(-337.426,239.949,30.),(-337.874,158.488,30.),(-335.316,171.284,30.),(-334.309,220.418,30.),(-333.782,184.671,30.),(-333.27,198.649,30.),(-434.873,184.734,30.),(-431.73,127.703,30.),(-432.795,170.693,30.),(-429.332,157.876,30.),(-423.322,116.174,30.),(-424.484,146.284,30.),(-417.616,135.198,30.),(-413.7,107.939,30.),(-409.715,127.28,30.),(-402.863,102.998,30.),(-400.78,122.53,30.),(-390.812,101.351,30.),(-390.812,120.946,30.),(-380.843,122.53,30.),(-382.619,102.053,30.),(-375.004,104.16,30.),(-371.908,127.28,30.),(-367.967,107.67,30.),(-364.007,135.198,30.),(-361.508,112.584,30.),(-357.139,146.284,30.),(-355.628,118.903,30.),(-352.291,157.813,30.),(-350.325,126.626,30.),(-348.828,170.439,30.),(-346.75,184.164,30.),(-517.658,294.595,30.),(-593.783,290.034,30.),(-593.783,294.595,30.),(-591.077,288.049,30.),(-589.436,285.473,30.),(-588.604,281.546,30.),(-588.327,275.507,30.),(-576.137,276.182,30.),(-588.327,124.493,30.),(-517.658,276.182,30.),(-514.611,275.642,30.),(-514.611,295.144,30.),(-512.629,296.791,30.),(-512.629,274.021,30.),(-511.329,270.778,30.),(-511.329,300.042,30.),(-510.327,305.405,30.),(-510.327,265.372,30.),(-508.025,265.372,30.),(-508.025,305.405,30.),(-538.884,212.331,30.),(-576.137,193.919,30.),(-576.137,212.331,30.),(-538.884,193.919,30.),(-535.837,212.88,30.),(-533.898,191.757,30.),(-533.855,214.527,30.),(-532.566,188.514,30.),(-532.555,217.779,30.),(-531.553,183.108,30.),(-531.553,223.142,30.),(-529.252,183.108,30.),(-529.252,223.142,30.),(-593.783,109.966,30.),(-517.061,105.405,30.),(-593.783,105.405,30.),(-591.023,111.972,30.),(-589.393,114.611,30.),(-576.137,123.818,30.),(-517.147,123.818,30.),(-512.075,125.979,30.),(-514.014,104.856,30.),(-512.032,103.209,30.),(-510.764,129.222,30.),(-510.753,99.958,30.),(-509.816,134.628,30.),(-509.816,94.595,30.),(-507.429,94.595,30.),(-507.429,134.628,30.),(-673.093,294.595,30.),(-700.,290.034,30.),(-700.,294.595,30.),(-696.739,287.373,30.),(-693.948,283.446,30.),(-686.02,264.886,30.),(-675.904,287.838,30.),(-676.841,283.615,30.),(-673.093,290.034,30.),(-676.266,278.593,30.),(-656.61,188.936,30.),(-674.542,272.986,30.),(-649.364,207.683,30.),(-627.494,294.595,30.),(-624.66,287.838,30.),(-627.494,290.034,30.),(-603.16,294.595,30.),(-623.715,283.277,30.),(-610.236,281.334,30.),(-619.101,259.655,30.),(-606.847,286.592,30.),(-603.16,290.034,30.),(-626.045,272.817,30.),(-644.419,188.936,30.),(-659.359,111.972,30.),(-662.065,105.405,30.),(-662.065,109.966,30.),(-638.964,105.405,30.),(-657.718,114.611,30.),(-656.887,118.56,30.),(-656.61,124.493,30.),(-643.354,114.611,30.),(-644.419,124.493,30.),(-641.723,111.972,30.),(-638.964,109.966,30.),(-517.061,105.405,50.),(-593.783,109.966,50.),(-593.783,105.405,50.),(-591.023,111.972,50.),(-589.393,114.611,50.),(-588.327,124.493,50.),(-576.137,123.818,50.),(-588.327,275.507,50.),(-576.137,212.331,50.),(-576.137,193.919,50.),(-517.147,123.818,50.),(-512.075,125.979,50.),(-514.014,104.856,50.),(-512.032,103.209,50.),(-510.764,129.222,50.),(-510.753,99.958,50.),(-509.816,134.628,50.),(-509.816,94.595,50.),(-507.429,94.595,50.),(-507.429,134.628,50.),(-538.884,212.331,50.),(-538.884,193.919,50.),(-535.837,212.88,50.),(-533.898,191.757,50.),(-533.855,214.527,50.),(-532.566,188.514,50.),(-532.555,217.779,50.),(-531.553,183.108,50.),(-531.553,223.142,50.),(-529.252,183.108,50.),(-529.252,223.142,50.),(-591.077,288.049,50.),(-593.783,294.595,50.),(-593.783,290.034,50.),(-517.658,294.595,50.),(-589.436,285.473,50.),(-588.604,281.546,50.),(-576.137,276.182,50.),(-517.658,276.182,50.),(-514.611,295.144,50.),(-514.611,275.642,50.),(-512.629,296.791,50.),(-512.629,274.021,50.),(-511.329,270.778,50.),(-511.329,300.042,50.),(-510.327,265.372,50.),(-510.327,305.405,50.),(-508.025,305.405,50.),(-508.025,265.372,50.)),$); +#790=IFCSTYLEDITEM(#788,(#592),$); +#791=IFCWALL('06ymNwhgjC9vHrcokNIGHx',#1,'rail bridge - spandrel wall','A spandrel wall, providing structural support for the rail bridge.','solidwall',#792,#798,'454425.1027895.956001.1884275.1998466',$); +#792=IFCLOCALPLACEMENT(#760,#793); +#793=IFCAXIS2PLACEMENT3D(#794,#795,#796); +#794=IFCCARTESIANPOINT((10000.,2200.,3290.346)); +#795=IFCDIRECTION((0.,0.,1.)); +#796=IFCDIRECTION((-1.,-9.694523858759661E-16,0.)); +#797=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#773)); +#798=IFCPRODUCTDEFINITIONSHAPE($,$,(#797)); +#799=IFCSIGN('12d16mgwj97OPhxybgoR0P',#1,'road rail bridge - name sign','Ye Olde Brygge\X\27s Timeless Plaque: A Gleaming Tribute to Bygone Eras','pictoral',#800,#809,'454425.1027895.956001.1884275.1998466.2028197',$); +#800=IFCLOCALPLACEMENT(#760,#801); +#801=IFCAXIS2PLACEMENT3D(#802,#803,#804); +#802=IFCCARTESIANPOINT((0.,2200.,7024.582)); +#803=IFCDIRECTION((-1.8140762183711102E-16,1.,0.)); +#804=IFCDIRECTION((-1.,-1.9229626863835643E-16,0.)); +#805=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#806,#810)); +#806=IFCTRIANGULATEDFACESET(#807,((-1.,2.4770934453639655E-53,7.365191341496892E-16),(-1.,2.4770934453639655E-53,7.365191341496892E-16),(-1.,2.4770934453639655E-53,7.365191341496892E-16),(-1.,2.4770934453639655E-53,7.365191341496892E-16),(7.067707978630143E-16,2.757701622613239E-12,1.),(7.067707978630143E-16,2.757701622613239E-12,1.),(7.067707978630143E-16,2.757701622613239E-12,1.),(7.067707978630143E-16,2.757701622613239E-12,1.),(-7.067707978630143E-16,-2.757701622613239E-12,-1.),(-7.067707978630143E-16,-2.757701622613239E-12,-1.),(-7.067707978630143E-16,-2.757701622613239E-12,-1.),(-7.067707978630143E-16,-2.757701622613239E-12,-1.),(1.9490629760824888E-27,-1.,2.757701622613241E-12),(1.9490629760824888E-27,-1.,2.757701622613241E-12),(1.9490629760824888E-27,-1.,2.757701622613241E-12),(1.9490629760824888E-27,-1.,2.757701622613241E-12),(-1.9490629760824888E-27,1.,-2.757701622613241E-12),(-1.9490629760824888E-27,1.,-2.757701622613241E-12),(-1.9490629760824888E-27,1.,-2.757701622613241E-12),(-1.9490629760824888E-27,1.,-2.757701622613241E-12),(1.,-2.4770934453639655E-53,-7.365191341496892E-16),(1.,-2.4770934453639655E-53,-7.365191341496892E-16),(1.,-2.4770934453639655E-53,-7.365191341496892E-16),(1.,-2.4770934453639655E-53,-7.365191341496892E-16)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(9,10,11),(10,9,12),(13,14,15),(14,13,16),(17,18,19),(18,17,20),(21,22,23),(22,21,24)),$); +#807=IFCCARTESIANPOINTLIST3D(((-800.,0.,30.),(-800.,400.,0.),(-800.,0.,0.),(-800.,400.,30.),(800.,0.,30.),(-800.,400.,30.),(-800.,0.,30.),(800.,400.,30.),(800.,400.,0.),(-800.,0.,0.),(-800.,400.,0.),(800.,0.,0.),(800.,0.,30.),(-800.,0.,0.),(800.,0.,0.),(-800.,0.,30.),(-800.,400.,0.),(800.,400.,30.),(800.,400.,0.),(-800.,400.,30.),(800.,400.,0.),(800.,0.,30.),(800.,0.,0.),(800.,400.,30.)),$); +#808=IFCSTYLEDITEM(#806,(#592),$); +#809=IFCPRODUCTDEFINITIONSHAPE($,$,(#805)); +#810=IFCTRIANGULATEDFACESET(#811,((6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(0.985262099127433,-0.17105144262181596,4.715355859832444E-13),(0.998558022065677,0.05368311250554527,-1.4849924888142497E-13),(0.9985580220656759,0.05368311250556592,-1.484992488814819E-13),(0.9852620991274318,-0.17105144262182378,4.715355859832661E-13),(0.9985580220656759,0.05368311250556592,-1.484992488814819E-13),(0.9942362468634307,0.10721140528376343,-2.961667802558706E-13),(0.9942362468634307,0.10721140528376343,-2.961667802558706E-13),(0.998558022065677,0.05368311250554527,-1.4849924888142497E-13),(0.8507772826193545,0.5255264173938615,-1.4503525028234275E-12),(0.7331764133481148,0.6800384892857126,-1.876638410524086E-12),(0.7331764133484892,0.6800384892853092,-1.8766384105229728E-12),(0.8507772826193545,0.5255264173938615,-1.4503525028234275E-12),(0.7331764133481148,0.6800384892857126,-1.876638410524086E-12),(0.5879319010498577,0.8089104275059759,-2.2321676471580615E-12),(0.7331764133484892,0.6800384892853092,-1.8766384105229728E-12),(0.5879319010498577,0.8089104275059759,-2.2321676471580615E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-0.5954279130339792,0.8034087380530537,-2.2165514121692294E-12),(-0.7353424654424054,0.6776956975789981,-1.8696779124719843E-12),(-0.5954279130339792,0.8034087380530537,-2.2165514121692294E-12),(-0.735342465442188,0.6776956975792342,-1.8696779124726358E-12),(-0.735342465442188,0.6776956975792342,-1.8696779124726358E-12),(-0.9279729502401773,0.3726475595284927,-1.0278780882402646E-12),(-0.7353424654424054,0.6776956975789981,-1.8696779124719843E-12),(-0.9279729502400409,0.37264755952883255,-1.0278780882412027E-12),(-0.9279729502400409,0.37264755952883255,-1.0278780882412027E-12),(-0.9919380594528788,0.12672366080908923,-3.4922397095688467E-13),(-0.9279729502401773,0.3726475595284927,-1.0278780882402646E-12),(-0.9919380594528859,0.12672366080903444,-3.492239709567336E-13),(-0.9919380594528859,0.12672366080903444,-3.492239709567336E-13),(-0.9997278626286515,0.02332810930933755,-6.395138370624877E-14),(-0.9919380594528788,0.12672366080908923,-3.4922397095688467E-13),(-0.9997278626286514,0.02332810930934073,-6.395138370625757E-14),(-0.9997278626286514,0.02332810930934073,-6.395138370625757E-14),(-1.,1.0761972206014589E-42,4.034522267621423E-16),(-0.9997278626286515,0.02332810930933755,-6.395138370624877E-14),(-1.,1.0761972206014589E-42,4.034522267621423E-16),(-0.9325271362086447,-0.3610999033986357,9.96827613225119E-13),(-0.9262080086179281,-0.3770128973550006,1.0406673315188104E-12),(-0.9325271362086447,-0.3610999033986357,9.96827613225119E-13),(-0.9262080086179306,-0.3770128973549943,1.040667331518793E-12),(-0.9262080086179306,-0.3770128973549943,1.040667331518793E-12),(-0.8723365420137931,-0.48890587792275286,1.349288293088389E-12),(-0.9262080086179281,-0.3770128973550006,1.0406673315188104E-12),(-0.8723365420138,-0.488905877922741,1.3492882930883565E-12),(-0.8723365420138,-0.488905877922741,1.3492882930883565E-12),(-0.7301883777656378,-0.6832458803212693,1.885445944958469E-12),(-0.8723365420137931,-0.48890587792275286,1.349288293088389E-12),(-0.7301883777657012,-0.6832458803212016,1.885445944958282E-12),(-0.7301883777656378,-0.6832458803212693,1.885445944958469E-12),(-0.6321911971634419,-0.7748124226088884,2.138076904141292E-12),(-0.6321911971634419,-0.7748124226088884,2.138076904141292E-12),(-0.7301883777657012,-0.6832458803212016,1.885445944958282E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.6156006345831444,-0.7880582838222246,2.1742516148785587E-12),(0.6156006345831444,-0.7880582838222246,2.1742516148785587E-12),(0.6156006345831444,-0.7880582838222246,2.1742516148785587E-12),(0.6156006345831444,-0.7880582838222246,2.1742516148785587E-12),(0.976255309916327,-0.21662310555473194,5.972299551114726E-13),(0.9986377588414403,-0.0521787946980892,1.4362777165925236E-13),(0.9986377588414309,-0.05217879469827008,1.4362777165975133E-13),(0.976255309916327,-0.21662310555473194,5.972299551114726E-13),(0.9986377588414309,-0.05217879469827008,1.4362777165975133E-13),(0.9788258497336634,0.20469478716658152,-5.651872750450606E-13),(0.9788258497336585,0.20469478716660464,-5.651872750451245E-13),(0.9986377588414403,-0.0521787946980892,1.4362777165925236E-13),(0.9788258497336585,0.20469478716660464,-5.651872750451245E-13),(0.9450084045283365,0.32704604472582804,-9.029229207399145E-13),(0.9450084045283349,0.3270460447258325,-9.02922920739927E-13),(0.9788258497336634,0.20469478716658152,-5.651872750450606E-13),(0.9450084045283349,0.3270460447258325,-9.02922920739927E-13),(0.9330496485399467,0.35974762453626036,-9.93108373864561E-13),(0.9330496485399467,0.35974762453626036,-9.93108373864561E-13),(0.9450084045283365,0.32704604472582804,-9.029229207399145E-13),(-0.9414820933211209,0.3370630029470463,-9.295757347556836E-13),(-0.9606480611335328,0.2777684334844122,-7.660281374929297E-13),(-0.9414820933211209,0.3370630029470463,-9.295757347556836E-13),(-0.9606480611335284,0.27776843348442753,-7.66028137492972E-13),(-0.9606480611335284,0.27776843348442753,-7.66028137492972E-13),(-0.9760836593293772,0.21739523911570036,-5.995059148651137E-13),(-0.9606480611335328,0.2777684334844122,-7.660281374929297E-13),(-0.9760836593293772,0.21739523911570036,-5.995059148651137E-13),(-0.9792141269630011,-0.2028292226383756,5.599555474652705E-13),(-0.9792141269630011,-0.2028292226383756,5.599555474652705E-13),(-0.9792141269630011,-0.2028292226383756,5.599555474652705E-13),(-0.9792141269630011,-0.2028292226383756,5.599555474652705E-13),(-0.6124868691938966,-0.7904807619828953,2.1813197978649545E-12),(-0.6124868691938966,-0.7904807619828953,2.1813197978649545E-12),(-0.6124868691938966,-0.7904807619828953,2.1813197978649545E-12),(-0.6124868691938966,-0.7904807619828953,2.1813197978649545E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.6823833044151714,-0.7309945457084011,2.01676548549882E-12),(0.7673233100207234,-0.641260429076082,1.7692005719013815E-12),(0.6823833044151714,-0.7309945457084011,2.01676548549882E-12),(0.7673233100207456,-0.6412604290760555,1.7692005719013084E-12),(0.7673233100207234,-0.641260429076082,1.7692005719013815E-12),(0.8868360880342053,-0.46208414056336894,1.2747419599281075E-12),(0.8868360880342097,-0.46208414056336067,1.2747419599280846E-12),(0.7673233100207456,-0.6412604290760555,1.7692005719013084E-12),(0.8868360880342097,-0.46208414056336067,1.2747419599280846E-12),(0.9337699395388032,-0.35787386047838143,9.870509916662683E-13),(0.9337699395388004,-0.35787386047838854,9.87050991666288E-13),(0.8868360880342053,-0.46208414056336894,1.2747419599281075E-12),(0.9337699395388004,-0.35787386047838854,9.87050991666288E-13),(0.9852620991274318,-0.17105144262182378,4.715355859832661E-13),(0.985262099127433,-0.17105144262181596,4.715355859832444E-13),(0.9337699395388032,-0.35787386047838143,9.870509916662683E-13),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.20007400713171156,0.9797807875592683,-2.70334584864542E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.20007400713202148,0.979780787559205,-2.7033458486452456E-12),(-0.20007400713171156,0.9797807875592683,-2.70334584864542E-12),(-0.3920573365553578,0.9199407833404925,-2.5381582917956717E-12),(-0.3920573365553578,0.9199407833404925,-2.5381582917956717E-12),(-0.20007400713202148,0.979780787559205,-2.7033458486452456E-12),(-0.9271481171496583,0.37469503448250235,-1.0336038453690327E-12),(-0.9613689058329662,0.2752631956828324,-7.591904174313805E-13),(-0.9271481171496583,0.37469503448250235,-1.0336038453690327E-12),(-0.9613689058329608,0.27526319568285174,-7.59190417431434E-13),(-0.9613689058329608,0.27526319568285174,-7.59190417431434E-13),(-0.9849591146664003,0.1727875644703084,-4.763820494191688E-13),(-0.9613689058329662,0.2752631956828324,-7.591904174313805E-13),(-0.9849591146664003,0.1727875644703084,-4.763820494191688E-13),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.9850568535010431,-0.17222948461464055,4.755786844994556E-13),(-0.9627290187837146,-0.27046781026907074,7.466813754295922E-13),(-0.9850568535010431,-0.17222948461464055,4.755786844994556E-13),(-0.9627290187837202,-0.2704678102690515,7.466813754295392E-13),(-0.9627290187837202,-0.2704678102690515,7.466813754295392E-13),(-0.8103422277040963,-0.5859568874922134,1.6172045035604545E-12),(-0.9627290187837146,-0.27046781026907074,7.466813754295922E-13),(-0.81034222770443,-0.5859568874917522,1.6172045035591823E-12),(-0.8103422277040963,-0.5859568874922134,1.6172045035604545E-12),(-0.42212186728676276,-0.9065390941147197,2.5015633878011144E-12),(-0.4221218672866963,-0.9065390941147506,2.5015633878012E-12),(-0.81034222770443,-0.5859568874917522,1.6172045035591823E-12),(-0.42212186728676276,-0.9065390941147197,2.5015633878011144E-12),(-0.08899635085429565,-0.9960319520651028,2.748295809171878E-12),(-0.4221218672866963,-0.9065390941147506,2.5015633878012E-12),(-0.08899635085414907,-0.996031952065116,2.748295809171914E-12),(-0.08899635085429565,-0.9960319520651028,2.748295809171878E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.08899635085414907,-0.996031952065116,2.748295809171914E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-0.587931901049856,0.808910427505977,-2.2317615791035367E-12),(-0.733176413348379,0.6800384892854279,-1.876107399963493E-12),(-0.7331764133482979,0.6800384892855155,-1.8761073999637344E-12),(-0.587931901049856,0.808910427505977,-2.2317615791035367E-12),(-0.733176413348379,0.6800384892854279,-1.876107399963493E-12),(-0.850777282619356,0.5255264173938589,-1.4497165709511751E-12),(-0.7331764133482979,0.6800384892855155,-1.8761073999637344E-12),(-0.850777282619356,0.5255264173938589,-1.4497165709511751E-12),(-0.9942362468634307,0.10721140528376343,-2.9547106956687535E-13),(-0.9985580220656771,0.05368311250554416,-1.4774685637677248E-13),(-0.9942362468634307,0.10721140528376343,-2.9547106956687535E-13),(-0.9985580220656753,0.053683112505575656,-1.4774685637685936E-13),(-0.9985580220656753,0.053683112505575656,-1.4774685637685936E-13),(-0.9997372811223787,-0.022920923498716158,6.364736702955802E-14),(-0.9985580220656771,0.05368311250554416,-1.4774685637677248E-13),(-0.9997372811223788,-0.022920923498712536,6.364736702954802E-14),(-0.9997372811223788,-0.022920923498712536,6.364736702954802E-14),(-0.9919210150229099,-0.12685700593944488,3.503385568559952E-13),(-0.9997372811223787,-0.022920923498716158,6.364736702955802E-14),(-0.9919210150229022,-0.12685700593950436,3.503385568561593E-13),(-0.9919210150229022,-0.12685700593950436,3.503385568561593E-13),(-0.9257138949175167,-0.37822451633473103,1.0438472384269923E-12),(-0.9919210150229099,-0.12685700593944488,3.503385568559952E-13),(-0.9257138949175452,-0.3782245163346613,1.0438472384267996E-12),(-0.9257138949175452,-0.3782245163346613,1.0438472384267996E-12),(-0.7298956734503326,-0.6835585606796872,1.8863356104179433E-12),(-0.9257138949175167,-0.37822451633473103,1.0438472384269923E-12),(-0.7298956734504372,-0.6835585606795754,1.886335610417635E-12),(-0.7298956734504372,-0.6835585606795754,1.886335610417635E-12),(-0.5913596447695503,-0.806407943002815,2.225284315390222E-12),(-0.7298956734503326,-0.6835585606796872,1.8863356104179433E-12),(-0.5913596447695503,-0.806407943002815,2.225284315390222E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.0889963508542824,0.9960319520651041,-2.7482304628413806E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.08899635085428109,0.9960319520651042,-2.7482304628413814E-12),(-0.0889963508542824,0.9960319520651041,-2.7482304628413806E-12),(-0.42212186728667295,0.9065390941147616,-2.5011705247544278E-12),(-0.42212186728638,0.906539094114898,-2.501170524754804E-12),(-0.08899635085428109,0.9960319520651042,-2.7482304628413814E-12),(-0.42212186728667295,0.9065390941147616,-2.5011705247544278E-12),(-0.8086796863922657,0.5882492369876113,-1.6228555205522057E-12),(-0.42212186728638,0.906539094114898,-2.501170524754804E-12),(-0.8086796863923503,0.588249236987495,-1.622855520551885E-12),(-0.8086796863923503,0.588249236987495,-1.622855520551885E-12),(-0.9603664303895992,0.27874059514311694,-7.688010179705267E-13),(-0.8086796863922657,0.5882492369876113,-1.6228555205522057E-12),(-0.9603664303895765,0.27874059514319555,-7.688010179707439E-13),(-0.9603664303895765,0.27874059514319555,-7.688010179707439E-13),(-0.9830031215351365,0.18358884239565865,-5.06191566724125E-13),(-0.9603664303895992,0.27874059514311694,-7.688010179705267E-13),(-0.9830031215351365,0.18358884239565865,-5.06191566724125E-13),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.9832650394637072,-0.1821808501693699,5.031121888584163E-13),(-0.9604389766296841,-0.27849052438193517,7.687790947830071E-13),(-0.9832650394637072,-0.1821808501693699,5.031121888584163E-13),(-0.960438976629688,-0.2784905243819218,7.687790947829702E-13),(-0.960438976629688,-0.2784905243819218,7.687790947829702E-13),(-0.8061306092176587,-0.591737645314515,1.6330645760786865E-12),(-0.9604389766296841,-0.27849052438193517,7.687790947830071E-13),(-0.8061306092175907,-0.5917376453146074,1.6330645760789413E-12),(-0.8061306092175907,-0.5917376453146074,1.6330645760789413E-12),(-0.4173761927595036,-0.9087337969491296,2.5076042230389106E-12),(-0.8061306092176587,-0.591737645314515,1.6330645760786865E-12),(-0.4173761927594212,-0.9087337969491672,2.507604223039014E-12),(-0.4173761927595036,-0.9087337969491296,2.5076042230389106E-12),(-0.08763790369519597,-0.9961523968931217,2.7486252336026003E-12),(-0.08763790369509214,-0.996152396893131,2.7486252336026257E-12),(-0.4173761927594212,-0.9087337969491672,2.507604223039014E-12),(-0.08763790369519597,-0.9961523968931217,2.7486252336026003E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.08763790369509214,-0.996152396893131,2.7486252336026257E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(-1.3725977238595926E-27,1.,-2.75921435746603E-12),(-0.08899635085415496,0.9960319520651153,-2.7482234963039557E-12),(-1.3725977238595926E-27,1.,-2.75921435746603E-12),(-0.08899635085419567,0.9960319520651116,-2.7482234963039456E-12),(-0.08899635085419567,0.9960319520651116,-2.7482234963039456E-12),(-0.42212186728709555,0.906539094114565,-2.5011059445536584E-12),(-0.08899635085415496,0.9960319520651153,-2.7482234963039557E-12),(-0.42212186728641377,0.9065390941148823,-2.501105944554535E-12),(-0.42212186728709555,0.906539094114565,-2.5011059445536584E-12),(-0.8086796863924871,0.5882492369873068,-1.622798249274057E-12),(-0.8086796863927596,0.5882492369869325,-1.6227982492730243E-12),(-0.42212186728641377,0.9065390941148823,-2.501105944554535E-12),(-0.8086796863924871,0.5882492369873068,-1.622798249274057E-12),(-0.9603664303895686,0.27874059514322275,-7.688010179708137E-13),(-0.8086796863927596,0.5882492369869325,-1.6227982492730243E-12),(-0.960366430389606,0.27874059514309385,-7.68801017970458E-13),(-0.960366430389606,0.27874059514309385,-7.68801017970458E-13),(-0.9830031215351371,0.1835888423956546,-5.06191566724125E-13),(-0.9603664303895686,0.27874059514322275,-7.688010179708137E-13),(-0.9830031215351371,0.1835888423956546,-5.06191566724125E-13),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.9829162037139715,-0.1840536239157341,5.082192095830502E-13),(-0.95898232668401,-0.2834658658599357,7.825659264514561E-13),(-0.9829162037139715,-0.1840536239157341,5.082192095830502E-13),(-0.9589823266840098,-0.28346586585993633,7.82565926451458E-13),(-0.9589823266840098,-0.28346586585993633,7.82565926451458E-13),(-0.9250216907185366,-0.3799142952038267,1.0487304279890868E-12),(-0.95898232668401,-0.2834658658599357,7.825659264514561E-13),(-0.9250216907185366,-0.3799142952038267,1.0487304279890868E-12),(-0.3977066570345245,-0.9175126238643386,2.5317585009108955E-12),(-0.20308542061857274,-0.9791610245164875,2.7017889427276108E-12),(-0.20308542061850404,-0.9791610245165019,2.7017889427276503E-12),(-0.3977066570345245,-0.9175126238643386,2.5317585009108955E-12),(-0.20308542061850404,-0.9791610245165019,2.7017889427276503E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(-0.20308542061857274,-0.9791610245164875,2.7017889427276108E-12),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(-0.01445616326355981,0.9998955042121639,-2.7589136852881224E-12),(0.276796250063706,0.9609286320797555,-2.6515036447659757E-12),(-0.01445616326357933,0.9998955042121637,-2.7589136852881224E-12),(0.2767962500636958,0.9609286320797585,-2.6515036447659834E-12),(0.2767962500636958,0.9609286320797585,-2.6515036447659834E-12),(0.5363224181349204,0.8440131893554221,-2.328998260493746E-12),(0.276796250063706,0.9609286320797555,-2.6515036447659757E-12),(0.53632241813488,0.8440131893554479,-2.3289982604938165E-12),(0.53632241813488,0.8440131893554479,-2.3289982604938165E-12),(0.7332983821190578,0.6799069662693362,-1.8762508353968483E-12),(0.5363224181349204,0.8440131893554221,-2.328998260493746E-12),(0.733298382119046,0.6799069662693491,-1.876250835396883E-12),(0.7332983821190578,0.6799069662693362,-1.8762508353968483E-12),(0.8575262393066199,0.514440228695857,-1.4197827578029385E-12),(0.857526239306608,0.514440228695877,-1.4197827578029936E-12),(0.733298382119046,0.6799069662693491,-1.876250835396883E-12),(0.857526239306608,0.514440228695877,-1.4197827578029936E-12),(0.9319963445918341,0.3624676725826169,-1.0005944247295901E-12),(0.931996344591825,0.3624676725826408,-1.000594424729656E-12),(0.8575262393066199,0.514440228695857,-1.4197827578029385E-12),(0.931996344591825,0.3624676725826408,-1.000594424729656E-12),(0.9747870892284454,0.2231370221938414,-6.161184489075059E-13),(0.9747870892284406,0.22313702219386236,-6.161184489075635E-13),(0.9319963445918341,0.3624676725826169,-1.0005944247295901E-12),(0.9747870892284406,0.22313702219386236,-6.161184489075635E-13),(0.9947035144805423,0.10278578831753733,-2.839995431065248E-13),(0.9947035144805428,0.10278578831753325,-2.8399954310651365E-13),(0.9747870892284454,0.2231370221938414,-6.161184489075059E-13),(0.9947035144805428,0.10278578831753325,-2.8399954310651365E-13),(0.9999845618336788,0.005556626162130687,-1.579404356873985E-14),(0.9999845618336788,0.005556626162136084,-1.5794043568754727E-14),(0.9947035144805423,0.10278578831753733,-2.839995431065248E-13),(0.9999845618336788,0.005556626162136084,-1.5794043568754727E-14),(0.9971625390869557,-0.07527862008336489,2.0730861792427055E-13),(0.9971625390869561,-0.075278620083362,2.073086179242626E-13),(0.9999845618336788,0.005556626162130687,-1.579404356873985E-14),(0.9971625390869561,-0.075278620083362,2.073086179242626E-13),(0.9879040014647004,-0.15506670787126917,4.2756852497937635E-13),(0.9879040014647001,-0.15506670787127036,4.2756852497937963E-13),(0.9971625390869557,-0.07527862008336489,2.0730861792427055E-13),(0.9879040014647001,-0.15506670787127036,4.2756852497937963E-13),(0.9710252517045587,-0.2389769038047369,6.58986976156137E-13),(0.9710252517045607,-0.2389769038047292,6.589869761561156E-13),(0.9879040014647004,-0.15506670787126917,4.2756852497937635E-13),(0.9710252517045607,-0.2389769038047292,6.589869761561156E-13),(0.945969042642219,-0.32425695113993125,8.942268226012023E-13),(0.9459690426422243,-0.3242569511399157,8.942268226011595E-13),(0.9710252517045587,-0.2389769038047369,6.58986976156137E-13),(0.9459690426422243,-0.3242569511399157,8.942268226011595E-13),(0.9104691640560179,-0.413576959347515,1.1407417132320242E-12),(0.9104691640560099,-0.41357695934753264,1.140741713232073E-12),(0.945969042642219,-0.32425695113993125,8.942268226012023E-13),(0.9104691640560099,-0.41357695934753264,1.140741713232073E-12),(0.8578749092656005,-0.5138585798179669,1.4174689774199781E-12),(0.857874909265601,-0.5138585798179663,1.4174689774199765E-12),(0.9104691640560179,-0.413576959347515,1.1407417132320242E-12),(0.857874909265601,-0.5138585798179663,1.4174689774199765E-12),(0.7803315071929187,-0.62536608389169,1.7252113641137434E-12),(0.780331507192952,-0.6253660838916482,1.7252113641136277E-12),(0.8578749092656005,-0.5138585798179669,1.4174689774199781E-12),(0.780331507192952,-0.6253660838916482,1.7252113641136277E-12),(0.671227437601915,-0.7412514600392821,2.045010834016552E-12),(0.6712274376019304,-0.7412514600392682,2.045010834016513E-12),(0.7803315071929187,-0.62536608389169,1.7252113641137434E-12),(0.671227437601915,-0.7412514600392821,2.045010834016552E-12),(0.5282915656620173,-0.849063025723282,2.3425200314566528E-12),(0.6712274376019304,-0.7412514600392682,2.045010834016513E-12),(0.5282915656620125,-0.8490630257232851,2.342520031456662E-12),(0.5282915656620125,-0.8490630257232851,2.342520031456662E-12),(0.35815172061543016,-0.9336634002788194,2.5760047440571377E-12),(0.5282915656620173,-0.849063025723282,2.3425200314566528E-12),(0.3581517206153977,-0.9336634002788318,2.5760047440571712E-12),(0.3581517206153977,-0.9336634002788318,2.5760047440571712E-12),(0.17673045900502438,-0.9842592874135726,2.7156939922384504E-12),(0.35815172061543016,-0.9336634002788194,2.5760047440571377E-12),(0.17673045900501702,-0.9842592874135739,2.7156939922384545E-12),(0.17673045900501702,-0.9842592874135739,2.7156939922384545E-12),(-0.02516421475156609,-0.9996833310083435,2.7583530306259013E-12),(0.17673045900502438,-0.9842592874135726,2.7156939922384504E-12),(-0.02516421475162521,-0.9996833310083421,2.758353030625898E-12),(-0.02516421475162521,-0.9996833310083421,2.758353030625898E-12),(-0.27808054138022675,-0.9605577611500935,2.6504788577406794E-12),(-0.02516421475156609,-0.9996833310083435,2.7583530306259013E-12),(-0.2780805413802557,-0.9605577611500851,2.6504788577406556E-12),(-0.27808054138022675,-0.9605577611500935,2.6504788577406794E-12),(-0.5377928463665643,-0.8430770156972309,2.3264130353586965E-12),(-0.5377928463666088,-0.8430770156972025,2.3264130353586185E-12),(-0.2780805413802557,-0.9605577611500851,2.6504788577406556E-12),(-0.5377928463666088,-0.8430770156972025,2.3264130353586185E-12),(-0.7340598172506592,-0.6790848140681169,1.8739853050367576E-12),(-0.7340598172506781,-0.6790848140680965,1.873985305036701E-12),(-0.5377928463665643,-0.8430770156972309,2.3264130353586965E-12),(-0.7340598172506592,-0.6790848140681169,1.8739853050367576E-12),(-0.8575399153398935,-0.5144174312742993,1.4196809782560489E-12),(-0.7340598172506781,-0.6790848140680965,1.873985305036701E-12),(-0.857539915339897,-0.5144174312742935,1.4196809782560327E-12),(-0.857539915339897,-0.5144174312742935,1.4196809782560327E-12),(-0.931215481170937,-0.3644691038038483,1.0061202827345062E-12),(-0.8575399153398935,-0.5144174312742993,1.4196809782560489E-12),(-0.9312154811709294,-0.36446910380386777,1.00612028273456E-12),(-0.9312154811709294,-0.36446910380386777,1.00612028273456E-12),(-0.9739593803592153,-0.22672257366723225,6.260521195023044E-13),(-0.931215481170937,-0.3644691038038483,1.0061202827345062E-12),(-0.9739593803592121,-0.22672257366724605,6.260521195023425E-13),(-0.9739593803592121,-0.22672257366724605,6.260521195023425E-13),(-0.9944387604173459,-0.10531643641717323,2.9102201611162934E-13),(-0.9739593803592153,-0.22672257366723225,6.260521195023044E-13),(-0.9944387604173455,-0.10531643641717783,2.91022016111642E-13),(-0.9944387604173455,-0.10531643641717783,2.91022016111642E-13),(-0.9999739448500035,-0.007218699406564806,2.0349841648365343E-14),(-0.9944387604173459,-0.10531643641717323,2.9102201611162934E-13),(-0.9999739448500035,-0.007218699406560452,2.0349841648353336E-14),(-0.9999739448500035,-0.007218699406560452,2.0349841648353336E-14),(-0.9974002311185112,0.07206093924409047,-1.984930534307887E-13),(-0.9999739448500035,-0.007218699406564806,2.0349841648365343E-14),(-0.9974002311185115,0.07206093924408564,-1.9849305343077535E-13),(-0.9974002311185115,0.07206093924408564,-1.9849305343077535E-13),(-0.9886899396079466,0.14997400880831008,-4.134471216500252E-13),(-0.9974002311185112,0.07206093924409047,-1.984930534307887E-13),(-0.988689939607947,0.14997400880830747,-4.13447121650018E-13),(-0.988689939607947,0.14997400880830747,-4.13447121650018E-13),(-0.9722499433165867,0.2339445398398823,-6.450550627148683E-13),(-0.9886899396079466,0.14997400880831008,-4.134471216500252E-13),(-0.9722499433165831,0.23394453983989724,-6.450550627149096E-13),(-0.9722499433165831,0.23394453983989724,-6.450550627149096E-13),(-0.9453117550981344,0.3261681861759126,-8.994898477733635E-13),(-0.9722499433165867,0.2339445398398823,-6.450550627148683E-13),(-0.9453117550981349,0.32616818617591115,-8.994898477733594E-13),(-0.9453117550981349,0.32616818617591115,-8.994898477733594E-13),(-0.9018682894200392,0.432011097703025,-1.1915605268832753E-12),(-0.9453117550981344,0.3261681861759126,-8.994898477733635E-13),(-0.9018682894200535,0.43201109770299506,-1.1915605268831931E-12),(-0.9018682894200535,0.43201109770299506,-1.1915605268831931E-12),(-0.8335120349581517,0.5525013009757722,-1.5241104280499762E-12),(-0.9018682894200392,0.432011097703025,-1.1915605268832753E-12),(-0.8335120349581778,0.5525013009757331,-1.5241104280498685E-12),(-0.8335120349581778,0.5525013009757331,-1.5241104280498685E-12),(-0.732142370758794,0.6811516343221183,-1.8791952820968837E-12),(-0.8335120349581517,0.5525013009757722,-1.5241104280499762E-12),(-0.7321423707587661,0.6811516343221482,-1.879195282096966E-12),(-0.732142370758794,0.6811516343221183,-1.8791952820968837E-12),(-0.5698568764936294,0.821743962748084,-2.267178260100634E-12),(-0.56985687649368,0.821743962748049,-2.267178260100537E-12),(-0.7321423707587661,0.6811516343221482,-1.879195282096966E-12),(-0.56985687649368,0.821743962748049,-2.267178260100537E-12),(-0.3161638639264402,0.9487045963560542,-2.617565927050535E-12),(-0.31616386392637214,0.9487045963560767,-2.6175659270505975E-12),(-0.5698568764936294,0.821743962748084,-2.267178260100634E-12),(-0.31616386392637214,0.9487045963560767,-2.6175659270505975E-12),(-0.01445616326355981,0.9998955042121639,-2.7589136852881224E-12),(-0.01445616326357933,0.9998955042121637,-2.7589136852881224E-12),(-0.3161638639264402,0.9487045963560542,-2.617565927050535E-12),(-0.005246717485677339,-0.9999862358830873,2.7591812016299552E-12),(0.31925976024100283,-0.9476672440740248,2.6146919590508196E-12),(-0.005246717485740675,-0.9999862358830871,2.7591812016299556E-12),(0.31925976024109226,-0.9476672440739948,2.6146919590507368E-12),(0.31925976024109226,-0.9476672440739948,2.6146919590507368E-12),(0.59706336092566,-0.8021940806563927,2.2131479348748415E-12),(0.31925976024100283,-0.9476672440740248,2.6146919590508196E-12),(0.5970633609257284,-0.802194080656342,2.2131479348747017E-12),(0.59706336092566,-0.8021940806563927,2.2131479348748415E-12),(0.784978946319045,-0.6195224401390494,1.709119031212708E-12),(0.7849789463190372,-0.6195224401390592,1.7091190312127348E-12),(0.5970633609257284,-0.802194080656342,2.2131479348747017E-12),(0.7849789463190372,-0.6195224401390592,1.7091190312127348E-12),(0.8892699765686355,-0.4573826721396635,1.2616845588635908E-12),(0.8892699765686456,-0.4573826721396436,1.2616845588635356E-12),(0.784978946319045,-0.6195224401390494,1.709119031212708E-12),(0.8892699765686456,-0.4573826721396436,1.2616845588635356E-12),(0.9460355692139014,-0.3240628053049744,8.937254434059714E-13),(0.946035569213902,-0.3240628053049727,8.937254434059668E-13),(0.8892699765686355,-0.4573826721396635,1.2616845588635908E-12),(0.946035569213902,-0.3240628053049727,8.937254434059668E-13),(0.9789776170751959,-0.20396770642866793,5.624148573821216E-13),(0.9789776170751897,-0.20396770642869805,5.624148573822046E-13),(0.9460355692139014,-0.3240628053049744,8.937254434059714E-13),(0.9789776170751897,-0.20396770642869805,5.624148573822046E-13),(0.9953832851063591,-0.09597976729953485,2.6439268300870254E-13),(0.9953832851063574,-0.0959797672995527,2.6439268300875176E-13),(0.9789776170751959,-0.20396770642866793,5.624148573821216E-13),(0.9953832851063574,-0.0959797672995527,2.6439268300875176E-13),(1.,-6.809851204870718E-16,-4.594202152535489E-16),(1.,6.45609270072475E-16,-4.594202152572011E-16),(0.9953832851063591,-0.09597976729953485,2.6439268300870254E-13),(1.,6.45609270072475E-16,-4.594202152572011E-16),(0.9953832851063579,0.09597976729954767,-2.652282449374014E-13),(0.9953832851063568,0.09597976729955957,-2.652282449374341E-13),(1.,-6.809851204870718E-16,-4.594202152535489E-16),(0.9953832851063568,0.09597976729955957,-2.652282449374341E-13),(0.9789776170751958,0.20396770642866877,-5.631668615916516E-13),(0.9789776170751952,0.20396770642867176,-5.631668615916599E-13),(0.9953832851063579,0.09597976729954767,-2.652282449374014E-13),(0.9789776170751952,0.20396770642867176,-5.631668615916599E-13),(0.9460355692139023,0.32406280530497167,-8.94560260711164E-13),(0.9460355692139127,0.32406280530494147,-8.945602607110807E-13),(0.9789776170751958,0.20396770642866877,-5.631668615916516E-13),(0.9460355692139127,0.32406280530494147,-8.945602607110807E-13),(0.8891109963042099,0.4576916388256785,-1.2632214321625732E-12),(0.8891109963042216,0.45769163882565606,-1.2632214321625116E-12),(0.9460355692139023,0.32406280530497167,-8.94560260711164E-13),(0.8891109963042216,0.45769163882565606,-1.2632214321625116E-12),(0.7841350649780974,0.6205902028487036,-1.7126260503675843E-12),(0.784135064978063,0.620590202848747,-1.7126260503677039E-12),(0.8891109963042099,0.4576916388256785,-1.2632214321625732E-12),(0.784135064978063,0.620590202848747,-1.7126260503677039E-12),(0.5952527509857987,0.8035385257993787,-2.217395128914305E-12),(0.595252750985843,0.803538525799346,-2.2173951289142145E-12),(0.7841350649780974,0.6205902028487036,-1.7126260503675843E-12),(0.5952527509857987,0.8035385257993787,-2.217395128914305E-12),(0.3175291106517308,0.9482485243272045,-2.6165592060332315E-12),(0.595252750985843,0.803538525799346,-2.2173951289142145E-12),(0.31752911065161143,0.9482485243272446,-2.6165592060333417E-12),(0.31752911065161143,0.9482485243272446,-2.6165592060333417E-12),(-1.4062582279334804E-14,1.,-2.759214319657624E-12),(0.3175291106517308,0.9482485243272045,-2.6165592060332315E-12),(1.479612664760902E-14,1.,-2.7592143196576233E-12),(-1.4062582279334804E-14,1.,-2.759214319657624E-12),(-0.31752911065161,0.9482485243272449,-2.616282425881282E-12),(-0.31752911065167166,0.9482485243272244,-2.616282425881224E-12),(1.479612664760902E-14,1.,-2.7592143196576233E-12),(-0.31752911065167166,0.9482485243272244,-2.616282425881224E-12),(-0.5952527509858165,0.8035385257993655,-2.2168020671287512E-12),(-0.5952527509858213,0.8035385257993619,-2.2168020671287415E-12),(-0.31752911065161,0.9482485243272449,-2.616282425881282E-12),(-0.5952527509858165,0.8035385257993655,-2.2168020671287512E-12),(-0.7841350649781005,0.6205902028486996,-1.7119880521934731E-12),(-0.5952527509858213,0.8035385257993619,-2.2168020671287415E-12),(-0.7841350649780668,0.6205902028487421,-1.7119880521935902E-12),(-0.7841350649780668,0.6205902028487421,-1.7119880521935902E-12),(-0.8886633336049228,0.4585602245138429,-1.2649907391707565E-12),(-0.7841350649781005,0.6205902028486996,-1.7119880521934731E-12),(-0.8886633336049196,0.4585602245138489,-1.264990739170773E-12),(-0.8886633336049196,0.4585602245138489,-1.264990739170773E-12),(-0.945101558421973,0.32677674988952066,-9.012928586200932E-13),(-0.8886633336049228,0.4585602245138429,-1.2649907391707565E-12),(-0.9451015584219759,0.32677674988951194,-9.012928586200692E-13),(-0.9451015584219759,0.32677674988951194,-9.012928586200692E-13),(-0.9782446517648234,0.2074545764583652,-5.720144287754229E-13),(-0.945101558421973,0.32677674988952066,-9.012928586200932E-13),(-0.9782446517648219,0.2074545764583723,-5.720144287754424E-13),(-0.9782446517648219,0.2074545764583723,-5.720144287754424E-13),(-0.9951552549714545,0.09831591174728377,-2.708540982804576E-13),(-0.9782446517648234,0.2074545764583652,-5.720144287754229E-13),(-0.9951552549714534,0.09831591174729407,-2.708540982804861E-13),(-0.9951552549714534,0.09831591174729407,-2.708540982804861E-13),(-0.9999987530813137,0.0015791883415384137,-3.874864183562427E-15),(-0.9951552549714545,0.09831591174728377,-2.708540982804576E-13),(-0.9999987530813137,0.0015791883415576212,-3.874864183615432E-15),(-0.9999987530813137,0.0015791883415576212,-3.874864183615432E-15),(-0.9956491772094714,-0.09318109208472854,2.5754476410700605E-13),(-0.9999987530813137,0.0015791883415384137,-3.874864183562427E-15),(-0.995649177209472,-0.09318109208472376,2.5754476410699297E-13),(-0.995649177209472,-0.09318109208472376,2.5754476410699297E-13),(-0.979613746822012,-0.20089028607013118,5.546533964439388E-13),(-0.9956491772094714,-0.09318109208472854,2.5754476410700605E-13),(-0.9796137468220057,-0.2008902860701619,5.546533964440238E-13),(-0.9796137468220057,-0.2008902860701619,5.546533964440238E-13),(-0.9457986610955139,-0.3247535876167244,8.963957395519962E-13),(-0.979613746822012,-0.20089028607013118,5.546533964439388E-13),(-0.9457986610955131,-0.32475358761672657,8.963957395520021E-13),(-0.9457986610955131,-0.32475358761672657,8.963957395520021E-13),(-0.886378063178809,-0.46296212492533734,1.2777392376252994E-12),(-0.9457986610955139,-0.3247535876167244,8.963957395519962E-13),(-0.8863780631788213,-0.46296212492531347,1.277739237625234E-12),(-0.8863780631788213,-0.46296212492531347,1.277739237625234E-12),(-0.7799875144674657,-0.6257950761030844,1.727010498087206E-12),(-0.886378063178809,-0.46296212492533734,1.2777392376252994E-12),(-0.7799875144674742,-0.6257950761030739,1.7270104980871774E-12),(-0.7799875144674657,-0.6257950761030844,1.727010498087206E-12),(-0.59377879419472,-0.8046283263499144,2.2203868939434977E-12),(-0.593778794194671,-0.8046283263499506,2.220386893943598E-12),(-0.7799875144674742,-0.6257950761030739,1.7270104980871774E-12),(-0.593778794194671,-0.8046283263499506,2.220386893943598E-12),(-0.3238558108248667,-0.946106449505006,2.6106474803935812E-12),(-0.32385581082476506,-0.9461064495050407,2.610647480393677E-12),(-0.59377879419472,-0.8046283263499144,2.2203868939434977E-12),(-0.3238558108248667,-0.946106449505006,2.6106474803935812E-12),(-0.005246717485740675,-0.9999862358830871,2.7591812016299556E-12),(-0.32385581082476506,-0.9461064495050407,2.610647480393677E-12),(-0.005246717485677339,-0.9999862358830873,2.7591812016299552E-12),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.20007400713152548,0.9797807875593062,-2.70336001282182E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.2000740071318276,0.9797807875592447,-2.703360012821649E-12),(-0.2000740071318276,0.9797807875592447,-2.703360012821649E-12),(-0.39205733655535346,0.9199407833404945,-2.5381860473712873E-12),(-0.20007400713152548,0.9797807875593062,-2.70336001282182E-12),(-0.39205733655535346,0.9199407833404945,-2.5381860473712873E-12),(-0.9250216907185411,0.3799142952038156,-1.0479812651667526E-12),(-0.958982326684027,0.28346586585987765,-7.81811960906005E-13),(-0.9250216907185411,0.3799142952038156,-1.0479812651667526E-12),(-0.9589823266839906,0.2834658658600011,-7.818119609063457E-13),(-0.9589823266839906,0.2834658658600011,-7.818119609063457E-13),(-0.9829162037139707,0.18405362391573823,-5.074683244952742E-13),(-0.958982326684027,0.28346586585987765,-7.81811960906005E-13),(-0.9829162037139707,0.18405362391573823,-5.074683244952742E-13),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.9826489702535564,-0.1854750691053259,5.120494750431318E-13),(-0.9589087450177696,-0.2837146783803166,7.831406951919984E-13),(-0.9826489702535564,-0.1854750691053259,5.120494750431318E-13),(-0.9589087450177659,-0.28371467838032877,7.83140695192032E-13),(-0.9589087450177659,-0.28371467838032877,7.83140695192032E-13),(-0.8038585012002755,-0.5948205696241909,1.6415121292547801E-12),(-0.9589087450177696,-0.2837146783803166,7.831406951919984E-13),(-0.8038585012004971,-0.5948205696238914,1.6415121292539546E-12),(-0.8038585012002755,-0.5948205696241909,1.6415121292547801E-12),(-0.41828292848593485,-0.9083167904080769,2.506385284025357E-12),(-0.41828292848583404,-0.9083167904081234,2.506385284025485E-12),(-0.8038585012004971,-0.5948205696238914,1.6415121292539546E-12),(-0.41828292848593485,-0.9083167904080769,2.506385284025357E-12),(-0.08869355101094167,-0.9960589611107715,2.748381508177367E-12),(-0.41828292848583404,-0.9083167904081234,2.506385284025485E-12),(-0.08869355101079608,-0.9960589611107846,2.748381508177404E-12),(-0.08869355101094167,-0.9960589611107715,2.748381508177367E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(-0.08869355101079608,-0.9960589611107846,2.748381508177404E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-0.5954279130339785,0.8034087380530542,-2.2166069233204607E-12),(-0.7353424654422698,0.6776956975791453,-1.8697344232958566E-12),(-0.7353424654422304,0.677695697579188,-1.8697344232959745E-12),(-0.5954279130339785,0.8034087380530542,-2.2166069233204607E-12),(-0.7353424654422698,0.6776956975791453,-1.8697344232958566E-12),(-0.9279729502400419,0.3726475595288301,-1.0279062712827292E-12),(-0.7353424654422304,0.677695697579188,-1.8697344232959745E-12),(-0.9279729502400574,0.37264755952879125,-1.0279062712826217E-12),(-0.9279729502400574,0.37264755952879125,-1.0279062712826217E-12),(-0.9919380594528869,0.12672366080902567,-3.4922397095671337E-13),(-0.9279729502400419,0.3726475595288301,-1.0279062712827292E-12),(-0.9919380594528845,0.12672366080904565,-3.492239709567684E-13),(-0.9919380594528845,0.12672366080904565,-3.492239709567684E-13),(-0.9997278626286517,0.023328109309328878,-6.39513837062288E-14),(-0.9919380594528869,0.12672366080902567,-3.4922397095671337E-13),(-0.9997278626286515,0.023328109309333333,-6.39513837062411E-14),(-0.9997278626286515,0.023328109309333333,-6.39513837062411E-14),(-0.9997372811223784,-0.022920923498727593,6.37028927684859E-14),(-0.9997278626286517,0.023328109309328878,-6.39513837062288E-14),(-0.9997372811223789,-0.022920923498710125,6.370289276843767E-14),(-0.9997372811223789,-0.022920923498710125,6.370289276843767E-14),(-0.9919210150229036,-0.12685700593949403,3.5039425221430077E-13),(-0.9997372811223784,-0.022920923498727593,6.37028927684859E-14),(-0.9919210150229122,-0.12685700593942653,3.503942522141146E-13),(-0.9919210150229122,-0.12685700593942653,3.503942522141146E-13),(-0.9257138949175249,-0.3782245163347108,1.043847238426929E-12),(-0.9919210150229036,-0.12685700593949403,3.5039425221430077E-13),(-0.9257138949175149,-0.37822451633473536,1.0438472384269967E-12),(-0.9257138949175149,-0.37822451633473536,1.0438472384269967E-12),(-0.7298956734503225,-0.6835585606796979,1.8863356104179655E-12),(-0.9257138949175249,-0.3782245163347108,1.043847238426929E-12),(-0.7298956734502887,-0.6835585606797341,1.8863356104180657E-12),(-0.7298956734502887,-0.6835585606797341,1.8863356104180657E-12),(-0.5913596447695503,-0.806407943002815,2.225284315390222E-12),(-0.7298956734503225,-0.6835585606796979,1.8863356104179655E-12),(-0.5913596447695503,-0.806407943002815,2.225284315390222E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.5913596447695502,-0.806407943002815,2.224878145366024E-12),(0.7298956734503304,-0.6835585606796896,1.8858620626317275E-12),(0.5913596447695502,-0.806407943002815,2.224878145366024E-12),(0.7298956734502946,-0.6835585606797276,1.8858620626318325E-12),(0.7298956734503304,-0.6835585606796896,1.8858620626317275E-12),(0.9257138949175322,-0.3782245163346928,1.0432837498120332E-12),(0.9257138949175271,-0.37822451633470505,1.0432837498120671E-12),(0.7298956734502946,-0.6835585606797276,1.8858620626318325E-12),(0.9257138949175271,-0.37822451633470505,1.0432837498120671E-12),(0.9919210150229029,-0.1268570059394997,3.496685522373328E-13),(0.9919210150229099,-0.1268570059394458,3.496685522371841E-13),(0.9257138949175322,-0.3782245163346928,1.0432837498120332E-12),(0.9919210150229099,-0.1268570059394458,3.496685522371841E-13),(0.9997372811223789,-0.022920923498710073,6.286802903368002E-14),(0.9997372811223788,-0.02292092349871427,6.286802903369163E-14),(0.9919210150229029,-0.1268570059394997,3.496685522373328E-13),(0.9997372811223788,-0.02292092349871427,6.286802903369163E-14),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.9997372811223789,-0.022920923498710073,6.286802903368002E-14),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(-0.9985580220656759,0.05368311250556469,-1.4774685637683228E-13),(-0.9985580220656763,-0.053683112505556796,1.4849924888145965E-13),(-0.998558022065675,0.05368311250558329,-1.4774685637688357E-13),(-0.9985580220656761,-0.05368311250556282,1.4849924888147631E-13),(-0.9985580220656761,-0.05368311250556282,1.4849924888147631E-13),(-0.994236246863431,-0.10721140528376129,2.9616678025587057E-13),(-0.9985580220656763,-0.053683112505556796,1.4849924888145965E-13),(-0.994236246863431,-0.10721140528376129,2.9616678025587057E-13),(-0.8507772826193604,-0.5255264173938519,1.450241480520965E-12),(-0.7331764133483573,-0.6800384892854513,1.8766101216466353E-12),(-0.8507772826193604,-0.5255264173938519,1.450241480520965E-12),(-0.7331764133483956,-0.68003848928541,1.876610121646521E-12),(-0.7331764133483956,-0.68003848928541,1.876610121646521E-12),(-0.5879319010498538,-0.8089104275059785,2.2322231583092928E-12),(-0.7331764133483573,-0.6800384892854513,1.8766101216466353E-12),(-0.5879319010498538,-0.8089104275059785,2.2322231583092928E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(0.06586923201172726,0.9978282639182884,-2.753246939983783E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(0.06586923201174096,0.9978282639182874,-2.75324693998378E-12),(0.06586923201174096,0.9978282639182874,-2.75324693998378E-12),(0.26363297317792694,0.9646230639236067,-2.661639685233899E-12),(0.06586923201172726,0.9978282639182884,-2.753246939983783E-12),(0.26363297317782863,0.9646230639236335,-2.6616396852339736E-12),(0.26363297317782863,0.9646230639236335,-2.6616396852339736E-12),(0.4941723067129574,0.8693639808952259,-2.398888566859996E-12),(0.26363297317792694,0.9646230639236067,-2.661639685233899E-12),(0.49417230671293877,0.8693639808952366,-2.3988885668600255E-12),(0.49417230671293877,0.8693639808952366,-2.3988885668600255E-12),(0.6822341669074508,0.7311337370851497,-2.017541902750323E-12),(0.4941723067129574,0.8693639808952259,-2.398888566859996E-12),(0.6822341669074938,0.7311337370851094,-2.0175419027502113E-12),(0.6822341669074508,0.7311337370851497,-2.017541902750323E-12),(0.8170818871976416,0.5765216297881117,-1.5908905089817476E-12),(0.8170818871976462,0.5765216297881053,-1.5908905089817298E-12),(0.6822341669074938,0.7311337370851094,-2.0175419027502113E-12),(0.8170818871976462,0.5765216297881053,-1.5908905089817298E-12),(0.8956698069729665,0.44471968348276353,-1.2273605591564417E-12),(0.8956698069729655,0.44471968348276525,-1.2273605591564464E-12),(0.8170818871976416,0.5765216297881117,-1.5908905089817476E-12),(0.8956698069729655,0.44471968348276525,-1.2273605591564464E-12),(0.9418989444488495,0.33589638051956316,-9.273048625556787E-13),(0.9418989444488512,0.3358963805195581,-9.273048625556647E-13),(0.8956698069729665,0.44471968348276353,-1.2273605591564417E-12),(0.9418989444488512,0.3358963805195581,-9.273048625556647E-13),(0.9719072033706481,0.23536437291197268,-6.49898585478851E-13),(0.9719072033706505,0.23536437291196244,-6.498985854788227E-13),(0.9418989444488495,0.33589638051956316,-9.273048625556787E-13),(0.9719072033706505,0.23536437291196244,-6.498985854788227E-13),(0.9926609702408182,0.12093055098095644,-3.340739419237897E-13),(0.9926609702408176,0.12093055098096052,-3.34073941923801E-13),(0.9719072033706481,0.23536437291197268,-6.49898585478851E-13),(0.9926609702408176,0.12093055098096052,-3.34073941923801E-13),(0.9999176960541967,0.012829696709872374,-3.5856765529805036E-14),(0.9999176960541967,0.012829696709878598,-3.585676552982218E-14),(0.9926609702408182,0.12093055098095644,-3.340739419237897E-13),(0.9999176960541967,0.012829696709878598,-3.585676552982218E-14),(0.9977259706298166,-0.06740094606747518,1.8553196870279236E-13),(0.9977259706298175,-0.0674009460674604,1.8553196870275157E-13),(0.9999176960541967,0.012829696709872374,-3.5856765529805036E-14),(0.9977259706298175,-0.0674009460674604,1.8553196870275157E-13),(0.9902871124897815,-0.1390375303170006,3.8325132971139077E-13),(0.9902871124897834,-0.1390375303169881,3.8325132971135633E-13),(0.9977259706298166,-0.06740094606747518,1.8553196870279236E-13),(0.9902871124897834,-0.1390375303169881,3.8325132971135633E-13),(0.9766392563350035,-0.2148854648072119,5.925636185966191E-13),(0.9766392563350028,-0.21488546480721524,5.925636185966282E-13),(0.9902871124897815,-0.1390375303170006,3.8325132971139077E-13),(0.9766392563350028,-0.21488546480721524,5.925636185966282E-13),(0.956192572857882,-0.2927383876628142,8.07344059567985E-13),(0.9561925728578783,-0.2927383876628269,8.073440595680201E-13),(0.9766392563350035,-0.2148854648072119,5.925636185966191E-13),(0.9561925728578783,-0.2927383876628269,8.073440595680201E-13),(0.9254680870270003,-0.37882557977858955,1.0449101723568374E-12),(0.925468087026997,-0.3788255797785978,1.04491017235686E-12),(0.956192572857882,-0.2927383876628142,8.07344059567985E-13),(0.925468087026997,-0.3788255797785978,1.04491017235686E-12),(0.8749146921521967,-0.48427707095858563,1.3360245513057086E-12),(0.8749146921522147,-0.48427707095855305,1.336024551305619E-12),(0.9254680870270003,-0.37882557977858955,1.0449101723568374E-12),(0.8749146921522147,-0.48427707095855305,1.336024551305619E-12),(0.7908353863491634,-0.6120289141028957,1.6884943395375576E-12),(0.7908353863492028,-0.6120289141028448,1.688494339537417E-12),(0.8749146921521967,-0.48427707095858563,1.3360245513057086E-12),(0.7908353863492028,-0.6120289141028448,1.688494339537417E-12),(0.6577139687329254,-0.7532677713360533,2.0781819176665396E-12),(0.6577139687329435,-0.7532677713360374,2.078181917666496E-12),(0.7908353863491634,-0.6120289141028957,1.6884943395375576E-12),(0.6577139687329254,-0.7532677713360533,2.0781819176665396E-12),(0.48381045391931793,-0.8751728084660673,2.4146302815546845E-12),(0.6577139687329435,-0.7532677713360374,2.078181917666496E-12),(0.4838104539193804,-0.8751728084660328,2.4146302815545896E-12),(0.4838104539193804,-0.8751728084660328,2.4146302815545896E-12),(0.26498333539704805,-0.9642529916789763,2.6604947516021636E-12),(0.48381045391931793,-0.8751728084660673,2.4146302815546845E-12),(0.26498333539706426,-0.9642529916789718,2.660494751602151E-12),(0.26498333539706426,-0.9642529916789718,2.660494751602151E-12),(0.06820622469696762,-0.9976712439038158,2.7527671526785293E-12),(0.26498333539704805,-0.9642529916789763,2.6604947516021636E-12),(0.06820622469692826,-0.9976712439038183,2.7527671526785358E-12),(0.06820622469696762,-0.9976712439038158,2.7527671526785293E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(0.06820622469692826,-0.9976712439038183,2.7527671526785358E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-0.587931901049856,0.808910427505977,-2.2317615791035367E-12),(-0.733176413348437,0.6800384892853655,-1.876079111086589E-12),(-0.7331764133484753,0.6800384892853242,-1.8760791110864753E-12),(-0.587931901049856,0.808910427505977,-2.2317615791035367E-12),(-0.733176413348437,0.6800384892853655,-1.876079111086589E-12),(-0.8507772826193596,0.5255264173938535,-1.4496610597999443E-12),(-0.7331764133484753,0.6800384892853242,-1.8760791110864753E-12),(-0.8507772826193596,0.5255264173938535,-1.4496610597999443E-12),(-0.9942362468634309,0.10721140528376116,-2.9547106956687535E-13),(-0.998558022065675,0.05368311250558329,-1.4774685637688357E-13),(-0.9942362468634309,0.10721140528376116,-2.9547106956687535E-13),(-0.9985580220656759,0.05368311250556469,-1.4774685637683228E-13),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.07695947056770674,0.9970342220254721,-2.751007767601995E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.0769594705677078,0.9970342220254721,-2.7510077676019946E-12),(-0.07695947056770674,0.9970342220254721,-2.751007767601995E-12),(-0.30631458433137615,0.9519303416878236,-2.626478675247617E-12),(-0.3063145843315041,0.9519303416877822,-2.6264786752475027E-12),(-0.0769594705677078,0.9970342220254721,-2.7510077676019946E-12),(-0.3063145843315041,0.9519303416877822,-2.6264786752475027E-12),(-0.5625785556331592,0.82674383501887,-2.2809627230806477E-12),(-0.5625785556331618,0.8267438350188683,-2.280962723080643E-12),(-0.30631458433137615,0.9519303416878236,-2.626478675247617E-12),(-0.5625785556331618,0.8267438350188683,-2.280962723080643E-12),(-0.7436990877465491,0.6685145225684711,-1.844275979742807E-12),(-0.7436990877464648,0.6685145225685648,-1.8442759797430657E-12),(-0.5625785556331592,0.82674383501887,-2.2809627230806477E-12),(-0.7436990877465491,0.6685145225684711,-1.844275979742807E-12),(-0.8582582522446103,0.5132180554637833,-1.4157651248968762E-12),(-0.7436990877464648,0.6685145225685648,-1.8442759797430657E-12),(-0.8582582522446274,0.5132180554637548,-1.4157651248967975E-12),(-0.8582582522446274,0.5132180554637548,-1.4157651248967975E-12),(-0.9228983961102781,0.38504356955684416,-1.0620484515313755E-12),(-0.8582582522446103,0.5132180554637833,-1.4157651248968762E-12),(-0.9228983961102676,0.38504356955686964,-1.062048451531446E-12),(-0.9228983961102676,0.38504356955686964,-1.062048451531446E-12),(-0.9598249214871282,0.2805995725089912,-7.738806566492685E-13),(-0.9228983961102781,0.38504356955684416,-1.0620484515313755E-12),(-0.959824921487124,0.2805995725090049,-7.738806566493064E-13),(-0.959824921487124,0.2805995725090049,-7.738806566493064E-13),(-0.9825437042969424,0.18603190357151872,-5.129969861329518E-13),(-0.9598249214871282,0.2805995725089912,-7.738806566492685E-13),(-0.9825437042969416,0.18603190357152283,-5.129969861329631E-13),(-0.9825437042969416,0.18603190357152283,-5.129969861329631E-13),(-0.9959333498749684,0.09009307746338743,-2.4818266367508047E-13),(-0.9825437042969424,0.18603190357151872,-5.129969861329518E-13),(-0.9959333498749663,0.09009307746340967,-2.4818266367514186E-13),(-0.9959333498749663,0.09009307746340967,-2.4818266367514186E-13),(-0.9999913518233414,0.004158879479668723,-1.0984340022619178E-14),(-0.9959333498749684,0.09009307746338743,-2.4818266367508047E-13),(-0.9999913518233414,0.004158879479666016,-1.098434002261171E-14),(-0.9999913518233414,0.004158879479666016,-1.098434002261171E-14),(-0.997280073697995,-0.07370518709644312,2.0387423346171383E-13),(-0.9999913518233414,0.004158879479668723,-1.0984340022619178E-14),(-0.997280073697995,-0.07370518709644484,2.0387423346171853E-13),(-0.997280073697995,-0.07370518709644484,2.0387423346171853E-13),(-0.9867686117938449,-0.1621348413464799,4.477844712437174E-13),(-0.997280073697995,-0.07370518709644312,2.0387423346171383E-13),(-0.9867686117938491,-0.16213484134645498,4.4778447124364863E-13),(-0.9867686117938491,-0.16213484134645498,4.4778447124364863E-13),(-0.9628292628321741,-0.2701107377244606,7.457383956430091E-13),(-0.9867686117938449,-0.1621348413464799,4.477844712437174E-13),(-0.9628292628321742,-0.2701107377244601,7.457383956430077E-13),(-0.9628292628321742,-0.2701107377244601,7.457383956430077E-13),(-0.9101427787757594,-0.41429472871657336,1.1435550059457471E-12),(-0.9628292628321741,-0.2701107377244606,7.457383956430091E-13),(-0.9101427787757602,-0.41429472871657175,1.143555005945743E-12),(-0.9101427787757602,-0.41429472871657175,1.143555005945743E-12),(-0.7869835626918029,-0.6169739638371438,1.702660934173179E-12),(-0.9101427787757594,-0.41429472871657336,1.1435550059457471E-12),(-0.7869835626917597,-0.6169739638371992,1.7026609341733323E-12),(-0.7869835626918029,-0.6169739638371438,1.702660934173179E-12),(-0.5449321183150416,-0.8384801646006192,2.3137543375374905E-12),(-0.5449321183150387,-0.8384801646006211,2.313754337537496E-12),(-0.7869835626917597,-0.6169739638371992,1.7026609341733323E-12),(-0.5449321183150387,-0.8384801646006211,2.313754337537496E-12),(-0.24629616144207656,-0.969194614542868,2.674309038376756E-12),(-0.24629616144210634,-0.9691946145428606,2.6743090383767355E-12),(-0.5449321183150416,-0.8384801646006192,2.3137543375374905E-12),(-0.24629616144207656,-0.969194614542868,2.674309038376756E-12),(-0.05277084790588199,-0.9986066480908758,2.755387943058419E-12),(-0.24629616144210634,-0.9691946145428606,2.6743090383767355E-12),(-0.05277084790586261,-0.998606648090877,2.7553879430584223E-12),(-0.05277084790586261,-0.998606648090877,2.7553879430584223E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.05277084790588199,-0.9986066480908758,2.755387943058419E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.20007400713181706,0.9797807875592468,-2.703360012821659E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.20007400713174242,0.9797807875592619,-2.703360012821701E-12),(-0.20007400713181706,0.9797807875592468,-2.703360012821659E-12),(-0.39205733655535935,0.9199407833404918,-2.5381860473712873E-12),(-0.39205733655535935,0.9199407833404918,-2.5381860473712873E-12),(-0.20007400713174242,0.9797807875592619,-2.703360012821701E-12),(-0.9271481171496561,0.374695034482508,-1.0336038453690325E-12),(-0.9613689058329938,0.2752631956827363,-7.592183273170402E-13),(-0.9271481171496561,0.374695034482508,-1.0336038453690325E-12),(-0.9613689058329786,0.27526319568278984,-7.59218327317188E-13),(-0.9613689058329786,0.27526319568278984,-7.59218327317188E-13),(-0.9849591146664011,0.1727875644703044,-4.764375605704E-13),(-0.9613689058329938,0.2752631956827363,-7.592183273170402E-13),(-0.9849591146664011,0.1727875644703044,-4.764375605704E-13),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.9850568535010445,-0.1722294846146325,4.755786844994556E-13),(-0.9627290187837241,-0.2704678102690373,7.466813754295113E-13),(-0.9850568535010445,-0.1722294846146325,4.755786844994556E-13),(-0.9627290187837233,-0.2704678102690403,7.466813754295197E-13),(-0.9627290187837233,-0.2704678102690403,7.466813754295197E-13),(-0.8103422277042358,-0.5859568874920209,1.617118534510206E-12),(-0.9627290187837241,-0.2704678102690373,7.466813754295113E-13),(-0.8103422277044423,-0.5859568874917351,1.6171185345094178E-12),(-0.8103422277042358,-0.5859568874920209,1.617118534510206E-12),(-0.4221218672865516,-0.9065390941148183,2.501484456445548E-12),(-0.4221218672861895,-0.9065390941149867,2.5014844564460134E-12),(-0.8103422277044423,-0.5859568874917351,1.6171185345094178E-12),(-0.4221218672861895,-0.9065390941149867,2.5014844564460134E-12),(-0.0889963508540526,-0.9960319520651245,2.7483027757093965E-12),(-0.08899635085414635,-0.9960319520651162,2.748302775709374E-12),(-0.4221218672865516,-0.9065390941148183,2.501484456445548E-12),(-0.0889963508540526,-0.9960319520651245,2.7483027757093965E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.08899635085414635,-0.9960319520651162,2.748302775709374E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-0.5879319010498686,0.8089104275059679,-2.2317060679523054E-12),(-0.7331764133483359,0.6800384892854743,-1.876107399963612E-12),(-0.5879319010498686,0.8089104275059679,-2.2317060679523054E-12),(-0.7331764133483462,0.6800384892854633,-1.8761073999635813E-12),(-0.7331764133483462,0.6800384892854633,-1.8761073999635813E-12),(-0.8507772826193463,0.5255264173938747,-1.4497720821024064E-12),(-0.7331764133483359,0.6800384892854743,-1.876107399963612E-12),(-0.8507772826193463,0.5255264173938747,-1.4497720821024064E-12),(-0.9942362468634309,0.10721140528376116,-2.9547106956687535E-13),(-0.9985580220656761,0.05368311250556237,-1.477468563768259E-13),(-0.9942362468634309,0.10721140528376116,-2.9547106956687535E-13),(-0.9985580220656766,0.05368311250555518,-1.4774685637680597E-13),(-0.9985580220656766,0.05368311250555518,-1.4774685637680597E-13),(-0.9997372811223788,-0.022920923498714715,6.370289276845035E-14),(-0.9985580220656761,0.05368311250556237,-1.477468563768259E-13),(-0.9997372811223786,-0.02292092349872411,6.370289276847629E-14),(-0.9997372811223786,-0.02292092349872411,6.370289276847629E-14),(-0.9919210150229094,-0.12685700593944943,3.504220998932451E-13),(-0.9997372811223788,-0.022920923498714715,6.370289276845035E-14),(-0.9919210150229099,-0.12685700593944513,3.5042209989323335E-13),(-0.9919210150229099,-0.12685700593944513,3.5042209989323335E-13),(-0.9257138949175179,-0.3782245163347276,1.0438472384269452E-12),(-0.9919210150229094,-0.12685700593944943,3.504220998932451E-13),(-0.9257138949175853,-0.3782245163345627,1.0438472384264904E-12),(-0.9257138949175853,-0.3782245163345627,1.0438472384264904E-12),(-0.7298956734503028,-0.683558560679719,1.886307370755263E-12),(-0.9257138949175179,-0.3782245163347276,1.0438472384269452E-12),(-0.7298956734503935,-0.6835585606796221,1.8863073707549947E-12),(-0.7298956734503935,-0.6835585606796221,1.8863073707549947E-12),(-0.5913596447695699,-0.8064079430028008,2.2252843153902224E-12),(-0.7298956734503028,-0.683558560679719,1.886307370755263E-12),(-0.5913596447695699,-0.8064079430028008,2.2252843153902224E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.3725977238595926E-27,1.,-2.75921435746603E-12),(-0.08899635085414426,0.9960319520651163,-2.748230462841415E-12),(-1.3725977238595926E-27,1.,-2.75921435746603E-12),(-0.08899635085419927,0.9960319520651114,-2.7482304628414016E-12),(-0.08899635085419927,0.9960319520651114,-2.7482304628414016E-12),(-0.42212186728681367,0.9065390941146961,-2.501113120131821E-12),(-0.08899635085414426,0.9960319520651163,-2.748230462841415E-12),(-0.422121867286689,0.9065390941147541,-2.5011131201319813E-12),(-0.42212186728681367,0.9065390941146961,-2.501113120131821E-12),(-0.8086796863924085,0.5882492369874152,-1.622740977997091E-12),(-0.8086796863925371,0.5882492369872385,-1.6227409779966037E-12),(-0.422121867286689,0.9065390941147541,-2.5011131201319813E-12),(-0.8086796863924085,0.5882492369874152,-1.622740977997091E-12),(-0.9603664303895799,0.27874059514318394,-7.687173510534536E-13),(-0.8086796863925371,0.5882492369872385,-1.6227409779966037E-12),(-0.9603664303895832,0.278740595143172,-7.687173510534205E-13),(-0.9603664303895832,0.278740595143172,-7.687173510534205E-13),(-0.9830031215351334,0.18358884239567475,-5.061360555728937E-13),(-0.9603664303895799,0.27874059514318394,-7.687173510534536E-13),(-0.9830031215351334,0.18358884239567475,-5.061360555728937E-13),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.9832650394637042,-0.1821808501693859,5.031121888584162E-13),(-0.9604389766296882,-0.27849052438192123,7.688069869826957E-13),(-0.9832650394637042,-0.1821808501693859,5.031121888584162E-13),(-0.9604389766296882,-0.27849052438192123,7.688069869826958E-13),(-0.9604389766296882,-0.27849052438192123,7.688069869826958E-13),(-0.8061306092177407,-0.5917376453144033,1.633064576078389E-12),(-0.9604389766296882,-0.27849052438192123,7.688069869826957E-13),(-0.8061306092175928,-0.5917376453146048,1.6330645760789456E-12),(-0.8061306092175928,-0.5917376453146048,1.6330645760789456E-12),(-0.4173761927597633,-0.9087337969490104,2.5075755395340645E-12),(-0.8061306092177407,-0.5917376453144033,1.633064576078389E-12),(-0.41737619275943794,-0.9087337969491598,2.507575539534477E-12),(-0.41737619275943794,-0.9087337969491598,2.507575539534477E-12),(-0.0876379036952092,-0.9961523968931206,2.748625233602597E-12),(-0.4173761927597633,-0.9087337969490104,2.5075755395340645E-12),(-0.08763790369517202,-0.996152396893124,2.7486252336026063E-12),(-0.0876379036952092,-0.9961523968931206,2.748625233602597E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.08763790369517202,-0.996152396893124,2.7486252336026063E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.08899635085417186,0.996031952065114,-2.748223496303952E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.08899635085428885,0.9960319520651035,-2.748223496303923E-12),(-0.08899635085428885,0.9960319520651035,-2.748223496303923E-12),(-0.42212186728673545,0.9065390941147324,-2.501105944554121E-12),(-0.08899635085417186,0.996031952065114,-2.748223496303952E-12),(-0.4221218672863759,0.9065390941149,-2.5011059445545833E-12),(-0.42212186728673545,0.9065390941147324,-2.501105944554121E-12),(-0.8086796863921236,0.5882492369878068,-1.6227409779981367E-12),(-0.8086796863926936,0.588249236987023,-1.6227409779959736E-12),(-0.4221218672863759,0.9065390941149,-2.5011059445545833E-12),(-0.8086796863921236,0.5882492369878068,-1.6227409779981367E-12),(-0.9603664303895966,0.2787405951431262,-7.687452400256997E-13),(-0.8086796863926936,0.588249236987023,-1.6227409779959736E-12),(-0.9603664303895936,0.2787405951431366,-7.687452400257282E-13),(-0.9603664303895936,0.2787405951431366,-7.687452400257282E-13),(-0.9830031215351365,0.18358884239565865,-5.06191566724125E-13),(-0.9603664303895966,0.2787405951431262,-7.687452400256997E-13),(-0.9830031215351365,0.18358884239565865,-5.06191566724125E-13),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.9829162037139707,-0.18405362391573804,5.082192095830502E-13),(-0.9589823266839971,-0.2834658658599789,7.825101235733891E-13),(-0.9829162037139707,-0.18405362391573804,5.082192095830502E-13),(-0.9589823266839956,-0.283465865859984,7.825101235734033E-13),(-0.9589823266839956,-0.283465865859984,7.825101235734033E-13),(-0.9250216907185411,-0.3799142952038155,1.0486194056866243E-12),(-0.9589823266839971,-0.2834658658599789,7.825101235733891E-13),(-0.9250216907185411,-0.3799142952038155,1.0486194056866243E-12),(-0.39770665703451996,-0.9175126238643406,2.531786256486511E-12),(-0.20308542061863116,-0.9791610245164756,2.701803115869132E-12),(-0.39770665703451996,-0.9175126238643406,2.531786256486511E-12),(-0.20308542061867696,-0.979161024516466,2.7018031158691053E-12),(-0.20308542061863116,-0.9791610245164756,2.701803115869132E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.20308542061867696,-0.979161024516466,2.7018031158691053E-12),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(0.7352884309046378,0.677754323761786,-1.8703481552385253E-12),(0.8219126130549742,0.5696136028055726,-1.5721074216414702E-12),(0.821912613054971,0.569613602805577,-1.5721074216414825E-12),(0.7352884309046378,0.677754323761786,-1.8703481552385253E-12),(0.821912613054971,0.569613602805577,-1.5721074216414825E-12),(0.9379792061057557,0.34669151837507706,-9.570309790839878E-13),(0.937979206105743,0.3466915183751111,-9.570309790840815E-13),(0.8219126130549742,0.5696136028055726,-1.5721074216414702E-12),(0.937979206105743,0.3466915183751111,-9.570309790840815E-13),(0.98805711892142,0.15408805842343215,-4.255263526147315E-13),(0.9880571189214249,0.15408805842340023,-4.2552635261464347E-13),(0.9379792061057557,0.34669151837507706,-9.570309790839878E-13),(0.9880571189214249,0.15408805842340023,-4.2552635261464347E-13),(0.9999397421523021,0.01097779870410655,-3.0680332414721317E-14),(0.9999397421523019,0.010977798704114703,-3.068033241474382E-14),(0.98805711892142,0.15408805842343215,-4.255263526147315E-13),(0.9999397421523019,0.010977798704114703,-3.068033241474382E-14),(0.9948858286649289,-0.10100588062928692,2.783141461294464E-13),(0.9948858286649307,-0.10100588062926952,2.783141461293984E-13),(0.9999397421523021,0.01097779870410655,-3.0680332414721317E-14),(0.9948858286649307,-0.10100588062926952,2.783141461293984E-13),(0.9754732549000814,-0.22011798875748684,6.069184716438678E-13),(0.9754732549000839,-0.22011798875747546,6.069184716438365E-13),(0.9948858286649289,-0.10100588062928692,2.783141461294464E-13),(0.9754732549000839,-0.22011798875747546,6.069184716438365E-13),(0.9331889358875146,-0.359386157130639,9.91232101813445E-13),(0.9331889358875224,-0.35938615713061894,9.9123210181339E-13),(0.9754732549000814,-0.22011798875748684,6.069184716438678E-13),(0.9331889358875224,-0.35938615713061894,9.9123210181339E-13),(0.8533260584412695,-0.521377634718912,1.4383280526107085E-12),(0.8533260584412645,-0.5213776347189203,1.438328052610732E-12),(0.9331889358875146,-0.359386157130639,9.91232101813445E-13),(0.8533260584412645,-0.5213776347189203,1.438328052610732E-12),(0.7046792499668371,-0.7095260070400352,1.9575326358255978E-12),(0.7046792499668799,-0.7095260070399927,1.957532635825481E-12),(0.8533260584412695,-0.521377634718912,1.4383280526107085E-12),(0.7046792499668371,-0.7095260070400352,1.9575326358255978E-12),(0.46309034133606747,-0.886311082950701,2.445350036860986E-12),(0.7046792499668799,-0.7095260070399927,1.957532635825481E-12),(0.46309034133616733,-0.8863110829506489,2.445350036860842E-12),(0.46309034133616733,-0.8863110829506489,2.445350036860842E-12),(0.20131673991194704,-0.9795261968070204,2.7026382936464105E-12),(0.46309034133606747,-0.886311082950701,2.445350036860986E-12),(0.2013167399120235,-0.9795261968070046,2.702638293646367E-12),(0.2013167399120235,-0.9795261968070046,2.702638293646367E-12),(0.04276298507064453,-0.9990852451657206,2.7566814799619883E-12),(0.20131673991194704,-0.9795261968070204,2.7026382936464105E-12),(0.04276298507064104,-0.9990852451657207,2.7566814799619883E-12),(0.04276298507064104,-0.9990852451657207,2.7566814799619883E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(0.04276298507064453,-0.9990852451657206,2.7566814799619883E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-0.595427913033985,0.8034087380530496,-2.2166069233204607E-12),(-0.7353424654422723,0.6776956975791426,-1.8697061678841036E-12),(-0.7353424654423132,0.6776956975790981,-1.869706167883981E-12),(-0.595427913033985,0.8034087380530496,-2.2166069233204607E-12),(-0.7353424654422723,0.6776956975791426,-1.8697061678841036E-12),(-0.9279729502400482,0.37264755952881395,-1.0279344543242256E-12),(-0.7353424654423132,0.6776956975790981,-1.869706167883981E-12),(-0.9279729502401372,0.37264755952859296,-1.0279344543236155E-12),(-0.9279729502401372,0.37264755952859296,-1.0279344543236155E-12),(-0.9919380594528827,0.12672366080905945,-3.492796620308465E-13),(-0.9279729502400482,0.37264755952881395,-1.0279344543242256E-12),(-0.9919380594528854,0.12672366080903733,-3.492796620307854E-13),(-0.9919380594528854,0.12672366080903733,-3.492796620307854E-13),(-0.9997278626286517,0.023328109309328406,-6.395138370622752E-14),(-0.9919380594528827,0.12672366080905945,-3.492796620308465E-13),(-0.9997278626286514,0.023328109309333794,-6.395138370624238E-14),(-0.9997278626286514,0.023328109309333794,-6.395138370624238E-14),(-0.9997372811223784,-0.022920923498728103,6.37028927684873E-14),(-0.9997278626286517,0.023328109309328406,-6.395138370622752E-14),(-0.9997372811223787,-0.022920923498716585,6.37028927684555E-14),(-0.9997372811223787,-0.022920923498716585,6.37028927684555E-14),(-0.9919210150229141,-0.12685700593941257,3.505056429304207E-13),(-0.9997372811223784,-0.022920923498728103,6.37028927684873E-14),(-0.9919210150229048,-0.1268570059394845,3.5050564293061904E-13),(-0.9919210150229048,-0.1268570059394845,3.5050564293061904E-13),(-0.9257138949175897,-0.3782245163345522,1.0439318621370067E-12),(-0.9919210150229141,-0.12685700593941257,3.505056429304207E-13),(-0.9257138949175633,-0.3782245163346167,1.0439318621371848E-12),(-0.9257138949175633,-0.3782245163346167,1.0439318621371848E-12),(-0.7298956734501725,-0.6835585606798581,1.8863356104183993E-12),(-0.9257138949175897,-0.3782245163345522,1.0439318621370067E-12),(-0.7298956734503791,-0.6835585606796375,1.8863356104177906E-12),(-0.7298956734501725,-0.6835585606798581,1.8863356104183993E-12),(-0.5913596447695568,-0.8064079430028104,2.2253398265414533E-12),(-0.5913596447695568,-0.8064079430028104,2.2253398265414533E-12),(-0.7298956734503791,-0.6835585606796375,1.8863356104177906E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(0.07795967280676985,0.9969565133022913,-2.7508625779064196E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(0.07795967280676629,0.9969565133022915,-2.7508625779064208E-12),(0.07795967280676629,0.9969565133022915,-2.7508625779064208E-12),(0.33819741169692114,0.941075188665339,-2.5968084321240143E-12),(0.07795967280676985,0.9969565133022913,-2.7508625779064196E-12),(0.3381974116971664,0.941075188665251,-2.5968084321237715E-12),(0.3381974116971664,0.941075188665251,-2.5968084321237715E-12),(0.6202213981854017,0.7844268080789601,-2.1646572254656508E-12),(0.33819741169692114,0.941075188665339,-2.5968084321240143E-12),(0.6202213981854617,0.7844268080789125,-2.164657225465519E-12),(0.6202213981854017,0.7844268080789601,-2.1646572254656508E-12),(0.7950566191211772,0.6065352194156605,-1.6737602394790111E-12),(0.7950566191211507,0.6065352194156955,-1.6737602394791074E-12),(0.6202213981854617,0.7844268080789125,-2.164657225465519E-12),(0.7950566191211507,0.6065352194156955,-1.6737602394791074E-12),(0.9071364246607834,0.4208366750339745,-1.161501239451008E-12),(0.9071364246607592,0.4208366750340265,-1.1615012394511516E-12),(0.7950566191211772,0.6065352194156605,-1.6737602394790111E-12),(0.9071364246607592,0.4208366750340265,-1.1615012394511516E-12),(0.9665120711748036,0.2566211532071962,-7.084764068038022E-13),(0.9665120711748055,0.25662115320718937,-7.084764068037836E-13),(0.9071364246607834,0.4208366750339745,-1.161501239451008E-12),(0.9665120711748055,0.25662115320718937,-7.084764068037836E-13),(0.9924147561708995,0.12293474583800236,-3.3954536152028085E-13),(0.9924147561708991,0.12293474583800497,-3.39545361520288E-13),(0.9665120711748036,0.2566211532071962,-7.084764068038022E-13),(0.9924147561708991,0.12293474583800497,-3.39545361520288E-13),(0.9999871034548478,-0.005078673447265601,1.3669356791993708E-14),(0.9999871034548478,-0.005078673447250062,1.3669356791950824E-14),(0.9924147561708995,0.12293474583800236,-3.3954536152028085E-13),(0.9999871034548478,-0.005078673447250062,1.3669356791950824E-14),(0.9883938693820078,-0.15191299802209976,4.188672759432513E-13),(0.9883938693820004,-0.151912998022149,4.1886727594338727E-13),(0.9999871034548478,-0.005078673447265601,1.3669356791993708E-14),(0.9883938693820004,-0.151912998022149,4.1886727594338727E-13),(0.9438486732585091,-0.3303780894492741,9.11294804785386E-13),(0.9438486732585174,-0.3303780894492497,9.11294804785319E-13),(0.9883938693820078,-0.15191299802209976,4.188672759432513E-13),(0.9438486732585174,-0.3303780894492497,9.11294804785319E-13),(0.8505249238695582,-0.5259347429830835,1.450884465387306E-12),(0.8505249238695977,-0.52593474298302,1.450884465387131E-12),(0.9438486732585091,-0.3303780894492741,9.11294804785386E-13),(0.8505249238695977,-0.52593474298302,1.450884465387131E-12),(0.7840634204835987,-0.6206807171642756,1.7123408197394589E-12),(0.7840634204835987,-0.6206807171642756,1.7123408197394589E-12),(0.8505249238695582,-0.5259347429830835,1.450884465387306E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.04985214699043369,0.9987566087092712,-2.7557647213504354E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.04985214699045902,0.99875660870927,-2.7557647213504313E-12),(-0.04985214699043369,0.9987566087092712,-2.7557647213504354E-12),(-0.34263505180297543,0.9394685845072056,-2.5920324950847365E-12),(-0.34263505180298326,0.9394685845072027,-2.5920324950847285E-12),(-0.04985214699045902,0.99875660870927,-2.7557647213504313E-12),(-0.34263505180298326,0.9394685845072027,-2.5920324950847285E-12),(-0.7067512124899926,0.7074621711751983,-1.9518467729534758E-12),(-0.7067512124899772,0.7074621711752135,-1.951846772953518E-12),(-0.34263505180297543,0.9394685845072056,-2.5920324950847365E-12),(-0.7067512124899926,0.7074621711751983,-1.9518467729534758E-12),(-0.8848347895576633,0.465904920760069,-1.2852764846614836E-12),(-0.7067512124899772,0.7074621711752135,-1.951846772953518E-12),(-0.8848347895576638,0.4659049207600676,-1.2852764846614802E-12),(-0.8848347895576638,0.4659049207600676,-1.2852764846614802E-12),(-0.9613660408982533,0.27527320139748107,-7.591858025745733E-13),(-0.8848347895576633,0.465904920760069,-1.2852764846614836E-12),(-0.9613660408982357,0.27527320139754213,-7.591858025747417E-13),(-0.9613660408982357,0.27527320139754213,-7.591858025747417E-13),(-0.9926019629217055,0.12141393331894552,-3.3467292877236314E-13),(-0.9613660408982533,0.27527320139748107,-7.591858025745733E-13),(-0.9926019629217047,0.12141393331895171,-3.346729287723802E-13),(-0.9926019629217047,0.12141393331895171,-3.346729287723802E-13),(-0.9999995995077935,-0.0008949772360086743,2.9058556789209908E-15),(-0.9926019629217055,0.12141393331894552,-3.3467292877236314E-13),(-0.9999995995077935,-0.0008949772360261393,2.9058556789692004E-15),(-0.9999995995077935,-0.0008949772360261393,2.9058556789692004E-15),(-0.9922297490278524,-0.12441915103441759,3.436890946384989E-13),(-0.9999995995077935,-0.0008949772360086743,2.9058556789209908E-15),(-0.9922297490278514,-0.1244191510344244,3.4368909463851775E-13),(-0.9922297490278514,-0.1244191510344244,3.4368909463851775E-13),(-0.9603398875491048,-0.2788320289747448,7.697095394959575E-13),(-0.9922297490278524,-0.12441915103441759,3.436890946384989E-13),(-0.9603398875491099,-0.2788320289747272,7.69709539495909E-13),(-0.9603398875491099,-0.2788320289747272,7.69709539495909E-13),(-0.8853076919779572,-0.46500568870139897,1.283378647575306E-12),(-0.9603398875491048,-0.2788320289747448,7.697095394959575E-13),(-0.8853076919779543,-0.4650056887014047,1.283378647575322E-12),(-0.8853076919779543,-0.4650056887014047,1.283378647575322E-12),(-0.7047839328151388,-0.7094220239361236,1.9576692588969726E-12),(-0.8853076919779572,-0.46500568870139897,1.283378647575306E-12),(-0.7047839328151851,-0.7094220239360776,1.9576692588968453E-12),(-0.7047839328151388,-0.7094220239361236,1.9576692588969726E-12),(-0.3382277690985446,-0.9410642784691285,2.5967296503507575E-12),(-0.33822776909836216,-0.9410642784691942,2.5967296503509392E-12),(-0.7047839328151851,-0.7094220239360776,1.9576692588968453E-12),(-0.33822776909836216,-0.9410642784691942,2.5967296503509392E-12),(-0.05052755331290805,-0.9987226673888058,2.7557139652220927E-12),(-0.050527553312888905,-0.9987226673888068,2.755713965222096E-12),(-0.3382277690985446,-0.9410642784691285,2.5967296503507575E-12),(-0.05052755331290805,-0.9987226673888058,2.7557139652220927E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.050527553312888905,-0.9987226673888068,2.755713965222096E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.0537500230457373,0.9985544226643749,-2.755200393631339E-12),(-0.05375002304574732,0.9985544226643743,-2.755200393631337E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.0537500230457373,0.9985544226643749,-2.755200393631339E-12),(-0.29184427840924615,0.9564658473567085,-2.6389544242147224E-12),(-0.05375002304574732,0.9985544226643743,-2.755200393631337E-12),(-0.2918442784093408,0.9564658473566796,-2.6389544242146432E-12),(-0.2918442784093408,0.9564658473566796,-2.6389544242146432E-12),(-0.5877775740479074,0.8090225728904954,-2.2320719823564784E-12),(-0.29184427840924615,0.9564658473567085,-2.6389544242147224E-12),(-0.5877775740478249,0.8090225728905553,-2.2320719823566436E-12),(-0.5877775740479074,0.8090225728904954,-2.2320719823564784E-12),(-0.7805286589002669,0.6251199985885519,-1.7246201501569679E-12),(-0.7805286589003659,0.6251199985884281,-1.724620150156626E-12),(-0.5877775740478249,0.8090225728905553,-2.2320719823566436E-12),(-0.7805286589002669,0.6251199985885519,-1.7246201501569679E-12),(-0.9023997685575124,0.4308998232853527,-1.1885360712281195E-12),(-0.7805286589003659,0.6251199985884281,-1.724620150156626E-12),(-0.9023997685575618,0.43089982328524945,-1.1885360712278345E-12),(-0.9023997685575618,0.43089982328524945,-1.1885360712278345E-12),(-0.9670946829224584,0.254416733457353,-7.015393530595588E-13),(-0.9023997685575124,0.4308998232853527,-1.1885360712281195E-12),(-0.9670946829224693,0.254416733457312,-7.015393530594457E-13),(-0.9670946829224693,0.254416733457312,-7.015393530594457E-13),(-0.9936360937840041,0.11263797374627356,-3.1036671490409694E-13),(-0.9670946829224584,0.254416733457353,-7.015393530595588E-13),(-0.9936360937840051,0.11263797374626337,-3.103667149040688E-13),(-0.9936360937840051,0.11263797374626337,-3.103667149040688E-13),(-0.9999995871945382,-0.0009086312527777199,2.9886663787228385E-15),(-0.9936360937840041,0.11263797374627356,-3.1036671490409694E-13),(-0.9999995871945381,-0.0009086312527694739,2.988666378700091E-15),(-0.9999995871945381,-0.0009086312527694739,2.988666378700091E-15),(-0.99317464071528,-0.11663675681394135,3.222326268963989E-13),(-0.9999995871945382,-0.0009086312527777199,2.9886663787228385E-15),(-0.9931746407152823,-0.11663675681392228,3.2223262689634637E-13),(-0.9931746407152823,-0.11663675681392228,3.2223262689634637E-13),(-0.9647953651843898,-0.2630017173303625,7.260695749005098E-13),(-0.99317464071528,-0.11663675681394135,3.222326268963989E-13),(-0.9647953651843933,-0.2630017173303498,7.260695749004749E-13),(-0.9647953651843933,-0.2630017173303498,7.260695749004749E-13),(-0.8962309242385643,-0.4435877933831011,1.224294896171454E-12),(-0.9647953651843898,-0.2630017173303625,7.260695749005098E-13),(-0.8962309242385652,-0.44358779338309967,1.2242948961714497E-12),(-0.8962309242385652,-0.44358779338309967,1.2242948961714497E-12),(-0.7748453025522769,-0.6321508974229733,1.7445192615972098E-12),(-0.8962309242385643,-0.4435877933831011,1.224294896171454E-12),(-0.7748453025522536,-0.632150897423002,1.7445192615972896E-12),(-0.7748453025522769,-0.6321508974229733,1.7445192615972098E-12),(-0.5881877933364362,-0.8087243781227408,2.231714538454679E-12),(-0.5881877933364911,-0.8087243781227011,2.2317145384545694E-12),(-0.7748453025522536,-0.632150897423002,1.7445192615972896E-12),(-0.5881877933364362,-0.8087243781227408,2.231714538454679E-12),(-0.2965226979440034,-0.9550258057267402,2.6352543908567355E-12),(-0.5881877933364911,-0.8087243781227011,2.2317145384545694E-12),(-0.2965226979439802,-0.9550258057267476,2.6352543908567553E-12),(-0.2965226979440034,-0.9550258057267402,2.6352543908567355E-12),(-0.05742883068678888,-0.9983496027975112,2.75468304325398E-12),(-0.05742883068676342,-0.9983496027975126,2.7546830432539845E-12),(-0.2965226979439802,-0.9550258057267476,2.6352543908567553E-12),(-0.05742883068678888,-0.9983496027975112,2.75468304325398E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.05742883068676342,-0.9983496027975126,2.7546830432539845E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.9997278626286515,0.02332810930933182,-6.478625474594316E-14),(0.9997278626286512,0.023328109309348012,-6.478625474598787E-14),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.9997278626286512,0.023328109309348012,-6.478625474598787E-14),(0.991938059452877,0.1267236608091028,-3.5003315450024934E-13),(0.9919380594528837,0.1267236608090516,-3.5003315450010813E-13),(0.9997278626286515,0.02332810930933182,-6.478625474594316E-14),(0.9919380594528837,0.1267236608090516,-3.5003315450010813E-13),(0.9279729502401031,0.3726475595286776,-1.0285257208060182E-12),(0.9279729502400951,0.3726475595286975,-1.0285257208060731E-12),(0.991938059452877,0.1267236608091028,-3.5003315450024934E-13),(0.9279729502400951,0.3726475595286975,-1.0285257208060731E-12),(0.7353424654422643,0.6776956975791512,-1.8701801296868753E-12),(0.7353424654422448,0.6776956975791725,-1.8701801296869335E-12),(0.9279729502401031,0.3726475595286776,-1.0285257208060182E-12),(0.7353424654422643,0.6776956975791512,-1.8701801296868753E-12),(0.595427913033985,0.8034087380530496,-2.217013214368871E-12),(0.7353424654422448,0.6776956975791725,-1.8701801296869335E-12),(0.595427913033985,0.8034087380530496,-2.217013214368871E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-0.587931901049856,0.808910427505977,-2.2317615791035367E-12),(-0.7331764133481704,0.6800384892856528,-1.8761356888408905E-12),(-0.587931901049856,0.808910427505977,-2.2317615791035367E-12),(-0.7331764133483906,0.6800384892854153,-1.876135688840235E-12),(-0.7331764133483906,0.6800384892854153,-1.876135688840235E-12),(-0.8507772826193725,0.5255264173938323,-1.4497720821024064E-12),(-0.7331764133481704,0.6800384892856528,-1.8761356888408905E-12),(-0.8507772826193725,0.5255264173938323,-1.4497720821024064E-12),(-0.99423624686343,0.10721140528377023,-2.954710695668754E-13),(-0.9985580220656779,0.053683112505529824,-1.477468563767235E-13),(-0.99423624686343,0.10721140528377023,-2.954710695668754E-13),(-0.9985580220656758,0.05368311250557031,-1.4774685637683523E-13),(-0.9985580220656758,0.05368311250557031,-1.4774685637683523E-13),(-0.9997372811223786,-0.022920923498727014,6.367512989905946E-14),(-0.9985580220656779,0.053683112505529824,-1.477468563767235E-13),(-0.9997372811223788,-0.022920923498716328,6.367512989902996E-14),(-0.9997372811223788,-0.022920923498716328,6.367512989902996E-14),(-0.9919210150229154,-0.12685700593940089,3.503942522140495E-13),(-0.9997372811223786,-0.022920923498727014,6.367512989905946E-14),(-0.9919210150229056,-0.12685700593947852,3.5039425221426366E-13),(-0.9919210150229056,-0.12685700593947852,3.5039425221426366E-13),(-0.9257138949176099,-0.3782245163345029,1.043847238426325E-12),(-0.9919210150229154,-0.12685700593940089,3.503942522140495E-13),(-0.9257138949176389,-0.3782245163344319,1.0438472384261293E-12),(-0.9257138949176389,-0.3782245163344319,1.0438472384261293E-12),(-0.7298956734501645,-0.6835585606798666,1.8863356104184227E-12),(-0.9257138949176099,-0.3782245163345029,1.043847238426325E-12),(-0.7298956734503237,-0.6835585606796967,1.8863356104179538E-12),(-0.7298956734501645,-0.6835585606798666,1.8863356104184227E-12),(-0.5913596447695568,-0.8064079430028104,2.2253398265414533E-12),(-0.5913596447695568,-0.8064079430028104,2.2253398265414533E-12),(-0.7298956734503237,-0.6835585606796967,1.8863356104179538E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(0.03853104078009802,0.9992574037235865,-2.757176445086329E-12),(0.03853104078008816,0.9992574037235867,-2.7571764450863288E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(0.03853104078009802,0.9992574037235865,-2.757176445086329E-12),(0.17889663461281743,0.9838678743226695,-2.7147706795748045E-12),(0.03853104078008816,0.9992574037235867,-2.7571764450863288E-12),(0.17889663461278768,0.9838678743226749,-2.7147706795748195E-12),(0.17889663461278768,0.9838678743226749,-2.7147706795748195E-12),(0.41226168019314996,0.9110654790103296,-2.5139974038321675E-12),(0.17889663461281743,0.9838678743226695,-2.7147706795748045E-12),(0.41226168019310827,0.9110654790103483,-2.5139974038322192E-12),(0.41226168019310827,0.9110654790103483,-2.5139974038322192E-12),(0.6473041242886012,0.7622318352568118,-2.103486583130783E-12),(0.41226168019314996,0.9110654790103296,-2.5139974038321675E-12),(0.6473041242885218,0.762231835256879,-2.103486583130969E-12),(0.6473041242886012,0.7622318352568118,-2.103486583130783E-12),(0.8137975087381796,0.5811485307316305,-1.6039501949772979E-12),(0.8137975087381611,0.5811485307316561,-1.603950194977368E-12),(0.6473041242885218,0.762231835256879,-2.103486583130969E-12),(0.8137975087381611,0.5811485307316561,-1.603950194977368E-12),(0.915097394613651,0.4032328835441228,-1.1130666038816065E-12),(0.9150973946136156,0.4032328835442033,-1.1130666038818288E-12),(0.8137975087381796,0.5811485307316305,-1.6039501949772979E-12),(0.9150973946136156,0.4032328835442033,-1.1130666038818288E-12),(0.9704191606545896,0.241426288200855,-6.665413124945152E-13),(0.9704191606545819,0.24142628820088544,-6.665413124945992E-13),(0.915097394613651,0.4032328835441228,-1.1130666038816065E-12),(0.9704191606545819,0.24142628820088544,-6.665413124945992E-13),(0.9941110589328176,0.10836605791239322,-2.994416503813797E-13),(0.9941110589328194,0.10836605791237704,-2.994416503813351E-13),(0.9704191606545896,0.241426288200855,-6.665413124945152E-13),(0.9941110589328194,0.10836605791237704,-2.994416503813351E-13),(0.9999930758042374,0.0037213362628470636,-1.0711848874541983E-14),(0.9999930758042371,0.00372133626285637,-1.071184887456768E-14),(0.9941110589328176,0.10836605791239322,-2.994416503813797E-13),(0.9999930758042371,0.00372133626285637,-1.071184887456768E-14),(0.9958593468083936,-0.09090743299840695,2.504775444805681E-13),(0.9958593468083943,-0.09090743299839879,2.504775444805456E-13),(0.9999930758042374,0.0037213362628470636,-1.0711848874541983E-14),(0.9958593468083943,-0.09090743299839879,2.504775444805456E-13),(0.9797523183883908,-0.20021337271164855,5.520817167014186E-13),(0.9797523183883889,-0.20021337271165762,5.520817167014437E-13),(0.9958593468083936,-0.09090743299840695,2.504775444805681E-13),(0.9797523183883889,-0.20021337271165762,5.520817167014437E-13),(0.9432066145957844,-0.33220668593928016,9.163003530591014E-13),(0.9432066145957768,-0.3322066859393016,9.163003530591603E-13),(0.9797523183883908,-0.20021337271164855,5.520817167014186E-13),(0.9432066145957768,-0.3322066859393016,9.163003530591603E-13),(0.87462096294249,-0.48480735471066383,1.3373786743837518E-12),(0.8746209629424875,-0.4848073547106688,1.3373786743837655E-12),(0.9432066145957844,-0.33220668593928016,9.163003530591014E-13),(0.8746209629424875,-0.4848073547106688,1.3373786743837655E-12),(0.7610063543191211,-0.6487444247821482,1.7897533420233134E-12),(0.7610063543191802,-0.6487444247820788,1.7897533420231214E-12),(0.87462096294249,-0.48480735471066383,1.3373786743837518E-12),(0.7610063543191211,-0.6487444247821482,1.7897533420233134E-12),(0.5967658568195328,-0.8024154236643568,2.2137902678411934E-12),(0.7610063543191802,-0.6487444247820788,1.7897533420231214E-12),(0.5967658568194558,-0.802415423664414,2.213790267841351E-12),(0.5967658568194558,-0.802415423664414,2.213790267841351E-12),(0.3962631411435402,-0.9181369848617662,2.5331677562633346E-12),(0.5967658568195328,-0.8024154236643568,2.2137902678411934E-12),(0.39626314114354483,-0.918136984861764,2.5331677562633285E-12),(0.39626314114354483,-0.918136984861764,2.5331677562633285E-12),(0.2886029626037723,-0.9574488654629686,2.6417020054275285E-12),(0.3962631411435402,-0.9181369848617662,2.5331677562633346E-12),(0.2886029626037723,-0.9574488654629686,2.6417020054275285E-12),(0.9529875987463974,0.30300930123607694,-8.364562016503752E-13),(0.9296841404730456,0.36835770516292254,-1.0167884436957402E-12),(0.929684140473054,0.36835770516290123,-1.0167884436956816E-12),(0.9529875987463974,0.30300930123607694,-8.364562016503752E-13),(0.929684140473054,0.36835770516290123,-1.0167884436956816E-12),(0.9019056800696664,0.43193303214511475,-1.1922264100904592E-12),(0.9019056800696664,0.43193303214511475,-1.1922264100904592E-12),(0.9296841404730456,0.36835770516292254,-1.0167884436957402E-12),(0.444982586999434,0.8955392215125428,-2.471168782532109E-12),(0.444982586999434,0.8955392215125428,-2.471168782532109E-12),(0.444982586999434,0.8955392215125428,-2.471168782532109E-12),(0.444982586999434,0.8955392215125428,-2.471168782532109E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-0.5702090938650628,0.8214995978535741,-2.266456312235087E-12),(-0.5702090938650628,0.8214995978535741,-2.266456312235087E-12),(-0.5702090938650628,0.8214995978535741,-2.266456312235087E-12),(-0.5702090938650628,0.8214995978535741,-2.266456312235087E-12),(-0.9485728622037648,0.3165588809219502,-8.72954255030512E-13),(-0.9485728622037648,0.3165588809219502,-8.72954255030512E-13),(-0.9485728622037648,0.3165588809219502,-8.72954255030512E-13),(-0.9485728622037648,0.3165588809219502,-8.72954255030512E-13),(-0.9719489691963694,-0.23519183931020027,6.492728817331861E-13),(-0.9628838370128916,-0.2699161284905579,7.452318295323053E-13),(-0.9719489691963694,-0.23519183931020027,6.492728817331861E-13),(-0.9628838370128899,-0.2699161284905638,7.452318295323215E-13),(-0.9628838370128899,-0.2699161284905638,7.452318295323215E-13),(-0.952578555817858,-0.3042927784157289,8.402309538499275E-13),(-0.9628838370128916,-0.2699161284905579,7.452318295323053E-13),(-0.952578555817858,-0.3042927784157289,8.402309538499275E-13),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.04792972972070176,0.9988507100707795,-2.756026146125524E-12),(-0.04792972972066793,0.9988507100707813,-2.7560261461255298E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.04792972972070176,0.9988507100707795,-2.756026146125524E-12),(-0.3206778121135941,0.9471883343971453,-2.6133744696510272E-12),(-0.04792972972066793,0.9988507100707813,-2.7560261461255298E-12),(-0.32067781211367463,0.9471883343971181,-2.6133744696509525E-12),(-0.3206778121135941,0.9471883343971453,-2.6133744696510272E-12),(-0.6954181980173404,0.718605267073875,-1.9826354540722363E-12),(-0.6954181980174247,0.7186052670737935,-1.982635454072011E-12),(-0.32067781211367463,0.9471883343971181,-2.6133744696509525E-12),(-0.6954181980173404,0.718605267073875,-1.9826354540722363E-12),(-0.8917373201927142,0.45255336898040777,-1.2484138046447921E-12),(-0.6954181980174247,0.7186052670737935,-1.982635454072011E-12),(-0.8917373201926667,0.4525533689805009,-1.2484138046450494E-12),(-0.8917373201926667,0.4525533689805009,-1.2484138046450494E-12),(-0.9658311636130653,0.2591720729435028,-7.146935298626238E-13),(-0.8917373201927142,0.45255336898040777,-1.2484138046447921E-12),(-0.9658311636130642,0.25917207294350686,-7.14693529862635E-13),(-0.9658311636130642,0.25917207294350686,-7.14693529862635E-13),(-0.9937219264957836,0.11187820521222491,-3.0826251291398423E-13),(-0.9658311636130653,0.2591720729435028,-7.146935298626238E-13),(-0.9937219264957871,0.11187820521219376,-3.0826251291389825E-13),(-0.9937219264957871,0.11187820521219376,-3.0826251291389825E-13),(-0.9999994968635364,0.0010031314340942707,-2.235958891394024E-15),(-0.9937219264957836,0.11187820521222491,-3.0826251291398423E-13),(-0.9999994968635365,0.0010031314340779212,-2.2359588913489E-15),(-0.9999994968635365,0.0010031314340779212,-2.2359588913489E-15),(-0.9945078930900839,-0.1046616003199005,2.892339846314777E-13),(-0.9999994968635364,0.0010031314340942707,-2.235958891394024E-15),(-0.9945078930900895,-0.1046616003198478,2.8923398463133233E-13),(-0.9945078930900895,-0.1046616003198478,2.8923398463133233E-13),(-0.9720690082233135,-0.2346952135254229,6.480198437382011E-13),(-0.9945078930900839,-0.1046616003199005,2.892339846314777E-13),(-0.9720690082233349,-0.23469521352533462,6.480198437379572E-13),(-0.9720690082233349,-0.23469521352533462,6.480198437379572E-13),(-0.9183762991966798,-0.39570819182045036,1.0923587760299496E-12),(-0.9720690082233135,-0.2346952135254229,6.480198437382011E-13),(-0.9183762991966443,-0.3957081918205334,1.0923587760301788E-12),(-0.9183762991966443,-0.3957081918205334,1.0923587760301788E-12),(-0.8089731333683899,-0.587845617052751,1.6224833735797554E-12),(-0.9183762991966798,-0.39570819182045036,1.0923587760299496E-12),(-0.8089731333682966,-0.5878456170528793,1.6224833735801094E-12),(-0.8089731333682966,-0.5878456170528793,1.6224833735801094E-12),(-0.6233369684433753,-0.7819533386154335,2.157952104199461E-12),(-0.8089731333683899,-0.587845617052751,1.6224833735797554E-12),(-0.6233369684433545,-0.7819533386154501,2.1579521041995072E-12),(-0.6233369684433545,-0.7819533386154501,2.1579521041995072E-12),(-0.3440068091234996,-0.9389671534599432,2.5909549526726492E-12),(-0.6233369684433753,-0.7819533386154335,2.157952104199461E-12),(-0.34400680912364484,-0.9389671534598899,2.5909549526725026E-12),(-0.3440068091234996,-0.9389671534599432,2.5909549526726492E-12),(-0.08618514690951971,-0.9962791378184052,2.748972028701456E-12),(-0.086185146909493,-0.9962791378184075,2.748972028701463E-12),(-0.34400680912364484,-0.9389671534598899,2.5909549526725026E-12),(-0.08618514690951971,-0.9962791378184052,2.748972028701456E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.086185146909493,-0.9962791378184075,2.748972028701463E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(0.9852620991274315,-0.17105144262182528,4.715637567366567E-13),(0.9985580220656768,0.053683112505551744,-1.484992488814334E-13),(0.998558022065676,0.05368311250556627,-1.4849924888147349E-13),(0.9852620991274349,-0.17105144262180608,4.715637567366038E-13),(0.998558022065676,0.05368311250556627,-1.4849924888147349E-13),(0.99423624686343,0.1072114052837702,-2.9616678025587057E-13),(0.99423624686343,0.1072114052837702,-2.9616678025587057E-13),(0.9985580220656768,0.053683112505551744,-1.484992488814334E-13),(0.8507772826193725,0.5255264173938323,-1.4503525028234275E-12),(0.7331764133483752,0.6800384892854321,-1.876666699400091E-12),(0.733176413348323,0.6800384892854884,-1.8766666994002464E-12),(0.8507772826193725,0.5255264173938323,-1.4503525028234275E-12),(0.7331764133483752,0.6800384892854321,-1.876666699400091E-12),(0.587931901049856,0.808910427505977,-2.2322231583092928E-12),(0.733176413348323,0.6800384892854884,-1.8766666994002464E-12),(0.587931901049856,0.808910427505977,-2.2322231583092928E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-0.595427913033985,0.8034087380530496,-2.2166069233204607E-12),(-0.7353424654422683,0.6776956975791468,-1.8697061678841157E-12),(-0.7353424654421585,0.6776956975792661,-1.869706167884445E-12),(-0.595427913033985,0.8034087380530496,-2.2166069233204607E-12),(-0.7353424654422683,0.6776956975791468,-1.8697061678841157E-12),(-0.9279729502400907,0.3726475595287086,-1.0279344543239043E-12),(-0.7353424654421585,0.6776956975792661,-1.869706167884445E-12),(-0.9279729502400598,0.37264755952878564,-1.0279344543241167E-12),(-0.9279729502400598,0.37264755952878564,-1.0279344543241167E-12),(-0.9919380594528906,0.1267236608089965,-3.4927966203066397E-13),(-0.9279729502400907,0.3726475595287086,-1.0279344543239043E-12),(-0.9919380594528778,0.12672366080909672,-3.4927966203094054E-13),(-0.9919380594528778,0.12672366080909672,-3.4927966203094054E-13),(-0.9997278626286514,0.023328109309335668,-6.395138370626866E-14),(-0.9919380594528906,0.1267236608089965,-3.4927966203066397E-13),(-0.9997278626286514,0.023328109309338194,-6.395138370627564E-14),(-0.9997278626286514,0.023328109309338194,-6.395138370627564E-14),(-1.,1.0761972206014589E-42,4.034522267621423E-16),(-0.9997278626286514,0.023328109309335668,-6.395138370626866E-14),(-1.,1.0761972206014589E-42,4.034522267621423E-16),(-0.9325271362086448,-0.3610999033986354,9.96827613225119E-13),(-0.9262080086179268,-0.3770128973550036,1.0406673315188154E-12),(-0.9325271362086448,-0.3610999033986354,9.96827613225119E-13),(-0.9262080086179288,-0.37701289735499893,1.0406673315188023E-12),(-0.9262080086179288,-0.37701289735499893,1.0406673315188023E-12),(-0.8723365420137861,-0.48890587792276585,1.3493441244004426E-12),(-0.9262080086179268,-0.3770128973550036,1.0406673315188154E-12),(-0.8723365420137832,-0.4889058779227708,1.3493441244004564E-12),(-0.8723365420137832,-0.4889058779227708,1.3493441244004564E-12),(-0.730188377765645,-0.6832458803212618,1.8855299673778565E-12),(-0.8723365420137861,-0.48890587792276585,1.3493441244004426E-12),(-0.7301883777656969,-0.6832458803212063,1.885529967377703E-12),(-0.730188377765645,-0.6832458803212618,1.8855299673778565E-12),(-0.6321911971634502,-0.7748124226088815,2.138132415292523E-12),(-0.6321911971634502,-0.7748124226088815,2.138132415292523E-12),(-0.7301883777656969,-0.6832458803212063,1.885529967377703E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.6156006345831257,-0.7880582838222391,2.1743071260297896E-12),(0.6156006345831257,-0.7880582838222391,2.1743071260297896E-12),(0.6156006345831257,-0.7880582838222391,2.1743071260297896E-12),(0.6156006345831257,-0.7880582838222391,2.1743071260297896E-12),(0.9762553099163308,-0.21662310555471498,5.972854662627038E-13),(0.998637758841438,-0.052178794698135106,1.4359962851174748E-13),(0.9986377588414385,-0.05217879469812459,1.4359962851171847E-13),(0.9762553099163308,-0.21662310555471498,5.972854662627038E-13),(0.9986377588414385,-0.05217879469812459,1.4359962851171847E-13),(0.9788258497336725,0.20469478716653747,-5.652151490198807E-13),(0.9788258497336696,0.2046947871665516,-5.652151490199195E-13),(0.998637758841438,-0.052178794698135106,1.4359962851174748E-13),(0.9788258497336696,0.2046947871665516,-5.652151490199195E-13),(0.9450084045283325,0.3270460447258393,-9.028951483286143E-13),(0.9450084045283396,0.3270460447258185,-9.028951483285569E-13),(0.9788258497336725,0.20469478716653747,-5.652151490198807E-13),(0.9450084045283396,0.3270460447258185,-9.028951483285569E-13),(0.9330496485399467,0.3597476245362602,-9.93108373864561E-13),(0.9330496485399467,0.3597476245362602,-9.93108373864561E-13),(0.9450084045283325,0.3270460447258393,-9.028951483286143E-13),(-0.941482093321121,0.33706300294704605,-9.295202236044526E-13),(-0.9606480611335356,0.2777684334844022,-7.660003279224822E-13),(-0.941482093321121,0.33706300294704605,-9.295202236044526E-13),(-0.9606480611335216,0.2777684334844508,-7.660003279226165E-13),(-0.9606480611335216,0.2777684334844508,-7.660003279226165E-13),(-0.9760836593293745,0.21739523911571249,-5.995059148651137E-13),(-0.9606480611335356,0.2777684334844022,-7.660003279224822E-13),(-0.9760836593293745,0.21739523911571249,-5.995059148651137E-13),(-0.9792141269629987,-0.20282922263838732,5.599555474652705E-13),(-0.9792141269629987,-0.20282922263838732,5.599555474652705E-13),(-0.9792141269629987,-0.20282922263838732,5.599555474652705E-13),(-0.9792141269629987,-0.20282922263838732,5.599555474652705E-13),(-0.6124868691939012,-0.7904807619828917,2.1813197978649545E-12),(-0.6124868691939012,-0.7904807619828917,2.1813197978649545E-12),(-0.6124868691939012,-0.7904807619828917,2.1813197978649545E-12),(-0.6124868691939012,-0.7904807619828917,2.1813197978649545E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.6823833044151579,-0.7309945457084137,2.01676548549882E-12),(0.7673233100206696,-0.6412604290761467,1.7692005719015623E-12),(0.6823833044151579,-0.7309945457084137,2.01676548549882E-12),(0.7673233100207348,-0.6412604290760685,1.7692005719013466E-12),(0.7673233100206696,-0.6412604290761467,1.7692005719015623E-12),(0.8868360880342167,-0.46208414056334735,1.2746862122119363E-12),(0.8868360880342113,-0.46208414056335717,1.2746862122119634E-12),(0.7673233100207348,-0.6412604290760685,1.7692005719013466E-12),(0.8868360880342113,-0.46208414056335717,1.2746862122119634E-12),(0.9337699395388017,-0.35787386047838504,9.870232292519014E-13),(0.9337699395388005,-0.35787386047838804,9.870232292519097E-13),(0.8868360880342167,-0.46208414056334735,1.2746862122119363E-12),(0.9337699395388005,-0.35787386047838804,9.870232292519097E-13),(0.9852620991274349,-0.17105144262180608,4.715637567366038E-13),(0.9852620991274315,-0.17105144262182528,4.715637567366567E-13),(0.9337699395388017,-0.35787386047838504,9.870232292519014E-13),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(0.9536861696258785,-0.3008034073349574,8.294334364090115E-13),(0.9536861696258785,-0.3008034073349574,8.294334364090115E-13),(0.9536861696258785,-0.3008034073349574,8.294334364090115E-13),(0.9536861696258785,-0.3008034073349574,8.294334364090115E-13),(-0.7700417988451072,-0.6379934388623381,1.760603126181767E-12),(-0.7700417988451072,-0.6379934388623381,1.760603126181767E-12),(-0.7700417988451072,-0.6379934388623381,1.760603126181767E-12),(-0.7700417988451072,-0.6379934388623381,1.760603126181767E-12),(-0.994302470776474,0.10659548117907772,-2.937502228936808E-13),(-0.994302470776474,0.10659548117907772,-2.937502228936808E-13),(-0.994302470776474,0.10659548117907772,-2.937502228936808E-13),(-0.994302470776474,0.10659548117907772,-2.937502228936808E-13),(-0.9408175538277588,-0.33891345563366515,9.356544478813385E-13),(-0.8797598194001592,-0.4754184053746753,1.3122020890315926E-12),(-0.9408175538277588,-0.33891345563366515,9.356544478813385E-13),(-0.8797598194001869,-0.4754184053746245,1.3122020890314524E-12),(-0.8797598194001869,-0.4754184053746245,1.3122020890314524E-12),(-0.7490764788486547,-0.6624835309920549,1.828173540898808E-12),(-0.8797598194001592,-0.4754184053746753,1.3122020890315926E-12),(-0.7490764788486777,-0.662483530992029,1.828173540898736E-12),(-0.7490764788486547,-0.6624835309920549,1.828173540898808E-12),(-0.6277478308059733,-0.7784167655686737,2.147993539831176E-12),(-0.6277478308059808,-0.7784167655686675,2.1479935398311586E-12),(-0.7490764788486777,-0.662483530992029,1.828173540898736E-12),(-0.6277478308059733,-0.7784167655686737,2.147993539831176E-12),(-0.46242915451716665,-0.8866562338654922,2.4466586428265734E-12),(-0.6277478308059808,-0.7784167655686675,2.1479935398311586E-12),(-0.46242915451719524,-0.8866562338654773,2.446658642826532E-12),(-0.46242915451716665,-0.8866562338654922,2.4466586428265734E-12),(-0.24619523010030192,-0.9692202580816496,2.6744056903493743E-12),(-0.2461952301003007,-0.9692202580816499,2.674405690349375E-12),(-0.46242915451719524,-0.8866562338654773,2.446658642826532E-12),(-0.24619523010030192,-0.9692202580816496,2.6744056903493743E-12),(0.01107595437302213,-0.9999386597360495,2.7590418703621746E-12),(-0.2461952301003007,-0.9692202580816499,2.674405690349375E-12),(0.01107595437300701,-0.9999386597360496,2.759041870362175E-12),(0.01107595437300701,-0.9999386597360496,2.759041870362175E-12),(0.29728615576795203,-0.9547884276575168,2.634318140080722E-12),(0.01107595437302213,-0.9999386597360495,2.7590418703621746E-12),(0.29728615576786194,-0.9547884276575449,2.6343181400808E-12),(0.29728615576795203,-0.9547884276575168,2.634318140080722E-12),(0.5611488072511259,-0.8277149365093267,2.2835849641802897E-12),(0.5611488072510544,-0.8277149365093752,2.2835849641804238E-12),(0.29728615576786194,-0.9547884276575449,2.6343181400808E-12),(0.5611488072511259,-0.8277149365093267,2.2835849641802897E-12),(0.7489939741665258,-0.6625768081228272,1.8278643588246915E-12),(0.5611488072510544,-0.8277149365093752,2.2835849641804238E-12),(0.7489939741665401,-0.662576808122811,1.8278643588246475E-12),(0.7489939741665258,-0.6625768081228272,1.8278643588246915E-12),(0.8635495158077536,-0.5042640516120445,1.3909695738791913E-12),(0.8635495158077526,-0.5042640516120462,1.3909695738791962E-12),(0.7489939741665401,-0.662576808122811,1.8278643588246475E-12),(0.8635495158077526,-0.5042640516120462,1.3909695738791962E-12),(0.9334175416532469,-0.35879199117874594,9.895209807021604E-13),(0.9334175416532348,-0.3587919911787773,9.895209807022469E-13),(0.8635495158077536,-0.5042640516120445,1.3909695738791913E-12),(0.9334175416532348,-0.3587919911787773,9.895209807022469E-13),(0.9749062702748591,-0.22261573210077437,6.137961228185876E-13),(0.9749062702748557,-0.22261573210078947,6.137961228186292E-13),(0.9334175416532469,-0.35879199117874594,9.895209807021604E-13),(0.9749062702748557,-0.22261573210078947,6.137961228186292E-13),(0.9946566839741976,-0.10323798247473452,2.843868398055107E-13),(0.9946566839741967,-0.10323798247474142,2.843868398055298E-13),(0.9749062702748591,-0.22261573210077437,6.137961228185876E-13),(0.9946566839741967,-0.10323798247474142,2.843868398055298E-13),(0.9999996706240923,-0.0008116352057429888,1.735688041650183E-15),(0.9999996706240923,-0.0008116352057321722,1.735688041620332E-15),(0.9946566839741976,-0.10323798247473452,2.843868398055107E-13),(0.9999996706240923,-0.0008116352057321722,1.735688041620332E-15),(0.9950173309235021,0.0997021121234151,-2.7551994208939184E-13),(0.9950173309235023,0.09970211212341235,-2.7551994208938427E-13),(0.9999996706240923,-0.0008116352057429888,1.735688041650183E-15),(0.9950173309235023,0.09970211212341235,-2.7551994208938427E-13),(0.9766138235826096,0.21500102229374587,-5.936530566123433E-13),(0.9766138235826148,0.21500102229372134,-5.936530566122757E-13),(0.9950173309235021,0.0997021121234151,-2.7551994208939184E-13),(0.9766138235826148,0.21500102229372134,-5.936530566122757E-13),(0.937885089864574,0.34694604509883137,-9.576862461836526E-13),(0.9378850898645769,0.34694604509882304,-9.576862461836292E-13),(0.9766138235826096,0.21500102229374587,-5.936530566123433E-13),(0.9378850898645769,0.34694604509882304,-9.576862461836292E-13),(0.8712497287927936,0.49084000456206067,-1.3546115534512904E-12),(0.8712497287927798,0.4908400045620854,-1.3546115534513585E-12),(0.937885089864574,0.34694604509883137,-9.576862461836526E-13),(0.8712497287927798,0.4908400045620854,-1.3546115534513585E-12),(0.7558037417969682,0.6547982161595295,-1.8070237910514154E-12),(0.7558037417969727,0.6547982161595243,-1.8070237910514007E-12),(0.8712497287927936,0.49084000456206067,-1.3546115534512904E-12),(0.7558037417969682,0.6547982161595295,-1.8070237910514154E-12),(0.5617419259877942,0.8273125217156595,-2.2830404461652583E-12),(0.7558037417969727,0.6547982161595243,-1.8070237910514007E-12),(0.56174192598777,0.827312521715676,-2.2830404461653036E-12),(0.56174192598777,0.827312521715676,-2.2830404461653036E-12),(0.29396712482546045,0.9558155311156291,-2.637469979770619E-12),(0.5617419259877942,0.8273125217156595,-2.2830404461652583E-12),(0.2939671248254585,0.9558155311156297,-2.63746997977062E-12),(0.2939671248254585,0.9558155311156297,-2.63746997977062E-12),(-0.002695267450449311,0.9999963677600887,-2.759210538255731E-12),(0.29396712482546045,0.9558155311156291,-2.637469979770619E-12),(-0.0026952674504793607,0.9999963677600887,-2.759210538255731E-12),(-0.0026952674504793607,0.9999963677600887,-2.759210538255731E-12),(-0.2926144101614126,0.9562305197837437,-2.638341290756717E-12),(-0.002695267450449311,0.9999963677600887,-2.759210538255731E-12),(-0.2926144101613252,0.9562305197837706,-2.6383412907567904E-12),(-0.2926144101614126,0.9562305197837437,-2.638341290756717E-12),(-0.5408366900001049,0.8411276209646967,-2.320635090898078E-12),(-0.5408366900001452,0.841127620964671,-2.320635090898006E-12),(-0.2926144101613252,0.9562305197837706,-2.6383412907567904E-12),(-0.5408366900001452,0.841127620964671,-2.320635090898006E-12),(-0.7259710978950735,0.6877252104009433,-1.897291887302588E-12),(-0.7259710978950947,0.6877252104009208,-1.8972918873025265E-12),(-0.5408366900001049,0.8411276209646967,-2.320635090898078E-12),(-0.7259710978950735,0.6877252104009433,-1.897291887302588E-12),(-0.799321709095357,0.6009033244781372,-1.6577176199735507E-12),(-0.7259710978950947,0.6877252104009208,-1.8972918873025265E-12),(-0.799321709095357,0.6009033244781372,-1.6577176199735507E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(0.08869355101080907,-0.9960589611107835,2.7483022398577204E-12),(0.08869355101079084,-0.9960589611107851,2.748302239857725E-12),(1.3725977238595926E-27,-1.,2.75921435746603E-12),(0.08869355101080907,-0.9960589611107835,2.7483022398577204E-12),(0.41828292848581383,-0.9083167904081326,2.506007232802032E-12),(0.08869355101079084,-0.9960589611107851,2.748302239857725E-12),(0.41828292848587684,-0.9083167904081038,2.506007232801952E-12),(0.41828292848587684,-0.9083167904081038,2.506007232801952E-12),(0.8055283032698622,-0.5925572990278469,1.6346427547732219E-12),(0.41828292848581383,-0.9083167904081326,2.506007232802032E-12),(0.8055283032698332,-0.5925572990278865,1.6346427547733305E-12),(0.8055283032698622,-0.5925572990278469,1.6346427547732219E-12),(0.9613077859588501,-0.2754765700652123,7.597414831211071E-13),(0.9613077859588718,-0.2754765700651368,7.59741483120899E-13),(0.8055283032698332,-0.5925572990278865,1.6346427547733305E-12),(0.9613077859588718,-0.2754765700651368,7.59741483120899E-13),(0.9847230941359341,-0.17412761950751132,4.80045788911041E-13),(0.9847230941359341,-0.17412761950751132,4.80045788911041E-13),(0.9613077859588501,-0.2754765700652123,7.597414831211071E-13),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(0.9850106999604984,0.1724932490369674,-4.762448176277352E-13),(0.9614949837727648,0.27482248121252945,-7.586480458963843E-13),(0.9614949837727732,0.2748224812124999,-7.586480458963027E-13),(0.9850106999604984,0.1724932490369674,-4.762448176277352E-13),(0.9614949837727732,0.2748224812124999,-7.586480458963027E-13),(0.9273794962553974,0.37412199871844704,-1.0326877403536495E-12),(0.9273794962553974,0.37412199871844704,-1.0326877403536495E-12),(0.9614949837727648,0.27482248121252945,-7.586480458963843E-13),(0.3926681168676969,0.9196802433430745,-2.5377536302997775E-12),(0.200399297225422,0.9797143061482553,-2.7033227720185767E-12),(0.3926681168676969,0.9196802433430745,-2.5377536302997775E-12),(0.20039929722539637,0.9797143061482605,-2.7033227720185917E-12),(0.20039929722539637,0.9797143061482605,-2.7033227720185917E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(0.200399297225422,0.9797143061482553,-2.7033227720185767E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.5672614750584217,-0.8235377458954407,2.2720352267772054E-12),(0.7214044108111449,-0.6925140258956672,1.9105192110572966E-12),(0.5672614750584217,-0.8235377458954407,2.2720352267772054E-12),(0.7214044108113933,-0.6925140258954087,1.910519211056583E-12),(0.7214044108111449,-0.6925140258956672,1.9105192110572966E-12),(0.8460222407894988,-0.5331476044113067,1.470810879146345E-12),(0.8460222407894988,-0.5331476044113067,1.470810879146345E-12),(0.7214044108113933,-0.6925140258954087,1.910519211056583E-12),(0.9941612242434783,-0.10790486648297537,2.9735844982463723E-13),(0.9985392391497387,-0.054031360137064166,1.4869470620440723E-13),(0.99853923914974,-0.05403136013704105,1.486947062043435E-13),(0.9941612242434783,-0.10790486648297537,2.9735844982463723E-13),(0.99853923914974,-0.05403136013704105,1.486947062043435E-13),(0.9985392391497393,0.054031360137051426,-1.4944711174428883E-13),(0.9985392391497397,0.05403136013704346,-1.4944711174426684E-13),(0.9985392391497387,-0.054031360137064166,1.4869470620440723E-13),(0.9985392391497397,0.05403136013704346,-1.4944711174426684E-13),(0.9941612242434782,0.1079048664829755,-2.980541582818343E-13),(0.9941612242434782,0.1079048664829755,-2.980541582818343E-13),(0.9985392391497393,0.054031360137051426,-1.4944711174428883E-13),(0.8460222407894984,0.5331476044113076,-1.4713911584127824E-12),(0.7214044108112283,0.6925140258955805,-1.9111073800618405E-12),(0.7214044108113113,0.692514025895494,-1.9111073800616014E-12),(0.8460222407894984,0.5331476044113076,-1.4713911584127824E-12),(0.7214044108112283,0.6925140258955805,-1.9111073800618405E-12),(0.5672614750584241,0.8235377458954392,-2.2726072133746413E-12),(0.7214044108113113,0.692514025895494,-1.9111073800616014E-12),(0.5672614750584241,0.8235377458954392,-2.2726072133746413E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.8194722387884859,-0.5731188793391708,1.581056420400817E-12),(0.7574045442264162,-0.6529459061707751,1.8013477214461727E-12),(0.7574045442264307,-0.6529459061707586,1.8013477214461272E-12),(0.8194722387884859,-0.5731188793391708,1.581056420400817E-12),(0.7574045442264162,-0.6529459061707751,1.8013477214461727E-12),(0.5831639704137637,-0.8123544691889466,2.2412318974493106E-12),(0.7574045442264307,-0.6529459061707586,1.8013477214461272E-12),(0.5831639704137174,-0.8123544691889798,2.241231897449403E-12),(0.5831639704137174,-0.8123544691889798,2.241231897449403E-12),(0.3197400203626559,-0.9475053136412948,2.6142334461356002E-12),(0.5831639704137637,-0.8123544691889466,2.2412318974493106E-12),(0.31974002036271576,-0.9475053136412748,2.614233446135545E-12),(0.31974002036271576,-0.9475053136412748,2.614233446135545E-12),(0.012699053705120382,-0.9999193637663962,2.7589902311344565E-12),(0.3197400203626559,-0.9475053136412948,2.6142334461356002E-12),(0.012699053705104884,-0.9999193637663965,2.758990231134458E-12),(0.012699053705120382,-0.9999193637663962,2.7589902311344565E-12),(-0.2815655603975249,-0.9595419924099351,2.6476760984357175E-12),(-0.28156556039741143,-0.9595419924099683,2.6476760984358088E-12),(0.012699053705104884,-0.9999193637663965,2.758990231134458E-12),(-0.2815655603975249,-0.9595419924099351,2.6476760984357175E-12),(-0.5404333018571977,-0.8413868588489645,2.3217769207241132E-12),(-0.28156556039741143,-0.9595419924099683,2.6476760984358088E-12),(-0.540433301857118,-0.8413868588490157,2.3217769207242542E-12),(-0.5404333018571977,-0.8413868588489645,2.3217769207241132E-12),(-0.7333107949378584,-0.6798935784573981,1.876325439455166E-12),(-0.7333107949378527,-0.6798935784574043,1.8763254394551833E-12),(-0.540433301857118,-0.8413868588490157,2.3217769207242542E-12),(-0.7333107949378584,-0.6798935784573981,1.876325439455166E-12),(-0.857100934324648,-0.515148510994466,1.421825487972121E-12),(-0.7333107949378527,-0.6798935784574043,1.8763254394551833E-12),(-0.8571009343246425,-0.5151485109944751,1.421825487972146E-12),(-0.8571009343246425,-0.5151485109944751,1.421825487972146E-12),(-0.930947415719256,-0.3651532680473211,1.0080154823091416E-12),(-0.857100934324648,-0.515148510994466,1.421825487972121E-12),(-0.9309474157192436,-0.3651532680473529,1.0080154823092294E-12),(-0.9309474157192436,-0.3651532680473529,1.0080154823092294E-12),(-0.9717468331379525,-0.23602561786035084,6.517020356283683E-13),(-0.930947415719256,-0.3651532680473211,1.0080154823091416E-12),(-0.9717468331379511,-0.23602561786035728,6.517020356283857E-13),(-0.9717468331379511,-0.23602561786035728,6.517020356283857E-13),(-0.9931098274040339,-0.1171873317109414,3.2380958985168884E-13),(-0.9717468331379525,-0.23602561786035084,6.517020356283683E-13),(-0.9931098274040338,-0.11718733171094246,3.2380958985169187E-13),(-0.9931098274040338,-0.11718733171094246,3.2380958985169187E-13),(-0.9999579620805333,-0.009169191444562432,2.5829991692882743E-14),(-0.9931098274040339,-0.1171873317109414,3.2380958985168884E-13),(-0.9999579620805331,-0.009169191444566668,2.582999169289443E-14),(-0.9999579620805331,-0.009169191444566668,2.582999169289443E-14),(-0.9967023029360896,0.08114505112386929,-2.235040045820152E-13),(-0.9999579620805333,-0.009169191444562432,2.5829991692882743E-14),(-0.9967023029360891,0.08114505112387725,-2.2350400458203727E-13),(-0.9967023029360891,0.08114505112387725,-2.2350400458203727E-13),(-0.9857538147747108,0.16819457974948349,-4.637661699943967E-13),(-0.9967023029360896,0.08114505112386929,-2.235040045820152E-13),(-0.9857538147747129,0.16819457974947152,-4.637661699943635E-13),(-0.9857538147747129,0.16819457974947152,-4.637661699943635E-13),(-0.9654101412336251,0.2607359952198245,-7.190263371202493E-13),(-0.9857538147747108,0.16819457974948349,-4.637661699943967E-13),(-0.9654101412336293,0.26073599521980817,-7.190263371202043E-13),(-0.9654101412336293,0.26073599521980817,-7.190263371202043E-13),(-0.933824740070632,0.3577308413207013,-9.866663138356275E-13),(-0.9654101412336251,0.2607359952198245,-7.190263371202493E-13),(-0.933824740070634,0.357730841320696,-9.86666313835613E-13),(-0.933824740070634,0.357730841320696,-9.86666313835613E-13),(-0.887595750904099,0.4606232549242262,-1.2707488237403747E-12),(-0.933824740070632,0.3577308413207013,-9.866663138356275E-13),(-0.8875957509041004,0.4606232549242236,-1.2707488237403678E-12),(-0.8875957509041004,0.4606232549242236,-1.2707488237403678E-12),(-0.819804938826555,0.5726428749889312,-1.5798922894855866E-12),(-0.887595750904099,0.4606232549242262,-1.2707488237403747E-12),(-0.8198049388265481,0.5726428749889407,-1.5798922894856127E-12),(-0.8198049388265481,0.5726428749889407,-1.5798922894856127E-12),(-0.7226711292766403,0.6911920419897972,-1.9069158451957925E-12),(-0.819804938826555,0.5726428749889312,-1.5798922894855866E-12),(-0.7226711292765956,0.6911920419898439,-1.9069158451959217E-12),(-0.7226711292766403,0.6911920419897972,-1.9069158451957925E-12),(-0.5715761942912734,0.8205489955630344,-2.2638461197902074E-12),(-0.571576194291267,0.8205489955630387,-2.263846119790219E-12),(-0.7226711292765956,0.6911920419898439,-1.9069158451959217E-12),(-0.5715761942912734,0.8205489955630344,-2.2638461197902074E-12),(-0.3225397005865454,0.9465559368286386,-2.6116062180979976E-12),(-0.571576194291267,0.8205489955630387,-2.263846119790219E-12),(-0.32253970058654396,0.9465559368286391,-2.6116062180979988E-12),(-0.3225397005865454,0.9465559368286386,-2.6116062180979976E-12),(-0.02037212465314542,0.9997924667335301,-2.758632476471E-12),(-0.020372124653092762,0.9997924667335312,-2.758632476471003E-12),(-0.32253970058654396,0.9465559368286391,-2.6116062180979988E-12),(-0.02037212465314542,0.9997924667335301,-2.758632476471E-12),(0.25541347674785303,0.9668319170856814,-2.6677918948115393E-12),(-0.020372124653092762,0.9997924667335312,-2.758632476471003E-12),(0.25541347674790693,0.9668319170856672,-2.6677918948114997E-12),(0.25541347674790693,0.9668319170856672,-2.6677918948114997E-12),(0.4905585459951927,0.8714082355309036,-2.40456900779254E-12),(0.25541347674785303,0.9668319170856814,-2.6677918948115393E-12),(0.4905585459951778,0.871408235530912,-2.404569007792563E-12),(0.4905585459951778,0.871408235530912,-2.404569007792563E-12),(0.6462378453519254,0.7631360607617106,-2.105854824265498E-12),(0.4905585459951927,0.8714082355309036,-2.40456900779254E-12),(0.6462378453519061,0.763136060761727,-2.105854824265543E-12),(0.6462378453519061,0.763136060761727,-2.105854824265543E-12),(0.6427392629565352,0.7660850082426167,-2.114002661260435E-12),(0.6462378453519254,0.7631360607617106,-2.105854824265498E-12),(0.6427392629565662,0.7660850082425907,-2.114002661260363E-12),(0.6427392629565662,0.7660850082425907,-2.114002661260363E-12),(0.5846038255640311,0.8113189059401364,-2.238828935803458E-12),(0.6427392629565352,0.7660850082426167,-2.114002661260435E-12),(0.5846038255640311,0.8113189059401364,-2.238828935803458E-12),(-0.8601478920980523,0.5100447075691285,-1.4070838674255486E-12),(-0.8601478920980523,0.5100447075691285,-1.4070838674255486E-12),(-0.8601478920980523,0.5100447075691285,-1.4070838674255486E-12),(-0.8601478920980523,0.5100447075691285,-1.4070838674255486E-12),(0.8094388435365364,0.587204188144324,-1.6206600999260327E-12),(0.8094388435365364,0.587204188144324,-1.6206600999260327E-12),(0.8094388435365364,0.587204188144324,-1.6206600999260327E-12),(0.8094388435365364,0.587204188144324,-1.6206600999260327E-12),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(0.9536861696258785,-0.3008034073349574,8.294334364090115E-13),(0.9536861696258785,-0.3008034073349574,8.294334364090115E-13),(0.9536861696258785,-0.3008034073349574,8.294334364090115E-13),(0.9536861696258785,-0.3008034073349574,8.294334364090115E-13),(-0.770041798845136,-0.637993438862303,1.7605476150305354E-12),(-0.770041798845136,-0.637993438862303,1.7605476150305354E-12),(-0.770041798845136,-0.637993438862303,1.7605476150305354E-12),(-0.770041798845136,-0.637993438862303,1.7605476150305354E-12),(-0.994302470776474,0.10659548117907772,-2.937502228936808E-13),(-0.994302470776474,0.10659548117907772,-2.937502228936808E-13),(-0.994302470776474,0.10659548117907772,-2.937502228936808E-13),(-0.994302470776474,0.10659548117907772,-2.937502228936808E-13),(-0.9408175538277588,-0.33891345563366515,9.356544478813385E-13),(-0.8797598194001714,-0.4754184053746529,1.312174019616709E-12),(-0.9408175538277588,-0.33891345563366515,9.356544478813385E-13),(-0.8797598194001328,-0.4754184053747243,1.312174019616906E-12),(-0.8797598194001328,-0.4754184053747243,1.312174019616906E-12),(-0.7490764788486469,-0.6624835309920637,1.828145698459636E-12),(-0.8797598194001714,-0.4754184053746529,1.312174019616709E-12),(-0.7490764788486561,-0.6624835309920533,1.8281456984596075E-12),(-0.7490764788486469,-0.6624835309920637,1.828145698459636E-12),(-0.6277478308059852,-0.778416765568664,2.147993539831158E-12),(-0.6277478308059492,-0.7784167655686931,2.1479935398312386E-12),(-0.7490764788486561,-0.6624835309920533,1.8281456984596075E-12),(-0.6277478308059492,-0.7784167655686931,2.1479935398312386E-12),(-0.4624291545171812,-0.8866562338654849,2.4466586428265617E-12),(-0.4624291545172642,-0.8866562338654415,2.446658642826442E-12),(-0.6277478308059852,-0.778416765568664,2.147993539831158E-12),(-0.4624291545171812,-0.8866562338654849,2.4466586428265617E-12),(-0.24619523010037206,-0.9692202580816319,2.674405690349325E-12),(-0.4624291545172642,-0.8866562338654415,2.446658642826442E-12),(-0.2461952301003438,-0.9692202580816389,2.6744056903493444E-12),(-0.2461952301003438,-0.9692202580816389,2.6744056903493444E-12),(0.011075954373054989,-0.9999386597360491,2.759034866055225E-12),(-0.24619523010037206,-0.9692202580816319,2.674405690349325E-12),(0.0110759543730961,-0.9999386597360487,2.759034866055223E-12),(0.011075954373054989,-0.9999386597360491,2.759034866055225E-12),(0.29728615576782064,-0.9547884276575576,2.6343111180856386E-12),(0.2972861557679879,-0.9547884276575057,2.6343111180854952E-12),(0.0110759543730961,-0.9999386597360487,2.759034866055223E-12),(0.29728615576782064,-0.9547884276575576,2.6343111180856386E-12),(0.5611488072510459,-0.8277149365093812,2.2835849641804347E-12),(0.2972861557679879,-0.9547884276575057,2.6343111180854952E-12),(0.5611488072509848,-0.8277149365094224,2.2835849641805486E-12),(0.5611488072509848,-0.8277149365094224,2.2835849641805486E-12),(0.7489939741665427,-0.6625768081228082,1.8278643588246398E-12),(0.5611488072510459,-0.8277149365093812,2.2835849641804347E-12),(0.7489939741665566,-0.6625768081227924,1.8278643588245958E-12),(0.7489939741665427,-0.6625768081228082,1.8278643588246398E-12),(0.8635495158077704,-0.5042640516120157,1.3909695738791117E-12),(0.8635495158077656,-0.5042640516120236,1.390969573879134E-12),(0.7489939741665566,-0.6625768081227924,1.8278643588245958E-12),(0.8635495158077656,-0.5042640516120236,1.390969573879134E-12),(0.9334175416532352,-0.35879199117877647,9.895209807022448E-13),(0.9334175416532393,-0.3587919911787656,9.895209807022144E-13),(0.8635495158077704,-0.5042640516120157,1.3909695738791117E-12),(0.9334175416532393,-0.3587919911787656,9.895209807022144E-13),(0.9749062702748574,-0.2226157321007812,6.137961228186063E-13),(0.9749062702748587,-0.22261573210077576,6.137961228185914E-13),(0.9334175416532352,-0.35879199117877647,9.895209807022448E-13),(0.9749062702748587,-0.22261573210077576,6.137961228185914E-13),(0.9946566839741972,-0.1032379824747367,2.8438683980551676E-13),(0.994656683974197,-0.10323798247473812,2.8438683980552065E-13),(0.9749062702748574,-0.2226157321007812,6.137961228186063E-13),(0.994656683974197,-0.10323798247473812,2.8438683980552065E-13),(0.9999996706240923,-0.0008116352057429553,1.7356880416347777E-15),(0.9999996706240923,-0.0008116352057480785,1.7356880416489062E-15),(0.9946566839741972,-0.1032379824747367,2.8438683980551676E-13),(0.9999996706240923,-0.0008116352057480785,1.7356880416489062E-15),(0.9950173309235023,0.09970211212341352,-2.755199420894028E-13),(0.9950173309235034,0.09970211212340235,-2.7551994208937195E-13),(0.9999996706240923,-0.0008116352057429553,1.7356880416347777E-15),(0.9950173309235034,0.09970211212340235,-2.7551994208937195E-13),(0.9766138235826098,0.2150010222937444,-5.937086798056038E-13),(0.9766138235826136,0.21500102229372753,-5.93708679805557E-13),(0.9950173309235023,0.09970211212341352,-2.755199420894028E-13),(0.9766138235826136,0.21500102229372753,-5.93708679805557E-13),(0.9378850898645635,0.3469460450988595,-9.57741910242298E-13),(0.9378850898645755,0.34694604509882676,-9.577419102422077E-13),(0.9766138235826098,0.2150010222937444,-5.937086798056038E-13),(0.9378850898645755,0.34694604509882676,-9.577419102422077E-13),(0.8712497287927936,0.4908400045620607,-1.3546115534512753E-12),(0.8712497287927745,0.4908400045620945,-1.3546115534513684E-12),(0.9378850898645635,0.3469460450988595,-9.57741910242298E-13),(0.8712497287927745,0.4908400045620945,-1.3546115534513684E-12),(0.7558037417969744,0.6547982161595223,-1.8070237910513799E-12),(0.7558037417969822,0.6547982161595135,-1.8070237910513556E-12),(0.8712497287927936,0.4908400045620607,-1.3546115534512753E-12),(0.7558037417969744,0.6547982161595223,-1.8070237910513799E-12),(0.5617419259878124,0.8273125217156473,-2.2830404461652244E-12),(0.7558037417969822,0.6547982161595135,-1.8070237910513556E-12),(0.5617419259877519,0.8273125217156883,-2.283040446165338E-12),(0.5617419259877519,0.8273125217156883,-2.283040446165338E-12),(0.29396712482546045,0.9558155311156291,-2.637469979770619E-12),(0.5617419259878124,0.8273125217156473,-2.2830404461652244E-12),(0.2939671248254585,0.9558155311156297,-2.63746997977062E-12),(0.2939671248254585,0.9558155311156297,-2.63746997977062E-12),(-0.002695267450516672,0.9999963677600887,-2.7592105382557315E-12),(0.29396712482546045,0.9558155311156291,-2.637469979770619E-12),(-0.002695267450412,0.9999963677600888,-2.759210538255732E-12),(-0.002695267450412,0.9999963677600888,-2.759210538255732E-12),(-0.2926144101614269,0.9562305197837393,-2.638341290756704E-12),(-0.002695267450516672,0.9999963677600887,-2.7592105382557315E-12),(-0.29261441016138784,0.9562305197837514,-2.638341290756738E-12),(-0.2926144101614269,0.9562305197837393,-2.638341290756704E-12),(-0.5408366900001067,0.8411276209646955,-2.3206071089229516E-12),(-0.5408366900001648,0.8411276209646582,-2.320607108922849E-12),(-0.29261441016138784,0.9562305197837514,-2.638341290756738E-12),(-0.5408366900001648,0.8411276209646582,-2.320607108922849E-12),(-0.7259710978950983,0.6877252104009172,-1.8972918873025217E-12),(-0.7259710978950612,0.6877252104009562,-1.897291887302629E-12),(-0.5408366900001067,0.8411276209646955,-2.3206071089229516E-12),(-0.7259710978950983,0.6877252104009172,-1.8972918873025217E-12),(-0.7993217090953496,0.6009033244781474,-1.6577731311247824E-12),(-0.7259710978950612,0.6877252104009562,-1.897291887302629E-12),(-0.7993217090953496,0.6009033244781474,-1.6577731311247824E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(0.08869355101086293,-0.9960589611107787,2.748302239857704E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(0.08869355101077159,-0.9960589611107867,2.748302239857726E-12),(0.08869355101077159,-0.9960589611107867,2.748302239857726E-12),(0.4182829284859115,-0.9083167904080877,2.50606458307681E-12),(0.08869355101086293,-0.9960589611107787,2.748302239857704E-12),(0.41828292848561616,-0.9083167904082237,2.5060645830771854E-12),(0.41828292848561616,-0.9083167904082237,2.5060645830771854E-12),(0.8055283032698752,-0.5925572990278292,1.634700062820342E-12),(0.4182829284859115,-0.9083167904080877,2.50606458307681E-12),(0.8055283032697906,-0.592557299027944,1.6347000628206588E-12),(0.8055283032698752,-0.5925572990278292,1.634700062820342E-12),(0.9613077859588944,-0.27547657006505755,7.597414831206351E-13),(0.9613077859588679,-0.2754765700651501,7.597414831208905E-13),(0.8055283032697906,-0.592557299027944,1.6347000628206588E-12),(0.9613077859588679,-0.2754765700651501,7.597414831208905E-13),(0.9847230941359283,-0.17412761950754374,4.80045788911041E-13),(0.9847230941359283,-0.17412761950754374,4.80045788911041E-13),(0.9613077859588944,-0.27547657006505755,7.597414831206351E-13),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(0.9850106999604984,0.1724932490369674,-4.762448176277352E-13),(0.961494983772804,0.2748224812123921,-7.58648045895943E-13),(0.961494983772787,0.2748224812124512,-7.586480458961059E-13),(0.9850106999604984,0.1724932490369674,-4.762448176277352E-13),(0.961494983772787,0.2748224812124512,-7.586480458961059E-13),(0.9273794962553793,0.3741219987184919,-1.0326877403536493E-12),(0.9273794962553793,0.3741219987184919,-1.0326877403536493E-12),(0.961494983772804,0.2748224812123921,-7.58648045895943E-13),(0.3926681168676969,0.9196802433430745,-2.5377536302997775E-12),(0.20039929722533362,0.9797143061482733,-2.7033227720186272E-12),(0.3926681168676969,0.9196802433430745,-2.5377536302997775E-12),(0.2003992972254554,0.9797143061482484,-2.703322772018558E-12),(0.2003992972254554,0.9797143061482484,-2.703322772018558E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(0.20039929722533362,0.9797143061482733,-2.7033227720186272E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.5672614750584476,-0.8235377458954231,2.2720352267772058E-12),(0.7214044108111475,-0.6925140258956647,1.9105475464784433E-12),(0.5672614750584476,-0.8235377458954231,2.2720352267772058E-12),(0.7214044108112989,-0.6925140258955069,1.910547546478008E-12),(0.7214044108111475,-0.6925140258956647,1.9105475464784433E-12),(0.8460222407894723,-0.5331476044113491,1.4708663902975762E-12),(0.8460222407894723,-0.5331476044113491,1.4708663902975762E-12),(0.7214044108112989,-0.6925140258955069,1.910547546478008E-12),(0.9941612242434783,-0.10790486648297537,2.9735844982463723E-13),(0.9985392391497385,-0.054031360137068975,1.4869470620442054E-13),(0.9985392391497395,-0.054031360137050524,1.4869470620436962E-13),(0.9941612242434783,-0.10790486648297537,2.9735844982463723E-13),(0.9985392391497395,-0.054031360137050524,1.4869470620436962E-13),(0.9985392391497385,0.05403136013706628,-1.4944711174432983E-13),(0.9985392391497392,0.05403136013705365,-1.4944711174429494E-13),(0.9985392391497385,-0.054031360137068975,1.4869470620442054E-13),(0.9985392391497392,0.05403136013705365,-1.4944711174429494E-13),(0.9941612242434782,0.1079048664829755,-2.980541582818343E-13),(0.9941612242434782,0.1079048664829755,-2.980541582818343E-13),(0.9985392391497385,0.05403136013706628,-1.4944711174432983E-13),(0.8460222407894719,0.53314760441135,-1.4712801361103203E-12),(0.7214044108113185,0.6925140258954865,-1.910994038376792E-12),(0.7214044108112997,0.6925140258955061,-1.9109940383768462E-12),(0.8460222407894719,0.53314760441135,-1.4712801361103203E-12),(0.7214044108113185,0.6925140258954865,-1.910994038376792E-12),(0.5672614750584498,0.8235377458954214,-2.2724961910721783E-12),(0.7214044108112997,0.6925140258955061,-1.9109940383768462E-12),(0.5672614750584498,0.8235377458954214,-2.2724961910721783E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(0.8194722387884859,-0.5731188793391708,1.581056420400817E-12),(0.757404544226434,-0.6529459061707545,1.8013756196478485E-12),(0.7574045442264348,-0.6529459061707538,1.8013756196478462E-12),(0.8194722387884859,-0.5731188793391708,1.581056420400817E-12),(0.757404544226434,-0.6529459061707545,1.8013756196478485E-12),(0.583163970413716,-0.8123544691889808,2.2412739162456285E-12),(0.7574045442264348,-0.6529459061707538,1.8013756196478462E-12),(0.5831639704137412,-0.8123544691889628,2.2412739162455785E-12),(0.5831639704137412,-0.8123544691889628,2.2412739162455785E-12),(0.3197400203626799,-0.9475053136412869,2.6142475071518236E-12),(0.583163970413716,-0.8123544691889808,2.2412739162456285E-12),(0.3197400203626479,-0.9475053136412975,2.6142475071518535E-12),(0.3197400203626479,-0.9475053136412975,2.6142475071518535E-12),(0.012699053705094217,-0.9999193637663966,2.7589867216784573E-12),(0.3197400203626799,-0.9475053136412869,2.6142475071518236E-12),(0.012699053705109459,-0.9999193637663963,2.758986721678457E-12),(0.012699053705094217,-0.9999193637663966,2.7589867216784573E-12),(-0.28156556039750363,-0.9595419924099412,2.6476725911720834E-12),(-0.2815655603974348,-0.9595419924099615,2.6476725911721395E-12),(0.012699053705109459,-0.9999193637663963,2.758986721678457E-12),(-0.2815655603974348,-0.9595419924099615,2.6476725911721395E-12),(-0.540433301857153,-0.8413868588489932,2.3217769207241742E-12),(-0.5404333018571272,-0.8413868588490098,2.32177692072422E-12),(-0.28156556039750363,-0.9595419924099412,2.6476725911720834E-12),(-0.5404333018571272,-0.8413868588490098,2.32177692072422E-12),(-0.7333107949378317,-0.6798935784574272,1.87629750355809E-12),(-0.73331079493784,-0.679893578457418,1.876297503558066E-12),(-0.540433301857153,-0.8413868588489932,2.3217769207241742E-12),(-0.7333107949378317,-0.6798935784574272,1.87629750355809E-12),(-0.85710093432464,-0.5151485109944794,1.4217976125704666E-12),(-0.73331079493784,-0.679893578457418,1.876297503558066E-12),(-0.8571009343246485,-0.5151485109944652,1.4217976125704274E-12),(-0.8571009343246485,-0.5151485109944652,1.4217976125704274E-12),(-0.9309474157192527,-0.36515326804732995,1.0079319831677573E-12),(-0.85710093432464,-0.5151485109944794,1.4217976125704666E-12),(-0.930947415719251,-0.3651532680473342,1.0079319831677692E-12),(-0.930947415719251,-0.3651532680473342,1.0079319831677692E-12),(-0.9717468331379574,-0.23602561786033083,6.516186142789013E-13),(-0.9309474157192527,-0.36515326804732995,1.0079319831677573E-12),(-0.9717468331379546,-0.23602561786034235,6.51618614278933E-13),(-0.9717468331379546,-0.23602561786034235,6.51618614278933E-13),(-0.9931098274040329,-0.11718733171094989,3.237817843713939E-13),(-0.9717468331379574,-0.23602561786033083,6.516186142789013E-13),(-0.9931098274040345,-0.11718733171093668,3.237817843713575E-13),(-0.9931098274040345,-0.11718733171093668,3.237817843713575E-13),(-0.9999579620805331,-0.009169191444583459,2.5802203621706983E-14),(-0.9931098274040329,-0.11718733171094989,3.237817843713939E-13),(-0.999957962080533,-0.009169191444587096,2.5802203621717027E-14),(-0.999957962080533,-0.009169191444587096,2.5802203621717027E-14),(-0.9967023029360895,0.08114505112387327,-2.2350400458204252E-13),(-0.9999579620805331,-0.009169191444583459,2.5802203621706983E-14),(-0.99670230293609,0.08114505112386673,-2.2350400458202442E-13),(-0.99670230293609,0.08114505112386673,-2.2350400458202442E-13),(-0.9857538147747091,0.16819457974949253,-4.63766169994388E-13),(-0.9967023029360895,0.08114505112387327,-2.2350400458204252E-13),(-0.9857538147747111,0.168194579749481,-4.63766169994356E-13),(-0.9857538147747111,0.168194579749481,-4.63766169994356E-13),(-0.9654101412336203,0.26073599521984153,-7.190263371202625E-13),(-0.9857538147747091,0.16819457974949253,-4.63766169994388E-13),(-0.965410141233624,0.26073599521982815,-7.190263371202256E-13),(-0.965410141233624,0.26073599521982815,-7.190263371202256E-13),(-0.933824740070633,0.3577308413206985,-9.86666313835656E-13),(-0.9654101412336203,0.26073599521984153,-7.190263371202625E-13),(-0.9338247400706331,0.3577308413206983,-9.866663138356555E-13),(-0.9338247400706331,0.3577308413206983,-9.866663138356555E-13),(-0.8875957509041146,0.46062325492419626,-1.2707488237403285E-12),(-0.933824740070633,0.3577308413206985,-9.86666313835656E-13),(-0.8875957509041126,0.4606232549242003,-1.2707488237403394E-12),(-0.8875957509041126,0.4606232549242003,-1.2707488237403394E-12),(-0.8198049388265566,0.572642874988929,-1.5798922894855804E-12),(-0.8875957509041146,0.46062325492419626,-1.2707488237403285E-12),(-0.8198049388265604,0.5726428749889236,-1.5798922894855656E-12),(-0.8198049388265604,0.5726428749889236,-1.5798922894855656E-12),(-0.722671129276619,0.6911920419898193,-1.9069158451958418E-12),(-0.8198049388265566,0.572642874988929,-1.5798922894855804E-12),(-0.7226711292766199,0.6911920419898184,-1.9069158451958398E-12),(-0.722671129276619,0.6911920419898193,-1.9069158451958418E-12),(-0.5715761942912858,0.8205489955630256,-2.2638461197901658E-12),(-0.5715761942912485,0.8205489955630518,-2.2638461197902377E-12),(-0.7226711292766199,0.6911920419898184,-1.9069158451958398E-12),(-0.5715761942912485,0.8205489955630518,-2.2638461197902377E-12),(-0.32253970058651305,0.9465559368286498,-2.6116062180980234E-12),(-0.32253970058652687,0.9465559368286449,-2.6116062180980105E-12),(-0.5715761942912858,0.8205489955630256,-2.2638461197901658E-12),(-0.32253970058651305,0.9465559368286498,-2.6116062180980234E-12),(-0.020372124653166204,0.9997924667335297,-2.7586324764709995E-12),(-0.32253970058652687,0.9465559368286449,-2.6116062180980105E-12),(-0.02037212465307671,0.9997924667335314,-2.7586324764710043E-12),(-0.02037212465307671,0.9997924667335314,-2.7586324764710043E-12),(0.25541347674785186,0.9668319170856817,-2.6677918948115393E-12),(-0.020372124653166204,0.9997924667335297,-2.7586324764709995E-12),(0.25541347674788184,0.966831917085674,-2.667791894811518E-12),(0.25541347674788184,0.966831917085674,-2.667791894811518E-12),(0.4905585459952011,0.8714082355308989,-2.4045690077925264E-12),(0.25541347674785186,0.9668319170856817,-2.6677918948115393E-12),(0.4905585459951661,0.8714082355309185,-2.4045690077925805E-12),(0.4905585459951661,0.8714082355309185,-2.4045690077925805E-12),(0.6462378453519136,0.7631360607617204,-2.1058548242655326E-12),(0.4905585459952011,0.8714082355308989,-2.4045690077925264E-12),(0.646237845351932,0.7631360607617048,-2.1058548242654894E-12),(0.646237845351932,0.7631360607617048,-2.1058548242654894E-12),(0.6427392629565304,0.7660850082426208,-2.1140304923394597E-12),(0.6462378453519136,0.7631360607617204,-2.1058548242655326E-12),(0.6427392629565537,0.7660850082426012,-2.1140304923394063E-12),(0.6427392629565537,0.7660850082426012,-2.1140304923394063E-12),(0.5846038255640063,0.8113189059401544,-2.2388844469546893E-12),(0.6427392629565304,0.7660850082426208,-2.1140304923394597E-12),(0.5846038255640063,0.8113189059401544,-2.2388844469546893E-12),(-0.8601478920980623,0.5100447075691116,-1.4071948897280112E-12),(-0.8601478920980623,0.5100447075691116,-1.4071948897280112E-12),(-0.8601478920980623,0.5100447075691116,-1.4071948897280112E-12),(-0.8601478920980623,0.5100447075691116,-1.4071948897280112E-12),(0.8094388435365364,0.587204188144324,-1.6206600999260327E-12),(0.8094388435365364,0.587204188144324,-1.6206600999260327E-12),(0.8094388435365364,0.587204188144324,-1.6206600999260327E-12),(0.8094388435365364,0.587204188144324,-1.6206600999260327E-12),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.20007400713178172,0.9797807875592539,-2.703360012821679E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.20007400713178403,0.9797807875592535,-2.703360012821677E-12),(-0.20007400713178172,0.9797807875592539,-2.703360012821679E-12),(-0.39205733655535935,0.9199407833404918,-2.5381860473712873E-12),(-0.39205733655535935,0.9199407833404918,-2.5381860473712873E-12),(-0.20007400713178403,0.9797807875592535,-2.703360012821677E-12),(-0.9271481171496652,0.37469503448248564,-1.0336038453690327E-12),(-0.9613689058329687,0.27526319568282365,-7.592183273173125E-13),(-0.9271481171496652,0.37469503448248564,-1.0336038453690327E-12),(-0.9613689058329601,0.27526319568285385,-7.592183273173959E-13),(-0.9613689058329601,0.27526319568285385,-7.592183273173959E-13),(-0.9849591146664011,0.1727875644703044,-4.764375605704E-13),(-0.9613689058329687,0.27526319568282365,-7.592183273173125E-13),(-0.9849591146664011,0.1727875644703044,-4.764375605704E-13),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.9850568535010445,-0.1722294846146325,4.755786844994556E-13),(-0.9627290187837485,-0.2704678102689502,7.466813754293024E-13),(-0.9850568535010445,-0.1722294846146325,4.755786844994556E-13),(-0.9627290187837382,-0.2704678102689871,7.466813754294039E-13),(-0.9627290187837382,-0.2704678102689871,7.466813754294039E-13),(-0.8103422277042295,-0.5859568874920293,1.6171185345102203E-12),(-0.9627290187837485,-0.2704678102689502,7.466813754293024E-13),(-0.8103422277044079,-0.5859568874917827,1.6171185345095396E-12),(-0.8103422277042295,-0.5859568874920293,1.6171185345102203E-12),(-0.4221218672866537,-0.9065390941147706,2.501477280867575E-12),(-0.4221218672864478,-0.9065390941148664,2.501477280867839E-12),(-0.8103422277044079,-0.5859568874917827,1.6171185345095396E-12),(-0.4221218672866537,-0.9065390941147706,2.501477280867575E-12),(-0.08899635085419964,-0.9960319520651113,2.7482958091719033E-12),(-0.4221218672864478,-0.9065390941148664,2.501477280867839E-12),(-0.08899635085420729,-0.9960319520651107,2.7482958091719017E-12),(-0.08899635085420729,-0.9960319520651107,2.7482958091719017E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.08899635085419964,-0.9960319520651113,2.7482958091719033E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-0.587931901049856,0.808910427505977,-2.2317615791035367E-12),(-0.7331764133481863,0.6800384892856357,-1.876135688840783E-12),(-0.587931901049856,0.808910427505977,-2.2317615791035367E-12),(-0.7331764133483407,0.6800384892854691,-1.8761356888403235E-12),(-0.7331764133483407,0.6800384892854691,-1.8761356888403235E-12),(-0.8507772826193463,0.5255264173938747,-1.4497720821024064E-12),(-0.7331764133481863,0.6800384892856357,-1.876135688840783E-12),(-0.8507772826193463,0.5255264173938747,-1.4497720821024064E-12),(-0.994236246863432,0.1072114052837521,-2.955820918693379E-13),(-0.9985580220656773,0.05368311250553952,-1.4780244768945283E-13),(-0.994236246863432,0.1072114052837521,-2.955820918693379E-13),(-0.9985580220656758,0.053683112505568904,-1.4780244768953393E-13),(-0.9985580220656758,0.053683112505568904,-1.4780244768953393E-13),(-0.9997372811223786,-0.022920923498721792,6.370289276844907E-14),(-0.9985580220656773,0.05368311250553952,-1.4780244768945283E-13),(-0.9997372811223787,-0.022920923498718167,6.370289276843906E-14),(-0.9997372811223787,-0.022920923498718167,6.370289276843906E-14),(-0.9919210150229111,-0.12685700593943589,3.5042209989324683E-13),(-0.9997372811223786,-0.022920923498721792,6.370289276844907E-14),(-0.9919210150229133,-0.12685700593941754,3.504220998931963E-13),(-0.9919210150229133,-0.12685700593941754,3.504220998931963E-13),(-0.9257138949175407,-0.37822451633467224,1.043875446330418E-12),(-0.9919210150229111,-0.12685700593943589,3.5042209989324683E-13),(-0.9257138949176085,-0.37822451633450627,1.04387544632996E-12),(-0.9257138949176085,-0.37822451633450627,1.04387544632996E-12),(-0.7298956734501632,-0.6835585606798681,1.8863638500812267E-12),(-0.9257138949175407,-0.37822451633467224,1.043875446330418E-12),(-0.729895673450331,-0.6835585606796888,1.886363850080732E-12),(-0.7298956734501632,-0.6835585606798681,1.8863638500812267E-12),(-0.5913596447695311,-0.8064079430028291,2.2253398265414533E-12),(-0.5913596447695311,-0.8064079430028291,2.2253398265414533E-12),(-0.729895673450331,-0.6835585606796888,1.886363850080732E-12),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(1.,-1.0761972206014589E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.9832650394637132,-0.18218085016933794,5.029456554047225E-13),(-0.9604389766296769,-0.27849052438196026,7.686954181838739E-13),(-0.9832650394637132,-0.18218085016933794,5.029456554047225E-13),(-0.9604389766296849,-0.27849052438193206,7.68695418183796E-13),(-0.9604389766296849,-0.27849052438193206,7.68695418183796E-13),(-0.8061306092176249,-0.5917376453145607,1.633035915474229E-12),(-0.9604389766296769,-0.27849052438196026,7.686954181838739E-13),(-0.8061306092174902,-0.5917376453147445,1.6330359154747359E-12),(-0.8061306092176249,-0.5917376453145607,1.633035915474229E-12),(-0.4173761927595571,-0.9087337969491049,2.507568368658197E-12),(-0.41737619275961,-0.9087337969490807,2.5075683686581293E-12),(-0.8061306092174902,-0.5917376453147445,1.6330359154747359E-12),(-0.4173761927595571,-0.9087337969491049,2.507568368658197E-12),(-0.0876379036952066,-0.996152396893121,2.748618267907462E-12),(-0.41737619275961,-0.9087337969490807,2.5075683686581293E-12),(-0.0876379036952242,-0.9961523968931193,2.7486182679074572E-12),(-0.0876379036952066,-0.996152396893121,2.748618267907462E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.0876379036952242,-0.9961523968931193,2.7486182679074572E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.08899635085425409,0.9960319520651065,-2.7482234963039302E-12),(-0.08899635085416184,0.9960319520651149,-2.748223496303953E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-0.08899635085425409,0.9960319520651065,-2.7482234963039302E-12),(-0.422121867286659,0.9065390941147681,-2.5011059445542186E-12),(-0.08899635085416184,0.9960319520651149,-2.748223496303953E-12),(-0.422121867286817,0.9065390941146945,-2.501105944554015E-12),(-0.422121867286659,0.9065390941147681,-2.5011059445542186E-12),(-0.8086796863923623,0.5882492369874787,-1.6227982492744912E-12),(-0.8086796863925251,0.5882492369872546,-1.6227982492738729E-12),(-0.422121867286817,0.9065390941146945,-2.501105944554015E-12),(-0.8086796863923623,0.5882492369874787,-1.6227982492744912E-12),(-0.9603664303895912,0.2787405951431447,-7.687731289981813E-13),(-0.8086796863925251,0.5882492369872546,-1.6227982492738729E-12),(-0.9603664303895675,0.27874059514322663,-7.687731289984075E-13),(-0.9603664303895675,0.27874059514322663,-7.687731289984075E-13),(-0.9830031215351425,0.1835888423956264,-5.061360555728938E-13),(-0.9603664303895912,0.2787405951431447,-7.687731289981813E-13),(-0.9830031215351425,0.1835888423956264,-5.061360555728938E-13),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(1.,-1.0761972206014592E-42,-4.034522267621423E-16),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.9829162037139707,-0.18405362391573804,5.082192095830502E-13),(-0.9589823266839851,-0.2834658658600195,7.82510123573501E-13),(-0.9829162037139707,-0.18405362391573804,5.082192095830502E-13),(-0.958982326683998,-0.2834658658599764,7.825101235733823E-13),(-0.958982326683998,-0.2834658658599764,7.825101235733823E-13),(-0.9250216907185411,-0.3799142952038155,1.0486194056866243E-12),(-0.9589823266839851,-0.2834658658600195,7.82510123573501E-13),(-0.9250216907185411,-0.3799142952038155,1.0486194056866243E-12),(-0.39770665703451996,-0.9175126238643406,2.531786256486511E-12),(-0.20308542061848583,-0.9791610245165054,2.7018031158692143E-12),(-0.2030854206186462,-0.9791610245164724,2.701803115869123E-12),(-0.39770665703451996,-0.9175126238643406,2.531786256486511E-12),(-0.20308542061848583,-0.9791610245165054,2.7018031158692143E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(-0.2030854206186462,-0.9791610245164724,2.701803115869123E-12),(9.687009403864346E-28,-1.,2.7592143574660292E-12),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-1.,1.0761972206014592E-42,4.034522267621423E-16),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-9.687009403864346E-28,1.,-2.7592143574660292E-12),(-1.3725977238595926E-27,1.,-2.75921435746603E-12),(-0.08899635085414169,0.9960319520651166,-2.7482234963039565E-12),(-1.3725977238595926E-27,1.,-2.75921435746603E-12),(-0.08899635085414813,0.9960319520651161,-2.748223496303954E-12),(-0.9603664303895796,0.2787405951431853,-7.687731289982965E-13),(-0.9830031215351425,0.1835888423956264,-5.061360555728938E-13),(-0.960366430389585,0.2787405951431662,-7.687731289982434E-13),(-0.9830031215351425,0.1835888423956264,-5.061360555728938E-13),(-0.08899635085414813,0.9960319520651161,-2.748223496303954E-12),(-0.4221218672867728,0.9065390941147151,-2.50110594455407E-12),(-0.08899635085414169,0.9960319520651166,-2.7482234963039565E-12),(-0.4221218672867537,0.906539094114724,-2.5011059445540946E-12),(-0.4221218672867728,0.9065390941147151,-2.50110594455407E-12),(-0.8086796863926495,0.5882492369870835,-1.6227982492734043E-12),(-0.8086796863925304,0.5882492369872474,-1.622798249273856E-12),(-0.4221218672867537,0.906539094114724,-2.5011059445540946E-12),(-0.8086796863926495,0.5882492369870835,-1.6227982492734043E-12),(-0.960366430389585,0.2787405951431662,-7.687731289982434E-13),(-0.8086796863925304,0.5882492369872474,-1.622798249273856E-12),(-0.9603664303895796,0.2787405951431853,-7.687731289982965E-13),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(2.9014540321687446E-15,-2.753816448777958E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(7.564390735594402E-15,-2.762882014836081E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(1.3448572766107732E-14,-2.7681850473853533E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(6.254968316871736E-16,-2.7588738478177244E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(1.1339149019319938E-14,-2.7463497837929584E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(2.924299242996266E-16,-2.75749174968622E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.007680667607106E-15,-2.7643353439559525E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(9.673814482382205E-15,-2.7461948200471406E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.16562303699603E-14,-2.7571002251900776E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(3.2345209395562916E-15,-2.768257652314093E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(2.421773610497175E-14,-2.7527431704243738E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(1.791231007543588E-15,-2.7562066450224008E-12,-1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.),(6.512596466317564E-16,2.759214357466027E-12,1.)),$,((1,2,3),(2,1,4),(3,2,5),(3,5,6),(7,8,9),(8,7,10),(8,10,6),(8,6,11),(11,6,5),(8,11,12),(8,12,13),(14,15,16),(15,14,17),(17,14,18),(18,14,19),(19,14,20),(20,14,21),(20,21,22),(22,21,4),(22,4,1),(21,14,23),(23,14,24),(25,26,27),(26,25,22),(26,22,28),(28,22,1),(29,30,31),(30,29,32),(32,29,33),(32,33,25),(32,25,34),(34,25,27),(32,34,35),(36,37,38),(37,36,39),(40,41,42),(41,40,43),(44,45,46),(45,44,47),(48,49,50),(49,48,51),(52,53,54),(53,52,55),(56,57,58),(57,56,59),(60,61,62),(61,60,63),(64,65,66),(65,64,67),(68,69,70),(69,68,71),(72,73,74),(73,72,75),(76,77,78),(77,76,79),(80,81,82),(81,80,83),(84,85,86),(85,84,87),(88,89,90),(89,88,91),(92,93,94),(93,92,95),(96,97,98),(97,96,99),(100,101,102),(101,100,103),(104,105,106),(105,104,107),(108,109,110),(109,108,111),(112,113,114),(113,112,115),(116,117,118),(117,116,119),(120,121,122),(121,120,123),(124,125,126),(125,124,127),(128,129,130),(129,128,131),(132,133,134),(133,132,135),(136,137,138),(137,136,139),(140,141,142),(141,140,143),(144,145,146),(145,144,147),(148,149,150),(149,148,151),(152,153,154),(153,152,155),(156,157,158),(157,156,159),(160,161,162),(161,160,163),(164,165,166),(165,164,167),(168,169,170),(169,168,171),(172,173,174),(173,172,175),(176,177,178),(177,176,179),(180,181,182),(181,180,183),(184,185,186),(185,184,187),(188,189,190),(189,188,191),(192,193,194),(193,192,195),(196,197,198),(197,196,199),(200,201,202),(201,200,203),(204,205,206),(205,204,207),(208,209,210),(209,208,211),(212,213,214),(213,212,215),(216,217,218),(217,216,219),(220,221,222),(221,220,223),(224,225,226),(225,224,227),(228,229,230),(229,228,231),(232,233,234),(233,232,235),(236,237,238),(237,236,239),(240,241,242),(241,240,243),(244,245,246),(245,244,247),(248,249,250),(249,248,251),(252,253,254),(253,252,255),(256,257,258),(257,256,259),(260,261,262),(261,260,263),(264,265,266),(265,264,267),(268,269,270),(269,268,271),(272,273,274),(273,272,275),(276,277,278),(277,276,279),(280,281,282),(281,280,283),(284,285,286),(285,284,287),(288,289,290),(289,288,291),(292,293,294),(293,292,295),(296,297,298),(297,296,299),(300,301,302),(301,300,303),(304,305,306),(305,304,307),(308,309,310),(309,308,311),(312,313,314),(313,312,315),(316,317,318),(317,316,319),(320,321,322),(321,320,323),(324,325,326),(325,324,327),(328,329,330),(329,328,331),(332,333,334),(333,332,335),(336,337,338),(337,336,339),(340,341,342),(341,340,343),(344,345,346),(345,344,347),(348,349,350),(349,348,351),(352,353,354),(353,352,355),(356,357,358),(357,356,359),(360,361,362),(361,360,363),(364,365,366),(365,364,367),(368,369,370),(369,368,371),(372,373,374),(373,372,375),(373,375,376),(376,375,377),(377,375,378),(377,378,379),(379,378,380),(380,378,381),(380,381,382),(382,381,383),(382,383,384),(384,383,385),(384,385,386),(386,385,387),(387,385,388),(387,388,389),(387,389,390),(390,389,391),(390,391,392),(392,391,393),(392,393,394),(394,393,395),(394,395,396),(396,395,397),(396,397,398),(398,397,399),(398,399,400),(400,399,401),(402,403,404),(403,402,405),(405,402,406),(405,406,407),(407,406,372),(407,372,408),(408,372,409),(409,372,374),(409,374,410),(409,410,411),(411,410,412),(411,412,413),(411,413,414),(414,413,415),(414,415,416),(414,416,417),(417,416,418),(417,418,419),(419,418,420),(419,420,421),(421,420,422),(421,422,423),(421,423,424),(424,423,425),(424,425,426),(426,425,427),(426,427,428),(428,427,429),(428,429,430),(430,429,431),(430,431,432),(430,432,433),(433,432,434),(433,434,401),(433,401,399),(433,399,435),(433,435,436),(436,435,437),(436,437,438),(436,438,439),(439,438,440),(439,440,441),(442,443,444),(443,442,445),(446,447,448),(447,446,449),(450,451,452),(451,450,453),(454,455,456),(455,454,457),(458,459,460),(459,458,461),(462,463,464),(463,462,465),(466,467,468),(467,466,469),(470,471,472),(471,470,473),(474,475,476),(475,474,477),(478,479,480),(479,478,481),(482,483,484),(483,482,485),(486,487,488),(487,486,489),(490,491,492),(491,490,493),(494,495,496),(495,494,497),(498,499,500),(499,498,501),(502,503,504),(503,502,505),(506,507,508),(507,506,509),(510,511,512),(511,510,513),(514,515,516),(515,514,517),(518,519,520),(519,518,521),(522,523,524),(523,522,525),(526,527,528),(527,526,529),(530,531,532),(531,530,533),(534,535,536),(535,534,537),(538,539,540),(539,538,541),(542,543,544),(543,542,545),(546,547,548),(547,546,549),(550,551,552),(551,550,553),(554,555,556),(555,554,557),(558,559,560),(559,558,561),(562,563,564),(563,562,565),(566,567,568),(567,566,569),(570,571,572),(571,570,573),(574,575,576),(575,574,577),(578,579,580),(579,578,581),(582,583,584),(583,582,585),(586,587,588),(587,586,589),(590,591,592),(591,590,593),(594,595,596),(595,594,597),(598,599,600),(599,598,601),(602,603,604),(603,602,605),(606,607,608),(607,606,609),(610,611,612),(611,610,613),(614,615,616),(615,614,617),(618,619,620),(619,618,621),(622,623,624),(623,622,625),(626,627,628),(627,626,629),(630,631,632),(631,630,633),(634,635,636),(635,634,637),(638,639,640),(639,638,641),(642,643,644),(643,642,645),(646,647,648),(647,646,649),(650,651,652),(651,650,653),(654,655,656),(655,654,657),(658,659,660),(659,658,661),(662,663,664),(663,662,665),(666,667,668),(667,666,669),(670,671,672),(671,670,673),(674,675,676),(675,674,677),(678,679,680),(679,678,681),(682,683,684),(683,682,685),(686,687,688),(687,686,689),(690,691,692),(691,690,693),(694,695,696),(695,694,697),(698,699,700),(699,698,701),(702,703,704),(703,702,705),(706,707,708),(707,706,709),(710,711,712),(711,710,713),(714,715,716),(715,714,717),(718,719,720),(719,718,721),(722,723,724),(723,722,725),(725,722,726),(726,722,727),(727,722,728),(728,722,729),(728,729,730),(730,729,731),(729,722,732),(732,722,733),(732,733,734),(734,733,735),(734,735,736),(736,735,737),(736,737,738),(736,738,739),(739,738,740),(739,740,741),(742,743,744),(743,742,745),(745,742,746),(745,746,747),(745,747,730),(745,730,748),(748,730,749),(749,730,731),(745,748,750),(745,750,751),(752,753,754),(753,752,755),(756,757,758),(757,756,759),(760,761,762),(761,760,763),(764,765,766),(765,764,767),(768,769,770),(769,768,771),(772,773,774),(773,772,775),(776,777,778),(777,776,779),(780,781,782),(781,780,783),(784,785,786),(785,784,787),(788,789,790),(789,788,791),(792,793,794),(793,792,795),(796,797,798),(797,796,799),(800,801,802),(801,800,803),(804,805,806),(805,804,807),(808,809,810),(809,808,811),(812,813,814),(813,812,815),(816,817,818),(817,816,819),(820,821,822),(821,820,823),(824,825,826),(825,824,827),(828,829,830),(829,828,831),(832,833,834),(833,832,835),(836,837,838),(837,836,839),(840,841,842),(841,840,843),(844,845,846),(845,844,847),(848,849,850),(849,848,851),(852,853,854),(853,852,855),(856,857,858),(857,856,859),(860,861,862),(861,860,863),(864,865,866),(865,864,867),(868,869,870),(869,868,871),(872,873,874),(873,872,875),(873,875,876),(876,875,877),(877,875,878),(878,875,879),(879,875,880),(880,875,881),(880,881,882),(882,881,883),(882,883,884),(884,883,885),(884,885,886),(886,885,887),(887,885,888),(887,888,889),(889,888,890),(889,890,891),(891,890,892),(892,890,893),(892,893,894),(895,896,897),(896,895,898),(896,898,899),(896,899,900),(896,900,901),(901,900,877),(901,877,878),(896,901,902),(896,902,903),(896,903,904),(904,903,905),(904,905,906),(906,905,907),(906,907,908),(908,907,909),(908,909,910),(910,909,911),(910,911,912),(912,911,913),(912,913,914),(912,914,915),(915,914,894),(915,894,893),(915,893,916),(915,916,917),(917,916,918),(917,918,919),(919,918,920),(919,920,921),(919,921,922),(923,924,925),(924,923,926),(927,928,929),(928,927,930),(931,932,933),(932,931,934),(935,936,937),(936,935,938),(939,940,941),(940,939,942),(943,944,945),(944,943,946),(947,948,949),(948,947,950),(951,952,953),(952,951,954),(955,956,957),(956,955,958),(959,960,961),(960,959,962),(963,964,965),(964,963,966),(967,968,969),(968,967,970),(971,972,973),(972,971,974),(975,976,977),(976,975,978),(979,980,981),(980,979,982),(983,984,985),(984,983,986),(987,988,989),(988,987,990),(991,992,993),(992,991,994),(995,996,997),(996,995,998),(999,1000,1001),(1000,999,1002),(1003,1004,1005),(1004,1003,1006),(1007,1008,1009),(1008,1007,1010),(1011,1012,1013),(1012,1011,1014),(1015,1016,1017),(1016,1015,1018),(1019,1020,1021),(1020,1019,1022),(1023,1024,1025),(1024,1023,1026),(1027,1028,1029),(1028,1027,1030),(1031,1032,1033),(1032,1031,1034),(1035,1036,1037),(1036,1035,1038),(1039,1040,1041),(1040,1039,1042),(1043,1044,1045),(1044,1043,1046),(1047,1048,1049),(1048,1047,1050),(1051,1052,1053),(1052,1051,1054),(1055,1056,1057),(1056,1055,1058),(1059,1060,1061),(1060,1059,1062),(1063,1064,1065),(1064,1063,1066),(1067,1068,1069),(1068,1067,1070),(1071,1072,1073),(1072,1071,1074),(1075,1076,1077),(1076,1075,1078),(1079,1080,1081),(1080,1079,1082),(1083,1084,1085),(1084,1083,1086),(1087,1088,1089),(1088,1087,1090),(1091,1092,1093),(1092,1091,1094),(1095,1096,1097),(1096,1095,1098),(1099,1100,1101),(1100,1099,1102),(1103,1104,1105),(1104,1103,1106),(1107,1108,1109),(1108,1107,1110),(1111,1112,1113),(1112,1111,1114),(1115,1116,1117),(1116,1115,1118),(1119,1120,1121),(1120,1119,1122),(1123,1124,1125),(1124,1123,1126),(1127,1128,1129),(1128,1127,1130),(1130,1127,1131),(1131,1127,1132),(1132,1127,1133),(1132,1133,1134),(1133,1127,1135),(1135,1127,1136),(1136,1127,1137),(1136,1137,1138),(1136,1138,1139),(1139,1138,1140),(1139,1140,1141),(1141,1140,1142),(1141,1142,1143),(1143,1142,1144),(1145,1146,1133),(1146,1145,1147),(1147,1145,1148),(1147,1148,1149),(1147,1149,1150),(1150,1149,1151),(1151,1149,1152),(1151,1152,1153),(1153,1152,1154),(1153,1154,1155),(1155,1154,1156),(1155,1156,1157),(1158,1159,1160),(1159,1158,1161),(1159,1161,1162),(1159,1162,1163),(1159,1163,1134),(1159,1134,1164),(1164,1134,1133),(1164,1133,1146),(1159,1164,1165),(1159,1165,1166),(1159,1166,1167),(1167,1166,1168),(1168,1166,1169),(1168,1169,1170),(1170,1169,1171),(1170,1171,1172),(1172,1171,1173),(1172,1173,1174),(1172,1174,1175),(1176,1177,1178),(1177,1176,1179),(1180,1181,1182),(1181,1180,1183),(1184,1185,1186),(1185,1184,1187),(1188,1189,1190),(1189,1188,1191),(1192,1193,1194),(1193,1192,1195),(1196,1197,1198),(1197,1196,1199),(1200,1201,1202),(1201,1200,1203),(1204,1205,1206),(1205,1204,1207),(1208,1209,1210),(1209,1208,1211),(1212,1213,1214),(1213,1212,1215),(1216,1217,1218),(1217,1216,1219),(1220,1221,1222),(1221,1220,1223),(1224,1225,1226),(1225,1224,1227),(1228,1229,1230),(1229,1228,1231),(1232,1233,1234),(1233,1232,1235),(1236,1237,1238),(1237,1236,1239),(1240,1241,1242),(1241,1240,1243),(1244,1245,1246),(1245,1244,1247),(1248,1249,1250),(1249,1248,1251),(1252,1253,1254),(1253,1252,1255),(1256,1257,1258),(1257,1256,1259),(1260,1261,1262),(1261,1260,1263),(1264,1265,1266),(1265,1264,1267),(1268,1269,1270),(1269,1268,1271),(1272,1273,1274),(1273,1272,1275),(1276,1277,1278),(1277,1276,1279),(1280,1281,1282),(1281,1280,1283),(1284,1285,1286),(1285,1284,1287),(1288,1289,1290),(1289,1288,1291),(1292,1293,1294),(1293,1292,1295),(1296,1297,1298),(1297,1296,1299),(1300,1301,1302),(1301,1300,1303),(1304,1305,1306),(1305,1304,1307),(1308,1309,1310),(1309,1308,1311),(1312,1313,1314),(1313,1312,1315),(1316,1317,1318),(1317,1316,1319),(1320,1321,1322),(1321,1320,1323),(1324,1325,1326),(1325,1324,1327),(1328,1329,1330),(1329,1328,1331),(1332,1333,1334),(1333,1332,1335),(1336,1337,1338),(1337,1336,1339),(1340,1341,1342),(1341,1340,1343),(1344,1345,1346),(1345,1344,1347),(1348,1349,1350),(1349,1348,1351),(1352,1353,1354),(1353,1352,1355),(1356,1357,1358),(1357,1356,1359),(1360,1361,1362),(1361,1360,1363),(1364,1365,1366),(1365,1364,1367),(1368,1369,1370),(1369,1368,1371),(1372,1373,1374),(1373,1372,1375),(1375,1372,1376),(1376,1372,1377),(1377,1372,1378),(1378,1372,1379),(1378,1379,1380),(1380,1379,1381),(1379,1372,1382),(1382,1372,1383),(1383,1372,1384),(1383,1384,1385),(1383,1385,1386),(1386,1385,1387),(1387,1385,1388),(1387,1388,1389),(1389,1388,1390),(1390,1388,1391),(1390,1391,1392),(1392,1391,1393),(1393,1391,1394),(1394,1391,1395),(1395,1391,1396),(1395,1396,1397),(1395,1397,1398),(1398,1397,1399),(1398,1399,1400),(1401,1402,1381),(1402,1401,1403),(1403,1401,1404),(1404,1401,1405),(1404,1405,1406),(1406,1405,1407),(1406,1407,1408),(1406,1408,1409),(1409,1408,1410),(1409,1410,1411),(1411,1410,1394),(1394,1410,1412),(1394,1412,1413),(1394,1413,1393),(1411,1414,1409),(1414,1411,1415),(1414,1415,1416),(1416,1415,1417),(1417,1415,1418),(1418,1415,1419),(1419,1415,1420),(1419,1420,1421),(1421,1420,1422),(1421,1422,1423),(1423,1422,1424),(1425,1426,1427),(1426,1425,1428),(1428,1425,1429),(1428,1429,1430),(1428,1430,1380),(1428,1380,1431),(1431,1380,1381),(1431,1381,1402),(1428,1431,1432),(1428,1432,1433),(1428,1433,1434),(1434,1433,1435),(1434,1435,1436),(1436,1435,1437),(1436,1437,1438),(1436,1438,1418),(1418,1438,1439),(1418,1439,1417),(1440,1441,1442),(1441,1440,1443),(1444,1445,1446),(1445,1444,1447),(1448,1449,1450),(1449,1448,1451),(1452,1453,1454),(1453,1452,1455),(1456,1457,1458),(1457,1456,1459),(1460,1461,1462),(1461,1460,1463),(1464,1465,1466),(1465,1464,1467),(1468,1469,1470),(1469,1468,1471),(1472,1473,1474),(1473,1472,1475),(1476,1477,1478),(1477,1476,1479),(1480,1481,1482),(1481,1480,1483),(1484,1485,1486),(1485,1484,1487),(1488,1489,1490),(1489,1488,1491),(1492,1493,1494),(1493,1492,1495),(1496,1497,1498),(1497,1496,1499),(1500,1501,1502),(1501,1500,1503),(1504,1505,1506),(1505,1504,1507),(1508,1509,1510),(1509,1508,1511),(1512,1513,1514),(1513,1512,1515),(1516,1517,1518),(1517,1516,1519),(1520,1521,1522),(1521,1520,1523),(1524,1525,1526),(1525,1524,1527),(1528,1529,1530),(1529,1528,1531),(1532,1533,1534),(1533,1532,1535),(1536,1537,1538),(1537,1536,1539),(1540,1541,1542),(1541,1540,1543),(1544,1545,1546),(1545,1544,1547),(1548,1549,1550),(1549,1548,1551),(1552,1553,1554),(1553,1552,1555),(1556,1557,1558),(1557,1556,1559),(1560,1561,1562),(1561,1560,1563),(1564,1565,1566),(1565,1564,1567),(1568,1569,1570),(1569,1568,1571),(1572,1573,1574),(1573,1572,1575),(1576,1577,1578),(1577,1576,1579),(1580,1581,1582),(1581,1580,1583),(1584,1585,1586),(1585,1584,1587),(1588,1589,1590),(1589,1588,1591),(1592,1593,1594),(1593,1592,1595),(1596,1597,1598),(1597,1596,1599),(1600,1601,1602),(1601,1600,1603),(1604,1605,1606),(1605,1604,1607),(1608,1609,1610),(1609,1608,1611),(1612,1613,1614),(1613,1612,1615),(1616,1617,1618),(1617,1616,1619),(1620,1621,1622),(1621,1620,1623),(1624,1625,1626),(1625,1624,1627),(1628,1629,1630),(1629,1628,1631),(1632,1633,1634),(1633,1632,1635),(1636,1637,1638),(1637,1636,1639),(1640,1641,1642),(1641,1640,1643),(1644,1645,1646),(1645,1644,1647),(1648,1649,1650),(1649,1648,1651),(1652,1653,1654),(1653,1652,1655),(1656,1657,1658),(1657,1656,1659),(1660,1661,1662),(1661,1660,1663),(1664,1665,1666),(1665,1664,1667),(1668,1669,1670),(1669,1668,1671),(1672,1673,1674),(1673,1672,1675),(1676,1677,1678),(1677,1676,1679),(1680,1681,1682),(1681,1680,1683),(1684,1685,1686),(1685,1684,1687),(1688,1689,1690),(1689,1688,1691),(1692,1693,1694),(1693,1692,1695),(1696,1697,1698),(1697,1696,1699),(1700,1701,1702),(1701,1700,1703),(1704,1705,1706),(1705,1704,1707),(1708,1709,1710),(1709,1708,1711),(1712,1713,1714),(1713,1712,1715),(1715,1712,1716),(1716,1712,1717),(1717,1712,1718),(1717,1718,1719),(1717,1719,1720),(1720,1719,1721),(1720,1721,1722),(1718,1712,1723),(1723,1712,1724),(1725,1726,1727),(1726,1725,1728),(1726,1728,1729),(1729,1728,1730),(1729,1730,1731),(1730,1728,1732),(1722,1733,1734),(1733,1722,1721),(1734,1733,1735),(1734,1735,1736),(1734,1736,1737),(1737,1736,1731),(1731,1736,1729),(1737,1738,1734),(1738,1737,1739),(1738,1739,1740),(1740,1739,1741),(1740,1741,1742),(1742,1741,1743),(1742,1743,1744),(1744,1743,1745),(1745,1743,1746),(1747,1748,1749),(1748,1747,1750),(1748,1750,1751),(1748,1751,1752),(1748,1752,1720),(1748,1720,1753),(1753,1720,1722),(1748,1753,1754),(1748,1754,1755),(1748,1755,1756),(1756,1755,1757),(1757,1755,1758),(1757,1758,1759),(1757,1759,1760),(1760,1759,1761),(1760,1761,1762),(1760,1762,1763),(1763,1762,1764),(1763,1764,1746),(1763,1746,1743),(1763,1743,1765),(1763,1765,1766),(1766,1765,1767),(1766,1767,1768),(1768,1767,1769),(1768,1769,1770),(1770,1769,1771),(1770,1771,1772),(1773,1774,1775),(1774,1773,1776),(1777,1778,1779),(1778,1777,1780),(1781,1782,1783),(1782,1781,1784),(1785,1786,1787),(1786,1785,1788),(1789,1790,1791),(1790,1789,1792),(1793,1794,1795),(1794,1793,1796),(1797,1798,1799),(1798,1797,1800),(1801,1802,1803),(1802,1801,1804),(1805,1806,1807),(1806,1805,1808),(1809,1810,1811),(1810,1809,1812),(1813,1814,1815),(1814,1813,1816),(1817,1818,1819),(1818,1817,1820),(1821,1822,1823),(1822,1821,1824),(1825,1826,1827),(1826,1825,1828),(1829,1830,1831),(1830,1829,1832),(1833,1834,1835),(1834,1833,1836),(1837,1838,1839),(1838,1837,1840),(1841,1842,1843),(1842,1841,1844),(1845,1846,1847),(1846,1845,1848),(1849,1850,1851),(1850,1849,1852),(1853,1854,1855),(1854,1853,1856),(1857,1858,1859),(1858,1857,1860),(1861,1862,1863),(1862,1861,1864),(1865,1866,1867),(1866,1865,1868),(1869,1870,1871),(1870,1869,1872),(1873,1874,1875),(1874,1873,1876),(1877,1878,1879),(1878,1877,1880),(1881,1882,1883),(1882,1881,1884),(1885,1886,1887),(1886,1885,1888),(1889,1890,1891),(1890,1889,1892),(1893,1894,1895),(1894,1893,1896),(1897,1898,1899),(1898,1897,1900),(1901,1902,1903),(1902,1901,1904),(1905,1906,1907),(1906,1905,1908),(1909,1910,1911),(1910,1909,1912),(1913,1914,1915),(1914,1913,1916),(1917,1918,1919),(1918,1917,1920),(1921,1922,1923),(1922,1921,1924),(1925,1926,1927),(1926,1925,1928),(1929,1930,1931),(1930,1929,1932),(1933,1934,1935),(1934,1933,1936),(1937,1938,1939),(1938,1937,1940),(1941,1942,1943),(1942,1941,1944),(1945,1946,1947),(1946,1945,1948),(1949,1950,1951),(1950,1949,1952),(1953,1954,1955),(1954,1953,1956),(1957,1958,1959),(1958,1957,1960),(1961,1962,1963),(1962,1961,1964),(1965,1966,1967),(1966,1965,1968),(1969,1970,1971),(1970,1969,1972),(1973,1974,1975),(1974,1973,1976),(1977,1978,1979),(1978,1977,1980),(1981,1982,1983),(1982,1981,1984),(1985,1986,1987),(1986,1985,1988),(1989,1990,1991),(1990,1989,1992),(1993,1994,1995),(1994,1993,1996),(1997,1998,1999),(1998,1997,2000),(2001,2002,2003),(2002,2001,2004),(2005,2006,2007),(2006,2005,2008),(2009,2010,2011),(2010,2009,2012),(2013,2014,2015),(2014,2013,2016),(2017,2018,2019),(2018,2017,2020),(2018,2020,2021),(2021,2020,2022),(2023,2024,2025),(2024,2023,2026),(2026,2023,2027),(2026,2027,2017),(2026,2017,2028),(2028,2017,2019),(2026,2028,2029),(2030,2031,2032),(2031,2030,2033),(2033,2030,2034),(2034,2030,2035),(2035,2030,2036),(2036,2030,2037),(2036,2037,2020),(2020,2037,2038),(2020,2038,2022),(2022,2038,2039),(2037,2030,2040),(2040,2030,2041),(2039,2042,2022),(2042,2039,2043),(2042,2043,2044),(2045,2046,2047),(2046,2045,2048),(2046,2048,2044),(2046,2044,2049),(2049,2044,2043),(2046,2049,2050),(2046,2050,2051),(2052,2053,2054),(2053,2052,2055),(2056,2057,2058),(2057,2056,2059),(2060,2061,2062),(2061,2060,2063),(2064,2065,2066),(2065,2064,2067),(2068,2069,2070),(2069,2068,2071),(2072,2073,2074),(2073,2072,2075),(2076,2077,2078),(2077,2076,2079),(2080,2081,2082),(2081,2080,2083),(2084,2085,2086),(2085,2084,2087),(2088,2089,2090),(2089,2088,2091),(2092,2093,2094),(2093,2092,2095),(2096,2097,2098),(2097,2096,2099),(2100,2101,2102),(2101,2100,2103),(2104,2105,2106),(2105,2104,2107),(2108,2109,2110),(2109,2108,2111),(2112,2113,2114),(2113,2112,2115),(2116,2117,2118),(2117,2116,2119),(2120,2121,2122),(2121,2120,2123),(2124,2125,2126),(2125,2124,2127),(2128,2129,2130),(2129,2128,2131),(2132,2133,2134),(2133,2132,2135),(2136,2137,2138),(2137,2136,2139),(2140,2141,2142),(2141,2140,2143),(2144,2145,2146),(2145,2144,2147),(2148,2149,2150),(2149,2148,2151),(2152,2153,2154),(2153,2152,2155),(2156,2157,2158),(2157,2156,2159),(2160,2161,2162),(2161,2160,2163),(2164,2165,2166),(2165,2164,2167),(2168,2169,2170),(2169,2168,2171),(2172,2173,2174),(2173,2172,2175),(2176,2177,2178),(2177,2176,2179),(2180,2181,2182),(2181,2180,2183),(2184,2185,2186),(2185,2184,2187),(2188,2189,2190),(2189,2188,2191),(2192,2193,2194),(2193,2192,2195),(2193,2195,2196),(2196,2195,2197),(2197,2195,2198),(2197,2198,2199),(2199,2198,2200),(2200,2198,2201),(2200,2201,2202),(2202,2201,2203),(2202,2203,2204),(2204,2203,2205),(2204,2205,2206),(2206,2205,2207),(2206,2207,2208),(2208,2207,2209),(2209,2207,2210),(2209,2210,2211),(2211,2210,2212),(2211,2212,2213),(2213,2212,2214),(2212,2215,2216),(2215,2212,2217),(2217,2212,2218),(2217,2218,2219),(2219,2218,2220),(2221,2222,2223),(2222,2221,2224),(2224,2221,2225),(2224,2225,2226),(2226,2225,2227),(2227,2225,2228),(2227,2228,2229),(2229,2228,2230),(2229,2230,2231),(2229,2231,2232),(2232,2231,2214),(2232,2214,2233),(2233,2214,2212),(2233,2212,2216),(2232,2233,2234),(2232,2234,2235),(2236,2237,2238),(2239,2240,2241),(2240,2239,2242),(2242,2239,2243),(2242,2243,2244),(2244,2243,2192),(2244,2192,2245),(2245,2192,2246),(2246,2192,2194),(2246,2194,2247),(2246,2247,2248),(2246,2248,2249),(2249,2248,2250),(2249,2250,2251),(2251,2250,2252),(2251,2252,2253),(2253,2252,2254),(2253,2254,2255),(2253,2255,2256),(2256,2255,2257),(2256,2257,2258),(2258,2257,2259),(2258,2259,2260),(2260,2259,2261),(2260,2261,2262),(2260,2262,2263),(2263,2262,2264),(2263,2264,2265),(2265,2264,2266),(2265,2266,2267),(2265,2267,2268),(2268,2267,2237),(2268,2237,2236),(2268,2236,2269),(2269,2236,2270),(2269,2270,2271),(2272,2273,2274),(2273,2272,2275),(2276,2277,2278),(2277,2276,2279),(2280,2281,2282),(2281,2280,2283),(2284,2285,2286),(2285,2284,2287),(2288,2289,2290),(2289,2288,2291),(2292,2293,2294),(2293,2292,2295),(2296,2297,2298),(2297,2296,2299),(2300,2301,2302),(2301,2300,2303),(2304,2305,2306),(2305,2304,2307),(2308,2309,2310),(2309,2308,2311),(2312,2313,2314),(2313,2312,2315),(2316,2317,2318),(2317,2316,2319),(2320,2321,2322),(2321,2320,2323),(2324,2325,2326),(2325,2324,2327),(2328,2329,2330),(2329,2328,2331),(2332,2333,2334),(2333,2332,2335),(2336,2337,2338),(2337,2336,2339),(2340,2341,2342),(2341,2340,2343),(2344,2345,2346),(2345,2344,2347),(2348,2349,2350),(2349,2348,2351),(2352,2353,2354),(2353,2352,2355),(2356,2357,2358),(2357,2356,2359),(2360,2361,2362),(2361,2360,2363),(2364,2365,2366),(2365,2364,2367),(2368,2369,2370),(2369,2368,2371),(2372,2373,2374),(2373,2372,2375),(2376,2377,2378),(2377,2376,2379),(2380,2381,2382),(2381,2380,2383),(2384,2385,2386),(2385,2384,2387),(2388,2389,2390),(2389,2388,2391),(2392,2393,2394),(2393,2392,2395),(2396,2397,2398),(2397,2396,2399),(2400,2401,2402),(2401,2400,2403),(2404,2405,2406),(2405,2404,2407),(2408,2409,2410),(2409,2408,2411),(2412,2413,2414),(2413,2412,2415),(2416,2417,2418),(2417,2416,2419),(2420,2421,2422),(2421,2420,2423),(2424,2425,2426),(2425,2424,2427),(2428,2429,2430),(2429,2428,2431),(2432,2433,2434),(2433,2432,2435),(2436,2437,2438),(2437,2436,2439),(2440,2441,2442),(2441,2440,2443),(2444,2445,2446),(2445,2444,2447),(2448,2449,2450),(2449,2448,2451),(2452,2453,2454),(2453,2452,2455),(2456,2457,2458),(2457,2456,2459),(2460,2461,2462),(2461,2460,2463),(2464,2465,2466),(2465,2464,2467),(2468,2469,2470),(2469,2468,2471),(2472,2473,2474),(2473,2472,2475),(2476,2477,2478),(2477,2476,2479),(2480,2481,2482),(2481,2480,2483),(2484,2485,2486),(2485,2484,2487),(2488,2489,2490),(2489,2488,2491),(2492,2493,2494),(2493,2492,2495),(2496,2497,2498),(2497,2496,2499),(2500,2501,2502),(2501,2500,2503),(2504,2505,2506),(2505,2504,2507),(2508,2509,2510),(2509,2508,2511),(2512,2513,2514),(2513,2512,2515),(2516,2517,2518),(2517,2516,2519),(2520,2521,2522),(2521,2520,2523),(2524,2525,2526),(2525,2524,2527),(2528,2529,2530),(2529,2528,2531),(2532,2533,2534),(2533,2532,2535),(2536,2537,2538),(2537,2536,2539),(2540,2541,2542),(2541,2540,2543),(2544,2545,2546),(2545,2544,2547),(2548,2549,2550),(2549,2548,2551),(2552,2553,2554),(2553,2552,2555),(2556,2557,2558),(2557,2556,2559),(2560,2561,2562),(2561,2560,2563),(2564,2565,2566),(2565,2564,2567),(2568,2569,2570),(2569,2568,2571),(2572,2573,2574),(2573,2572,2575),(2576,2577,2578),(2577,2576,2579),(2580,2581,2582),(2581,2580,2583),(2584,2585,2586),(2585,2584,2587),(2588,2589,2590),(2589,2588,2591),(2592,2593,2594),(2593,2592,2595),(2593,2595,2596),(2596,2595,2597),(2597,2595,2598),(2597,2598,2599),(2599,2598,2600),(2600,2598,2601),(2600,2601,2602),(2602,2601,2603),(2602,2603,2604),(2604,2603,2605),(2604,2605,2606),(2606,2605,2607),(2606,2607,2608),(2608,2607,2609),(2609,2607,2610),(2609,2610,2611),(2611,2610,2612),(2611,2612,2613),(2613,2612,2614),(2612,2615,2616),(2615,2612,2617),(2615,2617,2618),(2618,2617,2619),(2620,2621,2622),(2621,2620,2623),(2623,2620,2624),(2624,2620,2625),(2624,2625,2626),(2626,2625,2627),(2626,2627,2628),(2628,2627,2629),(2628,2629,2630),(2628,2630,2631),(2631,2630,2614),(2631,2614,2632),(2632,2614,2612),(2632,2612,2633),(2633,2612,2616),(2631,2632,2634),(2631,2634,2635),(2636,2637,2638),(2639,2640,2641),(2640,2639,2642),(2642,2639,2643),(2642,2643,2644),(2644,2643,2592),(2644,2592,2645),(2645,2592,2646),(2646,2592,2594),(2646,2594,2647),(2646,2647,2648),(2646,2648,2649),(2649,2648,2650),(2649,2650,2651),(2651,2650,2652),(2651,2652,2653),(2653,2652,2654),(2653,2654,2655),(2653,2655,2656),(2656,2655,2657),(2656,2657,2658),(2658,2657,2659),(2658,2659,2660),(2660,2659,2661),(2660,2661,2662),(2660,2662,2663),(2663,2662,2664),(2663,2664,2665),(2665,2664,2666),(2665,2666,2667),(2665,2667,2668),(2668,2667,2637),(2668,2637,2636),(2668,2636,2669),(2669,2636,2670),(2669,2670,2671),(2672,2673,2674),(2673,2672,2675),(2676,2677,2678),(2677,2676,2679),(2680,2681,2682),(2681,2680,2683),(2684,2685,2686),(2685,2684,2687),(2688,2689,2690),(2689,2688,2691),(2692,2693,2694),(2693,2692,2695),(2696,2697,2698),(2697,2696,2699),(2700,2701,2702),(2701,2700,2703),(2704,2705,2706),(2705,2704,2707),(2708,2709,2710),(2709,2708,2711),(2712,2713,2714),(2713,2712,2715),(2716,2717,2718),(2717,2716,2719),(2720,2721,2722),(2721,2720,2723),(2724,2725,2726),(2725,2724,2727),(2728,2729,2730),(2729,2728,2731),(2732,2733,2734),(2733,2732,2735),(2736,2737,2738),(2737,2736,2739),(2740,2741,2742),(2741,2740,2743),(2744,2745,2746),(2745,2744,2747),(2748,2749,2750),(2749,2748,2751),(2752,2753,2754),(2753,2752,2755),(2756,2757,2758),(2757,2756,2759),(2760,2761,2762),(2761,2760,2763),(2764,2765,2766),(2765,2764,2767),(2768,2769,2770),(2769,2768,2771),(2772,2773,2774),(2773,2772,2775),(2776,2777,2778),(2777,2776,2779),(2780,2781,2782),(2781,2780,2783),(2784,2785,2786),(2785,2784,2787),(2788,2789,2790),(2789,2788,2791),(2792,2793,2794),(2793,2792,2795),(2796,2797,2798),(2797,2796,2799),(2800,2801,2802),(2801,2800,2803),(2804,2805,2806),(2805,2804,2807),(2808,2809,2810),(2809,2808,2811),(2812,2813,2814),(2813,2812,2815),(2816,2817,2818),(2817,2816,2819),(2820,2821,2822),(2821,2820,2823),(2824,2825,2826),(2825,2824,2827),(2828,2829,2830),(2829,2828,2831),(2832,2833,2834),(2833,2832,2835),(2836,2837,2838),(2837,2836,2839),(2840,2841,2842),(2841,2840,2843),(2844,2845,2846),(2845,2844,2847),(2848,2849,2850),(2849,2848,2851),(2852,2853,2854),(2853,2852,2855),(2856,2857,2858),(2857,2856,2859),(2860,2861,2862),(2861,2860,2863),(2864,2865,2866),(2865,2864,2867),(2868,2869,2870),(2869,2868,2871),(2872,2873,2874),(2873,2872,2875),(2876,2877,2878),(2877,2876,2879),(2880,2881,2882),(2881,2880,2883),(2884,2885,2886),(2885,2884,2887),(2888,2889,2890),(2889,2888,2891),(2892,2893,2894),(2893,2892,2895),(2896,2897,2898),(2897,2896,2899),(2900,2901,2902),(2901,2900,2903),(2904,2905,2906),(2905,2904,2907),(2908,2909,2910),(2909,2908,2911),(2912,2913,2914),(2913,2912,2915),(2916,2917,2918),(2917,2916,2919),(2920,2921,2922),(2921,2920,2923),(2924,2925,2926),(2925,2924,2927),(2928,2929,2930),(2929,2928,2931),(2932,2933,2934),(2933,2932,2935),(2936,2937,2938),(2937,2936,2939),(2940,2941,2942),(2941,2940,2943),(2944,2945,2946),(2945,2944,2947),(2948,2949,2950),(2949,2948,2951),(2952,2953,2954),(2953,2952,2955),(2956,2957,2958),(2957,2956,2959),(2960,2961,2962),(2961,2960,2963),(2964,2965,2966),(2965,2964,2967),(2968,2969,2970),(2969,2968,2971),(2972,2973,2974),(2973,2972,2975),(2976,2977,2978),(2977,2976,2979),(2980,2981,2982),(2981,2980,2983),(2984,2985,2986),(2985,2984,2987),(2988,2989,2990),(2989,2988,2991),(2992,2993,2994),(2993,2992,2995),(2996,2997,2998),(2997,2996,2999),(3000,3001,3002),(3001,3000,3003),(3004,3005,3006),(3005,3004,3007),(3008,3009,3010),(3009,3008,3011),(3012,3013,3014),(3013,3012,3015),(3016,3017,3018),(3017,3016,3019),(3020,3021,3022),(3021,3020,3023),(3024,3025,3026),(3025,3024,3027),(3028,3029,3030),(3029,3028,3031),(3032,3033,3034),(3033,3032,3035),(3036,3037,3038),(3037,3036,3039),(3040,3041,3042),(3041,3040,3043),(3044,3045,3046),(3045,3044,3047),(3048,3049,3050),(3049,3048,3051),(3052,3053,3054),(3053,3052,3055),(3056,3057,3058),(3057,3056,3059),(3060,3061,3062),(3061,3060,3063),(3064,3065,3066),(3065,3064,3067),(3068,3069,3070),(3069,3068,3071),(3072,3073,3074),(3073,3072,3075),(3076,3077,3078),(3077,3076,3079),(3080,3081,3082),(3081,3080,3083),(3084,3085,3086),(3085,3084,3087),(3088,3089,3090),(3089,3088,3091),(3092,3093,3094),(3093,3092,3095),(3096,3097,3098),(3097,3096,3099),(3100,3101,3102),(3101,3100,3103),(3104,3105,3106),(3105,3104,3107),(3108,3109,3110),(3109,3108,3111),(3112,3113,3114),(3113,3112,3115),(3116,3117,3118),(3117,3116,3119),(3120,3121,3122),(3121,3120,3123),(3124,3125,3126),(3125,3124,3127),(3128,3129,3130),(3129,3128,3131),(3132,3133,3134),(3133,3132,3135),(3136,3137,3138),(3137,3136,3139),(3140,3141,3142),(3141,3140,3143),(3144,3145,3146),(3145,3144,3147),(3148,3149,3150),(3149,3148,3151),(3152,3153,3154),(3153,3152,3155),(3156,3157,3158),(3157,3156,3159),(3160,3161,3162),(3161,3160,3163),(3163,3160,3164),(3164,3160,3165),(3165,3160,3166),(3165,3166,3167),(3166,3160,3168),(3168,3160,3169),(3169,3160,3170),(3169,3170,3171),(3169,3171,3172),(3172,3171,3173),(3172,3173,3174),(3174,3173,3175),(3174,3175,3176),(3174,3176,3177),(3178,3179,3166),(3179,3178,3180),(3180,3178,3181),(3180,3181,3182),(3180,3182,3183),(3183,3182,3184),(3184,3182,3185),(3184,3185,3186),(3186,3185,3187),(3186,3187,3188),(3188,3187,3189),(3188,3189,3190),(3191,3192,3193),(3192,3191,3194),(3194,3191,3195),(3194,3195,3196),(3194,3196,3167),(3194,3167,3197),(3197,3167,3179),(3179,3167,3166),(3194,3197,3198),(3194,3198,3199),(3194,3199,3200),(3200,3199,3201),(3201,3199,3202),(3201,3202,3203),(3203,3202,3204),(3203,3204,3205),(3203,3205,3206),(3206,3205,3207),(3206,3207,3208),(3209,3210,3211),(3210,3209,3212),(3213,3214,3215),(3214,3213,3216),(3217,3218,3219),(3218,3217,3220),(3221,3222,3223),(3222,3221,3224),(3225,3226,3227),(3226,3225,3228),(3229,3230,3231),(3230,3229,3232),(3233,3234,3235),(3234,3233,3236),(3237,3238,3239),(3238,3237,3240),(3240,3237,3241),(3241,3237,3242),(3242,3237,3243),(3243,3237,3244),(3243,3244,3245),(3245,3244,3246),(3244,3237,3247),(3247,3237,3248),(3247,3248,3249),(3249,3248,3250),(3249,3250,3251),(3251,3250,3252),(3251,3252,3253),(3253,3252,3254),(3253,3254,3255),(3255,3254,3256),(3256,3254,3257),(3246,3258,3259),(3258,3246,3260),(3258,3260,3261),(3261,3260,3262),(3261,3262,3263),(3263,3262,3264),(3263,3264,3265),(3265,3264,3266),(3265,3266,3267),(3267,3266,3268),(3267,3268,3269),(3267,3269,3270),(3271,3272,3273),(3272,3271,3274),(3274,3271,3275),(3274,3275,3245),(3274,3245,3259),(3259,3245,3246),(3274,3259,3276),(3274,3276,3277),(3274,3277,3278),(3278,3277,3279),(3279,3277,3280),(3279,3280,3281),(3281,3280,3282),(3281,3282,3283),(3283,3282,3284),(3284,3282,3285),(3286,3287,3288),(3287,3286,3289),(3287,3289,3290),(3290,3289,3291),(3290,3291,3292),(3292,3291,3293),(3292,3293,3294),(3292,3294,3295),(3295,3294,3296),(3296,3294,3297),(3297,3294,3298),(3297,3298,3299),(3299,3298,3300),(3299,3300,3301),(3301,3300,3302),(3301,3302,3303),(3303,3302,3304),(3304,3302,3305),(3304,3305,3306),(3306,3305,3307),(3306,3307,3308),(3308,3307,3309),(3308,3309,3310),(3310,3309,3311),(3311,3309,3312),(3311,3312,3313),(3313,3312,3314),(3313,3314,3315),(3315,3314,3316),(3316,3314,3317),(3316,3317,3318),(3318,3317,3319),(3319,3317,3320),(3319,3320,3321),(3321,3320,3322),(3319,3323,3318),(3324,3325,3326),(3325,3324,3327),(3327,3324,3328),(3327,3328,3329),(3329,3328,3330),(3329,3330,3331),(3331,3330,3332),(3331,3332,3333),(3333,3332,3334),(3334,3332,3335),(3334,3335,3336),(3336,3335,3337),(3336,3337,3338),(3338,3337,3339),(3339,3337,3340),(3339,3340,3341),(3337,3335,3342),(3342,3335,3343),(3339,3344,3345),(3344,3339,3341),(3345,3344,3346),(3345,3346,3347),(3292,3348,3349),(3348,3292,3295),(3349,3348,3350),(3349,3350,3351),(3349,3351,3352),(3352,3351,3353),(3352,3353,3354),(3352,3354,3355),(3355,3354,3356),(3355,3356,3357),(3357,3356,3358),(3357,3358,3359),(3359,3358,3360),(3359,3360,3361),(3361,3360,3362),(3361,3362,3363),(3361,3363,3364),(3364,3363,3365),(3364,3365,3339),(3339,3365,3338),(3366,3367,3368),(3367,3366,3369),(3367,3369,3370),(3370,3369,3371),(3370,3371,3372),(3372,3371,3373),(3372,3373,3374),(3372,3374,3375),(3375,3374,3376),(3376,3374,3377),(3377,3374,3378),(3377,3378,3379),(3379,3378,3380),(3379,3380,3381),(3381,3380,3382),(3381,3382,3383),(3383,3382,3384),(3384,3382,3385),(3384,3385,3386),(3386,3385,3387),(3386,3387,3388),(3388,3387,3389),(3388,3389,3390),(3390,3389,3391),(3391,3389,3392),(3391,3392,3393),(3393,3392,3394),(3393,3394,3395),(3395,3394,3396),(3396,3394,3397),(3396,3397,3398),(3398,3397,3399),(3399,3397,3400),(3399,3400,3401),(3401,3400,3402),(3399,3403,3398),(3404,3405,3406),(3405,3404,3407),(3405,3407,3408),(3405,3408,3409),(3409,3408,3410),(3409,3410,3411),(3411,3410,3412),(3411,3412,3413),(3413,3412,3414),(3414,3412,3415),(3414,3415,3416),(3416,3415,3417),(3416,3417,3418),(3418,3417,3419),(3419,3417,3420),(3417,3415,3421),(3421,3415,3422),(3419,3423,3424),(3423,3419,3425),(3425,3419,3420),(3424,3423,3426),(3424,3426,3427),(3372,3428,3429),(3428,3372,3375),(3429,3428,3430),(3429,3430,3431),(3429,3431,3432),(3432,3431,3433),(3432,3433,3434),(3432,3434,3435),(3435,3434,3436),(3435,3436,3437),(3437,3436,3438),(3437,3438,3439),(3439,3438,3440),(3439,3440,3441),(3441,3440,3442),(3441,3442,3443),(3441,3443,3444),(3444,3443,3445),(3444,3445,3419),(3419,3445,3418),(3446,3447,3448),(3447,3446,3449),(3449,3446,3450),(3450,3446,3451),(3451,3446,3452),(3451,3452,3453),(3452,3446,3454),(3451,3455,3456),(3455,3451,3453),(3456,3455,3457),(3456,3457,3458),(3456,3458,3459),(3460,3461,3462),(3461,3460,3463),(3463,3460,3464),(3464,3460,3465),(3464,3465,3466),(3465,3460,3467),(3467,3460,3468),(3469,3470,3458),(3470,3469,3466),(3466,3469,3464),(3471,3472,3473),(3472,3471,3474),(3472,3474,3475),(3472,3475,3476),(3472,3476,3459),(3472,3459,3477),(3477,3459,3478),(3478,3459,3458),(3478,3458,3470),(3472,3477,3479),(3472,3479,3480),(3481,3482,3483),(3482,3481,3484),(3484,3481,3485),(3485,3481,3486),(3486,3481,3487),(3487,3481,3488),(3487,3488,3489),(3489,3488,3490),(3488,3481,3491),(3491,3481,3492),(3492,3481,3493),(3492,3493,3494),(3492,3494,3495),(3495,3494,3496),(3496,3494,3497),(3496,3497,3498),(3498,3497,3499),(3499,3497,3500),(3499,3500,3501),(3501,3500,3502),(3502,3500,3503),(3503,3500,3504),(3504,3500,3505),(3504,3505,3506),(3506,3505,3507),(3506,3507,3508),(3508,3507,3509),(3508,3509,3510),(3510,3509,3511),(3512,3513,3514),(3513,3512,3515),(3515,3512,3516),(3515,3516,3517),(3517,3516,3518),(3517,3518,3503),(3503,3518,3519),(3503,3519,3520),(3503,3520,3502),(3490,3521,3522),(3521,3490,3488),(3522,3521,3514),(3522,3514,3523),(3523,3514,3513),(3523,3513,3524),(3523,3524,3525),(3526,3527,3528),(3527,3526,3529),(3527,3529,3525),(3527,3525,3530),(3530,3525,3524),(3527,3530,3531),(3532,3533,3534),(3533,3532,3535),(3535,3532,3536),(3535,3536,3537),(3535,3537,3538),(3538,3537,3539),(3539,3537,3487),(3539,3487,3489),(3535,3538,3540),(3535,3540,3541),(3542,3543,3544),(3543,3542,3545),(3543,3545,3546),(3546,3545,3547),(3547,3545,3548),(3548,3545,3549),(3548,3549,3550),(3549,3545,3551),(3551,3545,3552),(3552,3545,3553),(3552,3553,3554),(3554,3553,3555),(3554,3555,3556),(3556,3555,3557),(3557,3555,3558),(3557,3558,3559),(3559,3558,3560),(3561,3562,3563),(3562,3561,3564),(3564,3561,3565),(3564,3565,3560),(3564,3560,3558),(3564,3558,3566),(3564,3566,3567),(3567,3566,3568),(3567,3568,3569),(3569,3568,3570),(3569,3570,3571),(3550,3572,3573),(3572,3550,3574),(3572,3574,3575),(3575,3574,3576),(3575,3576,3577),(3577,3576,3578),(3577,3578,3579),(3579,3578,3580),(3580,3578,3563),(3580,3563,3581),(3581,3563,3562),(3581,3562,3582),(3581,3582,3583),(3583,3582,3584),(3584,3582,3585),(3586,3587,3588),(3587,3586,3589),(3587,3589,3590),(3587,3590,3591),(3587,3591,3592),(3587,3592,3573),(3573,3592,3548),(3573,3548,3550),(3587,3573,3593),(3587,3593,3594),(3587,3594,3595),(3595,3594,3596),(3596,3594,3597),(3596,3597,3598),(3596,3598,3599),(3599,3598,3600),(3599,3600,3601),(3599,3601,3602),(3602,3601,3603),(3602,3603,3585),(3602,3585,3582),(3602,3582,3604),(3602,3604,3605),(3605,3604,3606),(3606,3604,3607),(3606,3607,3608),(3608,3607,3609),(3610,3611,3612),(3611,3610,3613),(3613,3610,3614),(3614,3610,3615),(3615,3610,3616),(3616,3610,3617),(3617,3610,3618),(3618,3610,3619),(3618,3619,3620),(3620,3619,3621),(3621,3619,3622),(3621,3622,3623),(3621,3623,3624),(3624,3623,3625),(3624,3625,3626),(3626,3625,3627),(3626,3627,3628),(3629,3630,3617),(3630,3629,3631),(3631,3629,3632),(3631,3632,3633),(3633,3632,3634),(3633,3634,3635),(3633,3635,3636),(3636,3635,3637),(3636,3637,3638),(3638,3637,3639),(3638,3639,3640),(3640,3639,3641),(3642,3643,3644),(3643,3642,3645),(3643,3645,3646),(3643,3646,3647),(3643,3647,3648),(3648,3647,3616),(3648,3616,3617),(3648,3617,3630),(3643,3648,3649),(3643,3649,3650),(3643,3650,3651),(3651,3650,3652),(3652,3650,3653),(3652,3653,3654),(3654,3653,3655),(3654,3655,3656),(3656,3655,3657),(3657,3655,3658),(3659,3660,3661),(3660,3659,3662),(3662,3659,3663),(3663,3659,3664),(3664,3659,3665),(3664,3665,3666),(3665,3659,3667),(3667,3659,3668),(3668,3659,3669),(3668,3669,3670),(3670,3669,3671),(3670,3671,3672),(3672,3671,3673),(3672,3673,3674),(3674,3673,3675),(3674,3675,3676),(3676,3675,3677),(3676,3677,3678),(3678,3677,3679),(3679,3677,3680),(3679,3680,3681),(3681,3680,3682),(3682,3680,3683),(3683,3680,3684),(3683,3684,3685),(3685,3684,3686),(3685,3686,3687),(3687,3686,3688),(3688,3686,3689),(3690,3691,3692),(3691,3690,3693),(3691,3693,3694),(3691,3694,3695),(3691,3695,3666),(3666,3695,3664),(3691,3666,3696),(3691,3696,3697),(3691,3697,3698),(3698,3697,3699),(3698,3699,3700),(3700,3699,3701),(3700,3701,3702),(3702,3701,3703),(3702,3703,3704),(3702,3704,3705),(3705,3704,3706),(3705,3706,3707),(3707,3706,3708),(3707,3708,3709),(3707,3709,3682),(3682,3709,3681),(3710,3711,3712),(3711,3710,3713),(3713,3710,3714),(3714,3710,3715),(3715,3710,3716),(3716,3710,3717),(3716,3717,3718),(3716,3718,3719),(3719,3718,3720),(3717,3710,3721),(3721,3710,3722),(3723,3724,3725),(3724,3723,3726),(3726,3723,3727),(3726,3727,3728),(3726,3728,3719),(3726,3719,3729),(3729,3719,3720),(3726,3729,3730),(3726,3730,3731),(3726,3731,3732),(3732,3731,3733),(3733,3731,3734),(3734,3731,3735),(3734,3735,3736),(3736,3735,3737),(3736,3737,3738),(3738,3737,3739),(3740,3741,3742),(3741,3740,3743),(3741,3743,3744),(3744,3743,3745),(3744,3745,3746),(3746,3745,3747),(3746,3747,3748),(3746,3748,3749),(3749,3748,3750),(3750,3748,3751),(3750,3751,3752),(3752,3751,3753),(3753,3751,3754),(3753,3754,3755),(3755,3754,3756),(3756,3754,3757),(3756,3757,3758),(3758,3757,3759),(3758,3759,3760),(3760,3759,3761),(3760,3761,3762),(3762,3761,3763),(3762,3763,3764),(3764,3763,3765),(3765,3763,3766),(3765,3766,3767),(3767,3766,3768),(3767,3768,3769),(3769,3768,3770),(3769,3770,3771),(3771,3770,3772),(3772,3770,3773),(3772,3773,3774),(3774,3773,3775),(3775,3773,3776),(3776,3773,3777),(3777,3773,3778),(3777,3778,3779),(3779,3778,3780),(3780,3778,3781),(3780,3781,3782),(3782,3781,3783),(3746,3784,3785),(3784,3746,3749),(3785,3784,3786),(3785,3786,3787),(3785,3787,3788),(3788,3787,3789),(3788,3789,3790),(3788,3790,3791),(3791,3790,3792),(3791,3792,3793),(3793,3792,3794),(3793,3794,3795),(3795,3794,3796),(3795,3796,3797),(3795,3797,3798),(3798,3797,3799),(3799,3797,3800),(3799,3800,3801),(3801,3800,3802),(3801,3802,3803),(3803,3802,3804),(3803,3804,3805),(3805,3804,3806),(3805,3806,3807),(3807,3806,3808),(3807,3808,3776),(3776,3808,3809),(3776,3809,3775),(3810,3811,3812),(3811,3810,3813),(3813,3810,3814),(3814,3810,3815),(3815,3810,3816),(3816,3810,3817),(3816,3817,3818),(3817,3810,3819),(3819,3810,3820),(3820,3810,3821),(3820,3821,3822),(3820,3822,3823),(3823,3822,3824),(3824,3822,3825),(3824,3825,3826),(3824,3826,3827),(3827,3826,3828),(3828,3826,3829),(3830,3831,3832),(3831,3830,3833),(3833,3830,3834),(3833,3834,3835),(3835,3834,3836),(3835,3836,3837),(3837,3836,3838),(3837,3838,3839),(3839,3838,3840),(3839,3840,3841),(3841,3840,3842),(3843,3844,3845),(3844,3843,3846),(3844,3846,3847),(3844,3847,3818),(3844,3818,3848),(3848,3818,3832),(3832,3818,3817),(3848,3832,3831),(3844,3848,3849),(3844,3849,3850),(3844,3850,3851),(3851,3850,3852),(3852,3850,3853),(3852,3853,3854),(3854,3853,3855),(3854,3855,3856),(3856,3855,3857),(3857,3855,3858),(3859,3860,3861),(3860,3859,3862),(3862,3859,3863),(3863,3859,3864),(3864,3859,3865),(3864,3865,3866),(3865,3859,3867),(3864,3868,3869),(3868,3864,3866),(3869,3868,3870),(3869,3870,3871),(3872,3873,3874),(3873,3872,3875),(3873,3875,3876),(3876,3875,3877),(3876,3877,3878),(3877,3875,3879),(3879,3875,3880),(3881,3882,3871),(3882,3881,3878),(3878,3881,3876),(3883,3884,3885),(3884,3883,3886),(3886,3883,3887),(3886,3887,3888),(3886,3888,3889),(3886,3889,3890),(3890,3889,3869),(3890,3869,3891),(3891,3869,3871),(3891,3871,3882),(3886,3890,3892),(3886,3892,3893),(3894,3895,3896),(3895,3894,3897),(3897,3894,3898),(3898,3894,3899),(3899,3894,3900),(3899,3900,3901),(3901,3900,3902),(3902,3900,3903),(3900,3894,3904),(3904,3894,3905),(3905,3894,3906),(3905,3906,3907),(3905,3907,3908),(3908,3907,3909),(3908,3909,3910),(3910,3909,3911),(3910,3911,3912),(3910,3912,3913),(3903,3914,3902),(3914,3903,3915),(3914,3915,3916),(3916,3915,3917),(3916,3917,3918),(3918,3917,3919),(3918,3919,3920),(3920,3919,3921),(3920,3921,3922),(3922,3921,3923),(3922,3923,3924),(3925,3926,3927),(3926,3925,3928),(3928,3925,3929),(3928,3929,3930),(3928,3930,3901),(3928,3901,3931),(3931,3901,3902),(3928,3931,3932),(3928,3932,3933),(3933,3932,3934),(3933,3934,3935),(3935,3934,3936),(3935,3936,3937),(3935,3937,3938),(3938,3937,3939),(3938,3939,3940),(3940,3939,3941),(3941,3939,3942)),$); +#811=IFCCARTESIANPOINTLIST3D(((-649.364,207.683,50.),(-644.419,188.936,50.),(-626.045,272.817,50.),(-644.419,124.493,50.),(-619.101,259.655,50.),(-623.715,283.277,50.),(-627.494,290.034,50.),(-603.16,294.595,50.),(-627.494,294.595,50.),(-624.66,287.838,50.),(-610.236,281.334,50.),(-606.847,286.592,50.),(-603.16,290.034,50.),(-638.964,105.405,50.),(-662.065,109.966,50.),(-662.065,105.405,50.),(-659.359,111.972,50.),(-657.718,114.611,50.),(-656.887,118.56,50.),(-656.61,124.493,50.),(-643.354,114.611,50.),(-656.61,188.936,50.),(-641.723,111.972,50.),(-638.964,109.966,50.),(-686.02,264.886,50.),(-676.266,278.593,50.),(-676.841,283.615,50.),(-674.542,272.986,50.),(-696.739,287.373,50.),(-700.,294.595,50.),(-700.,290.034,50.),(-673.093,294.595,50.),(-693.948,283.446,50.),(-675.904,287.838,50.),(-673.093,290.034,50.),(-644.419,188.936,30.),(-644.419,124.493,50.),(-644.419,124.493,30.),(-644.419,188.936,50.),(-644.419,124.493,30.),(-643.354,114.611,50.),(-643.354,114.611,30.),(-644.419,124.493,50.),(-643.354,114.611,30.),(-641.723,111.972,50.),(-641.723,111.972,30.),(-643.354,114.611,50.),(-641.723,111.972,50.),(-638.964,109.966,30.),(-641.723,111.972,30.),(-638.964,109.966,50.),(-638.964,109.966,30.),(-638.964,105.405,50.),(-638.964,105.405,30.),(-638.964,109.966,50.),(-638.964,105.405,50.),(-662.065,105.405,30.),(-638.964,105.405,30.),(-662.065,105.405,50.),(-662.065,105.405,50.),(-662.065,109.966,30.),(-662.065,105.405,30.),(-662.065,109.966,50.),(-662.065,109.966,50.),(-659.359,111.972,30.),(-662.065,109.966,30.),(-659.359,111.972,50.),(-659.359,111.972,50.),(-657.718,114.611,30.),(-659.359,111.972,30.),(-657.718,114.611,50.),(-657.718,114.611,50.),(-656.887,118.56,30.),(-657.718,114.611,30.),(-656.887,118.56,50.),(-656.887,118.56,50.),(-656.61,124.493,30.),(-656.887,118.56,30.),(-656.61,124.493,50.),(-656.61,124.493,50.),(-656.61,188.936,30.),(-656.61,124.493,30.),(-656.61,188.936,50.),(-656.61,188.936,50.),(-686.02,264.886,30.),(-656.61,188.936,30.),(-686.02,264.886,50.),(-686.02,264.886,50.),(-693.948,283.446,30.),(-686.02,264.886,30.),(-693.948,283.446,50.),(-693.948,283.446,50.),(-696.739,287.373,30.),(-693.948,283.446,30.),(-696.739,287.373,50.),(-696.739,287.373,30.),(-700.,290.034,50.),(-700.,290.034,30.),(-696.739,287.373,50.),(-700.,290.034,50.),(-700.,294.595,30.),(-700.,290.034,30.),(-700.,294.595,50.),(-700.,294.595,30.),(-673.093,294.595,50.),(-673.093,294.595,30.),(-700.,294.595,50.),(-673.093,294.595,30.),(-673.093,290.034,50.),(-673.093,290.034,30.),(-673.093,294.595,50.),(-673.093,290.034,50.),(-675.904,287.838,30.),(-673.093,290.034,30.),(-675.904,287.838,50.),(-675.904,287.838,30.),(-676.841,283.615,50.),(-676.841,283.615,30.),(-675.904,287.838,50.),(-676.841,283.615,30.),(-676.266,278.593,50.),(-676.266,278.593,30.),(-676.841,283.615,50.),(-676.266,278.593,30.),(-674.542,272.986,50.),(-674.542,272.986,30.),(-676.266,278.593,50.),(-674.542,272.986,30.),(-649.364,207.683,50.),(-649.364,207.683,30.),(-674.542,272.986,50.),(-649.364,207.683,50.),(-626.045,272.817,30.),(-649.364,207.683,30.),(-626.045,272.817,50.),(-626.045,272.817,50.),(-623.715,283.277,30.),(-626.045,272.817,30.),(-623.715,283.277,50.),(-623.715,283.277,50.),(-624.66,287.838,30.),(-623.715,283.277,30.),(-624.66,287.838,50.),(-624.66,287.838,50.),(-627.494,290.034,30.),(-624.66,287.838,30.),(-627.494,290.034,50.),(-627.494,290.034,50.),(-627.494,294.595,30.),(-627.494,290.034,30.),(-627.494,294.595,50.),(-627.494,294.595,50.),(-603.16,294.595,30.),(-627.494,294.595,30.),(-603.16,294.595,50.),(-603.16,294.595,30.),(-603.16,290.034,50.),(-603.16,290.034,30.),(-603.16,294.595,50.),(-603.16,290.034,50.),(-606.847,286.592,30.),(-603.16,290.034,30.),(-606.847,286.592,50.),(-606.847,286.592,30.),(-610.236,281.334,50.),(-610.236,281.334,30.),(-606.847,286.592,50.),(-610.236,281.334,30.),(-619.101,259.655,50.),(-619.101,259.655,30.),(-610.236,281.334,50.),(-619.101,259.655,30.),(-644.419,188.936,50.),(-644.419,188.936,30.),(-619.101,259.655,50.),(-576.137,193.919,30.),(-576.137,123.818,50.),(-576.137,123.818,30.),(-576.137,193.919,50.),(-576.137,123.818,50.),(-517.147,123.818,30.),(-576.137,123.818,30.),(-517.147,123.818,50.),(-517.147,123.818,30.),(-512.075,125.979,50.),(-512.075,125.979,30.),(-517.147,123.818,50.),(-512.075,125.979,50.),(-510.764,129.222,30.),(-512.075,125.979,30.),(-510.764,129.222,50.),(-510.764,129.222,50.),(-509.816,134.628,30.),(-510.764,129.222,30.),(-509.816,134.628,50.),(-509.816,134.628,50.),(-507.429,134.628,30.),(-509.816,134.628,30.),(-507.429,134.628,50.),(-507.429,134.628,30.),(-507.429,94.595,50.),(-507.429,94.595,30.),(-507.429,134.628,50.),(-507.429,94.595,50.),(-509.816,94.595,30.),(-507.429,94.595,30.),(-509.816,94.595,50.),(-509.816,94.595,50.),(-510.753,99.958,30.),(-509.816,94.595,30.),(-510.753,99.958,50.),(-510.753,99.958,50.),(-512.032,103.209,30.),(-510.753,99.958,30.),(-512.032,103.209,50.),(-512.032,103.209,30.),(-514.014,104.856,50.),(-514.014,104.856,30.),(-512.032,103.209,50.),(-514.014,104.856,50.),(-517.061,105.405,30.),(-514.014,104.856,30.),(-517.061,105.405,50.),(-517.061,105.405,30.),(-593.783,105.405,50.),(-593.783,105.405,30.),(-517.061,105.405,50.),(-593.783,105.405,50.),(-593.783,109.966,30.),(-593.783,105.405,30.),(-593.783,109.966,50.),(-593.783,109.966,30.),(-591.023,111.972,50.),(-591.023,111.972,30.),(-593.783,109.966,50.),(-591.023,111.972,50.),(-589.393,114.611,30.),(-591.023,111.972,30.),(-589.393,114.611,50.),(-589.393,114.611,50.),(-588.327,124.493,30.),(-589.393,114.611,30.),(-588.327,124.493,50.),(-588.327,124.493,50.),(-588.327,275.507,30.),(-588.327,124.493,30.),(-588.327,275.507,50.),(-588.327,275.507,50.),(-588.604,281.546,30.),(-588.327,275.507,30.),(-588.604,281.546,50.),(-588.604,281.546,50.),(-589.436,285.473,30.),(-588.604,281.546,30.),(-589.436,285.473,50.),(-589.436,285.473,50.),(-591.077,288.049,30.),(-589.436,285.473,30.),(-591.077,288.049,50.),(-591.077,288.049,50.),(-593.783,290.034,30.),(-591.077,288.049,30.),(-593.783,290.034,50.),(-593.783,290.034,50.),(-593.783,294.595,30.),(-593.783,290.034,30.),(-593.783,294.595,50.),(-593.783,294.595,50.),(-517.658,294.595,30.),(-593.783,294.595,30.),(-517.658,294.595,50.),(-517.658,294.595,30.),(-514.611,295.144,50.),(-514.611,295.144,30.),(-517.658,294.595,50.),(-514.611,295.144,50.),(-512.629,296.791,30.),(-514.611,295.144,30.),(-512.629,296.791,50.),(-512.629,296.791,50.),(-511.329,300.042,30.),(-512.629,296.791,30.),(-511.329,300.042,50.),(-511.329,300.042,50.),(-510.327,305.405,30.),(-511.329,300.042,30.),(-510.327,305.405,50.),(-510.327,305.405,50.),(-508.025,305.405,30.),(-510.327,305.405,30.),(-508.025,305.405,50.),(-508.025,305.405,30.),(-508.025,265.372,50.),(-508.025,265.372,30.),(-508.025,305.405,50.),(-508.025,265.372,50.),(-510.327,265.372,30.),(-508.025,265.372,30.),(-510.327,265.372,50.),(-510.327,265.372,50.),(-511.329,270.778,30.),(-510.327,265.372,30.),(-511.329,270.778,50.),(-511.329,270.778,50.),(-512.629,274.021,30.),(-511.329,270.778,30.),(-512.629,274.021,50.),(-512.629,274.021,50.),(-514.611,275.642,30.),(-512.629,274.021,30.),(-514.611,275.642,50.),(-514.611,275.642,30.),(-517.658,276.182,50.),(-517.658,276.182,30.),(-514.611,275.642,50.),(-517.658,276.182,50.),(-576.137,276.182,30.),(-517.658,276.182,30.),(-576.137,276.182,50.),(-576.137,276.182,30.),(-576.137,212.331,50.),(-576.137,212.331,30.),(-576.137,276.182,50.),(-576.137,212.331,50.),(-538.884,212.331,30.),(-576.137,212.331,30.),(-538.884,212.331,50.),(-538.884,212.331,50.),(-535.837,212.88,30.),(-538.884,212.331,30.),(-535.837,212.88,50.),(-535.837,212.88,30.),(-533.855,214.527,50.),(-533.855,214.527,30.),(-535.837,212.88,50.),(-533.855,214.527,50.),(-532.555,217.779,30.),(-533.855,214.527,30.),(-532.555,217.779,50.),(-532.555,217.779,50.),(-531.553,223.142,30.),(-532.555,217.779,30.),(-531.553,223.142,50.),(-531.553,223.142,50.),(-529.252,223.142,30.),(-531.553,223.142,30.),(-529.252,223.142,50.),(-529.252,223.142,30.),(-529.252,183.108,50.),(-529.252,183.108,30.),(-529.252,223.142,50.),(-529.252,183.108,30.),(-531.553,183.108,50.),(-531.553,183.108,30.),(-529.252,183.108,50.),(-531.553,183.108,50.),(-532.566,188.514,30.),(-531.553,183.108,30.),(-532.566,188.514,50.),(-532.566,188.514,50.),(-533.898,191.757,30.),(-532.566,188.514,30.),(-533.898,191.757,50.),(-533.898,191.757,30.),(-538.884,193.919,50.),(-538.884,193.919,30.),(-533.898,191.757,50.),(-538.884,193.919,30.),(-576.137,193.919,50.),(-576.137,193.919,30.),(-538.884,193.919,50.),(-439.002,142.736,50.),(-434.873,184.734,50.),(-435.566,200.,50.),(-431.73,127.703,50.),(-432.795,170.693,50.),(-429.332,157.876,50.),(-423.322,116.174,50.),(-424.484,146.284,50.),(-417.616,135.198,50.),(-413.7,107.939,50.),(-409.715,127.28,50.),(-402.863,102.998,50.),(-400.78,122.53,50.),(-390.812,101.351,50.),(-390.812,120.946,50.),(-380.843,122.53,50.),(-382.619,102.053,50.),(-375.004,104.16,50.),(-371.908,127.28,50.),(-367.967,107.67,50.),(-364.007,135.198,50.),(-361.508,112.584,50.),(-357.139,146.284,50.),(-355.628,118.903,50.),(-352.291,157.813,50.),(-350.325,126.626,50.),(-348.828,170.439,50.),(-345.6,135.753,50.),(-346.75,184.164,50.),(-346.057,198.986,50.),(-447.314,178.885,50.),(-447.847,214.569,50.),(-448.353,200.,50.),(-446.328,228.378,50.),(-444.197,159.797,50.),(-443.798,241.427,50.),(-440.255,253.716,50.),(-435.518,265.446,50.),(-434.873,215.266,50.),(-429.918,275.465,50.),(-432.795,229.307,50.),(-429.332,242.124,50.),(-423.456,283.773,50.),(-424.484,253.716,50.),(-417.627,264.802,50.),(-416.13,290.372,50.),(-409.758,272.72,50.),(-404.515,296.41,50.),(-400.876,277.47,50.),(-390.982,298.649,50.),(-390.982,279.054,50.),(-380.971,277.344,50.),(-378.856,297.002,50.),(-371.994,272.551,50.),(-367.966,292.061,50.),(-364.05,264.675,50.),(-358.312,283.826,50.),(-357.139,253.716,50.),(-349.893,272.297,50.),(-352.291,242.251,50.),(-348.828,229.307,50.),(-342.621,257.242,50.),(-346.75,214.886,50.),(-341.454,146.284,50.),(-337.426,239.949,50.),(-337.874,158.488,50.),(-335.316,171.284,50.),(-334.309,220.418,50.),(-333.782,184.671,50.),(-333.27,198.649,50.),(-390.982,298.649,50.),(-378.856,297.002,30.),(-390.982,298.649,30.),(-378.856,297.002,50.),(-378.856,297.002,50.),(-367.966,292.061,30.),(-378.856,297.002,30.),(-367.966,292.061,50.),(-367.966,292.061,50.),(-358.312,283.826,30.),(-367.966,292.061,30.),(-358.312,283.826,50.),(-358.312,283.826,30.),(-349.893,272.297,50.),(-349.893,272.297,30.),(-358.312,283.826,50.),(-349.893,272.297,30.),(-342.621,257.242,50.),(-342.621,257.242,30.),(-349.893,272.297,50.),(-342.621,257.242,30.),(-337.426,239.949,50.),(-337.426,239.949,30.),(-342.621,257.242,50.),(-337.426,239.949,30.),(-334.309,220.418,50.),(-334.309,220.418,30.),(-337.426,239.949,50.),(-334.309,220.418,30.),(-333.27,198.649,50.),(-333.27,198.649,30.),(-334.309,220.418,50.),(-333.27,198.649,30.),(-333.782,184.671,50.),(-333.782,184.671,30.),(-333.27,198.649,50.),(-333.782,184.671,30.),(-335.316,171.284,50.),(-335.316,171.284,30.),(-333.782,184.671,50.),(-335.316,171.284,30.),(-337.874,158.488,50.),(-337.874,158.488,30.),(-335.316,171.284,50.),(-337.874,158.488,30.),(-341.454,146.284,50.),(-341.454,146.284,30.),(-337.874,158.488,50.),(-341.454,146.284,30.),(-345.6,135.753,50.),(-345.6,135.753,30.),(-341.454,146.284,50.),(-345.6,135.753,30.),(-350.325,126.626,50.),(-350.325,126.626,30.),(-345.6,135.753,50.),(-350.325,126.626,30.),(-355.628,118.903,50.),(-355.628,118.903,30.),(-350.325,126.626,50.),(-355.628,118.903,30.),(-361.508,112.584,50.),(-361.508,112.584,30.),(-355.628,118.903,50.),(-361.508,112.584,50.),(-367.967,107.67,30.),(-361.508,112.584,30.),(-367.967,107.67,50.),(-367.967,107.67,50.),(-375.004,104.16,30.),(-367.967,107.67,30.),(-375.004,104.16,50.),(-375.004,104.16,50.),(-382.619,102.053,30.),(-375.004,104.16,30.),(-382.619,102.053,50.),(-382.619,102.053,50.),(-390.812,101.351,30.),(-382.619,102.053,30.),(-390.812,101.351,50.),(-390.812,101.351,50.),(-402.863,102.998,30.),(-390.812,101.351,30.),(-402.863,102.998,50.),(-402.863,102.998,30.),(-413.7,107.939,50.),(-413.7,107.939,30.),(-402.863,102.998,50.),(-413.7,107.939,30.),(-423.322,116.174,50.),(-423.322,116.174,30.),(-413.7,107.939,50.),(-423.322,116.174,50.),(-431.73,127.703,30.),(-423.322,116.174,30.),(-431.73,127.703,50.),(-431.73,127.703,50.),(-439.002,142.736,30.),(-431.73,127.703,30.),(-439.002,142.736,50.),(-439.002,142.736,50.),(-444.197,159.797,30.),(-439.002,142.736,30.),(-444.197,159.797,50.),(-444.197,159.797,50.),(-447.314,178.885,30.),(-444.197,159.797,30.),(-447.314,178.885,50.),(-447.314,178.885,50.),(-448.353,200.,30.),(-447.314,178.885,30.),(-448.353,200.,50.),(-448.353,200.,50.),(-447.847,214.569,30.),(-448.353,200.,30.),(-447.847,214.569,50.),(-447.847,214.569,50.),(-446.328,228.378,30.),(-447.847,214.569,30.),(-446.328,228.378,50.),(-446.328,228.378,50.),(-443.798,241.427,30.),(-446.328,228.378,30.),(-443.798,241.427,50.),(-443.798,241.427,50.),(-440.255,253.716,30.),(-443.798,241.427,30.),(-440.255,253.716,50.),(-440.255,253.716,50.),(-435.518,265.446,30.),(-440.255,253.716,30.),(-435.518,265.446,50.),(-435.518,265.446,50.),(-429.918,275.465,30.),(-435.518,265.446,30.),(-429.918,275.465,50.),(-429.918,275.465,50.),(-423.456,283.773,30.),(-429.918,275.465,30.),(-423.456,283.773,50.),(-423.456,283.773,30.),(-416.13,290.372,50.),(-416.13,290.372,30.),(-423.456,283.773,50.),(-416.13,290.372,30.),(-404.515,296.41,50.),(-404.515,296.41,30.),(-416.13,290.372,50.),(-404.515,296.41,30.),(-390.982,298.649,50.),(-390.982,298.649,30.),(-404.515,296.41,50.),(-390.982,279.054,50.),(-400.876,277.47,30.),(-390.982,279.054,30.),(-400.876,277.47,50.),(-400.876,277.47,50.),(-409.758,272.72,30.),(-400.876,277.47,30.),(-409.758,272.72,50.),(-409.758,272.72,30.),(-417.627,264.802,50.),(-417.627,264.802,30.),(-409.758,272.72,50.),(-417.627,264.802,30.),(-424.484,253.716,50.),(-424.484,253.716,30.),(-417.627,264.802,50.),(-424.484,253.716,30.),(-429.332,242.124,50.),(-429.332,242.124,30.),(-424.484,253.716,50.),(-429.332,242.124,30.),(-432.795,229.307,50.),(-432.795,229.307,30.),(-429.332,242.124,50.),(-432.795,229.307,30.),(-434.873,215.266,50.),(-434.873,215.266,30.),(-432.795,229.307,50.),(-434.873,215.266,30.),(-435.566,200.,50.),(-435.566,200.,30.),(-434.873,215.266,50.),(-435.566,200.,30.),(-434.873,184.734,50.),(-434.873,184.734,30.),(-435.566,200.,50.),(-434.873,184.734,30.),(-432.795,170.693,50.),(-432.795,170.693,30.),(-434.873,184.734,50.),(-432.795,170.693,30.),(-429.332,157.876,50.),(-429.332,157.876,30.),(-432.795,170.693,50.),(-429.332,157.876,30.),(-424.484,146.284,50.),(-424.484,146.284,30.),(-429.332,157.876,50.),(-424.484,146.284,30.),(-417.616,135.198,50.),(-417.616,135.198,30.),(-424.484,146.284,50.),(-417.616,135.198,30.),(-409.715,127.28,50.),(-409.715,127.28,30.),(-417.616,135.198,50.),(-409.715,127.28,50.),(-400.78,122.53,30.),(-409.715,127.28,30.),(-400.78,122.53,50.),(-400.78,122.53,50.),(-390.812,120.946,30.),(-400.78,122.53,30.),(-390.812,120.946,50.),(-390.812,120.946,30.),(-380.843,122.53,50.),(-380.843,122.53,30.),(-390.812,120.946,50.),(-380.843,122.53,30.),(-371.908,127.28,50.),(-371.908,127.28,30.),(-380.843,122.53,50.),(-371.908,127.28,50.),(-364.007,135.198,30.),(-371.908,127.28,30.),(-364.007,135.198,50.),(-364.007,135.198,50.),(-357.139,146.284,30.),(-364.007,135.198,30.),(-357.139,146.284,50.),(-357.139,146.284,50.),(-352.291,157.813,30.),(-357.139,146.284,30.),(-352.291,157.813,50.),(-352.291,157.813,50.),(-348.828,170.439,30.),(-352.291,157.813,30.),(-348.828,170.439,50.),(-348.828,170.439,50.),(-346.75,184.164,30.),(-348.828,170.439,30.),(-346.75,184.164,50.),(-346.75,184.164,50.),(-346.057,198.986,30.),(-346.75,184.164,30.),(-346.057,198.986,50.),(-346.057,198.986,50.),(-346.75,214.886,30.),(-346.057,198.986,30.),(-346.75,214.886,50.),(-346.75,214.886,50.),(-348.828,229.307,30.),(-346.75,214.886,30.),(-348.828,229.307,50.),(-348.828,229.307,50.),(-352.291,242.251,30.),(-348.828,229.307,30.),(-352.291,242.251,50.),(-352.291,242.251,50.),(-357.139,253.716,30.),(-352.291,242.251,30.),(-357.139,253.716,50.),(-357.139,253.716,50.),(-364.05,264.675,30.),(-357.139,253.716,30.),(-364.05,264.675,50.),(-364.05,264.675,30.),(-371.994,272.551,50.),(-371.994,272.551,30.),(-364.05,264.675,50.),(-371.994,272.551,30.),(-380.971,277.344,50.),(-380.971,277.344,30.),(-371.994,272.551,50.),(-380.971,277.344,50.),(-390.982,279.054,30.),(-380.971,277.344,30.),(-390.982,279.054,50.),(-239.244,105.405,50.),(-315.113,109.966,50.),(-315.113,105.405,50.),(-312.406,111.972,50.),(-310.765,114.611,50.),(-309.934,118.56,50.),(-309.657,124.493,50.),(-297.467,123.818,50.),(-309.657,275.507,50.),(-297.467,275.507,50.),(-239.244,123.818,50.),(-236.186,104.856,50.),(-234.172,125.979,50.),(-234.172,103.209,50.),(-232.84,129.222,50.),(-232.84,99.958,50.),(-231.827,94.595,50.),(-231.827,134.628,50.),(-229.526,94.595,50.),(-229.526,134.628,50.),(-312.406,288.049,50.),(-315.113,294.595,50.),(-315.113,290.034,50.),(-292.011,294.595,50.),(-310.765,285.473,50.),(-309.934,281.546,50.),(-296.359,285.473,50.),(-297.19,281.546,50.),(-294.718,288.049,50.),(-292.011,290.034,50.),(-297.467,123.818,50.),(-239.244,123.818,30.),(-297.467,123.818,30.),(-239.244,123.818,50.),(-239.244,123.818,50.),(-234.172,125.979,30.),(-239.244,123.818,30.),(-234.172,125.979,50.),(-234.172,125.979,50.),(-232.84,129.222,30.),(-234.172,125.979,30.),(-232.84,129.222,50.),(-232.84,129.222,50.),(-231.827,134.628,30.),(-232.84,129.222,30.),(-231.827,134.628,50.),(-231.827,134.628,50.),(-229.526,134.628,30.),(-231.827,134.628,30.),(-229.526,134.628,50.),(-229.526,134.628,30.),(-229.526,94.595,50.),(-229.526,94.595,30.),(-229.526,134.628,50.),(-229.526,94.595,50.),(-231.827,94.595,30.),(-229.526,94.595,30.),(-231.827,94.595,50.),(-231.827,94.595,50.),(-232.84,99.958,30.),(-231.827,94.595,30.),(-232.84,99.958,50.),(-232.84,99.958,50.),(-234.172,103.209,30.),(-232.84,99.958,30.),(-234.172,103.209,50.),(-234.172,103.209,30.),(-236.186,104.856,50.),(-236.186,104.856,30.),(-234.172,103.209,50.),(-236.186,104.856,50.),(-239.244,105.405,30.),(-236.186,104.856,30.),(-239.244,105.405,50.),(-239.244,105.405,30.),(-315.113,105.405,50.),(-315.113,105.405,30.),(-239.244,105.405,50.),(-315.113,105.405,50.),(-315.113,109.966,30.),(-315.113,105.405,30.),(-315.113,109.966,50.),(-315.113,109.966,30.),(-312.406,111.972,50.),(-312.406,111.972,30.),(-315.113,109.966,50.),(-312.406,111.972,50.),(-310.765,114.611,30.),(-312.406,111.972,30.),(-310.765,114.611,50.),(-310.765,114.611,50.),(-309.934,118.56,30.),(-310.765,114.611,30.),(-309.934,118.56,50.),(-309.934,118.56,50.),(-309.657,124.493,30.),(-309.934,118.56,30.),(-309.657,124.493,50.),(-309.657,124.493,50.),(-309.657,275.507,30.),(-309.657,124.493,30.),(-309.657,275.507,50.),(-309.657,275.507,50.),(-309.934,281.546,30.),(-309.657,275.507,30.),(-309.934,281.546,50.),(-309.934,281.546,50.),(-310.765,285.473,30.),(-309.934,281.546,30.),(-310.765,285.473,50.),(-310.765,285.473,50.),(-312.406,288.049,30.),(-310.765,285.473,30.),(-312.406,288.049,50.),(-312.406,288.049,50.),(-315.113,290.034,30.),(-312.406,288.049,30.),(-315.113,290.034,50.),(-315.113,290.034,50.),(-315.113,294.595,30.),(-315.113,290.034,30.),(-315.113,294.595,50.),(-315.113,294.595,50.),(-292.011,294.595,30.),(-315.113,294.595,30.),(-292.011,294.595,50.),(-292.011,294.595,30.),(-292.011,290.034,50.),(-292.011,290.034,30.),(-292.011,294.595,50.),(-292.011,290.034,50.),(-294.718,288.049,30.),(-292.011,290.034,30.),(-294.718,288.049,50.),(-294.718,288.049,30.),(-296.359,285.473,50.),(-296.359,285.473,30.),(-294.718,288.049,50.),(-296.359,285.473,30.),(-297.19,281.546,50.),(-297.19,281.546,30.),(-296.359,285.473,50.),(-297.19,281.546,30.),(-297.467,275.507,50.),(-297.467,275.507,30.),(-297.19,281.546,50.),(-297.467,275.507,30.),(-297.467,123.818,50.),(-297.467,123.818,30.),(-297.467,275.507,50.),(-217.421,105.405,50.),(-214.661,111.972,50.),(-217.421,109.966,50.),(-169.171,105.405,50.),(-213.031,114.611,50.),(-211.965,124.493,50.),(-199.775,123.818,50.),(-169.853,123.818,50.),(-155.17,126.098,50.),(-152.879,107.644,50.),(-149.538,128.948,50.),(-146.259,110.441,50.),(-145.047,132.939,50.),(-140.656,114.358,50.),(-140.976,138.64,50.),(-137.46,145.777,50.),(-135.784,119.637,50.),(-134.497,154.35,50.),(-131.354,126.52,50.),(-132.089,164.358,50.),(-129.724,181.377,50.),(-127.366,135.008,50.),(-128.935,200.,50.),(-217.421,290.034,50.),(-169.171,294.595,50.),(-217.421,294.595,50.),(-214.661,288.028,50.),(-213.031,285.389,50.),(-211.965,275.507,50.),(-199.775,276.182,50.),(-169.853,276.182,50.),(-158.697,275.,50.),(-152.293,292.356,50.),(-150.119,271.453,50.),(-145.707,289.559,50.),(-143.416,265.076,50.),(-140.358,285.642,50.),(-137.886,255.405,50.),(-134.796,279.054,50.),(-133.97,244.151,50.),(-129.873,270.608,50.),(-131.173,231.166,50.),(-129.494,216.448,50.),(-125.589,260.304,50.),(-123.82,145.101,50.),(-121.945,248.142,50.),(-120.464,157.908,50.),(-117.597,224.789,50.),(-118.066,171.326,50.),(-116.628,185.357,50.),(-116.148,200.,50.),(-211.965,124.493,50.),(-211.965,275.507,30.),(-211.965,124.493,30.),(-211.965,275.507,50.),(-211.965,275.507,50.),(-213.031,285.389,30.),(-211.965,275.507,30.),(-213.031,285.389,50.),(-213.031,285.389,50.),(-214.661,288.028,30.),(-213.031,285.389,30.),(-214.661,288.028,50.),(-214.661,288.028,50.),(-217.421,290.034,30.),(-214.661,288.028,30.),(-217.421,290.034,50.),(-217.421,290.034,50.),(-217.421,294.595,30.),(-217.421,290.034,30.),(-217.421,294.595,50.),(-217.421,294.595,50.),(-169.171,294.595,30.),(-217.421,294.595,30.),(-169.171,294.595,50.),(-169.171,294.595,50.),(-152.293,292.356,30.),(-169.171,294.595,30.),(-152.293,292.356,50.),(-152.293,292.356,50.),(-145.707,289.559,30.),(-152.293,292.356,30.),(-145.707,289.559,50.),(-145.707,289.559,50.),(-140.358,285.642,30.),(-145.707,289.559,30.),(-140.358,285.642,50.),(-140.358,285.642,30.),(-134.796,279.054,50.),(-134.796,279.054,30.),(-140.358,285.642,50.),(-134.796,279.054,30.),(-129.873,270.608,50.),(-129.873,270.608,30.),(-134.796,279.054,50.),(-129.873,270.608,30.),(-125.589,260.304,50.),(-125.589,260.304,30.),(-129.873,270.608,50.),(-125.589,260.304,30.),(-121.945,248.142,50.),(-121.945,248.142,30.),(-125.589,260.304,50.),(-121.945,248.142,30.),(-117.597,224.789,50.),(-117.597,224.789,30.),(-121.945,248.142,50.),(-117.597,224.789,30.),(-116.148,200.,50.),(-116.148,200.,30.),(-117.597,224.789,50.),(-116.148,200.,30.),(-116.628,185.357,50.),(-116.628,185.357,30.),(-116.148,200.,50.),(-116.628,185.357,30.),(-118.066,171.326,50.),(-118.066,171.326,30.),(-116.628,185.357,50.),(-118.066,171.326,30.),(-120.464,157.908,50.),(-120.464,157.908,30.),(-118.066,171.326,50.),(-120.464,157.908,30.),(-123.82,145.101,50.),(-123.82,145.101,30.),(-120.464,157.908,50.),(-123.82,145.101,30.),(-127.366,135.008,50.),(-127.366,135.008,30.),(-123.82,145.101,50.),(-127.366,135.008,30.),(-131.354,126.52,50.),(-131.354,126.52,30.),(-127.366,135.008,50.),(-131.354,126.52,30.),(-135.784,119.637,50.),(-135.784,119.637,30.),(-131.354,126.52,50.),(-135.784,119.637,30.),(-140.656,114.358,50.),(-140.656,114.358,30.),(-135.784,119.637,50.),(-140.656,114.358,50.),(-146.259,110.441,30.),(-140.656,114.358,30.),(-146.259,110.441,50.),(-146.259,110.441,50.),(-152.879,107.644,30.),(-146.259,110.441,30.),(-152.879,107.644,50.),(-152.879,107.644,50.),(-169.171,105.405,30.),(-152.879,107.644,30.),(-169.171,105.405,50.),(-169.171,105.405,30.),(-217.421,105.405,50.),(-217.421,105.405,30.),(-169.171,105.405,50.),(-217.421,105.405,50.),(-217.421,109.966,30.),(-217.421,105.405,30.),(-217.421,109.966,50.),(-217.421,109.966,30.),(-214.661,111.972,50.),(-214.661,111.972,30.),(-217.421,109.966,50.),(-214.661,111.972,50.),(-213.031,114.611,30.),(-214.661,111.972,30.),(-213.031,114.611,50.),(-213.031,114.611,50.),(-211.965,124.493,30.),(-213.031,114.611,30.),(-211.965,124.493,50.),(-199.775,123.818,50.),(-169.853,123.818,30.),(-199.775,123.818,30.),(-169.853,123.818,50.),(-169.853,123.818,30.),(-155.17,126.098,50.),(-155.17,126.098,30.),(-169.853,123.818,50.),(-155.17,126.098,30.),(-149.538,128.948,50.),(-149.538,128.948,30.),(-155.17,126.098,50.),(-149.538,128.948,30.),(-145.047,132.939,50.),(-145.047,132.939,30.),(-149.538,128.948,50.),(-145.047,132.939,50.),(-140.976,138.64,30.),(-145.047,132.939,30.),(-140.976,138.64,50.),(-140.976,138.64,50.),(-137.46,145.777,30.),(-140.976,138.64,30.),(-137.46,145.777,50.),(-137.46,145.777,50.),(-134.497,154.35,30.),(-137.46,145.777,30.),(-134.497,154.35,50.),(-134.497,154.35,50.),(-132.089,164.358,30.),(-134.497,154.35,30.),(-132.089,164.358,50.),(-132.089,164.358,50.),(-129.724,181.377,30.),(-132.089,164.358,30.),(-129.724,181.377,50.),(-129.724,181.377,50.),(-128.935,200.,30.),(-129.724,181.377,30.),(-128.935,200.,50.),(-128.935,200.,50.),(-129.494,216.448,30.),(-128.935,200.,30.),(-129.494,216.448,50.),(-129.494,216.448,50.),(-131.173,231.166,30.),(-129.494,216.448,30.),(-131.173,231.166,50.),(-131.173,231.166,50.),(-133.97,244.151,30.),(-131.173,231.166,30.),(-133.97,244.151,50.),(-133.97,244.151,50.),(-137.886,255.405,30.),(-133.97,244.151,30.),(-137.886,255.405,50.),(-137.886,255.405,50.),(-143.416,265.076,30.),(-137.886,255.405,30.),(-143.416,265.076,50.),(-143.416,265.076,30.),(-150.119,271.453,50.),(-150.119,271.453,30.),(-143.416,265.076,50.),(-150.119,271.453,30.),(-158.697,275.,50.),(-158.697,275.,30.),(-150.119,271.453,50.),(-158.697,275.,50.),(-169.853,276.182,30.),(-158.697,275.,30.),(-169.853,276.182,50.),(-169.853,276.182,50.),(-199.775,276.182,30.),(-169.853,276.182,30.),(-199.775,276.182,50.),(-199.775,276.182,30.),(-199.775,123.818,50.),(-199.775,123.818,30.),(-199.775,276.182,50.),(-21.269,105.405,50.),(-97.991,109.966,50.),(-97.991,105.405,50.),(-95.231,111.972,50.),(-93.6,114.611,50.),(-92.535,124.493,50.),(-80.345,123.818,50.),(-92.535,275.507,50.),(-21.354,123.818,50.),(-16.282,125.979,50.),(-18.221,104.856,50.),(-16.239,103.209,50.),(-14.971,129.222,50.),(-14.961,99.958,50.),(-14.023,134.628,50.),(-14.023,94.595,50.),(-11.636,134.628,50.),(-11.636,94.595,50.),(-80.345,193.919,50.),(-80.345,212.331,50.),(-43.092,212.331,50.),(-43.092,193.919,50.),(-38.105,191.757,50.),(-40.044,212.88,50.),(-38.062,214.527,50.),(-36.773,188.514,50.),(-36.762,217.779,50.),(-35.761,183.108,50.),(-35.761,223.142,50.),(-33.459,183.108,50.),(-33.459,223.142,50.),(-97.991,290.034,50.),(-21.866,294.595,50.),(-97.991,294.595,50.),(-95.284,288.049,50.),(-93.643,285.473,50.),(-92.812,281.546,50.),(-80.345,276.182,50.),(-21.866,276.182,50.),(-18.818,275.642,50.),(-18.818,295.144,50.),(-16.836,296.791,50.),(-16.836,274.021,50.),(-15.536,300.042,50.),(-15.536,270.778,50.),(-14.534,305.405,50.),(-14.534,265.372,50.),(-12.233,265.372,50.),(-12.233,305.405,50.),(-80.345,193.919,30.),(-80.345,123.818,50.),(-80.345,123.818,30.),(-80.345,193.919,50.),(-80.345,123.818,50.),(-21.354,123.818,30.),(-80.345,123.818,30.),(-21.354,123.818,50.),(-21.354,123.818,30.),(-16.282,125.979,50.),(-16.282,125.979,30.),(-21.354,123.818,50.),(-16.282,125.979,50.),(-14.971,129.222,30.),(-16.282,125.979,30.),(-14.971,129.222,50.),(-14.971,129.222,50.),(-14.023,134.628,30.),(-14.971,129.222,30.),(-14.023,134.628,50.),(-14.023,134.628,50.),(-11.636,134.628,30.),(-14.023,134.628,30.),(-11.636,134.628,50.),(-11.636,134.628,30.),(-11.636,94.595,50.),(-11.636,94.595,30.),(-11.636,134.628,50.),(-11.636,94.595,50.),(-14.023,94.595,30.),(-11.636,94.595,30.),(-14.023,94.595,50.),(-14.023,94.595,50.),(-14.961,99.958,30.),(-14.023,94.595,30.),(-14.961,99.958,50.),(-14.961,99.958,50.),(-16.239,103.209,30.),(-14.961,99.958,30.),(-16.239,103.209,50.),(-16.239,103.209,30.),(-18.221,104.856,50.),(-18.221,104.856,30.),(-16.239,103.209,50.),(-18.221,104.856,30.),(-21.269,105.405,50.),(-21.269,105.405,30.),(-18.221,104.856,50.),(-21.269,105.405,50.),(-97.991,105.405,30.),(-21.269,105.405,30.),(-97.991,105.405,50.),(-97.991,105.405,50.),(-97.991,109.966,30.),(-97.991,105.405,30.),(-97.991,109.966,50.),(-97.991,109.966,50.),(-95.231,111.972,30.),(-97.991,109.966,30.),(-95.231,111.972,50.),(-95.231,111.972,50.),(-93.6,114.611,30.),(-95.231,111.972,30.),(-93.6,114.611,50.),(-93.6,114.611,50.),(-92.535,124.493,30.),(-93.6,114.611,30.),(-92.535,124.493,50.),(-92.535,124.493,50.),(-92.535,275.507,30.),(-92.535,124.493,30.),(-92.535,275.507,50.),(-92.535,275.507,50.),(-92.812,281.546,30.),(-92.535,275.507,30.),(-92.812,281.546,50.),(-92.812,281.546,50.),(-93.643,285.473,30.),(-92.812,281.546,30.),(-93.643,285.473,50.),(-93.643,285.473,50.),(-95.284,288.049,30.),(-93.643,285.473,30.),(-95.284,288.049,50.),(-95.284,288.049,50.),(-97.991,290.034,30.),(-95.284,288.049,30.),(-97.991,290.034,50.),(-97.991,290.034,50.),(-97.991,294.595,30.),(-97.991,290.034,30.),(-97.991,294.595,50.),(-97.991,294.595,50.),(-21.866,294.595,30.),(-97.991,294.595,30.),(-21.866,294.595,50.),(-21.866,294.595,50.),(-18.818,295.144,30.),(-21.866,294.595,30.),(-18.818,295.144,50.),(-18.818,295.144,30.),(-16.836,296.791,50.),(-16.836,296.791,30.),(-18.818,295.144,50.),(-16.836,296.791,50.),(-15.536,300.042,30.),(-16.836,296.791,30.),(-15.536,300.042,50.),(-15.536,300.042,50.),(-14.534,305.405,30.),(-15.536,300.042,30.),(-14.534,305.405,50.),(-14.534,305.405,50.),(-12.233,305.405,30.),(-14.534,305.405,30.),(-12.233,305.405,50.),(-12.233,305.405,30.),(-12.233,265.372,50.),(-12.233,265.372,30.),(-12.233,305.405,50.),(-12.233,265.372,50.),(-14.534,265.372,30.),(-12.233,265.372,30.),(-14.534,265.372,50.),(-14.534,265.372,50.),(-15.536,270.778,30.),(-14.534,265.372,30.),(-15.536,270.778,50.),(-15.536,270.778,50.),(-16.836,274.021,30.),(-15.536,270.778,30.),(-16.836,274.021,50.),(-16.836,274.021,50.),(-18.818,275.642,30.),(-16.836,274.021,30.),(-18.818,275.642,50.),(-18.818,275.642,50.),(-21.866,276.182,30.),(-18.818,275.642,30.),(-21.866,276.182,50.),(-21.866,276.182,30.),(-80.345,276.182,50.),(-80.345,276.182,30.),(-21.866,276.182,50.),(-80.345,276.182,30.),(-80.345,212.331,50.),(-80.345,212.331,30.),(-80.345,276.182,50.),(-80.345,212.331,50.),(-43.092,212.331,30.),(-80.345,212.331,30.),(-43.092,212.331,50.),(-43.092,212.331,50.),(-40.044,212.88,30.),(-43.092,212.331,30.),(-40.044,212.88,50.),(-40.044,212.88,30.),(-38.062,214.527,50.),(-38.062,214.527,30.),(-40.044,212.88,50.),(-38.062,214.527,50.),(-36.762,217.779,30.),(-38.062,214.527,30.),(-36.762,217.779,50.),(-36.762,217.779,50.),(-35.761,223.142,30.),(-36.762,217.779,30.),(-35.761,223.142,50.),(-35.761,223.142,50.),(-33.459,223.142,30.),(-35.761,223.142,30.),(-33.459,223.142,50.),(-33.459,223.142,30.),(-33.459,183.108,50.),(-33.459,183.108,30.),(-33.459,223.142,50.),(-33.459,183.108,30.),(-35.761,183.108,50.),(-35.761,183.108,30.),(-33.459,183.108,50.),(-35.761,183.108,50.),(-36.773,188.514,30.),(-35.761,183.108,30.),(-36.773,188.514,50.),(-36.773,188.514,50.),(-38.105,191.757,30.),(-36.773,188.514,30.),(-38.105,191.757,50.),(-38.105,191.757,50.),(-43.092,193.919,30.),(-38.105,191.757,30.),(-43.092,193.919,50.),(-43.092,193.919,30.),(-80.345,193.919,50.),(-80.345,193.919,30.),(-43.092,193.919,50.),(108.817,105.405,50.),(49.741,109.966,50.),(49.741,105.405,50.),(52.448,111.972,50.),(54.089,114.611,50.),(54.92,118.56,50.),(55.197,124.493,50.),(67.387,123.818,50.),(55.197,275.507,50.),(67.387,195.101,50.),(105.407,123.818,50.),(118.705,125.253,50.),(118.173,106.208,50.),(125.44,108.615,50.),(122.755,127.386,50.),(126.378,130.912,50.),(131.301,113.007,50.),(129.399,135.821,50.),(131.556,141.934,50.),(136.437,119.764,50.),(132.851,149.25,50.),(133.283,157.77,50.),(135.515,196.59,50.),(140.763,186.191,50.),(140.166,127.544,50.),(142.83,136.529,50.),(143.912,173.364,50.),(144.429,146.717,50.),(144.961,158.108,50.),(104.299,195.101,50.),(67.387,213.514,50.),(103.617,213.514,50.),(116.276,214.78,50.),(117.469,193.581,50.),(123.565,219.764,50.),(121.615,191.385,50.),(125.269,187.838,50.),(126.436,223.955,50.),(128.775,182.348,50.),(128.168,204.561,50.),(131.279,175.507,50.),(132.782,167.314,50.),(128.487,229.265,50.),(134.135,212.099,50.),(129.718,235.695,50.),(130.128,243.243,50.),(131.151,284.628,50.),(135.574,277.196,50.),(138.397,221.199,50.),(138.951,267.399,50.),(140.955,231.862,50.),(141.093,256.081,50.),(141.807,244.088,50.),(52.448,288.049,50.),(49.741,294.595,50.),(49.741,290.034,50.),(107.027,294.595,50.),(54.089,285.473,50.),(54.92,281.546,50.),(67.387,276.182,50.),(102.594,276.182,50.),(115.083,274.916,50.),(121.519,292.314,50.),(122.542,269.932,50.),(126.697,289.253,50.),(125.861,265.034,50.),(128.232,258.953,50.),(129.654,251.689,50.),(128.168,204.561,30.),(135.515,196.59,50.),(135.515,196.59,30.),(128.168,204.561,50.),(135.515,196.59,30.),(140.763,186.191,50.),(140.763,186.191,30.),(135.515,196.59,50.),(140.763,186.191,30.),(143.912,173.364,50.),(143.912,173.364,30.),(140.763,186.191,50.),(143.912,173.364,30.),(144.961,158.108,50.),(144.961,158.108,30.),(143.912,173.364,50.),(144.961,158.108,30.),(144.429,146.717,50.),(144.429,146.717,30.),(144.961,158.108,50.),(144.429,146.717,30.),(142.83,136.529,50.),(142.83,136.529,30.),(144.429,146.717,50.),(142.83,136.529,30.),(140.166,127.544,50.),(140.166,127.544,30.),(142.83,136.529,50.),(140.166,127.544,30.),(136.437,119.764,50.),(136.437,119.764,30.),(140.166,127.544,50.),(136.437,119.764,30.),(131.301,113.007,50.),(131.301,113.007,30.),(136.437,119.764,50.),(131.301,113.007,50.),(125.44,108.615,30.),(131.301,113.007,30.),(125.44,108.615,50.),(125.44,108.615,50.),(118.173,106.208,30.),(125.44,108.615,30.),(118.173,106.208,50.),(118.173,106.208,50.),(108.817,105.405,30.),(118.173,106.208,30.),(108.817,105.405,50.),(108.817,105.405,50.),(49.741,105.405,30.),(108.817,105.405,30.),(49.741,105.405,50.),(49.741,105.405,50.),(49.741,109.966,30.),(49.741,105.405,30.),(49.741,109.966,50.),(49.741,109.966,30.),(52.448,111.972,50.),(52.448,111.972,30.),(49.741,109.966,50.),(52.448,111.972,50.),(54.089,114.611,30.),(52.448,111.972,30.),(54.089,114.611,50.),(54.089,114.611,50.),(54.92,118.56,30.),(54.089,114.611,30.),(54.92,118.56,50.),(54.92,118.56,50.),(55.197,124.493,30.),(54.92,118.56,30.),(55.197,124.493,50.),(55.197,124.493,50.),(55.197,275.507,30.),(55.197,124.493,30.),(55.197,275.507,50.),(55.197,275.507,50.),(54.92,281.546,30.),(55.197,275.507,30.),(54.92,281.546,50.),(54.92,281.546,50.),(54.089,285.473,30.),(54.92,281.546,30.),(54.089,285.473,50.),(54.089,285.473,50.),(52.448,288.049,30.),(54.089,285.473,30.),(52.448,288.049,50.),(52.448,288.049,30.),(49.741,290.034,50.),(49.741,290.034,30.),(52.448,288.049,50.),(49.741,290.034,50.),(49.741,294.595,30.),(49.741,290.034,30.),(49.741,294.595,50.),(49.741,294.595,50.),(107.027,294.595,30.),(49.741,294.595,30.),(107.027,294.595,50.),(107.027,294.595,50.),(121.519,292.314,30.),(107.027,294.595,30.),(121.519,292.314,50.),(121.519,292.314,50.),(126.697,289.253,30.),(121.519,292.314,30.),(126.697,289.253,50.),(126.697,289.253,30.),(131.151,284.628,50.),(131.151,284.628,30.),(126.697,289.253,50.),(131.151,284.628,30.),(135.574,277.196,50.),(135.574,277.196,30.),(131.151,284.628,50.),(135.574,277.196,30.),(138.951,267.399,50.),(138.951,267.399,30.),(135.574,277.196,50.),(138.951,267.399,30.),(141.093,256.081,50.),(141.093,256.081,30.),(138.951,267.399,50.),(141.093,256.081,30.),(141.807,244.088,50.),(141.807,244.088,30.),(141.093,256.081,50.),(141.807,244.088,30.),(140.955,231.862,50.),(140.955,231.862,30.),(141.807,244.088,50.),(140.955,231.862,30.),(138.397,221.199,50.),(138.397,221.199,30.),(140.955,231.862,50.),(138.397,221.199,30.),(134.135,212.099,50.),(134.135,212.099,30.),(138.397,221.199,50.),(134.135,212.099,30.),(128.168,204.561,50.),(128.168,204.561,30.),(134.135,212.099,50.),(67.387,213.514,50.),(103.617,213.514,30.),(67.387,213.514,30.),(103.617,213.514,50.),(103.617,213.514,30.),(116.276,214.78,50.),(116.276,214.78,30.),(103.617,213.514,50.),(116.276,214.78,30.),(123.565,219.764,50.),(123.565,219.764,30.),(116.276,214.78,50.),(123.565,219.764,50.),(126.436,223.955,30.),(123.565,219.764,30.),(126.436,223.955,50.),(126.436,223.955,50.),(128.487,229.265,30.),(126.436,223.955,30.),(128.487,229.265,50.),(128.487,229.265,50.),(129.718,235.695,30.),(128.487,229.265,30.),(129.718,235.695,50.),(129.718,235.695,50.),(130.128,243.243,30.),(129.718,235.695,30.),(130.128,243.243,50.),(130.128,243.243,50.),(129.654,251.689,30.),(130.128,243.243,30.),(129.654,251.689,50.),(129.654,251.689,50.),(128.232,258.953,30.),(129.654,251.689,30.),(128.232,258.953,50.),(128.232,258.953,50.),(125.861,265.034,30.),(128.232,258.953,30.),(125.861,265.034,50.),(125.861,265.034,50.),(122.542,269.932,30.),(125.861,265.034,30.),(122.542,269.932,50.),(122.542,269.932,30.),(115.083,274.916,50.),(115.083,274.916,30.),(122.542,269.932,50.),(115.083,274.916,30.),(102.594,276.182,50.),(102.594,276.182,30.),(115.083,274.916,50.),(102.594,276.182,50.),(67.387,276.182,30.),(102.594,276.182,30.),(67.387,276.182,50.),(67.387,276.182,30.),(67.387,213.514,50.),(67.387,213.514,30.),(67.387,276.182,50.),(67.387,123.818,30.),(105.407,123.818,50.),(105.407,123.818,30.),(67.387,123.818,50.),(105.407,123.818,50.),(118.705,125.253,30.),(105.407,123.818,30.),(118.705,125.253,50.),(118.705,125.253,50.),(122.755,127.386,30.),(118.705,125.253,30.),(122.755,127.386,50.),(122.755,127.386,30.),(126.378,130.912,50.),(126.378,130.912,30.),(122.755,127.386,50.),(126.378,130.912,50.),(129.399,135.821,30.),(126.378,130.912,30.),(129.399,135.821,50.),(129.399,135.821,50.),(131.556,141.934,30.),(129.399,135.821,30.),(131.556,141.934,50.),(131.556,141.934,50.),(132.851,149.25,30.),(131.556,141.934,30.),(132.851,149.25,50.),(132.851,149.25,50.),(133.283,157.77,30.),(132.851,149.25,30.),(133.283,157.77,50.),(133.283,157.77,50.),(132.782,167.314,30.),(133.283,157.77,30.),(132.782,167.314,50.),(132.782,167.314,50.),(131.279,175.507,30.),(132.782,167.314,30.),(131.279,175.507,50.),(131.279,175.507,50.),(128.775,182.348,30.),(131.279,175.507,30.),(128.775,182.348,50.),(128.775,182.348,50.),(125.269,187.838,30.),(128.775,182.348,30.),(125.269,187.838,50.),(125.269,187.838,30.),(121.615,191.385,50.),(121.615,191.385,30.),(125.269,187.838,50.),(121.615,191.385,50.),(117.469,193.581,30.),(121.615,191.385,30.),(117.469,193.581,50.),(117.469,193.581,30.),(104.299,195.101,50.),(104.299,195.101,30.),(117.469,193.581,50.),(104.299,195.101,50.),(67.387,195.101,30.),(104.299,195.101,30.),(67.387,195.101,50.),(67.387,195.101,30.),(67.387,123.818,50.),(67.387,123.818,30.),(67.387,195.101,50.),(185.794,105.405,50.),(162.693,109.966,50.),(162.693,105.405,50.),(165.452,111.972,50.),(167.083,114.611,50.),(168.148,124.493,50.),(181.447,114.611,50.),(180.616,118.56,50.),(168.148,275.507,50.),(180.339,124.493,50.),(180.339,209.459,50.),(183.088,111.972,50.),(185.794,109.966,50.),(235.647,105.405,50.),(238.142,111.698,50.),(235.647,109.966,50.),(259.277,105.405,50.),(238.973,114.189,50.),(254.886,112.148,50.),(252.372,117.399,50.),(259.277,109.966,50.),(180.339,191.047,50.),(216.653,209.459,50.),(215.05,191.047,50.),(237.011,122.297,50.),(228.417,192.736,50.),(229.824,210.726,50.),(234.704,194.632,50.),(237.283,215.372,50.),(240.181,197.783,50.),(240.229,219.774,50.),(244.849,202.191,50.),(242.334,225.549,50.),(243.597,232.696,50.),(244.018,241.216,50.),(162.693,290.034,50.),(219.381,294.595,50.),(162.693,294.595,50.),(165.399,288.049,50.),(167.04,285.473,50.),(167.871,281.546,50.),(180.339,276.182,50.),(218.017,276.182,50.),(229.888,274.113,50.),(228.13,293.919,50.),(235.109,291.892,50.),(234.305,271.527,50.),(237.709,267.905,50.),(240.81,288.26,50.),(240.469,262.88,50.),(242.44,256.757,50.),(245.722,282.77,50.),(243.623,249.535,50.),(248.706,207.855,50.),(250.049,275.042,50.),(251.727,214.722,50.),(253.139,265.709,50.),(253.885,222.741,50.),(254.993,254.772,50.),(255.179,231.91,50.),(255.611,242.23,50.),(180.339,191.047,30.),(180.339,124.493,50.),(180.339,124.493,30.),(180.339,191.047,50.),(180.339,124.493,30.),(180.616,118.56,50.),(180.616,118.56,30.),(180.339,124.493,50.),(180.616,118.56,30.),(181.447,114.611,50.),(181.447,114.611,30.),(180.616,118.56,50.),(181.447,114.611,30.),(183.088,111.972,50.),(183.088,111.972,30.),(181.447,114.611,50.),(183.088,111.972,50.),(185.794,109.966,30.),(183.088,111.972,30.),(185.794,109.966,50.),(185.794,109.966,30.),(185.794,105.405,50.),(185.794,105.405,30.),(185.794,109.966,50.),(185.794,105.405,50.),(162.693,105.405,30.),(185.794,105.405,30.),(162.693,105.405,50.),(162.693,105.405,50.),(162.693,109.966,30.),(162.693,105.405,30.),(162.693,109.966,50.),(162.693,109.966,50.),(165.452,111.972,30.),(162.693,109.966,30.),(165.452,111.972,50.),(165.452,111.972,50.),(167.083,114.611,30.),(165.452,111.972,30.),(167.083,114.611,50.),(167.083,114.611,50.),(168.148,124.493,30.),(167.083,114.611,30.),(168.148,124.493,50.),(168.148,124.493,50.),(168.148,275.507,30.),(168.148,124.493,30.),(168.148,275.507,50.),(168.148,275.507,50.),(167.871,281.546,30.),(168.148,275.507,30.),(167.871,281.546,50.),(167.871,281.546,50.),(167.04,285.473,30.),(167.871,281.546,30.),(167.04,285.473,50.),(167.04,285.473,50.),(165.399,288.049,30.),(167.04,285.473,30.),(165.399,288.049,50.),(165.399,288.049,30.),(162.693,290.034,50.),(162.693,290.034,30.),(165.399,288.049,50.),(162.693,290.034,50.),(162.693,294.595,30.),(162.693,290.034,30.),(162.693,294.595,50.),(162.693,294.595,30.),(219.381,294.595,50.),(219.381,294.595,30.),(162.693,294.595,50.),(219.381,294.595,50.),(228.13,293.919,30.),(219.381,294.595,30.),(228.13,293.919,50.),(228.13,293.919,50.),(235.109,291.892,30.),(228.13,293.919,30.),(235.109,291.892,50.),(235.109,291.892,50.),(240.81,288.26,30.),(235.109,291.892,30.),(240.81,288.26,50.),(240.81,288.26,30.),(245.722,282.77,50.),(245.722,282.77,30.),(240.81,288.26,50.),(245.722,282.77,30.),(250.049,275.042,50.),(250.049,275.042,30.),(245.722,282.77,50.),(250.049,275.042,30.),(253.139,265.709,50.),(253.139,265.709,30.),(250.049,275.042,50.),(253.139,265.709,30.),(254.993,254.772,50.),(254.993,254.772,30.),(253.139,265.709,50.),(254.993,254.772,30.),(255.611,242.23,50.),(255.611,242.23,30.),(254.993,254.772,50.),(255.611,242.23,30.),(255.179,231.91,50.),(255.179,231.91,30.),(255.611,242.23,50.),(255.179,231.91,30.),(253.885,222.741,50.),(253.885,222.741,30.),(255.179,231.91,50.),(253.885,222.741,30.),(251.727,214.722,50.),(251.727,214.722,30.),(253.885,222.741,50.),(251.727,214.722,30.),(248.706,207.855,50.),(248.706,207.855,30.),(251.727,214.722,50.),(248.706,207.855,30.),(244.849,202.191,50.),(244.849,202.191,30.),(248.706,207.855,50.),(244.849,202.191,50.),(240.181,197.783,30.),(244.849,202.191,30.),(240.181,197.783,50.),(240.181,197.783,50.),(234.704,194.632,30.),(240.181,197.783,30.),(234.704,194.632,50.),(234.704,194.632,50.),(228.417,192.736,30.),(234.704,194.632,30.),(228.417,192.736,50.),(228.417,192.736,30.),(252.372,117.399,50.),(252.372,117.399,30.),(228.417,192.736,50.),(252.372,117.399,30.),(254.886,112.148,50.),(254.886,112.148,30.),(252.372,117.399,50.),(254.886,112.148,50.),(259.277,109.966,30.),(254.886,112.148,30.),(259.277,109.966,50.),(259.277,109.966,30.),(259.277,105.405,50.),(259.277,105.405,30.),(259.277,109.966,50.),(259.277,105.405,50.),(235.647,105.405,30.),(259.277,105.405,30.),(235.647,105.405,50.),(235.647,105.405,50.),(235.647,109.966,30.),(235.647,105.405,30.),(235.647,109.966,50.),(235.647,109.966,50.),(238.142,111.698,30.),(235.647,109.966,30.),(238.142,111.698,50.),(238.142,111.698,50.),(238.973,114.189,30.),(238.142,111.698,30.),(238.973,114.189,50.),(238.973,114.189,50.),(237.011,122.297,30.),(238.973,114.189,30.),(237.011,122.297,50.),(237.011,122.297,50.),(215.05,191.047,30.),(237.011,122.297,30.),(215.05,191.047,50.),(215.05,191.047,50.),(180.339,191.047,30.),(215.05,191.047,30.),(180.339,191.047,50.),(180.339,209.459,30.),(216.653,209.459,50.),(216.653,209.459,30.),(180.339,209.459,50.),(216.653,209.459,50.),(229.824,210.726,30.),(216.653,209.459,30.),(229.824,210.726,50.),(229.824,210.726,30.),(237.283,215.372,50.),(237.283,215.372,30.),(229.824,210.726,50.),(237.283,215.372,50.),(240.229,219.774,30.),(237.283,215.372,30.),(240.229,219.774,50.),(240.229,219.774,50.),(242.334,225.549,30.),(240.229,219.774,30.),(242.334,225.549,50.),(242.334,225.549,50.),(243.597,232.696,30.),(242.334,225.549,30.),(243.597,232.696,50.),(243.597,232.696,50.),(244.018,241.216,30.),(243.597,232.696,30.),(244.018,241.216,50.),(244.018,241.216,50.),(243.623,249.535,30.),(244.018,241.216,30.),(243.623,249.535,50.),(243.623,249.535,50.),(242.44,256.757,30.),(243.623,249.535,30.),(242.44,256.757,50.),(242.44,256.757,50.),(240.469,262.88,30.),(242.44,256.757,30.),(240.469,262.88,50.),(240.469,262.88,50.),(237.709,267.905,30.),(240.469,262.88,30.),(237.709,267.905,50.),(237.709,267.905,50.),(234.305,271.527,30.),(237.709,267.905,30.),(234.305,271.527,50.),(234.305,271.527,50.),(229.888,274.113,30.),(234.305,271.527,30.),(229.888,274.113,50.),(229.888,274.113,30.),(218.017,276.182,50.),(218.017,276.182,30.),(229.888,274.113,50.),(218.017,276.182,50.),(180.339,276.182,30.),(218.017,276.182,30.),(180.339,276.182,50.),(180.339,276.182,30.),(180.339,209.459,50.),(180.339,209.459,30.),(180.339,276.182,50.),(276.923,264.886,50.),(286.676,278.593,50.),(286.101,283.615,50.),(306.333,188.936,50.),(288.4,272.986,50.),(313.579,207.683,50.),(266.203,287.373,50.),(262.942,294.595,50.),(262.942,290.034,50.),(289.849,294.595,50.),(268.995,283.446,50.),(287.038,287.838,50.),(289.849,290.034,50.),(323.979,105.405,50.),(300.877,109.966,50.),(300.877,105.405,50.),(303.583,111.972,50.),(305.224,114.611,50.),(306.056,118.56,50.),(306.333,124.493,50.),(319.588,114.611,50.),(318.523,124.493,50.),(318.523,188.936,50.),(321.219,111.972,50.),(323.979,109.966,50.),(336.897,272.817,50.),(343.841,259.655,50.),(339.227,283.277,50.),(335.448,290.034,50.),(359.782,294.595,50.),(335.448,294.595,50.),(338.282,287.838,50.),(352.707,281.334,50.),(356.095,286.592,50.),(359.782,290.034,50.),(318.523,188.936,30.),(318.523,124.493,50.),(318.523,124.493,30.),(318.523,188.936,50.),(318.523,124.493,30.),(319.588,114.611,50.),(319.588,114.611,30.),(318.523,124.493,50.),(319.588,114.611,30.),(321.219,111.972,50.),(321.219,111.972,30.),(319.588,114.611,50.),(321.219,111.972,50.),(323.979,109.966,30.),(321.219,111.972,30.),(323.979,109.966,50.),(323.979,109.966,30.),(323.979,105.405,50.),(323.979,105.405,30.),(323.979,109.966,50.),(323.979,105.405,50.),(300.877,105.405,30.),(323.979,105.405,30.),(300.877,105.405,50.),(300.877,105.405,50.),(300.877,109.966,30.),(300.877,105.405,30.),(300.877,109.966,50.),(300.877,109.966,30.),(303.583,111.972,50.),(303.583,111.972,30.),(300.877,109.966,50.),(303.583,111.972,50.),(305.224,114.611,30.),(303.583,111.972,30.),(305.224,114.611,50.),(305.224,114.611,50.),(306.056,118.56,30.),(305.224,114.611,30.),(306.056,118.56,50.),(306.056,118.56,50.),(306.333,124.493,30.),(306.056,118.56,30.),(306.333,124.493,50.),(306.333,124.493,50.),(306.333,188.936,30.),(306.333,124.493,30.),(306.333,188.936,50.),(306.333,188.936,50.),(276.923,264.886,30.),(306.333,188.936,30.),(276.923,264.886,50.),(276.923,264.886,50.),(268.995,283.446,30.),(276.923,264.886,30.),(268.995,283.446,50.),(268.995,283.446,50.),(266.203,287.373,30.),(268.995,283.446,30.),(266.203,287.373,50.),(266.203,287.373,30.),(262.942,290.034,50.),(262.942,290.034,30.),(266.203,287.373,50.),(262.942,290.034,50.),(262.942,294.595,30.),(262.942,290.034,30.),(262.942,294.595,50.),(262.942,294.595,50.),(289.849,294.595,30.),(262.942,294.595,30.),(289.849,294.595,50.),(289.849,294.595,30.),(289.849,290.034,50.),(289.849,290.034,30.),(289.849,294.595,50.),(289.849,290.034,50.),(287.038,287.838,30.),(289.849,290.034,30.),(287.038,287.838,50.),(287.038,287.838,30.),(286.101,283.615,50.),(286.101,283.615,30.),(287.038,287.838,50.),(286.101,283.615,30.),(286.676,278.593,50.),(286.676,278.593,30.),(286.101,283.615,50.),(286.676,278.593,30.),(288.4,272.986,50.),(288.4,272.986,30.),(286.676,278.593,50.),(288.4,272.986,30.),(313.579,207.683,50.),(313.579,207.683,30.),(288.4,272.986,50.),(313.579,207.683,50.),(336.897,272.817,30.),(313.579,207.683,30.),(336.897,272.817,50.),(336.897,272.817,50.),(339.227,283.277,30.),(336.897,272.817,30.),(339.227,283.277,50.),(339.227,283.277,50.),(338.282,287.838,30.),(339.227,283.277,30.),(338.282,287.838,50.),(338.282,287.838,30.),(335.448,290.034,50.),(335.448,290.034,30.),(338.282,287.838,50.),(335.448,290.034,50.),(335.448,294.595,30.),(335.448,290.034,30.),(335.448,294.595,50.),(335.448,294.595,30.),(359.782,294.595,50.),(359.782,294.595,30.),(335.448,294.595,50.),(359.782,294.595,30.),(359.782,290.034,50.),(359.782,290.034,30.),(359.782,294.595,50.),(359.782,290.034,50.),(356.095,286.592,30.),(359.782,290.034,30.),(356.095,286.592,50.),(356.095,286.592,30.),(352.707,281.334,50.),(352.707,281.334,30.),(356.095,286.592,50.),(352.707,281.334,30.),(343.841,259.655,50.),(343.841,259.655,30.),(352.707,281.334,50.),(343.841,259.655,30.),(318.523,188.936,50.),(318.523,188.936,30.),(343.841,259.655,50.),(377.079,140.709,50.),(380.406,182.454,50.),(379.644,198.818,50.),(384.149,126.014,50.),(382.692,167.652,50.),(386.501,154.413,50.),(392.081,115.224,50.),(391.835,142.736,50.),(398.324,133.203,50.),(401.057,107.517,50.),(405.772,126.394,50.),(411.076,102.893,50.),(414.18,122.308,50.),(422.138,101.351,50.),(423.546,120.946,50.),(436.379,103.706,50.),(433.2,122.403,50.),(442.386,126.774,50.),(449.715,110.769,50.),(450.655,133.72,50.),(462.145,122.54,50.),(457.56,142.905,50.),(457.56,177.703,50.),(468.215,157.432,50.),(468.215,177.027,50.),(469.306,147.382,50.),(473.671,139.02,50.),(470.943,144.785,50.),(473.671,142.905,50.),(428.746,166.892,50.),(426.445,206.926,50.),(426.445,166.892,50.),(428.746,206.926,50.),(429.695,172.255,50.),(429.693,201.52,50.),(431.001,198.276,50.),(431.005,175.507,50.),(436.064,196.115,50.),(433.019,177.154,50.),(436.077,177.703,50.),(473.671,196.115,50.),(469.306,187.078,50.),(470.943,189.675,50.),(473.671,191.554,50.),(459.989,239.696,50.),(458.881,250.,50.),(458.03,242.061,50.),(368.071,178.421,50.),(367.465,214.981,50.),(366.857,199.493,50.),(369.287,229.688,50.),(371.712,158.108,50.),(372.324,243.613,50.),(376.576,256.757,50.),(381.28,267.325,50.),(380.475,216.058,50.),(382.967,231.63,50.),(386.699,276.394,50.),(387.121,245.534,50.),(392.831,283.963,50.),(392.936,257.77,50.),(399.677,290.034,50.),(399.284,266.786,50.),(406.398,273.226,50.),(410.802,295.988,50.),(414.279,277.09,50.),(422.694,297.973,50.),(422.927,278.378,50.),(432.806,296.706,50.),(430.196,277.46,50.),(437.262,274.704,50.),(442.002,292.905,50.),(444.126,270.112,50.),(451.603,285.853,50.),(450.788,263.682,50.),(456.858,255.617,50.),(462.93,274.831,50.),(465.743,272.804,50.),(471.71,276.858,50.),(469.75,279.561,50.),(471.71,276.858,30.),(459.989,239.696,50.),(459.989,239.696,30.),(471.71,276.858,50.),(459.989,239.696,50.),(458.03,242.061,30.),(459.989,239.696,30.),(458.03,242.061,50.),(458.03,242.061,50.),(458.881,250.,30.),(458.03,242.061,30.),(458.881,250.,50.),(458.881,250.,50.),(456.858,255.617,30.),(458.881,250.,30.),(456.858,255.617,50.),(456.858,255.617,50.),(450.788,263.682,30.),(456.858,255.617,30.),(450.788,263.682,50.),(450.788,263.682,30.),(444.126,270.112,50.),(444.126,270.112,30.),(450.788,263.682,50.),(444.126,270.112,50.),(437.262,274.704,30.),(444.126,270.112,30.),(437.262,274.704,50.),(437.262,274.704,30.),(430.196,277.46,50.),(430.196,277.46,30.),(437.262,274.704,50.),(430.196,277.46,50.),(422.927,278.378,30.),(430.196,277.46,30.),(422.927,278.378,50.),(422.927,278.378,50.),(414.279,277.09,30.),(422.927,278.378,30.),(414.279,277.09,50.),(414.279,277.09,30.),(406.398,273.226,50.),(406.398,273.226,30.),(414.279,277.09,50.),(406.398,273.226,50.),(399.284,266.786,30.),(406.398,273.226,30.),(399.284,266.786,50.),(399.284,266.786,30.),(392.936,257.77,50.),(392.936,257.77,30.),(399.284,266.786,50.),(392.936,257.77,30.),(387.121,245.534,50.),(387.121,245.534,30.),(392.936,257.77,50.),(387.121,245.534,30.),(382.967,231.63,50.),(382.967,231.63,30.),(387.121,245.534,50.),(382.967,231.63,30.),(380.475,216.058,50.),(380.475,216.058,30.),(382.967,231.63,50.),(380.475,216.058,30.),(379.644,198.818,50.),(379.644,198.818,30.),(380.475,216.058,50.),(379.644,198.818,30.),(380.406,182.454,50.),(380.406,182.454,30.),(379.644,198.818,50.),(380.406,182.454,30.),(382.692,167.652,50.),(382.692,167.652,30.),(380.406,182.454,50.),(382.692,167.652,30.),(386.501,154.413,50.),(386.501,154.413,30.),(382.692,167.652,50.),(386.501,154.413,30.),(391.835,142.736,50.),(391.835,142.736,30.),(386.501,154.413,50.),(391.835,142.736,30.),(398.324,133.203,50.),(398.324,133.203,30.),(391.835,142.736,50.),(398.324,133.203,50.),(405.772,126.394,30.),(398.324,133.203,30.),(405.772,126.394,50.),(405.772,126.394,50.),(414.18,122.308,30.),(405.772,126.394,30.),(414.18,122.308,50.),(414.18,122.308,50.),(423.546,120.946,30.),(414.18,122.308,30.),(423.546,120.946,50.),(423.546,120.946,50.),(433.2,122.403,30.),(423.546,120.946,30.),(433.2,122.403,50.),(433.2,122.403,30.),(442.386,126.774,50.),(442.386,126.774,30.),(433.2,122.403,50.),(442.386,126.774,30.),(450.655,133.72,50.),(450.655,133.72,30.),(442.386,126.774,50.),(450.655,133.72,50.),(457.56,142.905,30.),(450.655,133.72,30.),(457.56,142.905,50.),(457.56,142.905,50.),(457.56,177.703,30.),(457.56,142.905,30.),(457.56,177.703,50.),(457.56,177.703,30.),(436.077,177.703,50.),(436.077,177.703,30.),(457.56,177.703,50.),(436.077,177.703,50.),(433.019,177.154,30.),(436.077,177.703,30.),(433.019,177.154,50.),(433.019,177.154,50.),(431.005,175.507,30.),(433.019,177.154,30.),(431.005,175.507,50.),(431.005,175.507,30.),(429.695,172.255,50.),(429.695,172.255,30.),(431.005,175.507,50.),(429.695,172.255,30.),(428.746,166.892,50.),(428.746,166.892,30.),(429.695,172.255,50.),(428.746,166.892,50.),(426.445,166.892,30.),(428.746,166.892,30.),(426.445,166.892,50.),(426.445,166.892,50.),(426.445,206.926,30.),(426.445,166.892,30.),(426.445,206.926,50.),(426.445,206.926,50.),(428.746,206.926,30.),(426.445,206.926,30.),(428.746,206.926,50.),(428.746,206.926,30.),(429.693,201.52,50.),(429.693,201.52,30.),(428.746,206.926,50.),(429.693,201.52,30.),(431.001,198.276,50.),(431.001,198.276,30.),(429.693,201.52,50.),(431.001,198.276,50.),(436.064,196.115,30.),(431.001,198.276,30.),(436.064,196.115,50.),(436.064,196.115,50.),(473.671,196.115,30.),(436.064,196.115,30.),(473.671,196.115,50.),(473.671,196.115,30.),(473.671,191.554,50.),(473.671,191.554,30.),(473.671,196.115,50.),(473.671,191.554,50.),(470.943,189.675,30.),(473.671,191.554,30.),(470.943,189.675,50.),(470.943,189.675,30.),(469.306,187.078,50.),(469.306,187.078,30.),(470.943,189.675,50.),(469.306,187.078,30.),(468.215,177.027,50.),(468.215,177.027,30.),(469.306,187.078,50.),(468.215,177.027,30.),(468.215,157.432,50.),(468.215,157.432,30.),(468.215,177.027,50.),(468.215,157.432,30.),(469.306,147.382,50.),(469.306,147.382,30.),(468.215,157.432,50.),(469.306,147.382,30.),(470.943,144.785,50.),(470.943,144.785,30.),(469.306,147.382,50.),(470.943,144.785,50.),(473.671,142.905,30.),(470.943,144.785,30.),(473.671,142.905,50.),(473.671,142.905,30.),(473.671,139.02,50.),(473.671,139.02,30.),(473.671,142.905,50.),(473.671,139.02,30.),(462.145,122.54,50.),(462.145,122.54,30.),(473.671,139.02,50.),(462.145,122.54,50.),(449.715,110.769,30.),(462.145,122.54,30.),(449.715,110.769,50.),(449.715,110.769,50.),(436.379,103.706,30.),(449.715,110.769,30.),(436.379,103.706,50.),(436.379,103.706,50.),(422.138,101.351,30.),(436.379,103.706,30.),(422.138,101.351,50.),(422.138,101.351,30.),(411.076,102.893,50.),(411.076,102.893,30.),(422.138,101.351,50.),(411.076,102.893,50.),(401.057,107.517,30.),(411.076,102.893,30.),(401.057,107.517,50.),(401.057,107.517,30.),(392.081,115.224,50.),(392.081,115.224,30.),(401.057,107.517,50.),(392.081,115.224,50.),(384.149,126.014,30.),(392.081,115.224,30.),(384.149,126.014,50.),(384.149,126.014,50.),(377.079,140.709,30.),(384.149,126.014,30.),(377.079,140.709,50.),(377.079,140.709,50.),(371.712,158.108,30.),(377.079,140.709,30.),(371.712,158.108,50.),(371.712,158.108,50.),(368.071,178.421,30.),(371.712,158.108,30.),(368.071,178.421,50.),(368.071,178.421,50.),(366.857,199.493,30.),(368.071,178.421,30.),(366.857,199.493,50.),(366.857,199.493,50.),(367.465,214.981,30.),(366.857,199.493,30.),(367.465,214.981,50.),(367.465,214.981,50.),(369.287,229.688,30.),(367.465,214.981,30.),(369.287,229.688,50.),(369.287,229.688,50.),(372.324,243.613,30.),(369.287,229.688,30.),(372.324,243.613,50.),(372.324,243.613,50.),(376.576,256.757,30.),(372.324,243.613,30.),(376.576,256.757,50.),(376.576,256.757,50.),(381.28,267.325,30.),(376.576,256.757,30.),(381.28,267.325,50.),(381.28,267.325,50.),(386.699,276.394,30.),(381.28,267.325,30.),(386.699,276.394,50.),(386.699,276.394,50.),(392.831,283.963,30.),(386.699,276.394,30.),(392.831,283.963,50.),(392.831,283.963,30.),(399.677,290.034,50.),(399.677,290.034,30.),(392.831,283.963,50.),(399.677,290.034,50.),(410.802,295.988,30.),(399.677,290.034,30.),(410.802,295.988,50.),(410.802,295.988,30.),(422.694,297.973,50.),(422.694,297.973,30.),(410.802,295.988,50.),(422.694,297.973,50.),(432.806,296.706,30.),(422.694,297.973,30.),(432.806,296.706,50.),(432.806,296.706,50.),(442.002,292.905,30.),(432.806,296.706,30.),(442.002,292.905,50.),(442.002,292.905,50.),(451.603,285.853,30.),(442.002,292.905,30.),(451.603,285.853,50.),(451.603,285.853,50.),(462.93,274.831,30.),(451.603,285.853,30.),(462.93,274.831,50.),(462.93,274.831,50.),(465.743,272.804,30.),(462.93,274.831,30.),(465.743,272.804,50.),(465.743,272.804,50.),(469.75,279.561,30.),(465.743,272.804,30.),(469.75,279.561,50.),(469.75,279.561,30.),(471.71,276.858,50.),(471.71,276.858,30.),(469.75,279.561,50.),(499.322,140.709,50.),(502.649,182.454,50.),(501.888,198.818,50.),(506.392,126.014,50.),(504.935,167.652,50.),(508.745,154.413,50.),(514.324,115.224,50.),(514.078,142.736,50.),(520.567,133.203,50.),(523.3,107.517,50.),(528.016,126.394,50.),(533.319,102.893,50.),(536.423,122.308,50.),(544.382,101.351,50.),(545.789,120.946,50.),(558.622,103.706,50.),(555.444,122.403,50.),(564.629,126.774,50.),(571.958,110.769,50.),(572.898,133.72,50.),(584.388,122.54,50.),(579.803,142.905,50.),(579.803,177.703,50.),(591.549,147.382,50.),(590.459,157.432,50.),(595.914,139.02,50.),(593.186,144.785,50.),(595.914,142.905,50.),(550.989,166.892,50.),(548.688,206.926,50.),(548.688,166.892,50.),(550.989,206.926,50.),(551.936,201.52,50.),(551.938,172.255,50.),(553.244,198.276,50.),(553.248,175.507,50.),(558.307,196.115,50.),(555.262,177.154,50.),(558.321,177.703,50.),(595.914,196.115,50.),(591.549,187.078,50.),(590.459,177.027,50.),(593.186,189.675,50.),(595.914,191.554,50.),(582.232,239.696,50.),(581.124,250.,50.),(580.273,242.061,50.),(490.314,178.421,50.),(489.708,214.981,50.),(489.101,199.493,50.),(491.53,229.688,50.),(493.956,158.108,50.),(494.567,243.613,50.),(498.819,256.757,50.),(503.523,267.325,50.),(502.718,216.058,50.),(505.211,231.63,50.),(508.942,276.394,50.),(509.364,245.534,50.),(515.074,283.963,50.),(515.179,257.77,50.),(521.92,290.034,50.),(521.527,266.786,50.),(528.641,273.226,50.),(533.045,295.988,50.),(536.522,277.09,50.),(544.937,297.973,50.),(545.17,278.378,50.),(555.049,296.706,50.),(552.439,277.46,50.),(559.505,274.704,50.),(564.245,292.905,50.),(566.369,270.112,50.),(573.846,285.853,50.),(573.031,263.682,50.),(579.101,255.617,50.),(585.173,274.831,50.),(587.986,272.804,50.),(593.954,276.858,50.),(591.993,279.561,50.),(593.954,276.858,30.),(582.232,239.696,50.),(582.232,239.696,30.),(593.954,276.858,50.),(582.232,239.696,50.),(580.273,242.061,30.),(582.232,239.696,30.),(580.273,242.061,50.),(580.273,242.061,50.),(581.124,250.,30.),(580.273,242.061,30.),(581.124,250.,50.),(581.124,250.,50.),(579.101,255.617,30.),(581.124,250.,30.),(579.101,255.617,50.),(579.101,255.617,50.),(573.031,263.682,30.),(579.101,255.617,30.),(573.031,263.682,50.),(573.031,263.682,30.),(566.369,270.112,50.),(566.369,270.112,30.),(573.031,263.682,50.),(566.369,270.112,30.),(559.505,274.704,50.),(559.505,274.704,30.),(566.369,270.112,50.),(559.505,274.704,50.),(552.439,277.46,30.),(559.505,274.704,30.),(552.439,277.46,50.),(552.439,277.46,50.),(545.17,278.378,30.),(552.439,277.46,30.),(545.17,278.378,50.),(545.17,278.378,30.),(536.522,277.09,50.),(536.522,277.09,30.),(545.17,278.378,50.),(536.522,277.09,50.),(528.641,273.226,30.),(536.522,277.09,30.),(528.641,273.226,50.),(528.641,273.226,50.),(521.527,266.786,30.),(528.641,273.226,30.),(521.527,266.786,50.),(521.527,266.786,30.),(515.179,257.77,50.),(515.179,257.77,30.),(521.527,266.786,50.),(515.179,257.77,30.),(509.364,245.534,50.),(509.364,245.534,30.),(515.179,257.77,50.),(509.364,245.534,30.),(505.211,231.63,50.),(505.211,231.63,30.),(509.364,245.534,50.),(505.211,231.63,30.),(502.718,216.058,50.),(502.718,216.058,30.),(505.211,231.63,50.),(502.718,216.058,30.),(501.888,198.818,50.),(501.888,198.818,30.),(502.718,216.058,50.),(501.888,198.818,30.),(502.649,182.454,50.),(502.649,182.454,30.),(501.888,198.818,50.),(502.649,182.454,30.),(504.935,167.652,50.),(504.935,167.652,30.),(502.649,182.454,50.),(504.935,167.652,30.),(508.745,154.413,50.),(508.745,154.413,30.),(504.935,167.652,50.),(508.745,154.413,30.),(514.078,142.736,50.),(514.078,142.736,30.),(508.745,154.413,50.),(514.078,142.736,30.),(520.567,133.203,50.),(520.567,133.203,30.),(514.078,142.736,50.),(520.567,133.203,50.),(528.016,126.394,30.),(520.567,133.203,30.),(528.016,126.394,50.),(528.016,126.394,50.),(536.423,122.308,30.),(528.016,126.394,30.),(536.423,122.308,50.),(536.423,122.308,50.),(545.789,120.946,30.),(536.423,122.308,30.),(545.789,120.946,50.),(545.789,120.946,50.),(555.444,122.403,30.),(545.789,120.946,30.),(555.444,122.403,50.),(555.444,122.403,30.),(564.629,126.774,50.),(564.629,126.774,30.),(555.444,122.403,50.),(564.629,126.774,30.),(572.898,133.72,50.),(572.898,133.72,30.),(564.629,126.774,50.),(572.898,133.72,50.),(579.803,142.905,30.),(572.898,133.72,30.),(579.803,142.905,50.),(579.803,142.905,50.),(579.803,177.703,30.),(579.803,142.905,30.),(579.803,177.703,50.),(579.803,177.703,50.),(558.321,177.703,30.),(579.803,177.703,30.),(558.321,177.703,50.),(558.321,177.703,50.),(555.262,177.154,30.),(558.321,177.703,30.),(555.262,177.154,50.),(555.262,177.154,50.),(553.248,175.507,30.),(555.262,177.154,30.),(553.248,175.507,50.),(553.248,175.507,30.),(551.938,172.255,50.),(551.938,172.255,30.),(553.248,175.507,50.),(551.938,172.255,30.),(550.989,166.892,50.),(550.989,166.892,30.),(551.938,172.255,50.),(550.989,166.892,50.),(548.688,166.892,30.),(550.989,166.892,30.),(548.688,166.892,50.),(548.688,166.892,50.),(548.688,206.926,30.),(548.688,166.892,30.),(548.688,206.926,50.),(548.688,206.926,30.),(550.989,206.926,50.),(550.989,206.926,30.),(548.688,206.926,50.),(550.989,206.926,30.),(551.936,201.52,50.),(551.936,201.52,30.),(550.989,206.926,50.),(551.936,201.52,30.),(553.244,198.276,50.),(553.244,198.276,30.),(551.936,201.52,50.),(553.244,198.276,50.),(558.307,196.115,30.),(553.244,198.276,30.),(558.307,196.115,50.),(558.307,196.115,50.),(595.914,196.115,30.),(558.307,196.115,30.),(595.914,196.115,50.),(595.914,196.115,30.),(595.914,191.554,50.),(595.914,191.554,30.),(595.914,196.115,50.),(595.914,191.554,50.),(593.186,189.675,30.),(595.914,191.554,30.),(593.186,189.675,50.),(593.186,189.675,30.),(591.549,187.078,50.),(591.549,187.078,30.),(593.186,189.675,50.),(591.549,187.078,30.),(590.459,177.027,50.),(590.459,177.027,30.),(591.549,187.078,50.),(590.459,177.027,30.),(590.459,157.432,50.),(590.459,157.432,30.),(590.459,177.027,50.),(590.459,157.432,30.),(591.549,147.382,50.),(591.549,147.382,30.),(590.459,157.432,50.),(591.549,147.382,30.),(593.186,144.785,50.),(593.186,144.785,30.),(591.549,147.382,50.),(593.186,144.785,50.),(595.914,142.905,30.),(593.186,144.785,30.),(595.914,142.905,50.),(595.914,142.905,30.),(595.914,139.02,50.),(595.914,139.02,30.),(595.914,142.905,50.),(595.914,139.02,30.),(584.388,122.54,50.),(584.388,122.54,30.),(595.914,139.02,50.),(584.388,122.54,50.),(571.958,110.769,30.),(584.388,122.54,30.),(571.958,110.769,50.),(571.958,110.769,50.),(558.622,103.706,30.),(571.958,110.769,30.),(558.622,103.706,50.),(558.622,103.706,50.),(544.382,101.351,30.),(558.622,103.706,30.),(544.382,101.351,50.),(544.382,101.351,30.),(533.319,102.893,50.),(533.319,102.893,30.),(544.382,101.351,50.),(533.319,102.893,30.),(523.3,107.517,50.),(523.3,107.517,30.),(533.319,102.893,50.),(523.3,107.517,30.),(514.324,115.224,50.),(514.324,115.224,30.),(523.3,107.517,50.),(514.324,115.224,50.),(506.392,126.014,30.),(514.324,115.224,30.),(506.392,126.014,50.),(506.392,126.014,50.),(499.322,140.709,30.),(506.392,126.014,30.),(499.322,140.709,50.),(499.322,140.709,50.),(493.956,158.108,30.),(499.322,140.709,30.),(493.956,158.108,50.),(493.956,158.108,50.),(490.314,178.421,30.),(493.956,158.108,30.),(490.314,178.421,50.),(490.314,178.421,50.),(489.101,199.493,30.),(490.314,178.421,30.),(489.101,199.493,50.),(489.101,199.493,50.),(489.708,214.981,30.),(489.101,199.493,30.),(489.708,214.981,50.),(489.708,214.981,50.),(491.53,229.688,30.),(489.708,214.981,30.),(491.53,229.688,50.),(491.53,229.688,50.),(494.567,243.613,30.),(491.53,229.688,30.),(494.567,243.613,50.),(494.567,243.613,50.),(498.819,256.757,30.),(494.567,243.613,30.),(498.819,256.757,50.),(498.819,256.757,50.),(503.523,267.325,30.),(498.819,256.757,30.),(503.523,267.325,50.),(503.523,267.325,50.),(508.942,276.394,30.),(503.523,267.325,30.),(508.942,276.394,50.),(508.942,276.394,50.),(515.074,283.963,30.),(508.942,276.394,30.),(515.074,283.963,50.),(515.074,283.963,30.),(521.92,290.034,50.),(521.92,290.034,30.),(515.074,283.963,50.),(521.92,290.034,30.),(533.045,295.988,50.),(533.045,295.988,30.),(521.92,290.034,50.),(533.045,295.988,50.),(544.937,297.973,30.),(533.045,295.988,30.),(544.937,297.973,50.),(544.937,297.973,50.),(555.049,296.706,30.),(544.937,297.973,30.),(555.049,296.706,50.),(555.049,296.706,50.),(564.245,292.905,30.),(555.049,296.706,30.),(564.245,292.905,50.),(564.245,292.905,50.),(573.846,285.853,30.),(564.245,292.905,30.),(573.846,285.853,50.),(573.846,285.853,50.),(585.173,274.831,30.),(573.846,285.853,30.),(585.173,274.831,50.),(585.173,274.831,50.),(587.986,272.804,30.),(585.173,274.831,30.),(587.986,272.804,50.),(587.986,272.804,50.),(591.993,279.561,30.),(587.986,272.804,30.),(591.993,279.561,50.),(591.993,279.561,30.),(593.954,276.858,50.),(593.954,276.858,30.),(591.993,279.561,50.),(631.291,193.919,30.),(631.291,123.818,50.),(631.291,123.818,30.),(631.291,193.919,50.),(631.291,123.818,50.),(690.282,123.818,30.),(631.291,123.818,30.),(690.282,123.818,50.),(690.282,123.818,30.),(695.354,125.979,50.),(695.354,125.979,30.),(690.282,123.818,50.),(695.354,125.979,50.),(696.665,129.222,30.),(695.354,125.979,30.),(696.665,129.222,50.),(696.665,129.222,50.),(697.613,134.628,30.),(696.665,129.222,30.),(697.613,134.628,50.),(697.613,134.628,30.),(700.,134.628,50.),(700.,134.628,30.),(697.613,134.628,50.),(700.,134.628,30.),(700.,94.595,50.),(700.,94.595,30.),(700.,134.628,50.),(700.,94.595,50.),(697.613,94.595,30.),(700.,94.595,30.),(697.613,94.595,50.),(697.613,94.595,50.),(696.675,99.958,30.),(697.613,94.595,30.),(696.675,99.958,50.),(696.675,99.958,50.),(695.397,103.209,30.),(696.675,99.958,30.),(695.397,103.209,50.),(695.397,103.209,30.),(693.415,104.856,50.),(693.415,104.856,30.),(695.397,103.209,50.),(693.415,104.856,50.),(690.367,105.405,30.),(693.415,104.856,30.),(690.367,105.405,50.),(690.367,105.405,50.),(613.645,105.405,30.),(690.367,105.405,30.),(613.645,105.405,50.),(613.645,105.405,50.),(613.645,109.966,30.),(613.645,105.405,30.),(613.645,109.966,50.),(613.645,109.966,50.),(616.405,111.972,30.),(613.645,109.966,30.),(616.405,111.972,50.),(616.405,111.972,50.),(618.036,114.611,30.),(616.405,111.972,30.),(618.036,114.611,50.),(618.036,114.611,50.),(619.101,124.493,30.),(618.036,114.611,30.),(619.101,124.493,50.),(619.101,124.493,50.),(619.101,275.507,30.),(619.101,124.493,30.),(619.101,275.507,50.),(619.101,275.507,50.),(618.824,281.546,30.),(619.101,275.507,30.),(618.824,281.546,50.),(618.824,281.546,50.),(617.993,285.473,30.),(618.824,281.546,30.),(617.993,285.473,50.),(617.993,285.473,50.),(616.352,288.049,30.),(617.993,285.473,30.),(616.352,288.049,50.),(616.352,288.049,30.),(613.645,290.034,50.),(613.645,290.034,30.),(616.352,288.049,50.),(699.403,305.405,30.),(699.403,265.372,50.),(699.403,265.372,30.),(699.403,305.405,50.),(699.403,265.372,50.),(697.102,265.372,30.),(699.403,265.372,30.),(697.102,265.372,50.),(697.102,265.372,50.),(696.1,270.778,30.),(697.102,265.372,30.),(696.1,270.778,50.),(696.1,270.778,50.),(694.8,274.021,30.),(696.1,270.778,30.),(694.8,274.021,50.),(694.8,274.021,30.),(692.818,275.642,50.),(692.818,275.642,30.),(694.8,274.021,50.),(692.818,275.642,50.),(689.77,276.182,30.),(692.818,275.642,30.),(689.77,276.182,50.),(689.77,276.182,30.),(631.291,276.182,50.),(631.291,276.182,30.),(689.77,276.182,50.),(631.291,276.182,30.),(631.291,212.331,50.),(631.291,212.331,30.),(631.291,276.182,50.),(631.291,212.331,30.),(668.544,212.331,50.),(668.544,212.331,30.),(631.291,212.331,50.),(668.544,212.331,50.),(671.592,212.88,30.),(668.544,212.331,30.),(671.592,212.88,50.),(671.592,212.88,30.),(673.574,214.527,50.),(673.574,214.527,30.),(671.592,212.88,50.),(673.574,214.527,50.),(674.874,217.779,30.),(673.574,214.527,30.),(674.874,217.779,50.),(674.874,217.779,50.),(675.875,223.142,30.),(674.874,217.779,30.),(675.875,223.142,50.),(675.875,223.142,30.),(678.177,223.142,50.),(678.177,223.142,30.),(675.875,223.142,50.),(678.177,223.142,30.),(678.177,183.108,50.),(678.177,183.108,30.),(678.177,223.142,50.),(678.177,183.108,50.),(675.875,183.108,30.),(678.177,183.108,30.),(675.875,183.108,50.),(675.875,183.108,50.),(674.863,188.514,30.),(675.875,183.108,30.),(674.863,188.514,50.),(674.863,188.514,50.),(673.531,191.757,30.),(674.863,188.514,30.),(673.531,191.757,50.),(673.531,191.757,30.),(668.544,193.919,50.),(668.544,193.919,30.),(673.531,191.757,50.),(668.544,193.919,50.),(631.291,193.919,30.),(668.544,193.919,30.),(631.291,193.919,50.),(690.367,105.405,50.),(613.645,109.966,50.),(613.645,105.405,50.),(616.405,111.972,50.),(618.036,114.611,50.),(619.101,124.493,50.),(631.291,123.818,50.),(619.101,275.507,50.),(690.282,123.818,50.),(695.354,125.979,50.),(693.415,104.856,50.),(695.397,103.209,50.),(696.665,129.222,50.),(696.675,99.958,50.),(697.613,134.628,50.),(697.613,94.595,50.),(700.,94.595,50.),(700.,134.628,50.),(631.291,193.919,50.),(631.291,212.331,50.),(668.544,212.331,50.),(668.544,193.919,50.),(673.531,191.757,50.),(671.592,212.88,50.),(673.574,214.527,50.),(674.863,188.514,50.),(674.874,217.779,50.),(675.875,183.108,50.),(675.875,223.142,50.),(678.177,183.108,50.),(678.177,223.142,50.),(616.352,288.049,50.),(613.645,294.595,50.),(613.645,290.034,50.),(689.77,294.595,50.),(617.993,285.473,50.),(618.824,281.546,50.),(631.291,276.182,50.),(689.77,276.182,50.),(692.818,275.642,50.),(692.818,295.144,50.),(694.8,296.791,50.),(694.8,274.021,50.),(696.1,300.042,50.),(696.1,270.778,50.),(697.102,265.372,50.),(697.102,305.405,50.),(699.403,265.372,50.),(699.403,305.405,50.),(613.645,290.034,50.),(613.645,294.595,30.),(613.645,290.034,30.),(613.645,294.595,50.),(697.102,305.405,50.),(699.403,305.405,30.),(697.102,305.405,30.),(699.403,305.405,50.),(613.645,294.595,50.),(689.77,294.595,30.),(613.645,294.595,30.),(689.77,294.595,50.),(696.1,300.042,50.),(697.102,305.405,30.),(696.1,300.042,30.),(697.102,305.405,50.),(689.77,294.595,50.),(692.818,295.144,30.),(689.77,294.595,30.),(692.818,295.144,50.),(692.818,295.144,30.),(694.8,296.791,50.),(694.8,296.791,30.),(692.818,295.144,50.),(694.8,296.791,50.),(696.1,300.042,30.),(694.8,296.791,30.),(696.1,300.042,50.),(689.77,294.595,30.),(613.645,290.034,30.),(613.645,294.595,30.),(616.352,288.049,30.),(617.993,285.473,30.),(618.824,281.546,30.),(619.101,275.507,30.),(631.291,276.182,30.),(619.101,124.493,30.),(631.291,212.331,30.),(689.77,276.182,30.),(692.818,295.144,30.),(692.818,275.642,30.),(694.8,296.791,30.),(694.8,274.021,30.),(696.1,300.042,30.),(696.1,270.778,30.),(697.102,305.405,30.),(697.102,265.372,30.),(699.403,265.372,30.),(699.403,305.405,30.),(631.291,193.919,30.),(631.291,123.818,30.),(668.544,212.331,30.),(668.544,193.919,30.),(671.592,212.88,30.),(673.531,191.757,30.),(673.574,214.527,30.),(674.863,188.514,30.),(674.874,217.779,30.),(675.875,183.108,30.),(675.875,223.142,30.),(678.177,223.142,30.),(678.177,183.108,30.),(616.405,111.972,30.),(613.645,105.405,30.),(613.645,109.966,30.),(690.367,105.405,30.),(618.036,114.611,30.),(690.282,123.818,30.),(695.354,125.979,30.),(693.415,104.856,30.),(695.397,103.209,30.),(696.665,129.222,30.),(696.675,99.958,30.),(697.613,134.628,30.),(697.613,94.595,30.),(700.,94.595,30.),(700.,134.628,30.),(489.708,214.981,30.),(490.314,178.421,30.),(489.101,199.493,30.),(491.53,229.688,30.),(493.956,158.108,30.),(494.567,243.613,30.),(499.322,140.709,30.),(498.819,256.757,30.),(503.523,267.325,30.),(501.888,198.818,30.),(502.718,216.058,30.),(505.211,231.63,30.),(508.942,276.394,30.),(509.364,245.534,30.),(515.074,283.963,30.),(515.179,257.77,30.),(521.92,290.034,30.),(521.527,266.786,30.),(528.641,273.226,30.),(533.045,295.988,30.),(536.522,277.09,30.),(544.937,297.973,30.),(545.17,278.378,30.),(555.049,296.706,30.),(552.439,277.46,30.),(559.505,274.704,30.),(564.245,292.905,30.),(566.369,270.112,30.),(573.846,285.853,30.),(573.031,263.682,30.),(579.101,255.617,30.),(585.173,274.831,30.),(581.124,250.,30.),(582.232,239.696,30.),(587.986,272.804,30.),(593.954,276.858,30.),(591.993,279.561,30.),(580.273,242.061,30.),(550.989,206.926,30.),(548.688,166.892,30.),(548.688,206.926,30.),(550.989,166.892,30.),(551.936,201.52,30.),(551.938,172.255,30.),(553.244,198.276,30.),(553.248,175.507,30.),(558.307,196.115,30.),(555.262,177.154,30.),(558.321,177.703,30.),(595.914,196.115,30.),(579.803,177.703,30.),(591.549,187.078,30.),(579.803,142.905,30.),(584.388,122.54,30.),(590.459,177.027,30.),(590.459,157.432,30.),(593.186,189.675,30.),(595.914,191.554,30.),(591.549,147.382,30.),(595.914,139.02,30.),(593.186,144.785,30.),(595.914,142.905,30.),(502.649,182.454,30.),(506.392,126.014,30.),(504.935,167.652,30.),(508.745,154.413,30.),(514.324,115.224,30.),(514.078,142.736,30.),(520.567,133.203,30.),(523.3,107.517,30.),(528.016,126.394,30.),(533.319,102.893,30.),(536.423,122.308,30.),(544.382,101.351,30.),(545.789,120.946,30.),(558.622,103.706,30.),(555.444,122.403,30.),(564.629,126.774,30.),(571.958,110.769,30.),(572.898,133.72,30.),(367.465,214.981,30.),(368.071,178.421,30.),(366.857,199.493,30.),(369.287,229.688,30.),(371.712,158.108,30.),(372.324,243.613,30.),(377.079,140.709,30.),(376.576,256.757,30.),(381.28,267.325,30.),(379.644,198.818,30.),(380.475,216.058,30.),(382.967,231.63,30.),(386.699,276.394,30.),(387.121,245.534,30.),(392.831,283.963,30.),(392.936,257.77,30.),(399.677,290.034,30.),(399.284,266.786,30.),(406.398,273.226,30.),(410.802,295.988,30.),(414.279,277.09,30.),(422.694,297.973,30.),(422.927,278.378,30.),(432.806,296.706,30.),(430.196,277.46,30.),(437.262,274.704,30.),(442.002,292.905,30.),(444.126,270.112,30.),(451.603,285.853,30.),(450.788,263.682,30.),(456.858,255.617,30.),(462.93,274.831,30.),(458.881,250.,30.),(459.989,239.696,30.),(465.743,272.804,30.),(471.71,276.858,30.),(469.75,279.561,30.),(458.03,242.061,30.),(426.445,206.926,30.),(428.746,166.892,30.),(426.445,166.892,30.),(428.746,206.926,30.),(429.693,201.52,30.),(429.695,172.255,30.),(431.001,198.276,30.),(431.005,175.507,30.),(436.064,196.115,30.),(433.019,177.154,30.),(436.077,177.703,30.),(473.671,196.115,30.),(457.56,177.703,30.),(469.306,187.078,30.),(457.56,142.905,30.),(462.145,122.54,30.),(468.215,177.027,30.),(470.943,189.675,30.),(473.671,191.554,30.),(469.306,147.382,30.),(473.671,139.02,30.),(468.215,157.432,30.),(470.943,144.785,30.),(473.671,142.905,30.),(380.406,182.454,30.),(384.149,126.014,30.),(382.692,167.652,30.),(386.501,154.413,30.),(392.081,115.224,30.),(391.835,142.736,30.),(398.324,133.203,30.),(401.057,107.517,30.),(405.772,126.394,30.),(411.076,102.893,30.),(414.18,122.308,30.),(422.138,101.351,30.),(423.546,120.946,30.),(436.379,103.706,30.),(433.2,122.403,30.),(442.386,126.774,30.),(449.715,110.769,30.),(450.655,133.72,30.),(289.849,294.595,30.),(262.942,290.034,30.),(262.942,294.595,30.),(266.203,287.373,30.),(268.995,283.446,30.),(276.923,264.886,30.),(287.038,287.838,30.),(286.101,283.615,30.),(289.849,290.034,30.),(286.676,278.593,30.),(306.333,188.936,30.),(288.4,272.986,30.),(313.579,207.683,30.),(306.333,124.493,30.),(359.782,294.595,30.),(335.448,290.034,30.),(335.448,294.595,30.),(338.282,287.838,30.),(339.227,283.277,30.),(352.707,281.334,30.),(343.841,259.655,30.),(356.095,286.592,30.),(359.782,290.034,30.),(336.897,272.817,30.),(318.523,188.936,30.),(300.877,109.966,30.),(323.979,105.405,30.),(300.877,105.405,30.),(303.583,111.972,30.),(305.224,114.611,30.),(306.056,118.56,30.),(319.588,114.611,30.),(318.523,124.493,30.),(321.219,111.972,30.),(323.979,109.966,30.),(219.381,294.595,30.),(162.693,290.034,30.),(162.693,294.595,30.),(165.399,288.049,30.),(167.04,285.473,30.),(167.871,281.546,30.),(168.148,275.507,30.),(180.339,276.182,30.),(180.339,124.493,30.),(180.339,191.047,30.),(218.017,276.182,30.),(229.888,274.113,30.),(228.13,293.919,30.),(235.109,291.892,30.),(234.305,271.527,30.),(237.709,267.905,30.),(240.81,288.26,30.),(240.469,262.88,30.),(242.44,256.757,30.),(245.722,282.77,30.),(243.623,249.535,30.),(244.018,241.216,30.),(244.849,202.191,30.),(248.706,207.855,30.),(250.049,275.042,30.),(251.727,214.722,30.),(253.139,265.709,30.),(253.885,222.741,30.),(254.993,254.772,30.),(255.179,231.91,30.),(255.611,242.23,30.),(229.824,210.726,30.),(228.417,192.736,30.),(216.653,209.459,30.),(234.704,194.632,30.),(237.283,215.372,30.),(240.181,197.783,30.),(240.229,219.774,30.),(242.334,225.549,30.),(243.597,232.696,30.),(180.339,209.459,30.),(215.05,191.047,30.),(237.011,122.297,30.),(252.372,117.399,30.),(238.973,114.189,30.),(235.647,109.966,30.),(259.277,105.405,30.),(235.647,105.405,30.),(238.142,111.698,30.),(254.886,112.148,30.),(259.277,109.966,30.),(165.452,111.972,30.),(162.693,105.405,30.),(162.693,109.966,30.),(185.794,105.405,30.),(167.083,114.611,30.),(168.148,124.493,30.),(181.447,114.611,30.),(180.616,118.56,30.),(183.088,111.972,30.),(185.794,109.966,30.),(49.741,294.595,30.),(52.448,288.049,30.),(49.741,290.034,30.),(107.027,294.595,30.),(54.089,285.473,30.),(54.92,281.546,30.),(55.197,275.507,30.),(67.387,276.182,30.),(67.387,213.514,30.),(102.594,276.182,30.),(115.083,274.916,30.),(121.519,292.314,30.),(122.542,269.932,30.),(126.697,289.253,30.),(125.861,265.034,30.),(128.232,258.953,30.),(131.151,284.628,30.),(129.654,251.689,30.),(130.128,243.243,30.),(128.487,229.265,30.),(128.168,204.561,30.),(126.436,223.955,30.),(134.135,212.099,30.),(129.718,235.695,30.),(135.574,277.196,30.),(138.397,221.199,30.),(138.951,267.399,30.),(140.955,231.862,30.),(141.093,256.081,30.),(141.807,244.088,30.),(67.387,195.101,30.),(67.387,123.818,30.),(103.617,213.514,30.),(104.299,195.101,30.),(116.276,214.78,30.),(117.469,193.581,30.),(123.565,219.764,30.),(121.615,191.385,30.),(125.269,187.838,30.),(128.775,182.348,30.),(135.515,196.59,30.),(131.279,175.507,30.),(132.782,167.314,30.),(133.283,157.77,30.),(49.741,109.966,30.),(108.817,105.405,30.),(49.741,105.405,30.),(52.448,111.972,30.),(54.089,114.611,30.),(54.92,118.56,30.),(55.197,124.493,30.),(105.407,123.818,30.),(118.705,125.253,30.),(118.173,106.208,30.),(125.44,108.615,30.),(122.755,127.386,30.),(126.378,130.912,30.),(131.301,113.007,30.),(129.399,135.821,30.),(131.556,141.934,30.),(136.437,119.764,30.),(132.851,149.25,30.),(140.763,186.191,30.),(140.166,127.544,30.),(142.83,136.529,30.),(143.912,173.364,30.),(144.429,146.717,30.),(144.961,158.108,30.),(-21.866,294.595,30.),(-97.991,290.034,30.),(-97.991,294.595,30.),(-95.284,288.049,30.),(-93.643,285.473,30.),(-92.812,281.546,30.),(-92.535,275.507,30.),(-80.345,276.182,30.),(-21.866,276.182,30.),(-18.818,295.144,30.),(-18.818,275.642,30.),(-16.836,274.021,30.),(-16.836,296.791,30.),(-15.536,300.042,30.),(-15.536,270.778,30.),(-14.534,305.405,30.),(-14.534,265.372,30.),(-12.233,305.405,30.),(-12.233,265.372,30.),(-80.345,212.331,30.),(-80.345,193.919,30.),(-43.092,193.919,30.),(-43.092,212.331,30.),(-38.105,191.757,30.),(-40.044,212.88,30.),(-38.062,214.527,30.),(-36.773,188.514,30.),(-36.762,217.779,30.),(-35.761,183.108,30.),(-35.761,223.142,30.),(-33.459,183.108,30.),(-33.459,223.142,30.),(-97.991,109.966,30.),(-21.269,105.405,30.),(-97.991,105.405,30.),(-95.231,111.972,30.),(-93.6,114.611,30.),(-92.535,124.493,30.),(-80.345,123.818,30.),(-21.354,123.818,30.),(-16.282,125.979,30.),(-18.221,104.856,30.),(-16.239,103.209,30.),(-14.971,129.222,30.),(-14.961,99.958,30.),(-14.023,134.628,30.),(-14.023,94.595,30.),(-11.636,94.595,30.),(-11.636,134.628,30.),(-169.171,294.595,30.),(-217.421,290.034,30.),(-217.421,294.595,30.),(-214.661,288.028,30.),(-213.031,285.389,30.),(-211.965,275.507,30.),(-199.775,276.182,30.),(-199.775,123.818,30.),(-169.853,276.182,30.),(-158.697,275.,30.),(-152.293,292.356,30.),(-150.119,271.453,30.),(-145.707,289.559,30.),(-143.416,265.076,30.),(-140.358,285.642,30.),(-137.886,255.405,30.),(-134.796,279.054,30.),(-133.97,244.151,30.),(-129.873,270.608,30.),(-131.173,231.166,30.),(-129.494,216.448,30.),(-125.589,260.304,30.),(-128.935,200.,30.),(-127.366,135.008,30.),(-123.82,145.101,30.),(-121.945,248.142,30.),(-120.464,157.908,30.),(-117.597,224.789,30.),(-118.066,171.326,30.),(-116.628,185.357,30.),(-116.148,200.,30.),(-217.421,109.966,30.),(-169.171,105.405,30.),(-217.421,105.405,30.),(-214.661,111.972,30.),(-213.031,114.611,30.),(-211.965,124.493,30.),(-169.853,123.818,30.),(-155.17,126.098,30.),(-152.879,107.644,30.),(-149.538,128.948,30.),(-146.259,110.441,30.),(-145.047,132.939,30.),(-140.656,114.358,30.),(-140.976,138.64,30.),(-137.46,145.777,30.),(-135.784,119.637,30.),(-134.497,154.35,30.),(-131.354,126.52,30.),(-132.089,164.358,30.),(-129.724,181.377,30.),(-292.011,294.595,30.),(-315.113,290.034,30.),(-315.113,294.595,30.),(-312.406,288.049,30.),(-310.765,285.473,30.),(-309.934,281.546,30.),(-309.657,275.507,30.),(-296.359,285.473,30.),(-297.19,281.546,30.),(-309.657,124.493,30.),(-297.467,275.507,30.),(-294.718,288.049,30.),(-292.011,290.034,30.),(-312.406,111.972,30.),(-315.113,105.405,30.),(-315.113,109.966,30.),(-239.244,105.405,30.),(-310.765,114.611,30.),(-309.934,118.56,30.),(-297.467,123.818,30.),(-239.244,123.818,30.),(-234.172,125.979,30.),(-236.186,104.856,30.),(-234.172,103.209,30.),(-232.84,99.958,30.),(-232.84,129.222,30.),(-231.827,94.595,30.),(-231.827,134.628,30.),(-229.526,94.595,30.),(-229.526,134.628,30.),(-447.847,214.569,30.),(-447.314,178.885,30.),(-448.353,200.,30.),(-446.328,228.378,30.),(-444.197,159.797,30.),(-443.798,241.427,30.),(-439.002,142.736,30.),(-440.255,253.716,30.),(-435.518,265.446,30.),(-435.566,200.,30.),(-434.873,215.266,30.),(-429.918,275.465,30.),(-432.795,229.307,30.),(-429.332,242.124,30.),(-423.456,283.773,30.),(-424.484,253.716,30.),(-417.627,264.802,30.),(-416.13,290.372,30.),(-409.758,272.72,30.),(-404.515,296.41,30.),(-400.876,277.47,30.),(-390.982,298.649,30.),(-390.982,279.054,30.),(-378.856,297.002,30.),(-380.971,277.344,30.),(-371.994,272.551,30.),(-367.966,292.061,30.),(-364.05,264.675,30.),(-358.312,283.826,30.),(-357.139,253.716,30.),(-349.893,272.297,30.),(-352.291,242.251,30.),(-348.828,229.307,30.),(-342.621,257.242,30.),(-346.75,214.886,30.),(-346.057,198.986,30.),(-345.6,135.753,30.),(-341.454,146.284,30.),(-337.426,239.949,30.),(-337.874,158.488,30.),(-335.316,171.284,30.),(-334.309,220.418,30.),(-333.782,184.671,30.),(-333.27,198.649,30.),(-434.873,184.734,30.),(-431.73,127.703,30.),(-432.795,170.693,30.),(-429.332,157.876,30.),(-423.322,116.174,30.),(-424.484,146.284,30.),(-417.616,135.198,30.),(-413.7,107.939,30.),(-409.715,127.28,30.),(-402.863,102.998,30.),(-400.78,122.53,30.),(-390.812,101.351,30.),(-390.812,120.946,30.),(-380.843,122.53,30.),(-382.619,102.053,30.),(-375.004,104.16,30.),(-371.908,127.28,30.),(-367.967,107.67,30.),(-364.007,135.198,30.),(-361.508,112.584,30.),(-357.139,146.284,30.),(-355.628,118.903,30.),(-352.291,157.813,30.),(-350.325,126.626,30.),(-348.828,170.439,30.),(-346.75,184.164,30.),(-517.658,294.595,30.),(-593.783,290.034,30.),(-593.783,294.595,30.),(-591.077,288.049,30.),(-589.436,285.473,30.),(-588.604,281.546,30.),(-588.327,275.507,30.),(-576.137,276.182,30.),(-588.327,124.493,30.),(-517.658,276.182,30.),(-514.611,275.642,30.),(-514.611,295.144,30.),(-512.629,296.791,30.),(-512.629,274.021,30.),(-511.329,270.778,30.),(-511.329,300.042,30.),(-510.327,305.405,30.),(-510.327,265.372,30.),(-508.025,265.372,30.),(-508.025,305.405,30.),(-538.884,212.331,30.),(-576.137,193.919,30.),(-576.137,212.331,30.),(-538.884,193.919,30.),(-535.837,212.88,30.),(-533.898,191.757,30.),(-533.855,214.527,30.),(-532.566,188.514,30.),(-532.555,217.779,30.),(-531.553,183.108,30.),(-531.553,223.142,30.),(-529.252,183.108,30.),(-529.252,223.142,30.),(-593.783,109.966,30.),(-517.061,105.405,30.),(-593.783,105.405,30.),(-591.023,111.972,30.),(-589.393,114.611,30.),(-576.137,123.818,30.),(-517.147,123.818,30.),(-512.075,125.979,30.),(-514.014,104.856,30.),(-512.032,103.209,30.),(-510.764,129.222,30.),(-510.753,99.958,30.),(-509.816,134.628,30.),(-509.816,94.595,30.),(-507.429,94.595,30.),(-507.429,134.628,30.),(-673.093,294.595,30.),(-700.,290.034,30.),(-700.,294.595,30.),(-696.739,287.373,30.),(-693.948,283.446,30.),(-686.02,264.886,30.),(-675.904,287.838,30.),(-676.841,283.615,30.),(-673.093,290.034,30.),(-676.266,278.593,30.),(-656.61,188.936,30.),(-674.542,272.986,30.),(-649.364,207.683,30.),(-627.494,294.595,30.),(-624.66,287.838,30.),(-627.494,290.034,30.),(-603.16,294.595,30.),(-623.715,283.277,30.),(-610.236,281.334,30.),(-619.101,259.655,30.),(-606.847,286.592,30.),(-603.16,290.034,30.),(-626.045,272.817,30.),(-644.419,188.936,30.),(-659.359,111.972,30.),(-662.065,105.405,30.),(-662.065,109.966,30.),(-638.964,105.405,30.),(-657.718,114.611,30.),(-656.887,118.56,30.),(-656.61,124.493,30.),(-643.354,114.611,30.),(-644.419,124.493,30.),(-641.723,111.972,30.),(-638.964,109.966,30.),(-517.061,105.405,50.),(-593.783,109.966,50.),(-593.783,105.405,50.),(-591.023,111.972,50.),(-589.393,114.611,50.),(-588.327,124.493,50.),(-576.137,123.818,50.),(-588.327,275.507,50.),(-576.137,212.331,50.),(-576.137,193.919,50.),(-517.147,123.818,50.),(-512.075,125.979,50.),(-514.014,104.856,50.),(-512.032,103.209,50.),(-510.764,129.222,50.),(-510.753,99.958,50.),(-509.816,134.628,50.),(-509.816,94.595,50.),(-507.429,94.595,50.),(-507.429,134.628,50.),(-538.884,212.331,50.),(-538.884,193.919,50.),(-535.837,212.88,50.),(-533.898,191.757,50.),(-533.855,214.527,50.),(-532.566,188.514,50.),(-532.555,217.779,50.),(-531.553,183.108,50.),(-531.553,223.142,50.),(-529.252,183.108,50.),(-529.252,223.142,50.),(-591.077,288.049,50.),(-593.783,294.595,50.),(-593.783,290.034,50.),(-517.658,294.595,50.),(-589.436,285.473,50.),(-588.604,281.546,50.),(-576.137,276.182,50.),(-517.658,276.182,50.),(-514.611,295.144,50.),(-514.611,275.642,50.),(-512.629,296.791,50.),(-512.629,274.021,50.),(-511.329,270.778,50.),(-511.329,300.042,50.),(-510.327,265.372,50.),(-510.327,305.405,50.),(-508.025,305.405,50.),(-508.025,265.372,50.)),$); +#812=IFCSTYLEDITEM(#810,(#592),$); +#813=IFCMEMBER('3Py7bxE7n5JOxOxHlYh2N3',#1,'rail bridge - arch segment','An arch segment, forming part of the rail bridge\X\27s structure.','arch_segment',#814,#823,'454425.1027895.956001.1884275.1998900',$); +#814=IFCLOCALPLACEMENT(#760,#815); +#815=IFCAXIS2PLACEMENT3D(#816,#817,#818); +#816=IFCCARTESIANPOINT((5750.,0.,3290.346)); +#817=IFCDIRECTION((0.,0.,1.)); +#818=IFCDIRECTION((1.,2.57628149445829E-17,0.)); +#819=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#820)); +#820=IFCTRIANGULATEDFACESET(#821,((2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(2.9533595941466064E-14,-1.,2.556102309219879E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(-2.8988434096317344E-14,1.,-2.5569888607106647E-12),(1.,2.9770809209750606E-14,9.229352089037605E-14),(1.,2.9770809209750606E-14,9.229352089037605E-14),(1.,2.9770809209750606E-14,9.229352089037605E-14),(1.,2.9770809209750606E-14,9.229352089037605E-14),(-0.08291671292690155,2.5445955641011694E-12,0.9965564804452369),(-0.06308989390333586,2.5488953252129456E-12,0.998007848309454),(-0.08291671292682903,2.544595564101187E-12,0.996556480445243),(-0.06308989390333586,2.5488953252129456E-12,0.998007848309454),(-0.20699731044011394,2.49434657889934E-12,0.9783415116770622),(-0.08291671292682903,2.544595564101187E-12,0.996556480445243),(-0.2069973104401177,2.494346578899338E-12,0.9783415116770615),(-0.08291671292690155,2.5445955641011694E-12,0.9965564804452369),(-0.41499643505859146,2.3130302896814405E-12,0.9098230371279133),(-0.2069973104401177,2.494346578899338E-12,0.9783415116770615),(-0.4149964350585932,2.313030289681439E-12,0.9098230371279126),(-0.20699731044011394,2.49434657889934E-12,0.9783415116770622),(-0.6202433193807648,1.986379761054646E-12,0.784409475187246),(-0.4149964350585932,2.313030289681439E-12,0.9098230371279126),(-0.6202433193807649,1.986379761054646E-12,0.7844094751872459),(-0.41499643505859146,2.3130302896814405E-12,0.9098230371279133),(-0.6202433193807648,1.986379761054646E-12,0.784409475187246),(-0.8079266005471487,1.4820756378559873E-12,0.5892831307006234),(-0.80792660054715,1.4820756378559833E-12,0.5892831307006218),(-0.6202433193807649,1.986379761054646E-12,0.7844094751872459),(-0.80792660054715,1.4820756378559833E-12,0.5892831307006218),(-0.9472992235199226,7.905697969928424E-13,0.32035009149140536),(-0.9472992235199245,7.905697969928283E-13,0.32035009149139987),(-0.8079266005471487,1.4820756378559873E-12,0.5892831307006234),(-0.9472992235199245,7.905697969928283E-13,0.32035009149139987),(-0.9922313039468913,2.893066370684859E-13,0.1244067500895838),(-0.992231303946883,2.8930663706865276E-13,0.12440675008964953),(-0.9472992235199226,7.905697969928424E-13,0.32035009149140536),(-0.992231303946883,2.8930663706865276E-13,0.12440675008964953),(-0.9965447579665395,1.8437282493117022E-13,0.08305748232044576),(-0.9965447579665395,1.8437282493117022E-13,0.08305748232044576),(-0.9922313039468913,2.893066370684859E-13,0.1244067500895838),(3.5614296695786857E-14,-2.556391479400031E-12,-1.),(3.5614296695786857E-14,-2.556391479400031E-12,-1.),(3.5614296695786857E-14,-2.556391479400031E-12,-1.),(3.5614296695786857E-14,-2.556391479400031E-12,-1.),(0.9862029092609518,-3.937404209212833E-13,-0.16554099723402418),(0.9472992235199246,-7.90569796992828E-13,-0.32035009149139976),(0.9862029092609518,-3.937404209212833E-13,-0.16554099723402418),(0.947299223519922,-7.905697969928468E-13,-0.32035009149140703),(0.947299223519922,-7.905697969928468E-13,-0.32035009149140703),(0.8079266005471502,-1.4820756378559827E-12,-0.5892831307006215),(0.9472992235199246,-7.90569796992828E-13,-0.32035009149139976),(0.8079266005471503,-1.4820756378559827E-12,-0.5892831307006215),(0.8079266005471503,-1.4820756378559827E-12,-0.5892831307006215),(0.6202433193807653,-1.986379761054646E-12,-0.7844094751872457),(0.8079266005471502,-1.4820756378559827E-12,-0.5892831307006215),(0.620243319380765,-1.986379761054646E-12,-0.7844094751872458),(0.41499643505859335,-2.3130302896814393E-12,-0.9098230371279125),(0.6202433193807653,-1.986379761054646E-12,-0.7844094751872457),(0.620243319380765,-1.986379761054646E-12,-0.7844094751872458),(0.41499643505859124,-2.3130302896814413E-12,-0.9098230371279136),(0.2069973104401176,-2.494346578899338E-12,-0.9783415116770615),(0.41499643505859124,-2.3130302896814413E-12,-0.9098230371279136),(0.41499643505859335,-2.3130302896814393E-12,-0.9098230371279125),(0.2069973104401136,-2.49434657889934E-12,-0.9783415116770622),(0.1027107625008487,-2.5392901553580776E-12,-0.9947112642704385),(0.2069973104401136,-2.49434657889934E-12,-0.9783415116770622),(0.2069973104401176,-2.494346578899338E-12,-0.9783415116770615),(0.1027107625008487,-2.5392901553580776E-12,-0.9947112642704385)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(5,6,7),(7,6,8),(7,8,9),(9,8,10),(9,10,11),(9,11,12),(12,11,13),(12,13,14),(12,14,15),(15,14,16),(17,18,19),(18,17,20),(20,17,21),(20,21,22),(22,21,23),(22,23,24),(24,23,25),(24,25,26),(26,25,27),(27,25,28),(27,28,29),(29,28,30),(30,28,31),(30,31,32),(33,34,35),(34,33,36),(37,38,39),(38,37,40),(41,42,43),(42,41,44),(45,46,47),(46,45,48),(49,50,51),(50,49,52),(53,54,55),(54,53,56),(57,58,59),(58,57,60),(61,62,63),(62,61,64),(65,66,67),(66,65,68),(69,70,71),(70,69,72),(73,74,75),(74,73,76),(77,78,79),(78,77,80),(81,82,83),(82,81,84),(85,86,87),(86,85,88),(89,90,91),(90,89,92),(93,94,95),(94,93,96)),$); +#821=IFCCARTESIANPOINTLIST3D(((0.,-1750.,0.),(-739.652,-1750.,124.156),(-750.,-1750.,0.),(144.815,-1750.,862.73),(-574.827,-1750.,1106.093),(569.392,-1750.,1666.667),(-42.915,-1750.,2113.269),(1244.796,-1750.,2357.023),(775.819,-1750.,2950.128),(2125.,-1750.,2886.751),(3150.019,-1750.,3219.753),(1811.726,-1750.,3573.563),(4250.,-1750.,3333.333),(4250.,-1750.,4084.236),(2993.901,-1750.,3957.62),(4172.967,-1750.,4079.367),(-739.652,1750.,124.156),(0.,1750.,0.),(-750.,1750.,0.),(144.815,1750.,862.73),(-574.827,1750.,1106.093),(569.392,1750.,1666.667),(-42.915,1750.,2113.269),(1244.796,1750.,2357.023),(775.819,1750.,2950.128),(2125.,1750.,2886.751),(3150.019,1750.,3219.753),(1811.726,1750.,3573.563),(4250.,1750.,3333.333),(4250.,1750.,4084.236),(2993.901,1750.,3957.62),(4172.967,1750.,4079.367),(4250.,1750.,3333.333),(4250.,-1750.,4084.236),(4250.,-1750.,3333.333),(4250.,1750.,4084.236),(4172.967,-1750.,4079.367),(4250.,1750.,4084.236),(4172.967,1750.,4079.367),(4250.,-1750.,4084.236),(2993.901,-1750.,3957.62),(4172.967,1750.,4079.367),(2993.901,1750.,3957.62),(4172.967,-1750.,4079.367),(1811.726,-1750.,3573.563),(2993.901,1750.,3957.62),(1811.726,1750.,3573.563),(2993.901,-1750.,3957.62),(775.819,-1750.,2950.128),(1811.726,1750.,3573.563),(775.819,1750.,2950.128),(1811.726,-1750.,3573.563),(775.819,-1750.,2950.128),(-42.915,1750.,2113.269),(-42.915,-1750.,2113.269),(775.819,1750.,2950.128),(-42.915,-1750.,2113.269),(-574.827,1750.,1106.093),(-574.827,-1750.,1106.093),(-42.915,1750.,2113.269),(-574.827,-1750.,1106.093),(-739.652,1750.,124.156),(-739.652,-1750.,124.156),(-574.827,1750.,1106.093),(-739.652,-1750.,124.156),(-750.,1750.,0.),(-750.,-1750.,0.),(-739.652,1750.,124.156),(0.,1750.,0.),(-750.,-1750.,0.),(-750.,1750.,0.),(0.,-1750.,0.),(0.,1750.,0.),(144.815,-1750.,862.73),(0.,-1750.,0.),(144.815,1750.,862.73),(144.815,1750.,862.73),(569.392,-1750.,1666.667),(144.815,-1750.,862.73),(569.392,1750.,1666.667),(569.392,1750.,1666.667),(1244.796,-1750.,2357.023),(569.392,-1750.,1666.667),(1244.796,1750.,2357.023),(2125.,1750.,2886.751),(1244.796,-1750.,2357.023),(1244.796,1750.,2357.023),(2125.,-1750.,2886.751),(3150.019,1750.,3219.753),(2125.,-1750.,2886.751),(2125.,1750.,2886.751),(3150.019,-1750.,3219.753),(4250.,1750.,3333.333),(3150.019,-1750.,3219.753),(3150.019,1750.,3219.753),(4250.,-1750.,3333.333)),$); +#822=IFCSTYLEDITEM(#820,(#353),$); +#823=IFCPRODUCTDEFINITIONSHAPE($,$,(#819)); +#824=IFCMEMBER('1hByR6f1zEWg0gFVCzqiAV',#1,'rail bridge - arch segment','An arch segment, forming part of the rail bridge\X\27s structure.','arch_segment',#825,#831,'454425.1027895.956001.1884275.1998984',$); +#825=IFCLOCALPLACEMENT(#760,#826); +#826=IFCAXIS2PLACEMENT3D(#827,#828,#829); +#827=IFCCARTESIANPOINT((-4250.,0.,3290.346)); +#828=IFCDIRECTION((0.,0.,1.)); +#829=IFCDIRECTION((1.,2.57628149445829E-17,0.)); +#830=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#820)); +#831=IFCPRODUCTDEFINITIONSHAPE($,$,(#830)); +#832=IFCMEMBER('0LwIg3tPb1axicmL$uibFc',#1,'rail bridge - arch segment','An arch segment, forming part of the rail bridge\X\27s structure.','arch_segment',#833,#839,'454425.1027895.956001.1884275.1999105',$); +#833=IFCLOCALPLACEMENT(#760,#834); +#834=IFCAXIS2PLACEMENT3D(#835,#836,#837); +#835=IFCCARTESIANPOINT((-5750.,0.,3290.346)); +#836=IFCDIRECTION((0.,0.,1.)); +#837=IFCDIRECTION((-1.,-6.918966297196771E-16,0.)); +#838=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#628)); +#839=IFCPRODUCTDEFINITIONSHAPE($,$,(#838)); +#840=IFCMEMBER('14s9MtA2T3DOZ3vc6xj1mL',#1,'rail bridge - arch segment','An arch segment, forming part of the rail bridge\X\27s structure.','arch_segment',#841,#847,'454425.1027895.956001.1884275.1999106',$); +#841=IFCLOCALPLACEMENT(#760,#842); +#842=IFCAXIS2PLACEMENT3D(#843,#844,#845); +#843=IFCCARTESIANPOINT((4250.,0.,3290.346)); +#844=IFCDIRECTION((0.,0.,1.)); +#845=IFCDIRECTION((-1.,-6.918966297196771E-16,0.)); +#846=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#628)); +#847=IFCPRODUCTDEFINITIONSHAPE($,$,(#846)); +#848=IFCEARTHWORKSFILL('2vnqnmqXH4Q9vBMUebOywv',#1,'rail bridge - filler','The filling material between the arches and the bridge deck.','backfill',#849,#858,'454425.1027895.956001.1884275.1999332',.BACKFILL.); +#849=IFCLOCALPLACEMENT(#760,#850); +#850=IFCAXIS2PLACEMENT3D(#851,#852,#853); +#851=IFCCARTESIANPOINT((5000.,0.,3290.346)); +#852=IFCDIRECTION((0.,0.,1.)); +#853=IFCDIRECTION((1.,2.57628149445829E-17,0.)); +#854=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#855)); +#855=IFCTRIANGULATEDFACESET(#856,((-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-2.5549846064557993E-12,1.,-2.302200580472061E-14),(-4.158209776511004E-14,2.302200580461437E-14,1.),(-4.158209776511004E-14,2.302200580461437E-14,1.),(-4.158209776511004E-14,2.302200580461437E-14,1.),(-4.158209776511004E-14,2.302200580461437E-14,1.),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(2.5549846064557993E-12,-1.,2.302200580472061E-14),(-0.6202433193807413,-1.6027708127658811E-12,-0.7844094751872648),(-0.8079266005471168,-2.0778065071996617E-12,-0.5892831307006671),(-0.6202433193807902,-1.6027708127660051E-12,-0.7844094751872258),(-0.8079266005471817,-2.0778065071998253E-12,-0.5892831307005784),(0.20699731044024583,5.063515577917526E-13,-0.9783415116770344),(0.4149964350585089,1.0393635520664958E-12,-0.9098230371279511),(0.4149964350586758,1.0393635520669242E-12,-0.9098230371278749),(0.20699731043998557,5.063515577910863E-13,-0.9783415116770895),(-0.206997310439986,-5.513983257127455E-13,-0.9783415116770894),(-0.0829167129268582,-2.347936542235796E-13,-0.9965564804452405),(-0.08291671292687262,-2.3479365422361636E-13,-0.9965564804452394),(-0.20699731044024544,-5.513983257134072E-13,-0.9783415116770344),(-0.41499643505851114,-1.0812554545505578E-12,-0.90982303712795),(-0.20699731044024544,-5.513983257134072E-13,-0.9783415116770344),(-0.206997310439986,-5.513983257127455E-13,-0.9783415116770894),(-0.4149964350586755,-1.081255454550976E-12,-0.9098230371278752),(-0.8079266005471817,-2.0778065071998253E-12,-0.5892831307005784),(-0.9472992235198696,-2.4277100354666596E-12,-0.32035009149156196),(-0.8079266005471168,-2.0778065071996617E-12,-0.5892831307006671),(-0.9472992235199775,-2.4277100354669278E-12,-0.32035009149124316),(-0.08291671292687262,-2.3479365422361636E-13,-0.9965564804452394),(-0.06308989390333586,-1.8416985022288968E-13,-0.998007848309454),(-0.06308989390333586,-1.8416985022288968E-13,-0.998007848309454),(-0.0829167129268582,-2.347936542235796E-13,-0.9965564804452405),(-0.6202433193807413,-1.6027708127658811E-12,-0.7844094751872648),(-0.4149964350586755,-1.081255454550976E-12,-0.9098230371278752),(-0.41499643505851114,-1.0812554545505578E-12,-0.90982303712795),(-0.6202433193807902,-1.6027708127660051E-12,-0.7844094751872258),(0.08291671292685875,1.8890819606849642E-13,-0.9965564804452406),(0.20699731043998557,5.063515577910863E-13,-0.9783415116770895),(0.20699731044024583,5.063515577917526E-13,-0.9783415116770344),(0.08291671292687233,1.8890819606853118E-13,-0.9965564804452395),(0.9472992235198712,2.4129598321349406E-12,-0.32035009149155774),(0.8079266005471799,2.0506735478885955E-12,-0.5892831307005809),(0.947299223519976,2.4129598321352157E-12,-0.3203500914912475),(0.8079266005471187,2.0506735478884375E-12,-0.5892831307006645),(0.8079266005471187,2.0506735478884375E-12,-0.5892831307006645),(0.6202433193807384,1.5666534537837957E-12,-0.7844094751872668),(0.8079266005471799,2.0506735478885955E-12,-0.5892831307005809),(0.6202433193807917,1.566653453783933E-12,-0.7844094751872249),(0.9922313039467627,2.5322716147048113E-12,-0.12440675009060917),(0.947299223519976,2.4129598321352157E-12,-0.3203500914912475),(0.9922313039467875,2.532271614704879E-12,-0.12440675009041002),(0.9472992235198712,2.4129598321349406E-12,-0.32035009149155774),(0.4149964350586758,1.0393635520669242E-12,-0.9098230371278749),(0.6202433193807384,1.5666534537837957E-12,-0.7844094751872668),(0.6202433193807917,1.566653453783933E-12,-0.7844094751872249),(0.4149964350585089,1.0393635520664958E-12,-0.9098230371279511),(0.06308989390333586,1.382175652690157E-13,-0.998007848309454),(0.08291671292687233,1.8890819606853118E-13,-0.9965564804452395),(0.08291671292685875,1.8890819606849642E-13,-0.9965564804452406),(0.06308989390333586,1.382175652690157E-13,-0.998007848309454),(-0.9922313039468903,-2.5379998005505785E-12,-0.1244067500895908),(-0.9965447579665395,-2.5480686660888355E-12,-0.08305748232044574),(-0.9922313039468839,-2.5379998005505636E-12,-0.12440675008964268),(-0.9965447579665395,-2.5480686660888355E-12,-0.08305748232044574),(-0.9472992235199775,-2.4277100354669278E-12,-0.32035009149124316),(-0.9922313039468839,-2.5379998005505636E-12,-0.12440675008964268),(-0.9472992235198696,-2.4277100354666596E-12,-0.32035009149156196),(-0.9922313039468903,-2.5379998005505785E-12,-0.1244067500895908),(0.9965447579663902,2.5442443664081987E-12,-0.0830574823222392),(0.9922313039467875,2.532271614704879E-12,-0.12440675009041002),(0.9965447579663902,2.5442443664081987E-12,-0.0830574823222392),(0.9922313039467627,2.5322716147048113E-12,-0.12440675009060917)),$,((1,2,3),(2,1,4),(2,4,5),(5,4,6),(5,6,7),(7,6,8),(7,8,9),(9,8,10),(9,10,11),(11,10,12),(11,12,13),(13,12,14),(13,14,15),(15,14,16),(15,16,17),(18,19,20),(19,18,21),(22,23,24),(23,22,25),(25,22,26),(25,26,27),(27,26,28),(27,28,29),(29,28,30),(29,30,31),(31,30,32),(31,32,33),(33,32,34),(33,34,35),(35,34,36),(35,36,37),(37,36,38),(39,40,41),(40,39,42),(43,44,45),(44,43,46),(47,48,49),(48,47,50),(51,52,53),(52,51,54),(55,56,57),(56,55,58),(59,60,61),(60,59,62),(63,64,65),(64,63,66),(67,68,69),(68,67,70),(71,72,73),(72,71,74),(75,76,77),(76,75,78),(79,80,81),(80,79,82),(83,84,85),(84,83,86),(87,88,89),(88,87,90),(91,92,93),(92,91,94),(95,96,97),(96,95,98),(99,100,101),(100,99,102)),$); +#856=IFCCARTESIANPOINTLIST3D(((-10.348,1750.,124.156),(10.348,1750.,124.156),(0.,1750.,0.),(-175.173,1750.,1106.093),(175.173,1750.,1106.093),(-707.085,1750.,2113.269),(707.085,1750.,2113.269),(-1525.819,1750.,2950.128),(1525.819,1750.,2950.128),(-2561.726,1750.,3573.563),(2561.726,1750.,3573.563),(-3743.901,1750.,3957.62),(3743.901,1750.,3957.62),(-4922.967,1750.,4079.367),(4922.967,1750.,4079.367),(-5000.,1750.,4084.236),(5000.,1750.,4084.236),(-5000.,-1750.,4084.236),(5000.,1750.,4084.236),(-5000.,1750.,4084.236),(5000.,-1750.,4084.236),(10.348,-1750.,124.156),(-10.348,-1750.,124.156),(0.,-1750.,0.),(-175.173,-1750.,1106.093),(175.173,-1750.,1106.093),(-707.085,-1750.,2113.269),(707.085,-1750.,2113.269),(-1525.819,-1750.,2950.128),(1525.819,-1750.,2950.128),(-2561.726,-1750.,3573.563),(2561.726,-1750.,3573.563),(-3743.901,-1750.,3957.62),(3743.901,-1750.,3957.62),(-4922.967,-1750.,4079.367),(4922.967,-1750.,4079.367),(-5000.,-1750.,4084.236),(5000.,-1750.,4084.236),(-1525.819,1750.,2950.128),(-707.085,-1750.,2113.269),(-1525.819,-1750.,2950.128),(-707.085,1750.,2113.269),(3743.901,1750.,3957.62),(2561.726,-1750.,3573.563),(2561.726,1750.,3573.563),(3743.901,-1750.,3957.62),(-3743.901,1750.,3957.62),(-4922.967,-1750.,4079.367),(-4922.967,1750.,4079.367),(-3743.901,-1750.,3957.62),(-2561.726,1750.,3573.563),(-3743.901,-1750.,3957.62),(-3743.901,1750.,3957.62),(-2561.726,-1750.,3573.563),(-707.085,1750.,2113.269),(-175.173,-1750.,1106.093),(-707.085,-1750.,2113.269),(-175.173,1750.,1106.093),(-4922.967,1750.,4079.367),(-5000.,-1750.,4084.236),(-5000.,1750.,4084.236),(-4922.967,-1750.,4079.367),(-1525.819,1750.,2950.128),(-2561.726,-1750.,3573.563),(-2561.726,1750.,3573.563),(-1525.819,-1750.,2950.128),(4922.967,1750.,4079.367),(3743.901,-1750.,3957.62),(3743.901,1750.,3957.62),(4922.967,-1750.,4079.367),(175.173,1750.,1106.093),(707.085,-1750.,2113.269),(175.173,-1750.,1106.093),(707.085,1750.,2113.269),(707.085,1750.,2113.269),(1525.819,-1750.,2950.128),(707.085,-1750.,2113.269),(1525.819,1750.,2950.128),(10.348,1750.,124.156),(175.173,-1750.,1106.093),(10.348,-1750.,124.156),(175.173,1750.,1106.093),(2561.726,1750.,3573.563),(1525.819,-1750.,2950.128),(1525.819,1750.,2950.128),(2561.726,-1750.,3573.563),(5000.,1750.,4084.236),(4922.967,-1750.,4079.367),(4922.967,1750.,4079.367),(5000.,-1750.,4084.236),(-10.348,1750.,124.156),(0.,-1750.,0.),(-10.348,-1750.,124.156),(0.,1750.,0.),(-175.173,1750.,1106.093),(-10.348,-1750.,124.156),(-175.173,-1750.,1106.093),(-10.348,1750.,124.156),(0.,1750.,0.),(10.348,-1750.,124.156),(0.,-1750.,0.),(10.348,1750.,124.156)),$); +#857=IFCSTYLEDITEM(#855,(#670),$); +#858=IFCPRODUCTDEFINITIONSHAPE($,$,(#854)); +#859=IFCEARTHWORKSFILL('2ZYxBDA4bC$vk_U2Y8GUqS',#1,'rail bridge - filler','The filling material between the arches and the bridge deck.','backfill',#860,#866,'454425.1027895.956001.1884275.1999335',.BACKFILL.); +#860=IFCLOCALPLACEMENT(#760,#861); +#861=IFCAXIS2PLACEMENT3D(#862,#863,#864); +#862=IFCCARTESIANPOINT((-5000.,0.,3290.346)); +#863=IFCDIRECTION((0.,0.,1.)); +#864=IFCDIRECTION((1.,2.57628149445829E-17,0.)); +#865=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#855)); +#866=IFCPRODUCTDEFINITIONSHAPE($,$,(#865)); +#867=IFCELEMENTASSEMBLYTYPE('0iAJVoiDX1LxdIktn5l5jI',#1,'highway location marker','A marker indicating specific locations along the highway.',$,$,$,'1031224','signalassembly',.SIGNALASSEMBLY.); +#868=IFCRELDEFINESBYTYPE('0rhH8SOFzD4h_KH46QSIV5',#1,$,$,(#869,#876),#867); +#869=IFCELEMENTASSEMBLY('00ZvlN19v73wE8JOyDmPjG',#1,'highway location marker','A marker indicating specific locations along the highway.','signalassembly',#871,$,'454425.1027895.1031643',.FACTORY.,$); +#870=IFCRELCONTAINEDINSPATIALSTRUCTURE('1Q55mxxNvAD9n5MG$Y89Ka',#1,$,$,(#869,#876),#680); +#871=IFCLOCALPLACEMENT(#681,#872); +#872=IFCAXIS2PLACEMENT3D(#873,#874,#875); +#873=IFCCARTESIANPOINT((-3968.197,5000.,-200.)); +#874=IFCDIRECTION((0.,0.,1.)); +#875=IFCDIRECTION((-1.,-2.1777293602490653E-17,0.)); +#876=IFCELEMENTASSEMBLY('3E8poO$Er6gPhLg44LF$bc',#1,'highway location marker','A marker indicating specific locations along the highway.','signalassembly',#877,$,'454425.1027895.1031644',.FACTORY.,$); +#877=IFCLOCALPLACEMENT(#681,#878); +#878=IFCAXIS2PLACEMENT3D(#879,#880,#881); +#879=IFCCARTESIANPOINT((3968.197,-5000.,-200.)); +#880=IFCDIRECTION((0.,0.,1.)); +#881=IFCDIRECTION((1.,2.1777293602490653E-17,0.)); +#882=IFCBUILDINGELEMENTPROXYTYPE('2IpkHFcdnD3xuZl6H52fWn',#1,'geo-reference','The reference point for transforming the local engineering coordinate system into the coordinate reference system of the underlying map.',$,$,$,'1028019','origin',.USERDEFINED.); +#883=IFCRELDEFINESBYTYPE('3530pFWy94WO4ESJ$CWAXG',#1,$,$,(#884),#882); +#884=IFCBUILDINGELEMENTPROXY('3Fit2Fad92zf2f6aWdJtF5',#1,'geo-reference','The reference point for transforming the local engineering coordinate system into the coordinate reference system of the underlying map.','origin',#888,#896,'454425.1032696',$); +#885=IFCRELASSOCIATESMATERIAL('2EBkr99ef9S8X3ZQxjf56M',#1,$,$,(#884),#886); +#886=IFCMATERIAL('virtual_black',$,$); +#887=IFCRELCONTAINEDINSPATIALSTRUCTURE('0SZV9DIub3wgRD2_T34BsV',#1,$,$,(#884),#21); +#888=IFCLOCALPLACEMENT(#23,#7); +#889=IFCSHAPEREPRESENTATION(#12,'Body','Tessellation',(#890)); +#890=IFCTRIANGULATEDFACESET(#891,((-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-1.,7.21911462561536E-15,-2.8876462805389965E-13),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-3.058371444293475E-33,2.634474752431885E-33,1.),(-0.09801728974624706,0.9951847119559265,-2.8293428708776068E-14),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-0.09801728974624706,0.9951847119559265,-2.8293428708776068E-14),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-5.775291700492621E-14,1.,6.668325738175412E-26),(-0.9951847119558951,0.09801728974656551,1.7414784486937357E-13),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(-0.9951847119558951,0.09801728974656551,1.7414784486937357E-13),(0.38268339078040076,-0.9238795497362281,0.),(0.19509039794782512,-0.980785265299474,0.),(0.38268339078040076,-0.9238795497362281,0.),(0.19509039794782512,-0.980785265299474,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9238795497362351,-0.3826833907803836,0.),(0.9238795497362351,-0.3826833907803836,0.),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9238795497362351,-0.3826833907803836,0.),(0.8314696223790943,-0.5555702179389808,0.),(0.8314696223790943,-0.5555702179389808,0.),(0.9238795497362351,-0.3826833907803836,0.),(0.9951847119559278,-0.09801728974623324,-9.75332807319653E-13),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9807852652994759,-0.1950903979478154,-4.900260093397033E-13),(0.9951847119559278,-0.09801728974623324,-9.75332807319653E-13),(0.5555702179389931,-0.8314696223790862,0.),(0.38268339078040076,-0.9238795497362281,0.),(0.5555702179389931,-0.8314696223790862,0.),(0.38268339078040076,-0.9238795497362281,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.5555702179389931,-0.8314696223790862,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.5555702179389931,-0.8314696223790862,0.),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-0.38268349542963814,0.9238795063890931,0.),(-0.19509039794774516,0.9807852652994898,-1.421516415386496E-14),(-0.38268349542963814,0.9238795063890931,0.),(0.8314696223790943,-0.5555702179389808,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.7071067811865249,-0.7071067811865702,0.),(0.8314696223790943,-0.5555702179389808,0.),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(-0.9238795063891102,0.38268349542959684,0.),(-0.9238795063891102,0.38268349542959684,0.),(-0.9807852652994783,0.19509039794780292,8.749523528380382E-14),(0.19509039794782512,-0.980785265299474,0.),(0.09801728974630905,-0.9951847119559203,0.),(0.19509039794782512,-0.980785265299474,0.),(0.09801728974630905,-0.9951847119559203,0.),(0.9447142547101878,0.3278947650502742,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9447142547101878,0.3278947650502742,0.),(0.8957596329165385,0.44453872726369803,0.),(0.9447142547101878,0.3278947650502742,0.),(0.9447142547101878,0.3278947650502742,0.),(0.8957596329165385,0.44453872726369803,0.),(0.36763569523471507,-0.9299698896143292,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.36763569523471507,-0.9299698896143292,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.36763569523471507,-0.9299698896143292,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.36763569523471507,-0.9299698896143292,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.6371382701240347,-0.7707495214032589,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.6371382701240347,-0.7707495214032589,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9752819685766632,-0.22096398296833067,0.),(0.9752819685766632,-0.22096398296833067,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9999995436725548,-0.0009553296197073197,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9942464699972969,-0.10711655753390546,0.),(0.9999995436725548,-0.0009553296197073197,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.8576732356667385,0.5141951194059969,0.),(-0.8576732356667385,0.5141951194059969,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.7284943753270046,0.6850517827996052,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.3790838524776873,0.9253623251411714,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.3790838524776873,0.9253623251411714,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.012947889549911789,0.9999161725645823,0.),(-0.1834995529945839,0.9830197933158762,0.),(-0.012947889549911789,0.9999161725645823,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.3790838524776873,0.9253623251411714,0.),(-0.5669105664485456,0.8237793452430021,0.),(-0.3790838524776873,0.9253623251411714,0.),(0.25678560352314495,0.9664683925629717,0.),(0.38760898056242665,0.9218238867524298,0.),(0.25678560352314495,0.9664683925629717,0.),(0.38760898056242665,0.9218238867524298,0.),(-0.021878265380184617,-0.9997606421058765,0.),(0.18338909196229686,-0.9830404065699663,0.),(-0.021878265380184617,-0.9997606421058765,0.),(0.18338909196229686,-0.9830404065699663,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.021878265380184617,-0.9997606421058765,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.021878265380184617,-0.9997606421058765,0.),(0.9946569870411934,0.10323506250366385,0.),(0.9999995436725548,-0.0009553296197073197,0.),(0.9999995436725548,-0.0009553296197073197,0.),(0.9946569870411934,0.10323506250366385,0.),(0.817214458947544,-0.5763336950821748,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.817214458947544,-0.5763336950821748,0.),(0.8893220941653559,-0.45728132788180387,0.),(0.817214458947544,-0.5763336950821748,0.),(0.817214458947544,-0.5763336950821748,0.),(0.8893220941653559,-0.45728132788180387,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9447848469584931,0.32769130741845615,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9882486706267435,0.15285471862024486,0.),(-0.9447848469584931,0.32769130741845615,0.),(0.38760898056242665,0.9218238867524298,0.),(0.5120817306320317,0.8589367270951357,0.),(0.38760898056242665,0.9218238867524298,0.),(0.5120817306320317,0.8589367270951357,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9946569870411934,0.10323506250366385,0.),(0.9946569870411934,0.10323506250366385,0.),(0.9769903234900121,0.2132836322995312,0.),(0.9453223709696031,0.3261374172713214,0.),(0.8598493850403663,0.5105477793955271,0.),(0.8598493850403663,0.5105477793955271,0.),(0.9453223709696031,0.3261374172713214,0.),(0.8598493850403663,0.5105477793955271,0.),(0.7345761428927619,0.6785262635247017,0.),(0.7345761428927619,0.6785262635247017,0.),(0.8598493850403663,0.5105477793955271,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9997961495365582,-0.02019057631352784,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9088850097664936,-0.41704680675166556,0.),(-0.9088850097664936,-0.41704680675166556,0.),(-0.9746360240228631,-0.22379593534491413,0.),(-0.9088850097664936,-0.41704680675166556,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.9088850097664936,-0.41704680675166556,0.),(0.9882991966281712,0.15252769566249838,0.),(0.9453223709696031,0.3261374172713214,0.),(0.9453223709696031,0.3261374172713214,0.),(0.9882991966281712,0.15252769566249838,0.),(-0.8576732356667385,0.5141951194059969,0.),(-0.9447848469584931,0.32769130741845615,0.),(-0.9447848469584931,0.32769130741845615,0.),(-0.8576732356667385,0.5141951194059969,0.),(0.9752819685766632,-0.22096398296833067,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.9752819685766632,-0.22096398296833067,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(-0.12780975406149545,-0.991798702745038,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(-0.12780975406149545,-0.991798702745038,0.),(0.12233197847190952,-0.9924892377467619,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(0.12233197847190952,-0.9924892377467619,0.),(-0.0008875531940973642,-0.9999996061245864,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.12233197847190952,-0.9924892377467619,0.),(0.24649919644888388,-0.9691429957184104,0.),(0.12233197847190952,-0.9924892377467619,0.),(0.5120817306320317,0.8589367270951357,0.),(0.6291972681526775,0.7772456482664974,0.),(0.5120817306320317,0.8589367270951357,0.),(0.6291972681526775,0.7772456482664974,0.),(0.7362866814501166,0.6766697294243142,0.),(0.8266452258336311,0.5627234406051209,0.),(0.8266452258336311,0.5627234406051209,0.),(0.7362866814501166,0.6766697294243142,0.),(0.8266452258336311,0.5627234406051209,0.),(0.8957596329165385,0.44453872726369803,0.),(0.8957596329165385,0.44453872726369803,0.),(0.8266452258336311,0.5627234406051209,0.),(-0.012947889549911789,0.9999161725645823,0.),(0.12580746189129235,0.9920546771889498,0.),(-0.012947889549911789,0.9999161725645823,0.),(0.12580746189129235,0.9920546771889498,0.),(0.12580746189129235,0.9920546771889498,0.),(0.25678560352314495,0.9664683925629717,0.),(0.12580746189129235,0.9920546771889498,0.),(0.25678560352314495,0.9664683925629717,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.8893220941653559,-0.45728132788180387,0.),(0.8893220941653559,-0.45728132788180387,0.),(0.9408475861876066,-0.3388300747645555,0.),(0.6291972681526775,0.7772456482664974,0.),(0.7362866814501166,0.6766697294243142,0.),(0.6291972681526775,0.7772456482664974,0.),(0.7362866814501166,0.6766697294243142,0.),(-0.12780975406149545,-0.991798702745038,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.12780975406149545,-0.991798702745038,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.39586511141738157,-0.9183086700900217,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.39586511141738157,-0.9183086700900217,0.),(-0.5218882328493185,-0.8530138758621781,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.8301610356462975,-0.5575236810169295,0.),(-0.6371382701240347,-0.7707495214032589,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.6371382701240347,-0.7707495214032589,0.),(-0.7414983772070644,-0.6709546606137334,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.39586511141738157,-0.9183086700900217,0.),(-0.26163236387882916,-0.9651676052226247,0.),(-0.39586511141738157,-0.9183086700900217,0.),(0.9999861252731272,0.00526775675575694,0.),(0.9882991966281712,0.15252769566249838,0.),(0.9882991966281712,0.15252769566249838,0.),(0.9999861252731272,0.00526775675575694,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.4866110292734116,-0.8736187418945813,0.),(0.0002958514360789271,0.9999999562359629,0.),(-0.19223371225305855,0.981349173267807,0.),(0.0002958514360789271,0.9999999562359629,0.),(-0.19223371225305855,0.981349173267807,0.),(0.19272392771065497,0.9812530191993186,0.),(0.0002958514360789271,0.9999999562359629,0.),(0.19272392771065497,0.9812530191993186,0.),(0.0002958514360789271,0.9999999562359629,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9999861252731272,0.00526775675575694,0.),(0.9999861252731272,0.00526775675575694,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9908086705656648,-0.13527075933807678,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.7221689293892913,-0.6917167320693673,0.),(0.6078907658149572,-0.7940206652454991,0.),(0.7345761428927619,0.6785262635247017,0.),(0.578454045877275,0.8157149727743213,0.),(0.7345761428927619,0.6785262635247017,0.),(0.578454045877275,0.8157149727743213,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.9643985522083707,-0.2644530818470427,0.),(0.9643985522083707,-0.2644530818470427,0.),(0.9643985522083707,-0.2644530818470427,0.),(0.9643985522083707,-0.2644530818470427,0.),(-0.9625082715910013,0.27125233108473634,0.),(-0.9672095041928837,0.2539798712476175,0.),(-0.9672095041928837,0.2539798712476175,0.),(-0.9625082715910013,0.27125233108473634,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.9769988877805387,0.21324439799345352,0.),(0.9836499297931796,0.18009113142482358,0.),(0.9836499297931796,0.18009113142482358,0.),(0.9769988877805387,0.21324439799345352,0.),(-0.9731576010320436,0.23013970442658913,0.),(-0.9748015785129227,0.22307371545907045,0.),(-0.9748015785129227,0.22307371545907045,0.),(-0.9731576010320436,0.23013970442658913,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9633571078061799,-0.268222077464389,0.),(0.9633571078061799,-0.268222077464389,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9701425001453329,-0.24253562503632958,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9668351110436297,-0.25540138616157154,0.),(0.9701425001453329,-0.24253562503632958,0.),(-0.9649338002855462,-0.2624933543282454,0.),(-0.9638016856477805,-0.2666201619204687,0.),(-0.9638016856477805,-0.2666201619204687,0.),(-0.9649338002855462,-0.2624933543282454,0.),(0.9741171320751483,0.2260438298155657,0.),(0.9767827016489056,0.21423247596819933,0.),(0.9767827016489056,0.21423247596819933,0.),(0.9741171320751483,0.2260438298155657,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(-0.9672095041928837,0.2539798712476175,0.),(-0.9716008047066287,0.2366260262385175,0.),(-0.9716008047066287,0.2366260262385175,0.),(-0.9672095041928837,0.2539798712476175,0.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.2724781561229833,-0.9621619689199004,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.5361224862120472,-0.8441402014936934,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.9501115102274097,0.31191043287038495,0.),(-0.9501115102274097,0.31191043287038495,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.9501115102274097,0.31191043287038495,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.9501115102274097,0.31191043287038495,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.7089870822585878,-0.7052214667680322,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.7089870822585878,-0.7052214667680322,0.),(0.7089870822585878,-0.7052214667680322,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.7089870822585878,-0.7052214667680322,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.7411781990788633,0.6713083324450941,0.),(-0.7411781990788633,0.6713083324450941,0.),(-0.8675425301753608,0.4973630045921526,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.7411781990788633,0.6713083324450941,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.7411781990788633,0.6713083324450941,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.9519163807811555,-0.3063579670916137,0.),(0.8581695987356767,-0.5133662823032382,0.),(0.370770082790638,-0.9287246877882721,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.370770082790638,-0.9287246877882721,0.),(0.5444171631195075,-0.8388146115208698,0.),(0.18338909196229686,-0.9830404065699663,0.),(0.370770082790638,-0.9287246877882721,0.),(0.18338909196229686,-0.9830404065699663,0.),(0.370770082790638,-0.9287246877882721,0.),(0.578454045877275,0.8157149727743213,0.),(0.392800811108307,0.9196235766837736,0.),(0.578454045877275,0.8157149727743213,0.),(0.392800811108307,0.9196235766837736,0.),(0.392800811108307,0.9196235766837736,0.),(0.19272392771065497,0.9812530191993186,0.),(0.392800811108307,0.9196235766837736,0.),(0.19272392771065497,0.9812530191993186,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.9807060117051631,-0.19548841041185108,0.),(-0.19223371225305855,0.981349173267807,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.19223371225305855,0.981349173267807,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.9079682524707186,-0.41903896299183185,0.),(-0.7584219831189418,-0.6517638341622919,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.3935263597020274,0.9193133329935289,0.),(-0.5817421295538566,0.8133732812811987,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.989607048477485,0.14379808623093912,0.),(-0.9999291486926968,-0.011903679880554852,0.),(-0.9714624054277151,0.23719358094307266,0.),(-0.9731576010320436,0.23013970442658913,0.),(-0.9731576010320436,0.23013970442658913,0.),(-0.9714624054277151,0.23719358094307266,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9665515520007026,-0.256472410455848,0.),(-0.9660482448389756,-0.2583617398987992,0.),(-0.9649338002855462,-0.2624933543282454,0.),(-0.9649338002855462,-0.2624933543282454,0.),(-0.9660482448389756,-0.2583617398987992,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.9622060458243664,0.2723224657993486,0.),(0.965807041701975,0.25926194899923066,0.),(0.965807041701975,0.25926194899923066,0.),(0.9622060458243664,0.2723224657993486,0.),(0.965807041701975,0.25926194899923066,0.),(0.9769988877805387,0.21324439799345352,0.),(0.9769988877805387,0.21324439799345352,0.),(0.965807041701975,0.25926194899923066,0.),(0.9767827016489056,0.21423247596819933,0.),(0.9793050618474799,0.20238971278181062,0.),(0.9793050618474799,0.20238971278181062,0.),(0.9767827016489056,0.21423247596819933,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.8311604628836111,0.5560326293834755,0.),(0.8311604628836111,0.5560326293834755,0.),(0.8311604628836111,0.5560326293834755,0.),(0.8311604628836111,0.5560326293834755,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(-0.8313835216090105,-0.5556990552421339,0.),(-0.8313835216090105,-0.5556990552421339,0.),(-0.8313835216090105,-0.5556990552421339,0.),(-0.8313835216090105,-0.5556990552421339,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.9807852652994644,-0.19509039794787292,0.),(0.9951847119559052,-0.09801728974646383,0.),(0.9951847119559052,-0.09801728974646383,0.),(0.9807852652994644,-0.19509039794787292,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.7071067811865489,0.7071067811865461,0.),(-0.7071067811865489,0.7071067811865461,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.5555702260896939,0.8314696169329622,0.),(-0.7071067811865489,0.7071067811865461,0.),(-0.5555702260896939,0.8314696169329622,0.),(-0.7071067811865489,0.7071067811865461,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.8858807962836784E-33,-1.6032830017092906E-33,1.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.555570226089786,-0.8314696169329004,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.555570226089786,-0.8314696169329004,0.),(0.19509039794791153,-0.9807852652994568,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.19509039794791153,-0.9807852652994568,0.),(0.38268349542964936,-0.9238795063890886,0.),(0.09801728974643438,-0.9951847119559081,0.),(0.19509039794791153,-0.9807852652994568,0.),(0.09801728974643438,-0.9951847119559081,0.),(0.19509039794791153,-0.9807852652994568,0.),(-0.38268349542963814,0.9238795063890931,0.),(-0.5555702260896939,0.8314696169329622,0.),(-0.38268349542963814,0.9238795063890931,0.),(-0.5555702260896939,0.8314696169329622,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(-0.9238795063891102,0.38268349542959684,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.8314696169329316,0.5555702260897393,0.),(-0.9238795063891102,0.38268349542959684,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.09801728974637888,0.9951847119559135,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.09801728974637888,0.9951847119559135,0.),(-0.98078526529947,0.19509039794784488,0.),(-0.9951847119559265,0.09801728974624783,0.),(-0.9951847119559265,0.09801728974624783,0.),(-0.98078526529947,0.19509039794784488,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.9807852652994644,-0.19509039794787292,0.),(0.9807852652994644,-0.19509039794787292,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.7071067811865351,-0.70710678118656,0.),(0.8314696169328859,-0.5555702260898077,0.),(0.8314696169328859,-0.5555702260898077,0.),(0.7071067811865351,-0.70710678118656,0.),(0.8314696169328859,-0.5555702260898077,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.9238795063891059,-0.3826834954296072,0.),(0.8314696169328859,-0.5555702260898077,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.98078526529947,0.19509039794784488,0.),(-0.98078526529947,0.19509039794784488,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.7071067811865286,0.7071067811865666,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.9238795497362213,0.3826833907804165,0.),(-0.8314696223790744,0.5555702179390106,0.),(-0.3826833907803875,0.9238795497362333,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.3826833907803875,0.9238795497362333,0.),(-0.19509039794789132,0.9807852652994606,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.3826833907803875,0.9238795497362333,0.),(-0.5555702179389774,0.8314696223790966,0.),(-0.3826833907803875,0.9238795497362333,0.),(0.555570226089786,-0.8314696169329004,0.),(0.7071067811865351,-0.70710678118656,0.),(0.555570226089786,-0.8314696169329004,0.),(0.7071067811865351,-0.70710678118656,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(0.,-1.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(-1.,0.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(0.,1.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(1.,0.,0.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,-1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(0.,0.,1.),(-0.08709942068020388,0.9961996240298292,0.),(-0.08709942068020388,0.9961996240298292,0.),(-0.08709942068020388,0.9961996240298292,0.),(-0.08709942068020388,0.9961996240298292,0.),(0.9774618285571268,0.21111223013780628,0.),(0.9455208071073157,0.3255616736152011,0.),(0.9455208071073157,0.3255616736152011,0.),(0.9774618285571268,0.21111223013780628,0.),(0.9455208071073157,0.3255616736152011,0.),(0.82228120474033,0.5690813828713708,0.),(0.82228120474033,0.5690813828713708,0.),(0.9455208071073157,0.3255616736152011,0.),(0.82228120474033,0.5690813828713708,0.),(0.618991963670469,0.7853973191394131,0.),(0.618991963670469,0.7853973191394131,0.),(0.82228120474033,0.5690813828713708,0.),(0.618991963670469,0.7853973191394131,0.),(0.3996723632402599,0.9166580616903697,0.),(0.618991963670469,0.7853973191394131,0.),(0.3996723632402599,0.9166580616903697,0.),(0.3996723632402599,0.9166580616903697,0.),(0.19339585438116996,0.9811208098436082,0.),(0.3996723632402599,0.9166580616903697,0.),(0.19339585438116996,0.9811208098436082,0.),(0.19339585438116996,0.9811208098436082,0.),(0.006270084827264089,0.9999803428249272,0.),(0.19339585438116996,0.9811208098436082,0.),(0.006270084827264089,0.9999803428249272,0.),(0.006270084827264089,0.9999803428249272,0.),(-0.1706379345644615,0.9853337989166792,0.),(0.006270084827264089,0.9999803428249272,0.),(-0.1706379345644615,0.9853337989166792,0.),(-0.1706379345644615,0.9853337989166792,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.1706379345644615,0.9853337989166792,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.36619292031781997,0.930538954106225,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.5897177588229777,0.8076094135959565,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.8042639065180913,0.5942723017878747,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.9500076370258789,0.3122266638077316,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.999998131781137,0.001932985834453788,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.9482459825263331,-0.31753670122155864,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.5602022188465279,-0.8283558860776129,0.),(-0.7856441637606142,-0.6186786305901356,0.),(-0.5602022188465279,-0.8283558860776129,0.),(-0.5602022188465279,-0.8283558860776129,0.),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.5602022188465279,-0.8283558860776129,0.),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.26435381846863887,-0.964425766278074,1.1000904274438964E-30),(-0.35572378115320674,-0.9345911360172776,5.525978220010001E-31),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.26435381846863887,-0.964425766278074,1.1000904274438964E-30),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.4669255000030771,-0.8842966569239514,0.),(-0.31792071801850086,-0.9481173013159294,5.509088677023133E-31),(-0.4669255000030771,-0.8842966569239514,0.),(-0.4669255000030771,-0.8842966569239514,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.4669255000030771,-0.8842966569239514,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.6627300222149948,-0.7488584096175408,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.8433903094801822,-0.5373013920277173,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.9619276929535128,-0.27330406789715506,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9999804818049974,0.006247880364198881,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.9572996684082709,0.2890974660307744,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.8306807534286091,0.5567490331228951,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.6269838321900799,0.779032267734939,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.39405829076990984,0.9190854494961267,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.0014495197728581503,0.9999989494456624,0.),(-0.18580751544945262,0.9825861627371422,0.),(-0.0014495197728581503,0.9999989494456624,0.),(-0.0014495197728581503,0.9999989494456624,0.),(0.18439541958058675,0.9828521400687388,0.),(-0.0014495197728581503,0.9999989494456624,0.),(0.18439541958058675,0.9828521400687388,0.),(0.18439541958058675,0.9828521400687388,0.),(0.397653234982458,0.9175357784348174,0.),(0.18439541958058675,0.9828521400687388,0.),(0.397653234982458,0.9175357784348174,0.),(0.397653234982458,0.9175357784348174,0.),(0.6311132446113388,0.7756907067099287,0.),(0.397653234982458,0.9175357784348174,0.),(0.6311132446113388,0.7756907067099287,0.),(0.6311132446113388,0.7756907067099287,0.),(0.8310893844718592,0.5561388630712533,0.),(0.8310893844718592,0.5561388630712533,0.),(0.6311132446113388,0.7756907067099287,0.),(0.8310893844718592,0.5561388630712533,0.),(0.9540840705660083,0.29953895621804594,0.),(0.9540840705660083,0.29953895621804594,0.),(0.8310893844718592,0.5561388630712533,0.),(0.9540840705660083,0.29953895621804594,0.),(0.9862299090912843,0.16538006655518403,0.),(0.9862299090912843,0.16538006655518403,0.),(0.9540840705660083,0.29953895621804594,0.),(0.07505650511901447,-0.9971792822954755,0.),(0.07505650511901447,-0.9971792822954755,0.),(0.07505650511901447,-0.9971792822954755,0.),(0.07505650511901447,-0.9971792822954755,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.9655584237881841,-0.2601863375576772,0.),(-0.9655584237881841,-0.2601863375576772,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.9176891922159813,-0.3972990642953742,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.7878441680336847,-0.6158746356973238,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.6319969860598306,-0.7749708443620899,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.4492259604736119,-0.8934181755687317,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.006729681688991534,-0.9999773554357945,0.),(-0.23786759998517135,-0.9712975882175836,0.),(-0.006729681688991534,-0.9999773554357945,0.),(-0.006729681688991534,-0.9999773554357945,0.),(0.21785673822142915,-0.9759807588326319,0.),(-0.006729681688991534,-0.9999773554357945,0.),(0.21785673822142915,-0.9759807588326319,0.),(0.21785673822142915,-0.9759807588326319,0.),(0.426740401850111,-0.9043741645075924,0.),(0.21785673822142915,-0.9759807588326319,0.),(0.426740401850111,-0.9043741645075924,0.),(0.426740401850111,-0.9043741645075924,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.426740401850111,-0.9043741645075924,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.8920265571908663,-0.45198298780619,0.),(0.8920265571908663,-0.45198298780619,0.),(0.6499756897148813,-0.7599550004965191,0.),(0.8920265571908663,-0.45198298780619,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.8920265571908663,-0.45198298780619,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.9150023212001752,0.40344857441598614,0.),(0.9150023212001752,0.40344857441598614,0.),(0.9998122896310956,-0.019374867809258792,0.),(0.9150023212001752,0.40344857441598614,0.),(0.6471347723667976,0.7623756202776772,0.),(0.6471347723667976,0.7623756202776772,0.),(0.9150023212001752,0.40344857441598614,0.),(0.6471347723667976,0.7623756202776772,0.),(0.36235316167200854,0.93204087154282,0.),(0.6471347723667976,0.7623756202776772,0.),(0.36235316167200854,0.93204087154282,0.),(0.36235316167200854,0.93204087154282,0.),(0.2550849049142149,0.9669186580498412,0.),(0.36235316167200854,0.93204087154282,0.),(0.2550849049142149,0.9669186580498412,0.),(0.2550849049142149,0.9669186580498412,0.),(0.28595039760148855,0.9582444208611657,0.),(0.2550849049142149,0.9669186580498412,0.),(0.28595039760148855,0.9582444208611657,0.),(0.28595039760148855,0.9582444208611657,0.),(0.42364706687595166,0.9058273360455641,0.),(0.28595039760148855,0.9582444208611657,0.),(0.42364706687595166,0.9058273360455641,0.),(0.42364706687595166,0.9058273360455641,0.),(0.6276382490359698,0.7785051241623668,0.),(0.42364706687595166,0.9058273360455641,0.),(0.6276382490359698,0.7785051241623668,0.),(0.6276382490359698,0.7785051241623668,0.),(0.8269599887954417,0.5622607730683717,0.),(0.8269599887954417,0.5622607730683717,0.),(0.6276382490359698,0.7785051241623668,0.),(0.8269599887954417,0.5622607730683717,0.),(0.9588699203284513,0.2838458664298454,0.),(0.9588699203284513,0.2838458664298454,0.),(0.8269599887954417,0.5622607730683717,0.),(0.9588699203284513,0.2838458664298454,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.9588699203284513,0.2838458664298454,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.957401173102709,-0.2887611361342741,0.),(0.957401173102709,-0.2887611361342741,0.),(0.9999875508055405,-0.004989813016214063,0.),(0.957401173102709,-0.2887611361342741,0.),(0.835029876011192,-0.5502046039145194,0.),(0.835029876011192,-0.5502046039145194,0.),(0.957401173102709,-0.2887611361342741,0.),(0.835029876011192,-0.5502046039145194,0.),(0.644888194762835,-0.7642769238015314,0.),(0.644888194762835,-0.7642769238015314,0.),(0.835029876011192,-0.5502046039145194,0.),(0.644888194762835,-0.7642769238015314,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.644888194762835,-0.7642769238015314,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.202992057833538,-0.9791803840235496,0.),(0.42113746186410883,-0.9069968237070384,0.),(0.202992057833538,-0.9791803840235496,0.),(0.202992057833538,-0.9791803840235496,0.),(0.008487459676545215,-0.9999639808654306,0.),(0.202992057833538,-0.9791803840235496,0.),(0.008487459676545215,-0.9999639808654306,0.),(0.008487459676545215,-0.9999639808654306,0.),(-0.17916273136199512,-0.9838194527914711,0.),(0.008487459676545215,-0.9999639808654306,0.),(-0.17916273136199512,-0.9838194527914711,0.),(-0.17916273136199512,-0.9838194527914711,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.17916273136199512,-0.9838194527914711,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.40107835149177207,-0.9160437522109098,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.6388336480978726,-0.7693448966867615,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.8340779567171348,-0.5516465916858089,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.9876333514957574,-0.15678125848856422,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.9557741620484655,-0.29410160006459296,0.),(-0.9876333514957574,-0.15678125848856422,0.)),$,((1,2,3),(2,1,4),(5,6,7),(6,5,8),(8,5,9),(9,5,10),(9,10,11),(11,10,12),(12,10,13),(12,13,14),(14,13,15),(15,13,16),(16,13,17),(16,17,18),(18,17,19),(19,17,20),(19,20,21),(19,21,22),(23,24,25),(24,23,26),(27,28,29),(28,27,30),(31,32,33),(32,31,34),(35,36,37),(36,35,38),(39,40,41),(40,39,42),(40,42,43),(40,43,44),(44,43,45),(44,45,46),(44,46,47),(47,46,48),(47,48,49),(47,49,50),(47,50,51),(51,50,52),(51,52,53),(51,53,54),(54,53,55),(55,53,56),(57,58,59),(58,57,60),(61,62,63),(62,61,64),(65,66,67),(66,65,68),(69,70,71),(70,69,72),(73,74,75),(74,73,76),(77,78,79),(78,77,80),(81,82,83),(82,81,84),(85,86,87),(86,85,88),(89,90,91),(90,89,92),(93,94,95),(94,93,96),(97,98,99),(98,97,100),(101,102,103),(102,101,104),(105,106,107),(106,105,108),(109,110,111),(110,109,112),(113,114,115),(114,113,116),(117,118,119),(118,117,120),(121,122,123),(122,121,124),(125,126,127),(126,125,128),(129,130,131),(130,129,132),(133,134,135),(134,133,136),(137,138,139),(138,137,140),(141,142,143),(142,141,144),(145,146,147),(146,145,148),(149,150,151),(150,149,152),(153,154,155),(154,153,156),(157,158,159),(158,157,160),(161,162,163),(162,161,164),(165,166,167),(166,165,168),(169,170,171),(170,169,172),(173,174,175),(174,173,176),(177,178,179),(178,177,180),(181,182,183),(182,181,184),(185,186,187),(186,185,188),(189,190,191),(190,189,192),(193,194,195),(194,193,196),(197,198,199),(198,197,200),(201,202,203),(202,201,204),(205,206,207),(206,205,208),(209,210,211),(210,209,212),(213,214,215),(214,213,216),(217,218,219),(218,217,220),(221,222,223),(222,221,224),(225,226,227),(226,225,228),(229,230,231),(230,229,232),(233,234,235),(234,233,236),(237,238,239),(238,237,240),(241,242,243),(242,241,244),(245,246,247),(246,245,248),(249,250,251),(250,249,252),(253,254,255),(254,253,256),(257,258,259),(258,257,260),(261,262,263),(262,261,264),(265,266,267),(266,265,268),(269,270,271),(270,269,272),(273,274,275),(274,273,276),(277,278,279),(278,277,280),(281,282,283),(282,281,284),(285,286,287),(286,285,288),(289,290,291),(290,289,292),(293,294,295),(294,293,296),(297,298,299),(298,297,300),(301,302,303),(302,301,304),(305,306,307),(306,305,308),(309,310,311),(310,309,312),(313,314,315),(314,313,316),(317,318,319),(318,317,320),(321,322,323),(322,321,324),(325,326,327),(326,325,328),(326,328,329),(329,328,330),(329,330,331),(331,330,332),(331,333,334),(333,331,332),(335,336,337),(336,335,338),(339,340,341),(340,339,342),(343,344,345),(344,343,346),(347,348,349),(348,347,350),(351,352,353),(352,351,354),(355,356,357),(356,355,358),(359,360,361),(360,359,362),(360,362,363),(360,363,364),(364,363,365),(364,365,366),(364,366,367),(367,366,368),(368,366,369),(368,369,370),(370,369,371),(371,369,372),(371,372,373),(371,373,374),(371,374,375),(375,374,376),(375,376,377),(375,377,378),(379,380,381),(380,379,382),(383,384,385),(384,383,386),(386,383,387),(387,383,388),(387,388,389),(389,388,390),(390,388,391),(390,391,392),(390,392,393),(393,392,394),(393,394,395),(393,395,396),(396,395,397),(397,395,398),(398,395,399),(398,399,400),(400,399,401),(401,399,402),(403,404,405),(404,403,406),(407,408,409),(408,407,410),(411,412,413),(412,411,414),(415,416,417),(416,415,418),(419,420,421),(420,419,422),(423,424,425),(424,423,426),(427,428,429),(428,427,430),(431,432,433),(432,431,434),(435,436,437),(436,435,438),(439,440,441),(440,439,442),(443,444,445),(444,443,446),(447,448,449),(448,447,450),(451,452,453),(452,451,454),(455,456,457),(456,455,458),(459,460,461),(460,459,462),(463,464,465),(464,463,466),(467,468,469),(468,467,470),(471,472,473),(472,471,474),(475,476,477),(476,475,478),(479,480,481),(480,479,482),(483,484,485),(484,483,486),(487,488,489),(488,487,490),(491,492,493),(492,491,494),(495,496,497),(496,495,498),(499,500,501),(500,499,502),(503,504,505),(504,503,506),(507,508,509),(508,507,510),(511,512,513),(512,511,514),(515,516,517),(516,515,518),(519,520,521),(520,519,522),(523,524,525),(524,523,526),(527,528,529),(528,527,530),(531,532,533),(532,531,534),(535,536,537),(536,535,538),(539,540,541),(540,539,542),(543,544,545),(544,543,546),(546,543,547),(547,543,540),(547,540,542),(548,544,546),(549,550,551),(550,549,552),(553,554,555),(554,553,556),(557,558,559),(558,557,560),(561,562,563),(562,561,564),(565,566,567),(566,565,568),(569,570,571),(570,569,572),(573,574,575),(574,573,576),(574,576,577),(574,577,578),(574,578,579),(574,579,580),(580,579,581),(581,579,582),(581,582,583),(583,582,584),(584,582,585),(585,582,586),(585,586,587),(587,586,588),(588,586,589),(588,589,590),(591,592,593),(592,591,594),(594,591,595),(595,591,596),(596,591,597),(597,591,598),(597,598,599),(597,599,600),(600,599,601),(600,601,602),(600,602,603),(600,603,604),(604,603,605),(604,605,606),(604,606,607),(607,606,608),(609,610,611),(610,609,612),(613,614,615),(614,613,616),(617,618,619),(618,617,620),(621,622,623),(622,621,624),(625,626,627),(626,625,628),(629,630,631),(630,629,632),(633,634,635),(634,633,636),(637,638,639),(638,637,640),(641,642,643),(642,641,644),(645,646,647),(646,645,648),(649,650,651),(650,649,652),(653,654,655),(654,653,656),(657,658,659),(658,657,660),(661,662,663),(662,661,664),(665,666,667),(666,665,668),(669,670,671),(670,669,672),(673,674,675),(674,673,676),(677,678,679),(678,677,680),(681,682,683),(682,681,684),(685,686,687),(686,685,688),(686,688,689),(689,688,690),(690,688,691),(691,688,692),(691,692,693),(693,692,694),(693,694,695),(695,694,696),(696,694,697),(696,697,698),(698,697,699),(698,699,700),(700,699,701),(700,701,702),(702,701,703),(702,703,704),(704,703,705),(704,705,706),(706,705,707),(706,707,708),(708,707,709),(708,709,710),(710,709,711),(711,709,712),(712,709,713),(712,713,714),(714,713,715),(714,715,716),(716,715,717),(716,717,718),(718,717,719),(718,719,720),(720,719,721),(720,721,722),(723,724,725),(724,723,726),(724,726,727),(727,726,728),(727,728,729),(729,728,685),(729,685,730),(730,685,687),(730,687,731),(730,731,732),(732,731,733),(732,733,734),(732,734,735),(735,734,736),(735,736,737),(737,736,738),(737,738,739),(739,738,740),(739,740,741),(739,741,742),(742,741,743),(742,743,744),(744,743,745),(744,745,746),(746,745,747),(747,745,748),(747,748,749),(749,748,750),(749,750,751),(751,750,752),(751,752,753),(753,752,754),(753,754,755),(753,755,711),(711,755,756),(711,756,710),(757,758,759),(758,757,760),(760,757,761),(760,761,762),(762,761,763),(762,763,764),(764,763,765),(764,765,766),(766,765,767),(767,765,768),(767,768,769),(769,768,770),(770,768,771),(770,771,772),(772,771,773),(772,773,774),(774,773,775),(774,775,776),(776,775,777),(777,775,778),(777,778,779),(779,778,780),(779,780,781),(781,780,782),(781,782,783),(781,783,784),(784,783,785),(784,785,786),(786,785,787),(786,787,788),(788,787,789),(788,789,790),(790,789,791),(791,789,792),(791,792,793),(793,792,794),(764,795,796),(795,764,766),(796,795,797),(796,797,798),(796,798,799),(796,799,800),(800,799,801),(800,801,802),(802,801,803),(802,803,804),(802,804,805),(805,804,806),(805,806,807),(807,806,808),(807,808,809),(809,808,810),(809,810,811),(811,810,812),(811,812,813),(813,812,814),(813,814,815),(815,814,816),(815,816,817),(817,816,794),(817,794,792),(817,792,818),(817,818,819),(819,818,820),(819,820,821),(821,820,822),(821,822,823),(823,822,824),(823,824,825),(825,824,826),(825,826,827),(827,826,828),(829,830,831),(830,829,832),(833,834,835),(834,833,836),(837,838,839),(838,837,840),(841,842,843),(842,841,844),(845,846,847),(846,845,848),(849,850,851),(850,849,852),(853,854,855),(854,853,856),(856,853,857),(857,853,858),(857,858,859),(859,858,860),(860,858,861),(861,858,862),(861,862,863),(861,863,864),(864,863,865),(864,865,866),(866,865,867),(867,865,868),(868,865,869),(868,869,870),(870,869,871),(871,869,872),(872,869,873),(872,873,874),(875,876,877),(876,875,878),(878,875,879),(878,879,880),(880,879,855),(880,855,881),(881,855,854),(881,854,882),(881,882,883),(881,883,884),(884,883,885),(884,885,886),(886,885,887),(886,887,888),(888,887,889),(888,889,890),(888,890,891),(891,890,892),(892,890,893),(892,893,894),(894,893,895),(895,893,896),(896,893,897),(897,893,898),(897,898,899),(899,898,900),(899,900,901),(902,903,904),(903,902,905),(905,902,906),(906,902,907),(906,907,908),(908,907,909),(908,909,910),(908,910,911),(911,910,912),(911,912,913),(911,913,914),(914,913,915),(914,915,916),(914,916,917),(917,916,918),(917,918,919),(919,918,920),(919,920,921),(919,921,896),(896,921,922),(896,922,895),(923,924,925),(924,923,926),(924,926,927),(924,927,928),(928,927,929),(928,929,930),(930,929,931),(931,929,932),(931,932,933),(933,932,934),(934,932,935),(934,935,936),(936,935,937),(937,935,938),(937,938,939),(939,938,940),(939,940,941),(941,940,942),(942,940,943),(942,943,944),(944,943,945),(946,947,948),(947,946,949),(947,949,950),(950,949,951),(950,951,952),(952,951,953),(952,953,954),(954,953,955),(955,953,956),(956,953,957),(956,957,958),(958,957,959),(958,959,960),(960,959,961),(960,961,962),(962,961,963),(963,961,964),(963,964,965),(963,965,966),(966,965,967),(966,967,945),(966,945,943),(966,943,968),(966,968,969),(969,968,970),(969,970,971),(971,970,972),(954,973,952),(973,954,974),(973,974,975),(973,975,976),(976,975,977),(976,977,978),(976,978,979),(976,979,980),(980,979,981),(981,979,982),(981,982,983),(983,982,984),(983,984,985),(983,985,986),(983,986,987),(987,986,988),(987,988,989),(987,989,990),(987,990,991),(991,990,992),(993,994,995),(994,993,996),(997,998,999),(998,997,1000),(1001,1002,1003),(1002,1001,1004),(1005,1006,1007),(1006,1005,1008),(1009,1010,1011),(1010,1009,1012),(1013,1014,1015),(1014,1013,1016),(1017,1018,1019),(1018,1017,1020),(1021,1022,1023),(1022,1021,1024),(1025,1026,1027),(1026,1025,1028),(1029,1030,1031),(1030,1029,1032),(1033,1034,1035),(1034,1033,1036),(1037,1038,1039),(1038,1037,1040),(1041,1042,1043),(1042,1041,1044),(1045,1046,1047),(1046,1045,1048),(1049,1050,1051),(1050,1049,1052),(1053,1054,1055),(1054,1053,1056),(1057,1058,1059),(1058,1057,1060),(1061,1062,1063),(1062,1061,1064),(1064,1061,1065),(1065,1061,1066),(1067,1068,1069),(1068,1067,1070),(1071,1072,1073),(1072,1071,1074),(1075,1076,1077),(1076,1075,1078),(1079,1080,1081),(1080,1079,1082),(1083,1084,1085),(1084,1083,1086),(1087,1088,1089),(1088,1087,1090),(1091,1092,1093),(1092,1091,1094),(1095,1096,1097),(1096,1095,1098),(1099,1100,1101),(1100,1099,1102),(1103,1104,1105),(1104,1103,1106),(1107,1108,1109),(1108,1107,1110),(1111,1112,1113),(1112,1111,1114),(1115,1116,1117),(1116,1115,1118),(1119,1120,1121),(1120,1119,1122),(1123,1124,1125),(1124,1123,1126),(1127,1128,1129),(1128,1127,1130),(1131,1132,1133),(1132,1131,1134),(1135,1136,1137),(1136,1135,1138),(1139,1140,1141),(1140,1139,1142),(1143,1144,1145),(1144,1143,1146),(1147,1148,1149),(1148,1147,1150),(1151,1152,1153),(1152,1151,1154),(1155,1156,1157),(1156,1155,1158),(1159,1160,1161),(1160,1159,1162),(1163,1164,1165),(1164,1163,1166),(1167,1168,1169),(1168,1167,1170),(1171,1172,1173),(1172,1171,1174),(1175,1176,1177),(1176,1175,1178),(1179,1180,1181),(1180,1179,1182),(1183,1184,1185),(1184,1183,1186),(1187,1188,1189),(1188,1187,1190),(1191,1192,1193),(1192,1191,1194),(1195,1196,1197),(1196,1195,1198),(1199,1200,1201),(1200,1199,1202),(1203,1204,1205),(1204,1203,1206),(1207,1208,1209),(1208,1207,1210),(1211,1212,1213),(1212,1211,1214),(1215,1216,1217),(1216,1215,1218),(1219,1220,1221),(1220,1219,1222),(1223,1224,1225),(1224,1223,1226),(1227,1228,1229),(1228,1227,1230),(1231,1232,1233),(1232,1231,1234),(1235,1236,1237),(1236,1235,1238),(1239,1240,1241),(1240,1239,1242),(1243,1244,1245),(1244,1243,1246),(1247,1248,1249),(1248,1247,1250),(1251,1252,1253),(1252,1251,1254),(1255,1256,1257),(1256,1255,1258),(1259,1260,1261),(1260,1259,1262),(1263,1264,1265),(1264,1263,1266),(1267,1268,1269),(1268,1267,1270)),$); +#891=IFCCARTESIANPOINTLIST3D(((0.3,-300.,5.),(0.3,-500.,0.),(0.3,-500.,5.),(0.3,-300.,0.),(97.845,-490.393,5.),(0.3,-300.,5.),(0.3,-500.,5.),(58.827,-294.236,5.),(115.105,-277.164,5.),(191.642,-461.94,5.),(166.971,-249.441,5.),(212.432,-212.132,5.),(278.085,-415.735,5.),(249.741,-166.671,5.),(277.464,-114.805,5.),(294.536,-58.527,5.),(353.853,-353.553,5.),(300.3,0.,5.),(500.3,0.,5.),(416.035,-277.785,5.),(462.24,-191.342,5.),(490.693,-97.545,5.),(0.3,-300.,5.),(58.827,-294.236,0.),(0.3,-300.,0.),(58.827,-294.236,5.),(300.3,0.,5.),(500.3,0.,0.),(300.3,0.,0.),(500.3,0.,5.),(300.3,0.,5.),(294.536,-58.527,0.),(294.536,-58.527,5.),(300.3,0.,0.),(191.642,-461.94,5.),(97.845,-490.393,0.),(191.642,-461.94,0.),(97.845,-490.393,5.),(0.3,-300.,0.),(97.845,-490.393,0.),(0.3,-500.,0.),(58.827,-294.236,0.),(115.105,-277.164,0.),(191.642,-461.94,0.),(166.971,-249.441,0.),(212.432,-212.132,0.),(278.085,-415.735,0.),(249.741,-166.671,0.),(277.464,-114.805,0.),(294.536,-58.527,0.),(353.853,-353.553,0.),(300.3,0.,0.),(500.3,0.,0.),(416.035,-277.785,0.),(462.24,-191.342,0.),(490.693,-97.545,0.),(490.693,-97.545,0.),(462.24,-191.342,5.),(462.24,-191.342,0.),(490.693,-97.545,5.),(462.24,-191.342,0.),(416.035,-277.785,5.),(416.035,-277.785,0.),(462.24,-191.342,5.),(500.3,0.,0.),(490.693,-97.545,5.),(490.693,-97.545,0.),(500.3,0.,5.),(278.085,-415.735,5.),(191.642,-461.94,0.),(278.085,-415.735,0.),(191.642,-461.94,5.),(353.853,-353.553,5.),(278.085,-415.735,0.),(353.853,-353.553,0.),(278.085,-415.735,5.),(58.827,-294.236,5.),(115.105,-277.164,0.),(58.827,-294.236,0.),(115.105,-277.164,5.),(416.035,-277.785,0.),(353.853,-353.553,5.),(353.853,-353.553,0.),(416.035,-277.785,5.),(294.536,-58.527,5.),(277.464,-114.805,0.),(277.464,-114.805,5.),(294.536,-58.527,0.),(97.845,-490.393,5.),(0.3,-500.,0.),(97.845,-490.393,0.),(0.3,-500.,5.),(877.313,53.797,0.),(881.793,37.789,5.),(881.793,37.789,0.),(877.313,53.797,5.),(871.041,68.83,0.),(877.313,53.797,5.),(877.313,53.797,0.),(871.041,68.83,5.),(813.425,-115.375,5.),(798.774,-120.117,0.),(813.425,-115.375,0.),(798.774,-120.117,5.),(827.53,-108.736,5.),(813.425,-115.375,0.),(827.53,-108.736,0.),(813.425,-115.375,5.),(705.8,-107.143,5.),(692.962,-97.994,0.),(705.8,-107.143,0.),(692.962,-97.994,5.),(884.434,-15.353,0.),(881.604,-32.57,5.),(881.604,-32.57,0.),(884.434,-15.353,5.),(885.377,2.85,0.),(884.434,-15.353,5.),(884.434,-15.353,0.),(885.377,2.85,5.),(683.164,95.825,5.),(668.786,76.852,0.),(668.786,76.852,5.),(683.164,95.825,0.),(683.164,95.825,5.),(700.79,110.973,0.),(683.164,95.825,0.),(700.79,110.973,5.),(720.806,121.793,5.),(743.212,128.285,0.),(720.806,121.793,0.),(743.212,128.285,5.),(743.212,128.285,5.),(768.006,130.449,0.),(743.212,128.285,0.),(768.006,130.449,5.),(700.79,110.973,5.),(720.806,121.793,0.),(700.79,110.973,0.),(720.806,121.793,5.),(800.367,126.383,5.),(815.29,121.301,0.),(800.367,126.383,0.),(815.29,121.301,5.),(768.174,102.448,5.),(751.506,100.965,0.),(768.174,102.448,0.),(751.506,100.965,5.),(791.292,99.367,5.),(768.174,102.448,0.),(791.292,99.367,0.),(768.174,102.448,5.),(884.481,20.807,0.),(885.377,2.85,5.),(885.377,2.85,0.),(884.481,20.807,5.),(861.955,-77.91,0.),(852.052,-89.977,5.),(852.052,-89.977,0.),(861.955,-77.91,5.),(870.287,-64.051,0.),(861.955,-77.91,5.),(861.955,-77.91,0.),(870.287,-64.051,5.),(652.354,28.939,5.),(650.3,0.,0.),(650.3,0.,5.),(652.354,28.939,0.),(658.516,54.557,5.),(652.354,28.939,0.),(652.354,28.939,5.),(658.516,54.557,0.),(815.29,121.301,5.),(829.374,114.185,0.),(815.29,121.301,0.),(829.374,114.185,5.),(881.793,37.789,0.),(884.481,20.807,5.),(884.481,20.807,0.),(881.793,37.789,5.),(689.808,-40.22,0.),(697.275,-56.542,5.),(697.275,-56.542,0.),(689.808,-40.22,5.),(697.275,-56.542,0.),(707.728,-70.506,5.),(707.728,-70.506,0.),(697.275,-56.542,5.),(650.3,0.,5.),(653.821,-31.522,0.),(653.821,-31.522,5.),(650.3,0.,0.),(653.821,-31.522,5.),(664.385,-61.368,0.),(664.385,-61.368,5.),(653.821,-31.522,0.),(664.385,-61.368,5.),(672.255,-75.107,0.),(672.255,-75.107,5.),(664.385,-61.368,0.),(685.328,-21.541,0.),(689.808,-40.22,5.),(689.808,-40.22,0.),(685.328,-21.541,5.),(668.786,76.852,5.),(658.516,54.557,0.),(658.516,54.557,5.),(668.786,76.852,0.),(881.604,-32.57,0.),(876.889,-48.803,5.),(876.889,-48.803,0.),(881.604,-32.57,5.),(767.839,-123.91,5.),(750.946,-122.862,0.),(767.839,-123.91,0.),(750.946,-122.862,5.),(783.579,-122.962,5.),(767.839,-123.91,0.),(783.579,-122.962,0.),(767.839,-123.91,5.),(798.774,-120.117,5.),(783.579,-122.962,0.),(798.774,-120.117,0.),(783.579,-122.962,5.),(829.374,114.185,5.),(842.228,105.251,0.),(829.374,114.185,0.),(842.228,105.251,5.),(853.456,94.714,0.),(863.061,82.574,5.),(863.061,82.574,0.),(853.456,94.714,5.),(863.061,82.574,0.),(871.041,68.83,5.),(871.041,68.83,0.),(863.061,82.574,5.),(768.006,130.449,5.),(784.606,129.433,0.),(768.006,130.449,0.),(784.606,129.433,5.),(784.606,129.433,5.),(800.367,126.383,0.),(784.606,129.433,0.),(800.367,126.383,5.),(876.889,-48.803,0.),(870.287,-64.051,5.),(870.287,-64.051,0.),(876.889,-48.803,5.),(842.228,105.251,5.),(853.456,94.714,0.),(842.228,105.251,0.),(853.456,94.714,5.),(750.946,-122.862,5.),(734.975,-119.718,0.),(750.946,-122.862,0.),(734.975,-119.718,5.),(719.926,-114.479,5.),(705.8,-107.143,0.),(719.926,-114.479,0.),(705.8,-107.143,5.),(672.255,-75.107,5.),(681.781,-87.316,0.),(681.781,-87.316,5.),(672.255,-75.107,0.),(692.962,-97.994,5.),(681.781,-87.316,0.),(692.962,-97.994,0.),(681.781,-87.316,5.),(734.975,-119.718,5.),(719.926,-114.479,0.),(734.975,-119.718,0.),(719.926,-114.479,5.),(683.835,-0.503,0.),(685.328,-21.541,5.),(685.328,-21.541,0.),(683.835,-0.503,5.),(840.577,-100.253,5.),(827.53,-108.736,0.),(840.577,-100.253,0.),(827.53,-108.736,5.),(767.671,-96.076,5.),(785.219,-94.463,0.),(767.671,-96.076,0.),(785.219,-94.463,5.),(750.406,-94.478,5.),(767.671,-96.076,0.),(750.406,-94.478,0.),(767.671,-96.076,5.),(685.391,25.261,0.),(683.835,-0.503,5.),(683.835,-0.503,0.),(685.391,25.261,5.),(690.059,47.053,0.),(685.391,25.261,5.),(685.391,25.261,0.),(690.059,47.053,5.),(852.052,-89.977,5.),(840.577,-100.253,0.),(852.052,-89.977,0.),(840.577,-100.253,5.),(707.728,-70.506,5.),(720.434,-81.693,0.),(707.728,-70.506,0.),(720.434,-81.693,5.),(-867.339,-122.904,5.),(-900.538,-122.904,0.),(-867.339,-122.904,0.),(-900.538,-122.904,5.),(-717.104,-122.904,5.),(-748.459,-122.904,0.),(-717.104,-122.904,0.),(-748.459,-122.904,5.),(-649.7,122.904,0.),(-717.104,-122.904,5.),(-717.104,-122.904,0.),(-649.7,122.904,5.),(-826.762,122.904,5.),(-873.543,-43.092,0.),(-873.543,-43.092,5.),(-826.762,122.904,0.),(-64.254,843.159,0.),(-64.254,650.,5.),(-64.254,650.,0.),(-64.254,843.159,5.),(-64.254,650.,5.),(-95.441,895.808,5.),(-95.441,650.,5.),(-64.254,843.159,5.),(-62.074,895.808,5.),(64.854,650.,5.),(67.034,702.817,5.),(98.221,650.,5.),(98.221,895.808,5.),(67.034,895.808,5.),(-740.914,-46.403,0.),(-733.201,-88.531,5.),(-733.201,-88.531,0.),(-740.914,-46.403,5.),(-720.961,-35.044,5.),(-733.201,-88.531,0.),(-733.201,-88.531,5.),(-720.961,-35.044,0.),(-815.193,64.386,0.),(-867.339,-122.904,5.),(-867.339,-122.904,0.),(-815.193,64.386,5.),(-807.983,93.226,0.),(-815.193,64.386,5.),(-815.193,64.386,0.),(-807.983,93.226,5.),(-800.27,64.386,5.),(-748.459,-122.904,0.),(-748.459,-122.904,5.),(-800.27,64.386,0.),(-932.396,122.904,0.),(-895.005,-38.229,5.),(-895.005,-38.229,0.),(-932.396,122.904,5.),(-932.396,122.904,0.),(-900.538,-122.904,0.),(-965.763,122.904,0.),(-895.005,-38.229,0.),(-884.609,-88.531,0.),(-867.339,-122.904,0.),(-873.543,-43.092,0.),(-826.762,122.904,0.),(-815.193,64.386,0.),(-807.983,93.226,0.),(-787.527,122.904,0.),(-800.27,64.386,0.),(-748.459,-122.904,0.),(-752.316,-1.509,0.),(-740.914,-46.403,0.),(-733.201,-88.531,0.),(-717.104,-122.904,0.),(-720.961,-35.044,0.),(-682.396,122.904,0.),(-649.7,122.904,0.),(-873.543,-43.092,5.),(-884.609,-88.531,0.),(-884.609,-88.531,5.),(-873.543,-43.092,0.),(-900.538,-122.904,5.),(-932.396,122.904,5.),(-965.763,122.904,5.),(-895.005,-38.229,5.),(-884.609,-88.531,5.),(-867.339,-122.904,5.),(-873.543,-43.092,5.),(-826.762,122.904,5.),(-815.193,64.386,5.),(-807.983,93.226,5.),(-787.527,122.904,5.),(-800.27,64.386,5.),(-748.459,-122.904,5.),(-752.316,-1.509,5.),(-740.914,-46.403,5.),(-733.201,-88.531,5.),(-717.104,-122.904,5.),(-720.961,-35.044,5.),(-682.396,122.904,5.),(-649.7,122.904,5.),(812.02,90.124,5.),(791.292,99.367,0.),(812.02,90.124,0.),(791.292,99.367,5.),(829.207,75.285,5.),(812.02,90.124,0.),(829.207,75.285,0.),(812.02,90.124,5.),(850.36,-19.356,5.),(845.911,-39.026,0.),(845.911,-39.026,5.),(850.36,-19.356,0.),(845.911,-39.026,5.),(838.497,-55.992,0.),(838.497,-55.992,5.),(845.911,-39.026,0.),(721.786,89.102,5.),(708.734,78.722,0.),(721.786,89.102,0.),(708.734,78.722,5.),(708.734,78.722,0.),(697.84,64.874,5.),(697.84,64.874,0.),(708.734,78.722,5.),(838.497,-55.992,5.),(828.117,-70.255,0.),(828.117,-70.255,5.),(838.497,-55.992,0.),(815.442,-81.552,5.),(828.117,-70.255,0.),(815.442,-81.552,0.),(828.117,-70.255,5.),(697.84,64.874,0.),(690.059,47.053,5.),(690.059,47.053,0.),(697.84,64.874,5.),(736.044,96.517,5.),(721.786,89.102,0.),(736.044,96.517,0.),(721.786,89.102,5.),(751.506,100.965,5.),(736.044,96.517,0.),(751.506,100.965,0.),(736.044,96.517,5.),(720.434,-81.693,5.),(734.66,-89.684,0.),(720.434,-81.693,0.),(734.66,-89.684,5.),(734.66,-89.684,5.),(750.406,-94.478,0.),(734.66,-89.684,0.),(750.406,-94.478,5.),(841.698,55.416,5.),(849.307,31.124,0.),(849.307,31.124,5.),(841.698,55.416,0.),(849.307,31.124,5.),(851.843,3.018,0.),(851.843,3.018,5.),(849.307,31.124,0.),(785.219,-94.463,5.),(801.143,-89.621,0.),(785.219,-94.463,0.),(801.143,-89.621,5.),(829.207,75.285,5.),(841.698,55.416,0.),(841.698,55.416,5.),(829.207,75.285,0.),(801.143,-89.621,5.),(815.442,-81.552,0.),(801.143,-89.621,0.),(815.442,-81.552,5.),(851.843,3.018,5.),(850.36,-19.356,0.),(850.36,-19.356,5.),(851.843,3.018,0.),(-682.396,122.904,5.),(-720.961,-35.044,0.),(-720.961,-35.044,5.),(-682.396,122.904,0.),(-965.763,122.904,5.),(-900.538,-122.904,0.),(-900.538,-122.904,5.),(-965.763,122.904,0.),(-807.983,93.226,5.),(-800.27,64.386,0.),(-800.27,64.386,5.),(-807.983,93.226,0.),(-826.762,122.904,5.),(-787.527,122.904,0.),(-826.762,122.904,0.),(-787.527,122.904,5.),(-682.396,122.904,5.),(-649.7,122.904,0.),(-682.396,122.904,0.),(-649.7,122.904,5.),(-787.527,122.904,0.),(-752.316,-1.509,5.),(-752.316,-1.509,0.),(-787.527,122.904,5.),(-752.316,-1.509,0.),(-740.914,-46.403,5.),(-740.914,-46.403,0.),(-752.316,-1.509,5.),(-895.005,-38.229,0.),(-884.609,-88.531,5.),(-884.609,-88.531,0.),(-895.005,-38.229,5.),(-965.763,122.904,5.),(-932.396,122.904,0.),(-965.763,122.904,0.),(-932.396,122.904,5.),(67.034,895.808,5.),(98.221,895.808,0.),(67.034,895.808,0.),(98.221,895.808,5.),(67.034,895.808,5.),(67.034,702.817,0.),(67.034,702.817,5.),(67.034,895.808,0.),(-95.441,895.808,5.),(-95.441,650.,0.),(-95.441,650.,5.),(-95.441,895.808,0.),(-64.254,650.,5.),(-95.441,650.,0.),(-64.254,650.,0.),(-95.441,650.,5.),(-95.441,895.808,5.),(-62.074,895.808,0.),(-95.441,895.808,0.),(-62.074,895.808,5.),(-62.074,895.808,0.),(67.034,702.817,5.),(67.034,702.817,0.),(-62.074,895.808,5.),(98.221,895.808,0.),(67.034,702.817,0.),(67.034,895.808,0.),(98.221,650.,0.),(-62.074,895.808,0.),(-95.441,650.,0.),(-95.441,895.808,0.),(-64.254,843.159,0.),(64.854,650.,0.),(-64.254,650.,0.),(98.221,650.,5.),(64.854,650.,0.),(98.221,650.,0.),(64.854,650.,5.),(-64.254,843.159,5.),(64.854,650.,0.),(64.854,650.,5.),(-64.254,843.159,0.),(98.221,895.808,0.),(98.221,650.,5.),(98.221,650.,0.),(98.221,895.808,5.),(-293.936,58.527,0.),(-299.7,0.,5.),(-299.7,0.,0.),(-293.936,58.527,5.),(249.741,-166.671,5.),(212.432,-212.132,0.),(212.432,-212.132,5.),(249.741,-166.671,0.),(166.971,-249.441,5.),(212.432,-212.132,0.),(166.971,-249.441,0.),(212.432,-212.132,5.),(-490.093,97.545,0.),(-299.7,0.,0.),(-499.7,0.,0.),(-461.64,191.342,0.),(-415.435,277.785,0.),(-353.253,353.553,0.),(-277.485,415.735,0.),(-293.936,58.527,0.),(-276.864,114.805,0.),(-191.042,461.94,0.),(-249.141,166.671,0.),(-211.832,212.132,0.),(-166.371,249.441,0.),(-97.245,490.393,0.),(-114.505,277.164,0.),(-58.227,294.236,0.),(0.3,500.,0.),(0.3,300.,0.),(-299.7,0.,5.),(-490.093,97.545,5.),(-499.7,0.,5.),(-461.64,191.342,5.),(-415.435,277.785,5.),(-353.253,353.553,5.),(-277.485,415.735,5.),(-293.936,58.527,5.),(-276.864,114.805,5.),(-191.042,461.94,5.),(-249.141,166.671,5.),(-211.832,212.132,5.),(-166.371,249.441,5.),(-97.245,490.393,5.),(-114.505,277.164,5.),(-58.227,294.236,5.),(0.3,500.,5.),(0.3,300.,5.),(0.3,500.,0.),(0.3,300.,5.),(0.3,300.,0.),(0.3,500.,5.),(-114.505,277.164,5.),(-166.371,249.441,0.),(-114.505,277.164,0.),(-166.371,249.441,5.),(-58.227,294.236,5.),(-114.505,277.164,0.),(-58.227,294.236,0.),(-114.505,277.164,5.),(0.3,300.,5.),(-58.227,294.236,0.),(0.3,300.,0.),(-58.227,294.236,5.),(115.105,-277.164,5.),(166.971,-249.441,0.),(115.105,-277.164,0.),(166.971,-249.441,5.),(-299.7,0.,5.),(-499.7,0.,0.),(-299.7,0.,0.),(-499.7,0.,5.),(277.464,-114.805,5.),(249.741,-166.671,0.),(249.741,-166.671,5.),(277.464,-114.805,0.),(-97.245,490.393,5.),(0.3,500.,0.),(-97.245,490.393,0.),(0.3,500.,5.),(-490.093,97.545,5.),(-499.7,0.,0.),(-499.7,0.,5.),(-490.093,97.545,0.),(-276.864,114.805,0.),(-293.936,58.527,5.),(-293.936,58.527,0.),(-276.864,114.805,5.),(-211.832,212.132,0.),(-249.141,166.671,5.),(-249.141,166.671,0.),(-211.832,212.132,5.),(-249.141,166.671,0.),(-276.864,114.805,5.),(-276.864,114.805,0.),(-249.141,166.671,5.),(-461.64,191.342,5.),(-490.093,97.545,0.),(-490.093,97.545,5.),(-461.64,191.342,0.),(-353.253,353.553,5.),(-277.485,415.735,0.),(-353.253,353.553,0.),(-277.485,415.735,5.),(-353.253,353.553,5.),(-415.435,277.785,0.),(-415.435,277.785,5.),(-353.253,353.553,0.),(-415.435,277.785,5.),(-461.64,191.342,0.),(-461.64,191.342,5.),(-415.435,277.785,0.),(-191.042,461.94,5.),(-97.245,490.393,0.),(-191.042,461.94,0.),(-97.245,490.393,5.),(-277.485,415.735,5.),(-191.042,461.94,0.),(-277.485,415.735,0.),(-191.042,461.94,5.),(-166.371,249.441,5.),(-211.832,212.132,0.),(-166.371,249.441,0.),(-211.832,212.132,5.),(683.164,95.825,0.),(685.391,25.261,0.),(683.835,-0.503,0.),(700.79,110.973,0.),(690.059,47.053,0.),(697.84,64.874,0.),(708.734,78.722,0.),(720.806,121.793,0.),(721.786,89.102,0.),(743.212,128.285,0.),(736.044,96.517,0.),(751.506,100.965,0.),(768.006,130.449,0.),(768.174,102.448,0.),(784.606,129.433,0.),(791.292,99.367,0.),(800.367,126.383,0.),(812.02,90.124,0.),(815.29,121.301,0.),(829.207,75.285,0.),(829.374,114.185,0.),(841.698,55.416,0.),(842.228,105.251,0.),(849.307,31.124,0.),(853.456,94.714,0.),(851.843,3.018,0.),(852.052,-89.977,0.),(861.955,-77.91,0.),(863.061,82.574,0.),(870.287,-64.051,0.),(871.041,68.83,0.),(876.889,-48.803,0.),(877.313,53.797,0.),(881.604,-32.57,0.),(881.793,37.789,0.),(884.434,-15.353,0.),(884.481,20.807,0.),(885.377,2.85,0.),(652.354,28.939,0.),(653.821,-31.522,0.),(650.3,0.,0.),(658.516,54.557,0.),(664.385,-61.368,0.),(668.786,76.852,0.),(672.255,-75.107,0.),(681.781,-87.316,0.),(685.328,-21.541,0.),(692.962,-97.994,0.),(689.808,-40.22,0.),(697.275,-56.542,0.),(705.8,-107.143,0.),(707.728,-70.506,0.),(719.926,-114.479,0.),(720.434,-81.693,0.),(734.975,-119.718,0.),(734.66,-89.684,0.),(750.406,-94.478,0.),(750.946,-122.862,0.),(767.671,-96.076,0.),(767.839,-123.91,0.),(785.219,-94.463,0.),(783.579,-122.962,0.),(798.774,-120.117,0.),(801.143,-89.621,0.),(813.425,-115.375,0.),(815.442,-81.552,0.),(827.53,-108.736,0.),(828.117,-70.255,0.),(840.577,-100.253,0.),(838.497,-55.992,0.),(845.911,-39.026,0.),(850.36,-19.356,0.),(653.821,-31.522,5.),(652.354,28.939,5.),(650.3,0.,5.),(658.516,54.557,5.),(664.385,-61.368,5.),(668.786,76.852,5.),(672.255,-75.107,5.),(683.164,95.825,5.),(681.781,-87.316,5.),(683.835,-0.503,5.),(685.328,-21.541,5.),(692.962,-97.994,5.),(689.808,-40.22,5.),(697.275,-56.542,5.),(705.8,-107.143,5.),(707.728,-70.506,5.),(719.926,-114.479,5.),(720.434,-81.693,5.),(734.975,-119.718,5.),(734.66,-89.684,5.),(750.406,-94.478,5.),(750.946,-122.862,5.),(767.671,-96.076,5.),(767.839,-123.91,5.),(785.219,-94.463,5.),(783.579,-122.962,5.),(798.774,-120.117,5.),(801.143,-89.621,5.),(813.425,-115.375,5.),(815.442,-81.552,5.),(827.53,-108.736,5.),(828.117,-70.255,5.),(840.577,-100.253,5.),(838.497,-55.992,5.),(845.911,-39.026,5.),(852.052,-89.977,5.),(850.36,-19.356,5.),(851.843,3.018,5.),(685.391,25.261,5.),(700.79,110.973,5.),(690.059,47.053,5.),(697.84,64.874,5.),(708.734,78.722,5.),(720.806,121.793,5.),(721.786,89.102,5.),(743.212,128.285,5.),(736.044,96.517,5.),(751.506,100.965,5.),(768.006,130.449,5.),(768.174,102.448,5.),(784.606,129.433,5.),(791.292,99.367,5.),(800.367,126.383,5.),(812.02,90.124,5.),(815.29,121.301,5.),(829.207,75.285,5.),(829.374,114.185,5.),(841.698,55.416,5.),(842.228,105.251,5.),(849.307,31.124,5.),(853.456,94.714,5.),(861.955,-77.91,5.),(863.061,82.574,5.),(870.287,-64.051,5.),(871.041,68.83,5.),(876.889,-48.803,5.),(877.313,53.797,5.),(881.604,-32.57,5.),(881.793,37.789,5.),(884.434,-15.353,5.),(884.481,20.807,5.),(885.377,2.85,5.),(0.3,200.,0.),(200.3,0.,0.),(0.3,0.,0.),(200.3,200.,0.),(200.3,0.,100.),(0.3,200.,100.),(0.3,0.,100.),(200.3,200.,100.),(200.3,0.,100.),(0.3,0.,0.),(200.3,0.,0.),(0.3,0.,100.),(0.3,200.,100.),(0.3,0.,0.),(0.3,0.,100.),(0.3,200.,0.),(0.3,200.,100.),(200.3,200.,0.),(0.3,200.,0.),(200.3,200.,100.),(200.3,200.,0.),(200.3,0.,100.),(200.3,0.,0.),(200.3,200.,100.),(-51.846,-658.384,0.),(-61.907,-715.56,0.),(-69.703,-668.716,0.),(-58.532,-701.413,0.),(-48.409,-689.487,0.),(-30.426,-652.096,0.),(-40.659,-684.755,0.),(-30.908,-681.376,0.),(-5.401,-678.672,0.),(-6.742,-650.,0.),(18.975,-652.201,0.),(19.478,-681.648,0.),(41.464,-658.803,0.),(29.323,-685.368,0.),(37.44,-690.577,0.),(43.942,-697.242,0.),(59.929,-669.681,0.),(48.946,-705.332,0.),(54.458,-725.788,0.),(85.645,-723.441,0.),(73.573,-684.708,0.),(82.208,-702.943,0.),(-90.621,-699.736,0.),(-91.103,-733.857,0.),(-93.261,-717.74,0.),(-84.626,-748.34,0.),(-82.698,-682.948,0.),(-73.748,-760.895,0.),(-58.385,-771.227,0.),(-59.517,-727.632,0.),(-52.349,-737.357,0.),(-39.732,-778.668,0.),(-35.393,-746.014,0.),(-10.934,-786.569,0.),(-3.305,-754.879,0.),(32.829,-798.558,0.),(30.125,-763.284,0.),(51.105,-770.557,0.),(46.075,-805.118,0.),(54.961,-813.062,0.),(69.758,-781.77,0.),(59.991,-822.43,0.),(61.668,-833.266,0.),(68.103,-882.981,0.),(81.789,-867.555,0.),(82.795,-795.624,0.),(90.214,-849.635,0.),(90.466,-811.951,0.),(93.023,-830.584,0.),(-71.967,-818.343,0.),(-98.941,-844.396,0.),(-102.651,-821.026,0.),(-89.153,-865.208,0.),(-73.895,-882.29,0.),(-68.341,-835.132,0.),(-53.774,-894.467,0.),(-61.823,-848.608,0.),(-51.658,-859.297,0.),(-28.519,-901.761,0.),(-37.091,-867.723,0.),(-19.276,-873.193,0.),(2.144,-904.192,0.),(0.635,-875.017,0.),(18.157,-873.633,0.),(27.149,-901.782,0.),(33.499,-869.484,0.),(49.512,-894.551,0.),(45.928,-862.923,0.),(54.71,-854.309,0.),(59.929,-844.228,0.),(-98.941,-844.396,5.),(-71.967,-818.343,5.),(-102.651,-821.026,5.),(-89.153,-865.208,5.),(-73.895,-882.29,5.),(-68.341,-835.132,5.),(-53.774,-894.467,5.),(-61.823,-848.608,5.),(-51.658,-859.297,5.),(-28.519,-901.761,5.),(-37.091,-867.723,5.),(-19.276,-873.193,5.),(2.144,-904.192,5.),(0.635,-875.017,5.),(18.157,-873.633,5.),(27.149,-901.782,5.),(33.499,-869.484,5.),(49.512,-894.551,5.),(45.928,-862.923,5.),(54.71,-854.309,5.),(68.103,-882.981,5.),(59.929,-844.228,5.),(61.668,-833.266,5.),(-91.103,-733.857,5.),(-90.621,-699.736,5.),(-93.261,-717.74,5.),(-84.626,-748.34,5.),(-82.698,-682.948,5.),(-73.748,-760.895,5.),(-69.703,-668.716,5.),(-58.385,-771.227,5.),(-61.907,-715.56,5.),(-59.517,-727.632,5.),(-52.349,-737.357,5.),(-39.732,-778.668,5.),(-35.393,-746.014,5.),(-10.934,-786.569,5.),(-3.305,-754.879,5.),(32.829,-798.558,5.),(30.125,-763.284,5.),(51.105,-770.557,5.),(46.075,-805.118,5.),(54.961,-813.062,5.),(69.758,-781.77,5.),(59.991,-822.43,5.),(81.789,-867.555,5.),(82.795,-795.624,5.),(90.214,-849.635,5.),(90.466,-811.951,5.),(93.023,-830.584,5.),(-51.846,-658.384,5.),(-58.532,-701.413,5.),(-48.409,-689.487,5.),(-30.426,-652.096,5.),(-40.659,-684.755,5.),(-30.908,-681.376,5.),(-5.401,-678.672,5.),(-6.742,-650.,5.),(18.975,-652.201,5.),(19.478,-681.648,5.),(41.464,-658.803,5.),(29.323,-685.368,5.),(37.44,-690.577,5.),(43.942,-697.242,5.),(59.929,-669.681,5.),(48.946,-705.332,5.),(54.458,-725.788,5.),(85.645,-723.441,5.),(73.573,-684.708,5.),(82.208,-702.943,5.),(-102.651,-821.026,5.),(-71.967,-818.343,0.),(-102.651,-821.026,0.),(-71.967,-818.343,5.),(-71.967,-818.343,0.),(-68.341,-835.132,5.),(-68.341,-835.132,0.),(-71.967,-818.343,5.),(-68.341,-835.132,0.),(-61.823,-848.608,5.),(-61.823,-848.608,0.),(-68.341,-835.132,5.),(-61.823,-848.608,0.),(-51.658,-859.297,5.),(-51.658,-859.297,0.),(-61.823,-848.608,5.),(-51.658,-859.297,5.),(-37.091,-867.723,0.),(-51.658,-859.297,0.),(-37.091,-867.723,5.),(-37.091,-867.723,5.),(-19.276,-873.193,0.),(-37.091,-867.723,0.),(-19.276,-873.193,5.),(-19.276,-873.193,5.),(0.635,-875.017,0.),(-19.276,-873.193,0.),(0.635,-875.017,5.),(0.635,-875.017,5.),(18.157,-873.633,0.),(0.635,-875.017,0.),(18.157,-873.633,5.),(18.157,-873.633,5.),(33.499,-869.484,0.),(18.157,-873.633,0.),(33.499,-869.484,5.),(33.499,-869.484,5.),(45.928,-862.923,0.),(33.499,-869.484,0.),(45.928,-862.923,5.),(45.928,-862.923,5.),(54.71,-854.309,0.),(45.928,-862.923,0.),(54.71,-854.309,5.),(59.929,-844.228,5.),(54.71,-854.309,0.),(54.71,-854.309,5.),(59.929,-844.228,0.),(61.668,-833.266,5.),(59.929,-844.228,0.),(59.929,-844.228,5.),(61.668,-833.266,0.),(59.991,-822.43,5.),(61.668,-833.266,0.),(61.668,-833.266,5.),(59.991,-822.43,0.),(54.961,-813.062,5.),(59.991,-822.43,0.),(59.991,-822.43,5.),(54.961,-813.062,0.),(54.961,-813.062,5.),(46.075,-805.118,0.),(54.961,-813.062,0.),(46.075,-805.118,5.),(46.075,-805.118,5.),(32.829,-798.558,0.),(46.075,-805.118,0.),(32.829,-798.558,5.),(32.829,-798.558,5.),(-10.934,-786.569,0.),(32.829,-798.558,0.),(-39.732,-778.668,0.),(-39.732,-778.668,5.),(-10.934,-786.569,5.),(-39.732,-778.668,5.),(-58.385,-771.227,0.),(-39.732,-778.668,0.),(-58.385,-771.227,5.),(-58.385,-771.227,5.),(-73.748,-760.895,0.),(-58.385,-771.227,0.),(-73.748,-760.895,5.),(-84.626,-748.34,5.),(-73.748,-760.895,0.),(-73.748,-760.895,5.),(-84.626,-748.34,0.),(-91.103,-733.857,5.),(-84.626,-748.34,0.),(-84.626,-748.34,5.),(-91.103,-733.857,0.),(-93.261,-717.74,5.),(-91.103,-733.857,0.),(-91.103,-733.857,5.),(-93.261,-717.74,0.),(-90.621,-699.736,5.),(-93.261,-717.74,0.),(-93.261,-717.74,5.),(-90.621,-699.736,0.),(-82.698,-682.948,5.),(-90.621,-699.736,0.),(-90.621,-699.736,5.),(-82.698,-682.948,0.),(-69.703,-668.716,5.),(-82.698,-682.948,0.),(-82.698,-682.948,5.),(-69.703,-668.716,0.),(-69.703,-668.716,5.),(-51.846,-658.384,0.),(-69.703,-668.716,0.),(-51.846,-658.384,5.),(-51.846,-658.384,5.),(-30.426,-652.096,0.),(-51.846,-658.384,0.),(-30.426,-652.096,5.),(-30.426,-652.096,5.),(-6.742,-650.,0.),(-30.426,-652.096,0.),(-6.742,-650.,5.),(-6.742,-650.,5.),(18.975,-652.201,0.),(-6.742,-650.,0.),(18.975,-652.201,5.),(18.975,-652.201,5.),(41.464,-658.803,0.),(18.975,-652.201,0.),(41.464,-658.803,5.),(41.464,-658.803,5.),(59.929,-669.681,0.),(41.464,-658.803,0.),(59.929,-669.681,5.),(59.929,-669.681,0.),(73.573,-684.708,5.),(73.573,-684.708,0.),(59.929,-669.681,5.),(73.573,-684.708,0.),(82.208,-702.943,5.),(82.208,-702.943,0.),(73.573,-684.708,5.),(82.208,-702.943,0.),(85.645,-723.441,5.),(85.645,-723.441,0.),(82.208,-702.943,5.),(85.645,-723.441,5.),(54.458,-725.788,0.),(85.645,-723.441,0.),(54.458,-725.788,5.),(48.946,-705.332,5.),(54.458,-725.788,0.),(54.458,-725.788,5.),(48.946,-705.332,0.),(43.942,-697.242,5.),(48.946,-705.332,0.),(48.946,-705.332,5.),(43.942,-697.242,0.),(37.44,-690.577,5.),(43.942,-697.242,0.),(43.942,-697.242,5.),(37.44,-690.577,0.),(37.44,-690.577,5.),(29.323,-685.368,0.),(37.44,-690.577,0.),(29.323,-685.368,5.),(29.323,-685.368,5.),(19.478,-681.648,0.),(29.323,-685.368,0.),(19.478,-681.648,5.),(19.478,-681.648,5.),(-5.401,-678.672,0.),(19.478,-681.648,0.),(-5.401,-678.672,5.),(-5.401,-678.672,5.),(-30.908,-681.376,0.),(-5.401,-678.672,0.),(-30.908,-681.376,5.),(-30.908,-681.376,5.),(-40.659,-684.755,0.),(-30.908,-681.376,0.),(-40.659,-684.755,5.),(-40.659,-684.755,5.),(-48.409,-689.487,0.),(-40.659,-684.755,0.),(-48.409,-689.487,5.),(-48.409,-689.487,0.),(-58.532,-701.413,5.),(-58.532,-701.413,0.),(-48.409,-689.487,5.),(-58.532,-701.413,0.),(-61.907,-715.56,5.),(-61.907,-715.56,0.),(-58.532,-701.413,5.),(-61.907,-715.56,0.),(-59.517,-727.632,5.),(-59.517,-727.632,0.),(-61.907,-715.56,5.),(-59.517,-727.632,0.),(-52.349,-737.357,5.),(-52.349,-737.357,0.),(-59.517,-727.632,5.),(-52.349,-737.357,5.),(-35.393,-746.014,0.),(-52.349,-737.357,0.),(-35.393,-746.014,5.),(-35.393,-746.014,5.),(-3.305,-754.879,0.),(-35.393,-746.014,0.),(-3.305,-754.879,5.),(-3.305,-754.879,5.),(30.125,-763.284,0.),(-3.305,-754.879,0.),(30.125,-763.284,5.),(30.125,-763.284,5.),(51.105,-770.557,0.),(30.125,-763.284,0.),(51.105,-770.557,5.),(51.105,-770.557,5.),(69.758,-781.77,0.),(51.105,-770.557,0.),(69.758,-781.77,5.),(69.758,-781.77,0.),(82.795,-795.624,5.),(82.795,-795.624,0.),(69.758,-781.77,5.),(82.795,-795.624,0.),(90.466,-811.951,5.),(90.466,-811.951,0.),(82.795,-795.624,5.),(90.466,-811.951,0.),(93.023,-830.584,5.),(93.023,-830.584,0.),(90.466,-811.951,5.),(93.023,-830.584,0.),(90.214,-849.635,5.),(90.214,-849.635,0.),(93.023,-830.584,5.),(90.214,-849.635,0.),(81.789,-867.555,5.),(81.789,-867.555,0.),(90.214,-849.635,5.),(81.789,-867.555,0.),(68.103,-882.981,5.),(68.103,-882.981,0.),(81.789,-867.555,5.),(68.103,-882.981,5.),(49.512,-894.551,0.),(68.103,-882.981,0.),(49.512,-894.551,5.),(49.512,-894.551,5.),(27.149,-901.782,0.),(49.512,-894.551,0.),(27.149,-901.782,5.),(27.149,-901.782,5.),(2.144,-904.192,0.),(27.149,-901.782,0.),(2.144,-904.192,5.),(2.144,-904.192,5.),(-28.519,-901.761,0.),(2.144,-904.192,0.),(-28.519,-901.761,5.),(-28.519,-901.761,5.),(-53.774,-894.467,0.),(-28.519,-901.761,0.),(-53.774,-894.467,5.),(-53.774,-894.467,5.),(-73.895,-882.29,0.),(-53.774,-894.467,0.),(-73.895,-882.29,5.),(-89.153,-865.208,5.),(-73.895,-882.29,0.),(-73.895,-882.29,5.),(-89.153,-865.208,0.),(-98.941,-844.396,5.),(-89.153,-865.208,0.),(-89.153,-865.208,5.),(-98.941,-844.396,0.),(-102.651,-821.026,5.),(-98.941,-844.396,0.),(-98.941,-844.396,5.),(-102.651,-821.026,0.)),$); +#892=IFCSTYLEDITEM(#890,(#895),$); +#893=IFCSURFACESTYLERENDERING(#894,0.,$,$,$,$,$,$,.NOTDEFINED.); +#894=IFCCOLOURRGB($,0.,0.,0.); +#895=IFCSURFACESTYLE('virtual_black',.BOTH.,(#893)); +#896=IFCPRODUCTDEFINITIONSHAPE($,$,(#889)); +#897=IFCSITE('2syxA9_lr7Ew2uZai3VhhS',#1,'road - site','A designated parking area, providing space for vehicles.',$,#898,$,$,.PARTIAL.,$,$,0.,$,$); +#898=IFCLOCALPLACEMENT(#23,#899); +#899=IFCAXIS2PLACEMENT3D(#900,#901,#902); +#900=IFCCARTESIANPOINT((-17320.508,10000.,0.)); +#901=IFCDIRECTION((0.,0.,1.)); +#902=IFCDIRECTION((-0.5000000000000003,0.8660254037844387,0.)); +ENDSEC; +END-ISO-10303-21; diff --git a/tests/fixtures/make_broken.py b/tests/fixtures/make_broken.py new file mode 100644 index 0000000..2b9250b --- /dev/null +++ b/tests/fixtures/make_broken.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +"""Generate `broken_building.ifc`: a small IFC4 model with deliberate defects. + +Run: python3 tests/fixtures/make_broken.py +The file is committed; this script documents exactly how it was produced so +anyone can regenerate it. Defects (what VeriModel must catch): + + 1. duplicate GlobalId two walls share the same GlobalId -> ID-001 + 2. invalid GlobalId a slab with a 7-character GlobalId -> ID-002 + 3. element without storey a column not contained in any storey -> SP-001 + 4. zero-volume wall a wall extruded with zero depth -> GEO-002 / QT-001 + 5. far from origin a beam placed 25 km from the origin -> SP-004 + 6. missing FireRating no wall carries Pset_WallCommon.FireRating -> IDS / CFG-PSET + 7. empty property value Pset_WallCommon.Reference = "" -> PR-001 + 8. duplicate names two walls named "Wall" -> ID-003 + +Units are MILLIMETRES on purpose, so unit conversion is exercised: the good +wall is 5000 mm long, 3000 mm high and 200 mm thick (= 3.0 m3). The +ifcopenshell.api geometry helpers take METRES and convert to project units. +""" +import os +import sys + +import numpy as np +import ifcopenshell +import ifcopenshell.api +import ifcopenshell.api.root +import ifcopenshell.api.unit +import ifcopenshell.api.context +import ifcopenshell.api.project +import ifcopenshell.api.aggregate +import ifcopenshell.api.spatial +import ifcopenshell.api.geometry +import ifcopenshell.api.pset +import ifcopenshell.api.material +import ifcopenshell.api.classification + +OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "broken_building.ifc") + + +def main() -> None: + f = ifcopenshell.api.project.create_file(version="IFC4") + project = ifcopenshell.api.root.create_entity(f, ifc_class="IfcProject", name="VeriModel broken sample") + mm = ifcopenshell.api.unit.add_si_unit(f, unit_type="LENGTHUNIT", prefix="MILLI") + area = ifcopenshell.api.unit.add_si_unit(f, unit_type="AREAUNIT") + vol = ifcopenshell.api.unit.add_si_unit(f, unit_type="VOLUMEUNIT") + ifcopenshell.api.unit.assign_unit(f, units=[mm, area, vol]) + model_ctx = ifcopenshell.api.context.add_context(f, context_type="Model") + body = ifcopenshell.api.context.add_context( + f, context_type="Model", context_identifier="Body", target_view="MODEL_VIEW", parent=model_ctx + ) + + site = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSite", name="Site") + building = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuilding", name="Broken House") + storey = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBuildingStorey", name="Level 1") + storey.Elevation = 0.0 + ifcopenshell.api.aggregate.assign_object(f, relating_object=project, products=[site]) + ifcopenshell.api.aggregate.assign_object(f, relating_object=site, products=[building]) + ifcopenshell.api.aggregate.assign_object(f, relating_object=building, products=[storey]) + + concrete = ifcopenshell.api.material.add_material(f, name="Concrete C30/37") + + def box(element, length_mm, height_mm, thickness_mm, x=0.0, y=0.0, z=0.0): + # The API takes metres and writes project units (mm) into the file. + rep = ifcopenshell.api.geometry.add_wall_representation( + f, context=body, length=length_mm / 1000.0, height=height_mm / 1000.0, thickness=thickness_mm / 1000.0 + ) + ifcopenshell.api.geometry.assign_representation(f, product=element, representation=rep) + matrix = np.eye(4) + matrix[:, 3][0:3] = (x / 1000.0, y / 1000.0, z / 1000.0) + ifcopenshell.api.geometry.edit_object_placement(f, product=element, matrix=matrix, is_si=True) + + def wall(name, **kw): + w = ifcopenshell.api.root.create_entity(f, ifc_class="IfcWall", name=name) + box(w, **kw) + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[w]) + ifcopenshell.api.material.assign_material(f, products=[w], material=concrete) + return w + + # 1 + 8: two walls, same GlobalId, same name + w1 = wall("Wall", length_mm=5000.0, height_mm=3000.0, thickness_mm=200.0) + w2 = wall("Wall", length_mm=4000.0, height_mm=3000.0, thickness_mm=200.0, y=3000.0) + w2.GlobalId = w1.GlobalId + # 6 + 7: psets without FireRating, with an empty Reference + for w in (w1, w2): + pset = ifcopenshell.api.pset.add_pset(f, product=w, name="Pset_WallCommon") + ifcopenshell.api.pset.edit_pset(f, pset=pset, properties={"IsExternal": True, "Reference": ""}) + + # 4: zero-volume wall (zero thickness) + w3 = wall("Wall-Zero", length_mm=3000.0, height_mm=3000.0, thickness_mm=0.0, y=6000.0) + pset = ifcopenshell.api.pset.add_pset(f, product=w3, name="Pset_WallCommon") + ifcopenshell.api.pset.edit_pset(f, pset=pset, properties={"IsExternal": False, "FireRating": "REI60"}) + + # 2: invalid GlobalId on a slab + slab = ifcopenshell.api.root.create_entity(f, ifc_class="IfcSlab", name="Slab-1") + box(slab, length_mm=6000.0, height_mm=250.0, thickness_mm=6000.0, z=-250.0) + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[slab]) + slab.GlobalId = "BADID01" + + # 3: column with no spatial container + col = ifcopenshell.api.root.create_entity(f, ifc_class="IfcColumn", name="Column-Orphan") + box(col, length_mm=300.0, height_mm=3000.0, thickness_mm=300.0, x=8000.0) + + # 5: beam 25 km away + beam = ifcopenshell.api.root.create_entity(f, ifc_class="IfcBeam", name="Beam-Far") + box(beam, length_mm=4000.0, height_mm=400.0, thickness_mm=200.0, x=25_000_000.0, y=25_000_000.0, z=3000.0) + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[beam]) + + # a healthy door so at least one element passes everything + door = ifcopenshell.api.root.create_entity(f, ifc_class="IfcDoor", name="Door-1") + box(door, length_mm=900.0, height_mm=2100.0, thickness_mm=100.0, x=1000.0) + ifcopenshell.api.spatial.assign_container(f, relating_structure=storey, products=[door]) + pset = ifcopenshell.api.pset.add_pset(f, product=door, name="Pset_DoorCommon") + ifcopenshell.api.pset.edit_pset(f, pset=pset, properties={"FireRating": "EI30", "IsExternal": False}) + + f.write(OUT) + print(f"wrote {OUT} ({os.path.getsize(OUT)} bytes, {len(f.by_type('IfcProduct'))} products)") + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/src/lib.rs b/tests/src/lib.rs new file mode 100644 index 0000000..1240d16 --- /dev/null +++ b/tests/src/lib.rs @@ -0,0 +1,75 @@ +//! Helpers shared by the end-to-end tests. + +use std::path::{Path, PathBuf}; + +use verimodel_core::config::Config; +use verimodel_core::model::Model; +use verimodel_core::run::{execute, RunInputs, RunOutcome}; +use verimodel_ifc_reader::{read_model, ReadOptions}; + +/// Absolute path of a file under `tests/fixtures/`. +pub fn fixture(name: &str) -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("fixtures") + .join(name) +} + +/// Absolute path of a file under `examples/`. +pub fn example(name: &str) -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../examples") + .join(name) +} + +/// Whether the IFC-dependent tests are explicitly skipped (never silently). +pub fn skip_ifc() -> bool { + if std::env::var("VERIMODEL_SKIP_IFC_TESTS").is_ok() { + eprintln!("VERIMODEL_SKIP_IFC_TESTS set: skipping"); + return true; + } + false +} + +/// Read a fixture with geometry and an optional IDS. +pub fn read(name: &str, ids: Option<&Path>) -> Model { + let opts = ReadOptions { + ids_path: ids.map(|p| p.to_path_buf()), + ..Default::default() + }; + read_model(&fixture(name), &opts).unwrap_or_else(|e| panic!("reading {name}: {e}")) +} + +/// Run the whole pipeline into `out_dir`. +pub fn run( + model: &Model, + config: &Config, + config_dir: Option<&Path>, + ids: Option<&Path>, + out_dir: &Path, +) -> RunOutcome { + let inputs = RunInputs { + ifc_path: fixture(&model.info.file_name), + ids_path: ids.map(|p| p.to_path_buf()), + config_path: None, + config_dir: config_dir.map(|p| p.to_path_buf()), + out_dir: out_dir.to_path_buf(), + started: None, + }; + execute(model, config, &inputs).expect("run") +} + +/// Names of the topic folders inside a .bcfzip (GUID directories). +pub fn bcf_topics(path: &Path) -> Vec { + let f = std::fs::File::open(path).expect("bcfzip"); + let mut z = zip::ZipArchive::new(f).expect("zip"); + let mut topics = std::collections::BTreeSet::new(); + for i in 0..z.len() { + let name = z.by_index(i).unwrap().name().to_string(); + if name.ends_with("markup.bcf") { + if let Some(dir) = name.split('/').next() { + topics.insert(dir.to_string()); + } + } + } + topics.into_iter().collect() +} diff --git a/tests/tests/e2e.rs b/tests/tests/e2e.rs new file mode 100644 index 0000000..18d802d --- /dev/null +++ b/tests/tests/e2e.rs @@ -0,0 +1,524 @@ +//! End-to-end tests on real IFC files. See `tests/fixtures/README.md`. + +use std::path::Path; + +use verimodel_core::config::Config; +use verimodel_core::model::{RuleStatus, Severity, Verdict}; +use verimodel_tests::{bcf_topics, example, fixture, read, run, skip_ifc}; + +fn finding_ids(o: &verimodel_core::run::RunOutcome, rule: &str) -> Vec { + o.report + .findings + .iter() + .filter(|f| f.rule_id == rule) + .map(|f| f.global_id.clone().unwrap_or_default()) + .collect() +} + +// --------------------------------------------------------------------------- +// Golden fixtures +// --------------------------------------------------------------------------- + +#[test] +fn broken_building_fails_with_the_expected_findings() { + if skip_ifc() { + return; + } + let model = read("broken_building.ifc", None); + let dir = tempfile::tempdir().unwrap(); + let cfg = Config::from_yaml( + "requirements:\n required_psets:\n - pset: Pset_WallCommon\n applies_to: [IfcWall]\n properties: [FireRating]\n", + ) + .unwrap(); + let o = run(&model, &cfg, None, None, dir.path()); + let s = &o.report.summary; + assert_eq!(s.verdict, Some(Verdict::Fail)); + assert!(s.score < 100); + // 1. duplicate GlobalId: both walls + assert_eq!( + finding_ids(&o, "ID-001").len(), + 2, + "{:#?}", + o.report.findings + ); + // 2. invalid GlobalId on the slab + assert_eq!(finding_ids(&o, "ID-002"), vec!["BADID01".to_string()]); + // 3. orphan column + let orphan = finding_ids(&o, "SP-001"); + assert_eq!(orphan.len(), 1); + assert_eq!( + o.report + .findings + .iter() + .find(|f| f.rule_id == "SP-001") + .unwrap() + .name + .as_deref(), + Some("Column-Orphan") + ); + // 4. zero-volume wall + let zero = o + .report + .findings + .iter() + .filter(|f| f.rule_id == "QT-001") + .collect::>(); + assert_eq!(zero.len(), 1); + assert_eq!(zero[0].name.as_deref(), Some("Wall-Zero")); + // 5. far from origin + let far = o + .report + .findings + .iter() + .filter(|f| f.rule_id == "SP-004") + .collect::>(); + assert_eq!(far.len(), 1); + assert_eq!(far[0].name.as_deref(), Some("Beam-Far")); + // 6. missing FireRating from config-generated rule (2 walls with the pset but no property) + assert_eq!(finding_ids(&o, "CFG-PSET-001-01").len(), 2); + // 7. empty property value + assert_eq!(finding_ids(&o, "PR-001").len(), 2); + // 8. duplicate names + assert_eq!(finding_ids(&o, "ID-003").len(), 2); + // every finding carries a fix hint and an element reference + for f in &o.report.findings { + assert!(f.fix_hint.is_some(), "{f:?}"); + assert!(f.global_id.is_some(), "{f:?}"); + } + // outputs + for name in [ + "report.html", + "report.json", + "failures.csv", + "qto.csv", + "qto.xlsx", + "issues.bcfzip", + "issues.csv", + "run.json", + "audit.log", + "project.yaml", + ] { + assert!(dir.path().join(name).is_file(), "missing {name}"); + } + // BCF: one topic per ERROR/WARNING finding + let expected = o + .report + .findings + .iter() + .filter(|f| f.severity != Severity::Info) + .count(); + assert_eq!( + bcf_topics(&dir.path().join("issues.bcfzip")).len(), + expected + ); + assert_eq!(o.bcf.topics, expected); +} + +#[test] +fn qto_of_broken_building_matches_hand_computed_values() { + if skip_ifc() { + return; + } + let model = read("broken_building.ifc", None); + let cfg = Config::from_yaml("qto:\n group_by: [type]\n").unwrap(); + let dir = tempfile::tempdir().unwrap(); + let o = run(&model, &cfg, None, None, dir.path()); + let row = |t: &str| { + o.report + .qto + .rows + .iter() + .find(|r| r.group[0] == t) + .unwrap_or_else(|| panic!("row {t}")) + }; + // walls: 5000x3000x200 + 4000x3000x200 + 3000x3000x0 (mm) = 3.0 + 2.4 + 0 m3, from geometry (no base quantities) + let walls = row("IfcWall"); + assert_eq!(walls.count, 3); + assert!((walls.volume_m3 - 5.4).abs() < 1e-6, "{}", walls.volume_m3); + assert_eq!(walls.volume_sources.get("geometry"), Some(&3)); + // slab 6000x6000x250 mm = 9.0 m3 + assert!((row("IfcSlab").volume_m3 - 9.0).abs() < 1e-6); + // column 300x300x3000 = 0.27 m3 ; door 900x100x2100 = 0.189 m3 ; beam 4000x200x400 = 0.32 m3 + assert!((row("IfcColumn").volume_m3 - 0.27).abs() < 1e-6); + assert!((row("IfcDoor").volume_m3 - 0.189).abs() < 1e-6); + assert!((row("IfcBeam").volume_m3 - 0.32).abs() < 1e-4); + assert!((o.report.qto.total_volume_m3 - (5.4 + 9.0 + 0.27 + 0.189 + 0.32)).abs() < 1e-4); + assert_eq!(o.report.qto.samples.len(), 5); + assert!(!o.report.qto.method.is_empty()); +} + +#[test] +fn public_samples_pass_or_warn_but_never_crash() { + if skip_ifc() { + return; + } + for name in [ + "bsi_ifc2x3_building_architecture.ifc", + "bsi_ifc4_building_structural.ifc", + "bsi_ifc4_building_hvac.ifc", + "bsi_ifc4x3_infra_bridge.ifc", + ] { + let model = read(name, None); + let dir = tempfile::tempdir().unwrap(); + let o = run(&model, &Config::default(), None, None, dir.path()); + assert!(o.report.summary.verdict.is_some(), "{name}"); + assert_eq!(o.report.model.element_count, model.elements.len()); + assert!( + o.report + .rules + .iter() + .all(|r| r.status != RuleStatus::Skipped || r.skipped_reason.is_some()), + "{name}: skipped rules need a reason" + ); + assert!( + dir.path().join("report.html").metadata().unwrap().len() > 1000, + "{name}" + ); + // identity rules pass on the official samples + for id in ["ID-001", "ID-002"] { + assert_eq!( + o.report + .rules + .iter() + .find(|r| r.rule_id == id) + .unwrap() + .status, + RuleStatus::Pass, + "{name} {id}" + ); + } + } +} + +#[test] +fn architecture_sample_qto_reconciles_with_base_quantities() { + if skip_ifc() { + return; + } + // Hand check: the IFC2x3 sample declares Qto_WallBaseQuantities.NetVolume on its 4 walls. + let model = read("bsi_ifc2x3_building_architecture.ifc", None); + let expected: f64 = model + .elements + .iter() + .filter(|e| e.ifc_type == "IfcWall") + .map(|e| e.quantity("NetVolume").unwrap()) + .sum(); + assert!(expected > 0.0); + let cfg = Config::from_yaml("qto:\n group_by: [type]\n").unwrap(); + let dir = tempfile::tempdir().unwrap(); + let o = run(&model, &cfg, None, None, dir.path()); + let walls = o + .report + .qto + .rows + .iter() + .find(|r| r.group[0] == "IfcWall") + .unwrap(); + assert_eq!(walls.count, 4); + assert!((walls.volume_m3 - expected).abs() < 1e-9); + assert_eq!(walls.volume_sources.get("base_quantity"), Some(&4)); +} + +// --------------------------------------------------------------------------- +// Genericity: same IFC, two configs, different correct results +// --------------------------------------------------------------------------- + +#[test] +fn same_ifc_two_configs_give_different_results() { + if skip_ifc() { + return; + } + let model = read("bsi_ifc4_building_structural.ifc", None); + let lenient = Config::default(); + let strict = Config::from_yaml( + "requirements:\n required_psets:\n - pset: Pset_BeamCommon\n applies_to: [IfcBeam]\n properties: [LoadBearing]\n\ + tolerances:\n far_from_origin_m: 1\n\ + classification:\n required: true\n\ + naming:\n patterns:\n IfcBeam: '^B-[0-9]{3}$'\n", + ) + .unwrap(); + let d1 = tempfile::tempdir().unwrap(); + let d2 = tempfile::tempdir().unwrap(); + let a = run(&model, &lenient, None, None, d1.path()); + let b = run(&model, &strict, None, None, d2.path()); + assert!( + b.report.summary.errors > a.report.summary.errors, + "strict config must add errors: {} vs {}", + b.report.summary.errors, + a.report.summary.errors + ); + assert!(b + .report + .findings + .iter() + .any(|f| f.rule_id == "CFG-PSET-001")); + assert!(b.report.findings.iter().any(|f| f.rule_id == "CL-001")); + assert!(b.report.findings.iter().any(|f| f.rule_id == "NAM-001")); + assert!(b.report.findings.iter().any(|f| f.rule_id == "SP-004")); + assert!(!a.report.findings.iter().any(|f| f.rule_id == "CL-001")); + assert!( + a.report + .rules + .iter() + .find(|r| r.rule_id == "NAM-001") + .unwrap() + .status + == RuleStatus::Skipped + ); + assert_ne!(a.report.config, b.report.config); +} + +#[test] +fn example_configs_load_and_run() { + if skip_ifc() { + return; + } + let model = read("bsi_ifc4x3_infra_bridge.ifc", None); + for (ex, ifc_ok) in [ + ("residential", true), + ("office", true), + ("infrastructure", true), + ] { + let path = example(&format!("{ex}/project.yaml")); + let cfg = Config::from_file(&path).unwrap_or_else(|e| panic!("{ex}: {e}")); + let dir = tempfile::tempdir().unwrap(); + let o = run(&model, &cfg, path.parent(), None, dir.path()); + assert!(o.report.summary.verdict.is_some() == ifc_ok, "{ex}"); + } + // the office example rejects nothing by schema but the infrastructure one accepts only IFC4X3 + let infra = Config::from_file(&example("infrastructure/project.yaml")).unwrap(); + assert_eq!(infra.project.ifc_versions, vec!["IFC4X3".to_string()]); + let arch = read("bsi_ifc2x3_building_architecture.ifc", None); + let dir = tempfile::tempdir().unwrap(); + let o = run( + &arch, + &infra, + example("infrastructure").as_path().into(), + None, + dir.path(), + ); + assert!( + o.report.findings.iter().any(|f| f.rule_id == "SCH-001"), + "IFC2X3 file must fail the IFC4X3-only project" + ); +} + +// --------------------------------------------------------------------------- +// Determinism +// --------------------------------------------------------------------------- + +#[test] +fn two_runs_produce_identical_outputs_except_timestamps() { + if skip_ifc() { + return; + } + let model = read("broken_building.ifc", Some(&example("sample.ids"))); + let cfg = Config::from_file(&example("residential/project.yaml")).unwrap(); + let d1 = tempfile::tempdir().unwrap(); + let d2 = tempfile::tempdir().unwrap(); + run( + &model, + &cfg, + example("residential").as_path().into(), + Some(&example("sample.ids")), + d1.path(), + ); + run( + &model, + &cfg, + example("residential").as_path().into(), + Some(&example("sample.ids")), + d2.path(), + ); + for name in [ + "report.json", + "failures.csv", + "qto.csv", + "qto.xlsx", + "qto.json", + "report.html", + "issues.csv", + "project.yaml", + ] { + let a = std::fs::read(d1.path().join(name)).unwrap(); + let b = std::fs::read(d2.path().join(name)).unwrap(); + assert!(a == b, "{name} differs between two identical runs"); + } + // the BCF differs only by creation dates: same topics, same GUIDs + assert_eq!( + bcf_topics(&d1.path().join("issues.bcfzip")), + bcf_topics(&d2.path().join("issues.bcfzip")) + ); + // reading the model twice gives the same facts + let model2 = read("broken_building.ifc", Some(&example("sample.ids"))); + assert_eq!( + serde_json::to_string(&model).unwrap(), + serde_json::to_string(&model2).unwrap() + ); +} + +// --------------------------------------------------------------------------- +// IDS +// --------------------------------------------------------------------------- + +#[test] +fn ids_violations_are_reported_with_the_requirement_quoted() { + if skip_ifc() { + return; + } + let ids = example("sample.ids"); + let model = read("broken_building.ifc", Some(&ids)); + let dir = tempfile::tempdir().unwrap(); + let o = run(&model, &Config::default(), None, Some(&ids), dir.path()); + let ids_report = o.report.ids.as_ref().expect("ids section"); + assert!(ids_report.specifications_total >= 3); + let ids_findings: Vec<_> = o + .report + .findings + .iter() + .filter(|f| f.rule_id.starts_with("IDS-")) + .collect(); + assert!(!ids_findings.is_empty()); + // The walls lack FireRating: the quoted requirement must mention it + let fr = ids_findings.iter().find(|f| { + f.expected + .as_deref() + .map(|s| s.contains("FireRating")) + .unwrap_or(false) + }); + assert!(fr.is_some(), "{ids_findings:#?}"); + assert!(matches!( + fr.unwrap().source, + verimodel_core::model::RuleSource::Ids { .. } + )); + assert!(o + .report + .rules + .iter() + .any(|r| r.rule_id.starts_with("IDS-") && r.status == RuleStatus::Fail)); + // run.json records the IDS hash + assert!(o + .ledger + .ids_sha256 + .as_ref() + .map(|s| s.len() == 64) + .unwrap_or(false)); +} + +// --------------------------------------------------------------------------- +// Schema coverage +// --------------------------------------------------------------------------- + +#[test] +fn ifc2x3_ifc4_and_ifc4x3_all_work() { + if skip_ifc() { + return; + } + let cases = [ + ("bsi_ifc2x3_building_architecture.ifc", "IFC2X3"), + ("bsi_ifc4_building_structural.ifc", "IFC4"), + ("bsi_ifc4x3_infra_bridge.ifc", "IFC4X3"), + ]; + for (name, schema) in cases { + let model = read(name, None); + assert_eq!(model.info.schema, schema); + let dir = tempfile::tempdir().unwrap(); + let o = run(&model, &Config::default(), None, None, dir.path()); + assert_eq!(o.ledger.schema, schema); + assert!(o.report.qto.total_count > 0, "{name} has takeoff items"); + } + let _ = Path::new(&fixture("broken_building.ifc")); +} + +/// Not a test: writes a full run of the broken fixture (with the sample IDS and the +/// residential example) to `$VERIMODEL_DEMO_OUT` so humans can open the outputs. +/// `cargo test -p verimodel-tests -- --ignored write_demo_outputs` +#[test] +#[ignore] +fn write_demo_outputs() { + let Ok(out) = std::env::var("VERIMODEL_DEMO_OUT") else { + eprintln!("set VERIMODEL_DEMO_OUT"); + return; + }; + let ids = example("sample.ids"); + let cfg_path = example("residential/project.yaml"); + let cfg = Config::from_file(&cfg_path).unwrap(); + for name in [ + "broken_building.ifc", + "bsi_ifc2x3_building_architecture.ifc", + "bsi_ifc4x3_infra_bridge.ifc", + ] { + let model = read(name, Some(&ids)); + let dir = Path::new(&out).join(name.trim_end_matches(".ifc")); + let o = run(&model, &cfg, cfg_path.parent(), Some(&ids), &dir); + eprintln!( + "{name}: score {} verdict {:?} errors {} warnings {} -> {}", + o.report.summary.score, + o.report.summary.verdict, + o.report.summary.errors, + o.report.summary.warnings, + dir.display() + ); + } +} + +#[test] +fn demo_building_shows_a_realistic_mixed_review() { + if skip_ifc() { + return; + } + let cfg_path = example("demo/project.yaml"); + let cfg = Config::from_file(&cfg_path).unwrap(); + let ids = cfg.ids_path(cfg_path.parent()).unwrap(); + let path = example("demo/demo_building.ifc"); + let model = verimodel_ifc_reader::read_model( + &path, + &verimodel_ifc_reader::ReadOptions { + ids_path: Some(ids.clone()), + ..Default::default() + }, + ) + .unwrap(); + assert_eq!(model.info.storeys, vec!["Level 1", "Level 2", "Roof"]); + let dir = tempfile::tempdir().unwrap(); + let o = run(&model, &cfg, cfg_path.parent(), Some(&ids), dir.path()); + let s = &o.report.summary; + assert_eq!(s.verdict, Some(Verdict::Fail), "{:#?}", o.report.findings); + assert!(s.score >= 85 && s.score < 100, "score {}", s.score); + let by_rule = |id: &str| { + o.report + .findings + .iter() + .filter(|f| f.rule_id == id) + .map(|f| f.name.clone().unwrap_or_default()) + .collect::>() + }; + assert_eq!(by_rule("SP-001"), vec!["C-205"]); + assert_eq!(by_rule("CFG-PSET-002-01"), vec!["D-103"]); + assert_eq!(by_rule("PR-001"), vec!["W-204"]); + assert_eq!(by_rule("CL-001"), vec!["MEP-102"]); + assert_eq!(by_rule("ID-003").len(), 2); + assert!(o + .report + .findings + .iter() + .all(|f| f.rule_id != "ID-001" && f.rule_id != "ID-002")); + // quantities come from base quantities, not geometry + let walls = o + .report + .qto + .rows + .iter() + .filter(|r| r.group[0] == "IfcWall") + .map(|r| r.count) + .sum::(); + assert_eq!(walls, 9); + assert!(o + .report + .qto + .rows + .iter() + .filter(|r| r.group[0] == "IfcWall") + .all(|r| r.volume_sources.get("base_quantity") == Some(&r.count))); + assert!(o.report.qto.total_cost.unwrap_or(0.0) > 0.0); +}